diff -r 3e51c2a577dd -r 64639bc94e25 schema.py --- a/schema.py Thu Oct 20 14:22:16 2011 +0200 +++ b/schema.py Thu Oct 20 16:03:51 2011 +0200 @@ -850,23 +850,39 @@ return self._check(session, **kwargs) +def vargraph(rqlst): + """ builds an adjacency graph of variables from the rql syntax tree, e.g: + Any O,S WHERE T subworkflow_exit S, T subworkflow WF, O state_of WF + => {'WF': ['O', 'T'], 'S': ['T'], 'T': ['WF', 'S'], 'O': ['WF']} + """ + vargraph = {} + for relation in rqlst.get_nodes(nodes.Relation): + try: + rhsvarname = relation.children[1].children[0].variable.name + lhsvarname = relation.children[0].name + except AttributeError: + pass + else: + vargraph.setdefault(lhsvarname, []).append(rhsvarname) + vargraph.setdefault(rhsvarname, []).append(lhsvarname) + #vargraph[(lhsvarname, rhsvarname)] = relation.r_type + return vargraph + + +class GeneratedConstraint(object): + def __init__(self, rqlst, mainvars): + self.snippet_rqlst = rqlst + self.mainvars = mainvars + self.vargraph = vargraph(rqlst) + + class RRQLExpression(RQLExpression): def __init__(self, expression, mainvars=None, eid=None): if mainvars is None: mainvars = guess_rrqlexpr_mainvars(expression) RQLExpression.__init__(self, expression, mainvars, eid) # graph of links between variable, used by rql rewriter - self.vargraph = {} - for relation in self.rqlst.get_nodes(nodes.Relation): - try: - rhsvarname = relation.children[1].children[0].variable.name - lhsvarname = relation.children[0].name - except AttributeError: - pass - else: - self.vargraph.setdefault(lhsvarname, []).append(rhsvarname) - self.vargraph.setdefault(rhsvarname, []).append(lhsvarname) - #self.vargraph[(lhsvarname, rhsvarname)] = relation.r_type + self.vargraph = vargraph(self.rqlst) @property def full_rql(self):