rittenhop-dev/versions/5.94.2/node_modules/knex/lib/dialects/cockroachdb/crdb-querycompiler.js

123 lines
3.1 KiB
JavaScript
Raw Normal View History

2024-09-23 19:40:12 -04:00
const QueryCompiler_PG = require('../postgres/query/pg-querycompiler');
const {
columnize: columnize_,
wrap: wrap_,
operator: operator_,
} = require('../../formatter/wrappingFormatter');
class QueryCompiler_CRDB extends QueryCompiler_PG {
truncate() {
return `truncate ${this.tableName}`;
}
upsert() {
let sql = this._upsert();
if (sql === '') return sql;
const { returning } = this.single;
if (returning) sql += this._returning(returning);
return {
sql: sql,
returning,
};
}
_upsert() {
const upsertValues = this.single.upsert || [];
const sql = this.with() + `upsert into ${this.tableName} `;
const body = this._insertBody(upsertValues);
return body === '' ? '' : sql + body;
}
_groupOrder(item, type) {
// CockroachDB don't support PostgreSQL order nulls first/last syntax, we take the generic one.
return this._basicGroupOrder(item, type);
}
whereJsonPath(statement) {
let castValue = '';
if (!isNaN(statement.value) && parseInt(statement.value)) {
castValue = '::int';
} else if (!isNaN(statement.value) && parseFloat(statement.value)) {
castValue = '::float';
} else {
castValue = " #>> '{}'";
}
return `json_extract_path(${this._columnClause(
statement
)}, ${this.client.toArrayPathFromJsonPath(
statement.jsonPath,
this.builder,
this.bindingsHolder
)})${castValue} ${operator_(
statement.operator,
this.builder,
this.client,
this.bindingsHolder
)} ${this._jsonValueClause(statement)}`;
}
// Json common functions
_jsonExtract(nameFunction, params) {
let extractions;
if (Array.isArray(params.column)) {
extractions = params.column;
} else {
extractions = [params];
}
return extractions
.map((extraction) => {
const jsonCol = `json_extract_path(${columnize_(
extraction.column || extraction[0],
this.builder,
this.client,
this.bindingsHolder
)}, ${this.client.toArrayPathFromJsonPath(
extraction.path || extraction[1],
this.builder,
this.bindingsHolder
)})`;
const alias = extraction.alias || extraction[2];
return alias
? this.client.alias(jsonCol, this.formatter.wrap(alias))
: jsonCol;
})
.join(', ');
}
_onJsonPathEquals(nameJoinFunction, clause) {
return (
'json_extract_path(' +
wrap_(
clause.columnFirst,
undefined,
this.builder,
this.client,
this.bindingsHolder
) +
', ' +
this.client.toArrayPathFromJsonPath(
clause.jsonPathFirst,
this.builder,
this.bindingsHolder
) +
') = json_extract_path(' +
wrap_(
clause.columnSecond,
undefined,
this.builder,
this.client,
this.bindingsHolder
) +
', ' +
this.client.toArrayPathFromJsonPath(
clause.jsonPathSecond,
this.builder,
this.bindingsHolder
) +
')'
);
}
}
module.exports = QueryCompiler_CRDB;