storage: add 'Contains' and 'NotContains' operators (#5931)

This commit is contained in:
Frédéric Péters 2014-11-22 13:13:38 +01:00
parent 830eab99a7
commit d19b4ce3be
4 changed files with 31 additions and 0 deletions

View File

@ -501,6 +501,10 @@ def test_sql_table_select():
assert len(data_class.select([st.Less('id', 25), st.GreaterOrEqual('id', 10), lambda x: x.id >= 15])) == 10
assert len(data_class.select([st.NotEqual('id', 26)])) == 49
assert len(data_class.select([st.Contains('id', [24, 25, 26])])) == 3
assert len(data_class.select([st.Contains('id', [24, 25, 86])])) == 2
assert len(data_class.select([st.NotContains('id', [24, 25, 86])])) == 48
@postgresql
def test_sql_table_select_datetime():

View File

@ -205,6 +205,9 @@ def test_select():
assert len(Foobar.select([st.Less('unique_value', 26)])) == 25
assert len(Foobar.select([st.Less('unique_value', 25), st.GreaterOrEqual('unique_value', 10)])) == 15
assert len(Foobar.select([st.NotEqual('unique_value', 25)])) == 49
assert len(Foobar.select([st.Contains('unique_value', [24, 25, 26])])) == 3
assert len(Foobar.select([st.Contains('unique_value', [24, 25, 86])])) == 2
assert len(Foobar.select([st.NotContains('unique_value', [24, 25, 86])])) == 48
def test_select_datetime():

View File

@ -102,6 +102,18 @@ class LessOrEqual(Criteria):
class GreaterOrEqual(Criteria):
op = operator.ge
class Contains(Criteria):
op = operator.contains
def build_lambda(self):
return lambda x: self.op(self.value, getattr(x, self.attribute))
class NotContains(Criteria):
op = operator.contains
def build_lambda(self):
return lambda x: not self.op(self.value, getattr(x, self.attribute))
def parse_clause(clause):
# creates a callable out of a clause

View File

@ -79,6 +79,18 @@ class GreaterOrEqual(Criteria):
class NotEqual(Criteria):
sql_op = '!='
class Contains(Criteria):
sql_op = 'IN'
def as_sql(self):
return '%s %s %%(c%s)s' % (self.attribute, self.sql_op, id(self.value))
def as_sql_param(self):
return {'c%s' % id(self.value): tuple(self.value)}
class NotContains(Contains):
sql_op = 'NOT IN'
def get_name_as_sql_identifier(name):
name = qommon.misc.simplify(name)
for char in '<>|{}!?^*+/\'': # forbidden chars