storage: add 'Contains' and 'NotContains' operators (#5931)
This commit is contained in:
parent
830eab99a7
commit
d19b4ce3be
|
@ -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():
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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
|
||||
|
|
12
wcs/sql.py
12
wcs/sql.py
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue