|
8 | 8 | from api_tabular import config |
9 | 9 |
|
10 | 10 | TYPE_POSSIBILITIES = { |
11 | | - "string": ["compare", "contains", "differs", "exact", "in", "sort", "groupby", "count"], |
| 11 | + "string": [ |
| 12 | + "compare", |
| 13 | + "contains", |
| 14 | + "notcontains", |
| 15 | + "differs", |
| 16 | + "exact", |
| 17 | + "in", |
| 18 | + "notin", |
| 19 | + "sort", |
| 20 | + "groupby", |
| 21 | + "count", |
| 22 | + ], |
12 | 23 | "float": [ |
13 | 24 | "compare", |
14 | 25 | "differs", |
15 | 26 | "exact", |
16 | 27 | "in", |
| 28 | + "notin", |
17 | 29 | "sort", |
18 | 30 | "groupby", |
19 | 31 | "count", |
|
27 | 39 | "differs", |
28 | 40 | "exact", |
29 | 41 | "in", |
| 42 | + "notin", |
30 | 43 | "sort", |
31 | 44 | "groupby", |
32 | 45 | "count", |
|
35 | 48 | "min", |
36 | 49 | "sum", |
37 | 50 | ], |
38 | | - "bool": ["differs", "exact", "in", "sort", "groupby", "count"], |
39 | | - "date": ["compare", "contains", "differs", "exact", "in", "sort", "groupby", "count"], |
40 | | - "datetime": ["compare", "contains", "differs", "exact", "in", "sort", "groupby", "count"], |
41 | | - "json": ["contains", "differs", "exact", "in", "groupby", "count"], |
| 51 | + "bool": ["differs", "exact", "sort", "groupby", "count"], |
| 52 | + "date": [ |
| 53 | + "compare", |
| 54 | + "contains", |
| 55 | + "notcontains", |
| 56 | + "differs", |
| 57 | + "exact", |
| 58 | + "in", |
| 59 | + "notin", |
| 60 | + "sort", |
| 61 | + "groupby", |
| 62 | + "count", |
| 63 | + ], |
| 64 | + "datetime": [ |
| 65 | + "compare", |
| 66 | + "contains", |
| 67 | + "notcontains", |
| 68 | + "differs", |
| 69 | + "exact", |
| 70 | + "in", |
| 71 | + "notin", |
| 72 | + "sort", |
| 73 | + "groupby", |
| 74 | + "count", |
| 75 | + ], |
| 76 | + # TODO: JSON needs special treatment for operators to work |
| 77 | + "json": [], |
42 | 78 | } |
43 | 79 |
|
44 | 80 | MAP_TYPES = { |
|
61 | 97 | "name": "{}__contains", |
62 | 98 | "description": "String contains in column: {} ({}__contains=value)", |
63 | 99 | }, |
| 100 | + "notcontains": { |
| 101 | + "name": "{}__notcontains", |
| 102 | + "description": "String does not contain in column: {} ({}__notcontains=value)", |
| 103 | + }, |
64 | 104 | "in": { |
65 | 105 | "name": "{}__in", |
66 | 106 | "description": "Value in list in column: {} ({}__in=value1,value2,...)", |
67 | 107 | }, |
| 108 | + "notin": { |
| 109 | + "name": "{}__notin", |
| 110 | + "description": "Value not in list in column: {} ({}__notin=value1,value2,...)", |
| 111 | + }, |
68 | 112 | "groupby": { |
69 | 113 | "name": "{}__groupby", |
70 | 114 | "description": "Performs `group by values` operation in column: {}", |
@@ -114,7 +158,7 @@ def build_sql_query_string( |
114 | 158 | request_arg: list, |
115 | 159 | resource_id: str | None = None, |
116 | 160 | indexes: set | None = None, |
117 | | - page_size: int = None, |
| 161 | + page_size: int | None = None, |
118 | 162 | offset: int = 0, |
119 | 163 | ) -> str: |
120 | 164 | sql_query = [] |
@@ -190,8 +234,12 @@ def add_filter(argument: str, value: str, indexes: set | None) -> tuple[str | No |
190 | 234 | return f"{column}=neq.{value}", False |
191 | 235 | elif normalized_comparator == "contains": |
192 | 236 | return f"{column}=ilike.*{value}*", False |
| 237 | + elif normalized_comparator == "notcontains": |
| 238 | + return f"{column}=not.ilike.*{value}*", False |
193 | 239 | elif normalized_comparator == "in": |
194 | 240 | return f"{column}=in.({value})", False |
| 241 | + elif normalized_comparator == "notin": |
| 242 | + return f"{column}=not.in.({value})", False |
195 | 243 | elif normalized_comparator == "less": |
196 | 244 | return f"{column}=lte.{value}", False |
197 | 245 | elif normalized_comparator == "greater": |
|
0 commit comments