operators of the underlying proxied attributes.
"""
-
- if self._value_is_scalar:
- value_expr = getattr(
- self.target_class, self.value_attr).has(criterion, **kwargs)
+ if self._target_is_object:
+ if self._value_is_scalar:
+ value_expr = getattr(
+ self.target_class, self.value_attr).has(
+ criterion, **kwargs)
+ else:
+ value_expr = getattr(
+ self.target_class, self.value_attr).any(
+ criterion, **kwargs)
else:
- value_expr = getattr(
- self.target_class, self.value_attr).any(criterion, **kwargs)
+ value_expr = criterion
# check _value_is_scalar here, otherwise
# we're scalar->scalar - call .any() so that
def define_tables(cls, metadata):
Table('userkeywords', metadata,
Column('keyword_id', Integer, ForeignKey('keywords.id'), primary_key=True),
- Column('user_id', Integer, ForeignKey('users.id'))
+ Column('user_id', Integer, ForeignKey('users.id')),
+ Column('value', String(50))
)
Table('users', metadata,
Column('id', Integer,
# nonuselist
singular_value = association_proxy('singular', 'value')
+ # o2m -> scalar
+ singular_collection = association_proxy('user_keywords', 'value')
+
class Keyword(cls.Comparable):
def __init__(self, keyword):
self.keyword = keyword
for jj in words[(ii % len(words)):((ii + 3) % len(words))]:
k = Keyword(jj)
user.keywords.append(k)
- if ii % 3 == None:
+ if ii % 2 == 0:
user.singular.keywords.append(k)
+ user.user_keywords[-1].value = "singular%d" % ii
orphan = Keyword('orphan')
orphan.user_keyword = UserKeyword(keyword=orphan, user=None)
def _equivalent(self, q_proxy, q_direct):
eq_(q_proxy.all(), q_direct.all())
+ def test_filter_any_criterion_ul_scalar(self):
+ UserKeyword, User = self.classes.UserKeyword, self.classes.User
+
+ q1 = self.session.query(User).filter(
+ User.singular_collection.any(UserKeyword.value == 'singular8'))
+ self.assert_compile(
+ q1,
+ "SELECT users.id AS users_id, users.name AS users_name, "
+ "users.singular_id AS users_singular_id "
+ "FROM users "
+ "WHERE EXISTS (SELECT 1 "
+ "FROM userkeywords "
+ "WHERE users.id = userkeywords.user_id AND "
+ "userkeywords.value = :value_1)",
+ checkparams={'value_1': 'singular8'}
+ )
+
+ q2 = self.session.query(User).filter(
+ User.user_keywords.any(UserKeyword.value == 'singular8'))
+ self._equivalent(q1, q2)
+
def test_filter_any_kwarg_ul_nul(self):
UserKeyword, User = self.classes.UserKeyword, self.classes.User