rqlrewrite.py
changeset 7562 cdef82ca9eab
parent 7555 c3bf459268d7
child 7843 3b51806da60b
equal deleted inserted replaced
7554:fdace9d67d96 7562:cdef82ca9eab
   465     def _may_be_shared_with(self, sniprel, target):
   465     def _may_be_shared_with(self, sniprel, target):
   466         """if the snippet relation can be skipped to use a relation from the
   466         """if the snippet relation can be skipped to use a relation from the
   467         original query, return that relation node
   467         original query, return that relation node
   468         """
   468         """
   469         rschema = self.schema.rschema(sniprel.r_type)
   469         rschema = self.schema.rschema(sniprel.r_type)
       
   470         stmt = self.current_statement()
   470         for vi in self.varinfos:
   471         for vi in self.varinfos:
   471             try:
   472             try:
   472                 if target == 'object':
   473                 if target == 'object':
   473                     orel = vi['lhs_rels'][sniprel.r_type]
   474                     orel = vi['lhs_rels'][sniprel.r_type]
   474                     cardindex = 0
   475                     cardindex = 0
   480                     ttypes_func = rschema.subjects
   481                     ttypes_func = rschema.subjects
   481                     rdef = lambda x, y: rschema.rdef(y, x)
   482                     rdef = lambda x, y: rschema.rdef(y, x)
   482             except KeyError:
   483             except KeyError:
   483                 # may be raised by vi['xhs_rels'][sniprel.r_type]
   484                 # may be raised by vi['xhs_rels'][sniprel.r_type]
   484                 return None
   485                 return None
       
   486             # don't share if relation's statement is not the current statement
       
   487             if orel.stmt is not stmt:
       
   488                 return None
   485             # can't share neged relation or relations with different outer join
   489             # can't share neged relation or relations with different outer join
   486             if (orel.neged(strict=True) or sniprel.neged(strict=True)
   490             if (orel.neged(strict=True) or sniprel.neged(strict=True)
   487                 or (orel.optional and orel.optional != sniprel.optional)):
   491                 or (orel.optional and orel.optional != sniprel.optional)):
   488                 return None
   492                 return None
   489             # if cardinality is in '?1', we can ignore the snippet relation and use
   493             # if cardinality is in '?1', we can ignore the snippet relation and use
   496         return orel
   500         return orel
   497 
   501 
   498     def _use_orig_term(self, snippet_varname, term):
   502     def _use_orig_term(self, snippet_varname, term):
   499         key = (self.current_expr, self.varmap, snippet_varname)
   503         key = (self.current_expr, self.varmap, snippet_varname)
   500         if key in self.rewritten:
   504         if key in self.rewritten:
   501             insertedvar = self.select.defined_vars.pop(self.rewritten[key])
   505             stmt = self.current_statement()
       
   506             insertedvar = stmt.defined_vars.pop(self.rewritten[key])
   502             for inserted_vref in insertedvar.references():
   507             for inserted_vref in insertedvar.references():
   503                 inserted_vref.parent.replace(inserted_vref, term.copy(self.select))
   508                 inserted_vref.parent.replace(inserted_vref, term.copy(stmt))
   504         self.rewritten[key] = term.name
   509         self.rewritten[key] = term.name
   505 
   510 
   506     def _get_varname_or_term(self, vname):
   511     def _get_varname_or_term(self, vname):
   507         stmt = self.current_statement()
   512         stmt = self.current_statement()
   508         if vname == 'U':
   513         if vname == 'U':