Fixes for not contains in oracle.

This commit is contained in:
mike12345567 2024-07-30 18:22:20 +01:00
parent b470ecc7d9
commit 7cc000a838
2 changed files with 22 additions and 19 deletions

View File

@ -3,10 +3,10 @@ import * as dbCore from "../db"
import { import {
getNativeSql, getNativeSql,
isExternalTable, isExternalTable,
isValidISODateString,
isValidFilter,
sqlLog,
isInvalidISODateString, isInvalidISODateString,
isValidFilter,
isValidISODateString,
sqlLog,
} from "./utils" } from "./utils"
import SqlTableQueryBuilder from "./sqlTable" import SqlTableQueryBuilder from "./sqlTable"
import { import {
@ -433,27 +433,30 @@ class InternalBuilder {
const andOr = mode === filters?.containsAny ? " OR " : " AND " const andOr = mode === filters?.containsAny ? " OR " : " AND "
iterate(mode, (key, value) => { iterate(mode, (key, value) => {
let statement = "" let statement = ""
const identifier = this.quotedIdentifier(key)
for (let i in value) { for (let i in value) {
if (typeof value[i] === "string") { if (typeof value[i] === "string") {
value[i] = `%"${value[i].toLowerCase()}"%` value[i] = `%"${value[i].toLowerCase()}"%`
} else { } else {
value[i] = `%${value[i]}%` value[i] = `%${value[i]}%`
} }
const identifier = this.quotedIdentifier(key) statement += `${
statement += statement ? andOr : "" statement ? andOr : ""
if (not) { }COALESCE(LOWER(${identifier}), '') LIKE ?`
statement += `(NOT COALESCE(LOWER(${identifier}), '') LIKE ? OR ${identifier} IS NULL)`
} else {
statement += `COALESCE(LOWER(${identifier}), '') LIKE ?`
}
} }
if (statement === "") { if (statement === "") {
return return
} }
// @ts-ignore if (not) {
query = query[rawFnc](
`(NOT (${statement}) OR ${identifier} IS NULL)`,
value
)
} else {
query = query[rawFnc](statement, value) query = query[rawFnc](statement, value)
}
}) })
} }
} }

View File

@ -40,13 +40,13 @@ import { structures } from "@budibase/backend-core/tests"
import { DEFAULT_EMPLOYEE_TABLE_SCHEMA } from "../../../db/defaultData/datasource_bb_default" import { DEFAULT_EMPLOYEE_TABLE_SCHEMA } from "../../../db/defaultData/datasource_bb_default"
describe.each([ describe.each([
// ["in-memory", undefined], ["in-memory", undefined],
// ["lucene", undefined], ["lucene", undefined],
// ["sqs", undefined], ["sqs", undefined],
// [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)],
// [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)],
// [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)], [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)],
// [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)], [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)],
[DatabaseName.ORACLE, getDatasource(DatabaseName.ORACLE)], [DatabaseName.ORACLE, getDatasource(DatabaseName.ORACLE)],
])("search (%s)", (name, dsProvider) => { ])("search (%s)", (name, dsProvider) => {
const isSqs = name === "sqs" const isSqs = name === "sqs"