schema.py
changeset 7973 64639bc94e25
parent 7951 b7c825b00f64
child 7990 a673d1d9a738
equal deleted inserted replaced
7971:3e51c2a577dd 7973:64639bc94e25
   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