Beispiel #1
0
 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
Beispiel #2
0
 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])
Beispiel #3
0
 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
Beispiel #4
0
 def _aggregate(self):
     self.iter = leaf_it(self.iter)