def group_nodes(self, nodes, group_type): futures = [] groups = {} grouping_expr = lambda n: n.datestamp.replace(day=1, hour=0, minute=0, second=0, microsecond=0) for node in nodes.values(): key = grouping_expr(node) if not key in groups: groups[key] = group = NodeGroup(date_key=key, group_type=group_type) else: group = groups[key] group.nodes.append(node) group.count += 1 for key, group in groups.items(): persist_group = NodeGroup.get_by_date_key(key, group_type) if not persist_group: group_obj = group else: group_obj = persist_group group_obj.populate(nodes=group.nodes, count=group.count) futures.append(group_obj.put_async()) return futures
def process_request(self, request): # key: (finalise, query) context_var_types = { 'drinkstatic_nodes': (NodeList, lambda: Node.query().filter(Node.v_archived==False)), 'drinkstatic_archived_nodes': (NodeList, lambda: Node.query().filter(Node.v_archived==True)), 'drinkstatic_live_node_groups': (lambda m: m, lambda: NodeGroup.query().filter(NodeGroup.group_type==NodeGroup.NodeGroupType.live)), 'drinkstatic_all_node_groups': (lambda m: m, lambda: NodeGroup.query().filter(NodeGroup.group_type==NodeGroup.NodeGroupType.all_nodes)), 'drinkstatic_archived_node_groups': (lambda m: m, lambda: NodeGroup.query().filter(NodeGroup.group_type==NodeGroup.NodeGroupType.archived)) } context_results = memcache.get_multi(context_var_types.keys()) futures = {} for k,v in context_var_types.items(): if k not in context_results: futures[k] = v[1]().fetch_async() ndb.Future.wait_all(futures.values()) for k,v in futures.items(): context_results[k] = context_var_types[k][0](list(v.get_result())) memcache.set(k, context_results[k], time=settings.DRINKSTATIC_MEMCACHE_TIME) for k,v in context_results.items(): setattr(request, k, v)