848 assert creating == False |
848 assert creating == False |
849 return self._check(session, x=eid, **kwargs) |
849 return self._check(session, x=eid, **kwargs) |
850 return self._check(session, **kwargs) |
850 return self._check(session, **kwargs) |
851 |
851 |
852 |
852 |
|
853 def vargraph(rqlst): |
|
854 """ builds an adjacency graph of variables from the rql syntax tree, e.g: |
|
855 Any O,S WHERE T subworkflow_exit S, T subworkflow WF, O state_of WF |
|
856 => {'WF': ['O', 'T'], 'S': ['T'], 'T': ['WF', 'S'], 'O': ['WF']} |
|
857 """ |
|
858 vargraph = {} |
|
859 for relation in rqlst.get_nodes(nodes.Relation): |
|
860 try: |
|
861 rhsvarname = relation.children[1].children[0].variable.name |
|
862 lhsvarname = relation.children[0].name |
|
863 except AttributeError: |
|
864 pass |
|
865 else: |
|
866 vargraph.setdefault(lhsvarname, []).append(rhsvarname) |
|
867 vargraph.setdefault(rhsvarname, []).append(lhsvarname) |
|
868 #vargraph[(lhsvarname, rhsvarname)] = relation.r_type |
|
869 return vargraph |
|
870 |
|
871 |
|
872 class GeneratedConstraint(object): |
|
873 def __init__(self, rqlst, mainvars): |
|
874 self.snippet_rqlst = rqlst |
|
875 self.mainvars = mainvars |
|
876 self.vargraph = vargraph(rqlst) |
|
877 |
|
878 |
853 class RRQLExpression(RQLExpression): |
879 class RRQLExpression(RQLExpression): |
854 def __init__(self, expression, mainvars=None, eid=None): |
880 def __init__(self, expression, mainvars=None, eid=None): |
855 if mainvars is None: |
881 if mainvars is None: |
856 mainvars = guess_rrqlexpr_mainvars(expression) |
882 mainvars = guess_rrqlexpr_mainvars(expression) |
857 RQLExpression.__init__(self, expression, mainvars, eid) |
883 RQLExpression.__init__(self, expression, mainvars, eid) |
858 # graph of links between variable, used by rql rewriter |
884 # graph of links between variable, used by rql rewriter |
859 self.vargraph = {} |
885 self.vargraph = vargraph(self.rqlst) |
860 for relation in self.rqlst.get_nodes(nodes.Relation): |
|
861 try: |
|
862 rhsvarname = relation.children[1].children[0].variable.name |
|
863 lhsvarname = relation.children[0].name |
|
864 except AttributeError: |
|
865 pass |
|
866 else: |
|
867 self.vargraph.setdefault(lhsvarname, []).append(rhsvarname) |
|
868 self.vargraph.setdefault(rhsvarname, []).append(lhsvarname) |
|
869 #self.vargraph[(lhsvarname, rhsvarname)] = relation.r_type |
|
870 |
886 |
871 @property |
887 @property |
872 def full_rql(self): |
888 def full_rql(self): |
873 rql = self.minimal_rql |
889 rql = self.minimal_rql |
874 rqlst = getattr(self, 'rqlst', None) # may be not set yet |
890 rqlst = getattr(self, 'rqlst', None) # may be not set yet |