Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support whereLike and whereILike #4779

Merged
merged 9 commits into from Oct 31, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 18 additions & 0 deletions lib/dialects/mssql/query/mssql-querycompiler.js
Expand Up @@ -535,6 +535,24 @@ class QueryCompiler_MSSQL extends QueryCompiler {
}
return offset;
}

whereLike(statement) {
return `${this._columnClause(
statement
)} collate SQL_Latin1_General_CP1_CS_AS ${this._not(
statement,
'like '
)}${this._valueClause(statement)}`;
}

whereILike(statement) {
return `${this._columnClause(
statement
)} collate SQL_Latin1_General_CP1_CI_AS ${this._not(
statement,
'like '
)}${this._valueClause(statement)}`;
}
}

// Set the QueryBuilder & QueryCompiler on the client object,
Expand Down
14 changes: 14 additions & 0 deletions lib/dialects/mysql/query/mysql-querycompiler.js
Expand Up @@ -153,6 +153,20 @@ class QueryCompiler_MySQL extends QueryCompiler {
);
return `limit ${limit}`;
}

whereLike(statement) {
return `${this._columnClause(statement)} ${this._not(
statement,
'like '
)}${this._valueClause(statement)} COLLATE utf8_bin`;
}

whereILike(statement) {
return `${this._columnClause(statement)} ${this._not(
statement,
'like '
)}${this._valueClause(statement)}`;
}
}

// Set the QueryBuilder & QueryCompiler on the client object,
Expand Down
2 changes: 2 additions & 0 deletions lib/query/method-constants.js
Expand Up @@ -25,6 +25,8 @@ module.exports = [
'fullOuterJoin',
'crossJoin',
'where',
'whereLike',
'whereILike',
'andWhere',
'orWhere',
'whereNot',
Expand Down
23 changes: 23 additions & 0 deletions lib/query/querybuilder.js
Expand Up @@ -611,6 +611,29 @@ class Builder extends EventEmitter {
return this._bool('or').whereNotBetween(column, values);
}

_whereLike(type, column, value) {
this._statements.push({
grouping: 'where',
type: type,
column,
value: value,
not: this._not(),
bool: this._bool(),
asColumn: this._asColumnFlag,
});
return this;
}

// Adds a `where like` clause to the query.
whereLike(column, value) {
return this._whereLike('whereLike', column, value);
}

// Adds a `where ilike` clause to the query.
whereILike(column, value) {
return this._whereLike('whereILike', column, value);
}

// Adds a `group by` clause to the query.
groupBy(item) {
if (item && item.isRawInstance) {
Expand Down
54 changes: 39 additions & 15 deletions lib/query/querycompiler.js
Expand Up @@ -882,7 +882,23 @@ class QueryCompiler {
// Where Clause
// ------

whereIn(statement) {
_valueClause(statement) {
return statement.asColumn
? wrap_(
statement.value,
undefined,
this.builder,
this.client,
this.bindingsHolder
)
: this.client.parameter(
statement.value,
this.builder,
this.bindingsHolder
);
}

_columnClause(statement) {
let columns;
if (Array.isArray(statement.column)) {
columns = `(${columnize_(
Expand All @@ -900,13 +916,33 @@ class QueryCompiler {
this.bindingsHolder
);
}
return columns;
}

whereIn(statement) {
const values = this.client.values(
statement.value,
this.builder,
this.bindingsHolder
);
return `${columns} ${this._not(statement, 'in ')}${values}`;
return `${this._columnClause(statement)} ${this._not(
statement,
'in '
)}${values}`;
}

whereLike(statement) {
return `${this._columnClause(statement)} ${this._not(
statement,
'like '
)}${this._valueClause(statement)}`;
}

whereILike(statement) {
return `${this._columnClause(statement)} ${this._not(
statement,
'ilike '
)}${this._valueClause(statement)}`;
}

whereNull(statement) {
Expand Down Expand Up @@ -942,19 +978,7 @@ class QueryCompiler {
this.bindingsHolder
) +
' ' +
(statement.asColumn
? wrap_(
statement.value,
undefined,
this.builder,
this.client,
this.bindingsHolder
)
: this.client.parameter(
statement.value,
this.builder,
this.bindingsHolder
))
this._valueClause(statement)
);
}

Expand Down
17 changes: 16 additions & 1 deletion test/integration2/migrate/migration-integration.spec.js
Expand Up @@ -913,7 +913,22 @@ describe('Migrations', function () {
});
}

it('is not able to run two migrations in parallel when transactions are disabled', function () {
/** TODO : fix me and enabled it.
* Fail randomly with (mostly with PostgreSQL, PgNative, CockroachDb):
* knex.migrate.latest in parallel
* is not able to run two migrations in parallel when transactions are disabled:

* AssertionError: expected false to equal true
* + expected - actual

* -false
* +true

* at /home/runner/work/knex/knex/test/integration2/migrate/migration-integration.spec.js:944:37
* at runMicrotasks (<anonymous>)
* at processTicksAndRejections (internal/process/task_queues.js:95:5)
*/
it.skip('is not able to run two migrations in parallel when transactions are disabled', function () {
const migrations = [
knex.migrate
.latest({
Expand Down