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
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 ()
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)