Beispiel #1
0
def make_demand_query(symtab, query, left_clauses):
    """Create a demand query, update the query's demand_query attribute,
    and return the new demand query symbol.
    """
    ct = symtab.clausetools

    demquery_name = N.get_query_demand_query_name(query.name)

    demquery_tuple = L.tuplify(query.demand_params)
    demquery_tuple_type = symtab.analyze_expr_type(demquery_tuple)
    demquery_type = T.Set(demquery_tuple_type)

    demquery_comp = L.Comp(demquery_tuple, left_clauses)
    prefix = next(symtab.fresh_names.vars)
    demquery_comp = ct.comp_rename_lhs_vars(demquery_comp,
                                            lambda x: prefix + x)

    demquery_sym = symtab.define_query(demquery_name,
                                       type=demquery_type,
                                       node=demquery_comp,
                                       impl=query.impl)

    query.demand_query = demquery_name

    return demquery_sym
Beispiel #2
0
    def make_comp(self, struct):
        """Return the Comp node corresponding to a structure."""
        ct = self.symtab.clausetools
        resname = N.get_resultset_name

        if isinstance(struct, Filter):
            filter = struct
            vars = ct.lhs_vars(filter.clause)
            pred_clauses = []
            for t in filter.preds:
                tag = self.tags_by_name[t]
                pred_cl = L.RelMember([tag.tag_var], resname(tag.name))
                pred_clauses.append(pred_cl)
            return L.Comp(L.tuplify(vars), pred_clauses + [filter.clause])

        elif isinstance(struct, Tag):
            tag = struct
            return L.Comp(L.tuplify([tag.tag_var]), [tag.clause])

        else:
            assert ()
Beispiel #3
0
 def make_join_from_clauses(self, clauses):
     """Create a join from the given clauses."""
     lhs_vars = self.lhs_vars_from_clauses(clauses)
     resexp = L.tuplify(lhs_vars)
     return L.Comp(resexp, clauses)