Beispiel #1
0
 def get_loop_for_join(self, comp, body, query_name):
     """Given a join, create code for iterating over it and running
     body. The join is wrapped in a Query node with the given name.
     """
     assert self.is_join(comp)
     vars = self.lhs_vars_from_comp(comp)
     return (L.DecompFor(vars, L.Query(query_name, comp, None), body), )
Beispiel #2
0
    def generic_visit(self, node):
        node = super().generic_visit(node)

        # Wrap in Query if it's one of the queries we're given.
        name = self.query_name_map.get(node, None)
        if name is not None:
            self.found.add(node)
            node = L.Query(name, node, None)

        return node
 def rewrite_aggr(self, symbol, name, aggr):
     # Only operate on min and max nodes.
     if isinstance(aggr.op, L.Min):
         func = 'min2'
     elif isinstance(aggr.op, L.Max):
         func = 'max2'
     else:
         return
     
     parts = L.get_setunion(aggr.value)
     if len(parts) <= 1:
         return
     multiple_queries = \
         len([p for p in parts if not isinstance(p, L.Set)]) > 1
     
     i = 2
     done_first_query = False
     new_parts = []
     for p in parts:
         if isinstance(p, L.Set):
             # Flatten the literal elements as arguments to
             # min2/max2.
             new_parts.extend(p.elts)
         else:
             new_query_node = aggr._replace(value=p)
             if done_first_query:
                 # Create a new query symbol and node for this
                 # non-literal argument.
                 new_name = name + '_aggrop' + str(i)
                 i += 1
                 new_parts.append(L.Query(new_name, new_query_node,
                                          None))
                 symtab.define_query(new_name, node=new_query_node,
                                     impl=symbol.impl)
             else:
                 # Push the Query node down to the first non-literal
                 # argument.
                 new_parts.append(L.Query(name, new_query_node, None))
                 symbol.node = new_query_node
                 done_first_query = True
     
     return L.Call(func, new_parts)
 def query_helper(self, node):
     first = node is self.firstnode
     
     node = self.generic_visit(node)
     
     # Don't process first node if requested to skip.
     if first:
         return node
     
     name = next(symtab.fresh_names.queries)
     symtab.define_query(name, node=node)
     node = L.Query(name, node, None)
     return node
Beispiel #5
0
 def make_node(self):
     """Return a Query node for this query symbol, with no
     annotation.
     """
     return L.Query(self.name, self.node, None)