def _criterion_exists(self, criterion=None, **kwargs): if getattr(self, "_of_type", None): target_mapper = self._of_type to_selectable = target_mapper._with_polymorphic_selectable if self.prop._is_self_referential(): to_selectable = to_selectable.alias() single_crit = target_mapper._single_table_criterion if single_crit: if criterion is not None: criterion = single_crit & criterion else: criterion = single_crit else: to_selectable = None if self.adapter: source_selectable = self.__clause_element__() else: source_selectable = None pj, sj, source, dest, secondary, target_adapter = self.prop._create_joins( dest_polymorphic=True, dest_selectable=to_selectable, source_selectable=source_selectable ) for k in kwargs: crit = self.prop.mapper.class_manager[k] == kwargs[k] if criterion is None: criterion = crit else: criterion = criterion & crit # annotate the *local* side of the join condition, in the case of pj + sj this # is the full primaryjoin, in the case of just pj its the local side of # the primaryjoin. if sj: j = _orm_annotate(pj) & sj else: j = _orm_annotate(pj, exclude=self.prop.remote_side) if criterion and target_adapter: # limit this adapter to annotated only? criterion = target_adapter.traverse(criterion) # only have the "joined left side" of what we return be subject to Query adaption. The right # side of it is used for an exists() subquery and should not correlate or otherwise reach out # to anything in the enclosing query. if criterion: criterion = criterion._annotate({"_halt_adapt": True}) crit = j & criterion return sql.exists([1], crit, from_obj=dest).correlate(source)
def _criterion_exists(self, criterion=None, **kwargs): if getattr(self, '_of_type', None): target_mapper = self._of_type to_selectable = target_mapper._with_polymorphic_selectable if self.property._is_self_referential(): to_selectable = to_selectable.alias() single_crit = target_mapper._single_table_criterion if single_crit: if criterion is not None: criterion = single_crit & criterion else: criterion = single_crit else: to_selectable = None if self.adapter: source_selectable = self.__clause_element__() else: source_selectable = None pj, sj, source, dest, secondary, target_adapter = \ self.property._create_joins(dest_polymorphic=True, dest_selectable=to_selectable, source_selectable=source_selectable) for k in kwargs: crit = self.property.mapper.class_manager[k] == kwargs[k] if criterion is None: criterion = crit else: criterion = criterion & crit # annotate the *local* side of the join condition, in the case of pj + sj this # is the full primaryjoin, in the case of just pj its the local side of # the primaryjoin. if sj: j = _orm_annotate(pj) & sj else: j = _orm_annotate(pj, exclude=self.property.remote_side) if criterion and target_adapter: # limit this adapter to annotated only? criterion = target_adapter.traverse(criterion) # only have the "joined left side" of what we return be subject to Query adaption. The right # side of it is used for an exists() subquery and should not correlate or otherwise reach out # to anything in the enclosing query. if criterion: criterion = criterion._annotate({'_halt_adapt': True}) crit = j & criterion return sql.exists([1], crit, from_obj=dest).correlate(source)