equal
deleted
inserted
replaced
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': |