def visit_apply(self, query): self.visit(query[2]) id1s = list(leaf_it(self.root)) visitor = self.__class__(id1s) visitor.root = self.root visitor.visit(query[1]) self.iter = visitor.iter
def visit_assoc(self, query): if (len(query) > 2): self.visit(query[2]) assoc = query[1] self.parent_key = assoc # TODO: investigate if eager computation here is necessary self.parent_iter = iter(list(leaf_it(self.root))) self.iter = walk(self.root) self._visit_driver_assoc(self.iter, assoc, self.driver_assoc) self.iter = iter([self.root])
async def visit_edge(self, query): await self.visit_child(query.child) self.root, tmp_root = await aitertools.tee(self.root) # Tee is necessary because iteration over parent_iter # could leave the _visit_edge with an empty (already consumed) # iterator it1, it2 = await aitertools.tee(leaf_it(tmp_root)) self.parent_key = query.edge_name # Unbound query. Fill in input from the parent query._unbound._items = it1 self.parent_iter = self._visit_edge(it2, self.parent_key, query._unbound) self.iter = self.root
def _aggregate(self): self.iter = leaf_it(self.iter)