Skip to content

Commit 96bc6ec

Browse files
authored
Merge pull request #190 from devforth/fix-nq-filter
fix: fix nq and eq filters with null value
2 parents d985414 + 182ff2c commit 96bc6ec

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

adminforth/dataConnectors/clickhouse.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,19 @@ class ClickhouseConnector extends AdminForthBaseConnector implements IAdminForth
180180
let operator = this.OperatorsMap[filter.operator];
181181
if (filter.operator == AdminForthFilterOperators.IN || filter.operator == AdminForthFilterOperators.NIN) {
182182
placeholder = `(${filter.value.map((_, j) => `{p$?:${column._underlineType}}`).join(', ')})`;
183+
} else if (filter.operator == AdminForthFilterOperators.EQ && filter.value === null) {
184+
operator = 'IS';
185+
placeholder = 'NULL';
186+
} else if (filter.operator == AdminForthFilterOperators.NE) {
187+
if (filter.value === null) {
188+
operator = 'IS NOT';
189+
placeholder = 'NULL';
190+
} else {
191+
// for not equal, we need to add a null check
192+
// because nullish field will not match != value
193+
placeholder = `${placeholder} OR ${field} IS NULL)`;
194+
field = `(${field}`;
195+
}
183196
}
184197

185198
return `${field} ${operator} ${placeholder}`;
@@ -209,6 +222,12 @@ class ClickhouseConnector extends AdminForthBaseConnector implements IAdminForth
209222
return [{ 'f': `%${filter.value}%` }];
210223
} else if (filter.operator == AdminForthFilterOperators.IN || filter.operator == AdminForthFilterOperators.NIN) {
211224
return [{ 'p': filter.value }];
225+
} else if (filter.operator == AdminForthFilterOperators.EQ && filter.value === null) {
226+
// there is no param for IS NULL filter
227+
return [];
228+
} else if (filter.operator == AdminForthFilterOperators.NE && filter.value === null) {
229+
// there is no param for IS NOT NULL filter
230+
return [];
212231
} else {
213232
return [{ 'f': (filter as IAdminForthSingleFilter).value }];
214233
}

adminforth/dataConnectors/mysql.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ class MysqlConnector extends AdminForthBaseConnector implements IAdminForthDataS
192192
placeholder = `${placeholder} OR ${field} IS NULL)`;
193193
field = `(${field}`;
194194
}
195+
} else if (filter.operator == AdminForthFilterOperators.EQ && filter.value === null) {
196+
operator = 'IS';
197+
placeholder = 'NULL';
195198
}
196199
return `${field} ${operator} ${placeholder}`;
197200
}
@@ -219,6 +222,10 @@ class MysqlConnector extends AdminForthBaseConnector implements IAdminForthDataS
219222
return [`%${filter.value}%`];
220223
} else if (filter.operator == AdminForthFilterOperators.IN || filter.operator == AdminForthFilterOperators.NIN) {
221224
return filter.value;
225+
} else if (filter.operator == AdminForthFilterOperators.EQ && (filter as IAdminForthSingleFilter).value === null) {
226+
return [];
227+
} else if (filter.operator == AdminForthFilterOperators.NE && (filter as IAdminForthSingleFilter).value === null) {
228+
return [];
222229
} else {
223230
return [(filter as IAdminForthSingleFilter).value];
224231
}

adminforth/dataConnectors/postgres.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa
217217
(filter.operator == AdminForthFilterOperators.ILIKE || filter.operator == AdminForthFilterOperators.LIKE)
218218
) {
219219
field = `cast("${field}" as text)`
220+
} else if (filter.operator == AdminForthFilterOperators.EQ && filter.value === null) {
221+
operator = 'IS';
222+
placeholder = 'NULL';
220223
} else {
221224
field = `"${field}"`
222225
}
@@ -247,6 +250,8 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa
247250
return [`%${filter.value}%`];
248251
} else if (filter.operator == AdminForthFilterOperators.IN || filter.operator == AdminForthFilterOperators.NIN) {
249252
return filter.value;
253+
} else if (filter.operator == AdminForthFilterOperators.EQ && filter.value === null) {
254+
return [];
250255
} else {
251256
return [(filter as IAdminForthSingleFilter).value];
252257
}

0 commit comments

Comments
 (0)