diff --git a/tdrive/backend/node/src/core/platform/services/database/services/orm/connectors/postgres/postgres-query-builder.ts b/tdrive/backend/node/src/core/platform/services/database/services/orm/connectors/postgres/postgres-query-builder.ts index 7d13f095..441ff0b0 100644 --- a/tdrive/backend/node/src/core/platform/services/database/services/orm/connectors/postgres/postgres-query-builder.ts +++ b/tdrive/backend/node/src/core/platform/services/database/services/orm/connectors/postgres/postgres-query-builder.ts @@ -47,9 +47,18 @@ export class PostgresQueryBuilder { values.push(...inClause); } } else { - const value = `${this.dataTransformer.toDbString(filter, columnsDefinition[key].type)}`; - whereClause += `${key} = $${idx++} AND `; - values.push(value); + const isANotEqualFilter = filter && Object.keys(filter).join("") === "$ne"; + if (filter === null || (isANotEqualFilter && filter["$ne"] === null)) { + whereClause += `${key} IS${filter === null ? "" : " NOT"} NULL`; + } else { + const filterValue = isANotEqualFilter ? filter["$ne"] : filter; + const value = `${this.dataTransformer.toDbString( + filterValue, + columnsDefinition[key].type, + )}`; + whereClause += `${key} ${isANotEqualFilter ? "!=" : "="} $${idx++} AND `; + values.push(value); + } } }); } diff --git a/tdrive/backend/node/test/unit/core/services/database/services/orm/connectors/postgres/postgres-query-builder.test.ts b/tdrive/backend/node/test/unit/core/services/database/services/orm/connectors/postgres/postgres-query-builder.test.ts index 62f7e846..6145b1d9 100644 --- a/tdrive/backend/node/test/unit/core/services/database/services/orm/connectors/postgres/postgres-query-builder.test.ts +++ b/tdrive/backend/node/test/unit/core/services/database/services/orm/connectors/postgres/postgres-query-builder.test.ts @@ -105,6 +105,42 @@ describe('The PostgresQueryBuilder', () => { expect(query[1]).toEqual(options.$like.map(e=> `%${e[1]}%`)); }); + test('buildSelect query with IS NULL filter', async () => { + //given + const filters = { companu_id: null }; + + //when + const query = subj.buildSelect(TestDbEntity, filters, {}); + + //then + expect(normalizeWhitespace(query[0] as string)).toBe(`SELECT * FROM \"test_table\" WHERE companu_id IS NULL ORDER BY id DESC LIMIT 100 OFFSET 0`); + expect(query[1]).toEqual([]); + }); + + test('buildSelect query with not equal filter', async () => { + //given + const filters = { company_id: { $ne: '123' } }; + + //when + const query = subj.buildSelect(TestDbEntity, filters, {}); + + //then + expect(normalizeWhitespace(query[0] as string)).toBe(`SELECT * FROM "test_table" WHERE company_id != $1 ORDER BY id DESC LIMIT 100 OFFSET 0`); + expect(query[1]).toEqual([ '123' ]); + }); + + test('buildSelect query with IS NOT NULL filter', async () => { + //given + const filters = { company_id: { $ne: null } }; + + //when + const query = subj.buildSelect(TestDbEntity, filters, {}); + + //then + expect(normalizeWhitespace(query[0] as string)).toBe(`SELECT * FROM "test_table" WHERE company_id IS NOT NULL ORDER BY id DESC LIMIT 100 OFFSET 0`); + expect(query[1]).toEqual([]); + }); + test('buildDelete query', async () => { //given const entity = newTestDbEntity();