@budibase/backend-core 2.29.27 → 2.29.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +442 -312
- package/dist/index.js.map +4 -4
- package/dist/index.js.meta.json +1 -1
- package/dist/package.json +4 -4
- package/dist/plugins.js +1 -1
- package/dist/plugins.js.map +3 -3
- package/dist/plugins.js.meta.json +1 -1
- package/dist/src/sql/sql.js +395 -242
- package/dist/src/sql/sql.js.map +1 -1
- package/dist/src/sql/utils.js.map +1 -1
- package/package.json +4 -4
- package/src/sql/sql.ts +462 -297
- package/src/sql/utils.ts +1 -0
- package/dist/src/sql/sqlStatements.d.ts +0 -16
- package/dist/src/sql/sqlStatements.js +0 -66
- package/dist/src/sql/sqlStatements.js.map +0 -1
- package/src/sql/sqlStatements.ts +0 -87
package/dist/index.js
CHANGED
|
@@ -15440,7 +15440,7 @@ var require_cookie = __commonJS({
|
|
|
15440
15440
|
c.value = cookieValue;
|
|
15441
15441
|
return c;
|
|
15442
15442
|
}
|
|
15443
|
-
function
|
|
15443
|
+
function parse(str, options2) {
|
|
15444
15444
|
if (!options2 || typeof options2 !== "object") {
|
|
15445
15445
|
options2 = {};
|
|
15446
15446
|
}
|
|
@@ -15622,7 +15622,7 @@ var require_cookie = __commonJS({
|
|
|
15622
15622
|
});
|
|
15623
15623
|
}
|
|
15624
15624
|
Cookie2.cookiesCreated = 0;
|
|
15625
|
-
Cookie2.parse =
|
|
15625
|
+
Cookie2.parse = parse;
|
|
15626
15626
|
Cookie2.fromJSON = fromJSON;
|
|
15627
15627
|
Cookie2.prototype.key = "";
|
|
15628
15628
|
Cookie2.prototype.value = "";
|
|
@@ -16179,7 +16179,7 @@ var require_cookie = __commonJS({
|
|
|
16179
16179
|
exports.MemoryCookieStore = MemoryCookieStore;
|
|
16180
16180
|
exports.parseDate = parseDate;
|
|
16181
16181
|
exports.formatDate = formatDate;
|
|
16182
|
-
exports.parse =
|
|
16182
|
+
exports.parse = parse;
|
|
16183
16183
|
exports.fromJSON = fromJSON;
|
|
16184
16184
|
exports.domainMatch = domainMatch;
|
|
16185
16185
|
exports.defaultPath = defaultPath;
|
|
@@ -16381,7 +16381,7 @@ var require_aws_sign2 = __commonJS({
|
|
|
16381
16381
|
"../../node_modules/aws-sign2/index.js"(exports, module2) {
|
|
16382
16382
|
"use strict";
|
|
16383
16383
|
var crypto2 = require("crypto");
|
|
16384
|
-
var
|
|
16384
|
+
var parse = require("url").parse;
|
|
16385
16385
|
var keys2 = [
|
|
16386
16386
|
"acl",
|
|
16387
16387
|
"location",
|
|
@@ -16447,7 +16447,7 @@ var require_aws_sign2 = __commonJS({
|
|
|
16447
16447
|
}
|
|
16448
16448
|
module2.exports.canonicalizeHeaders = canonicalizeHeaders;
|
|
16449
16449
|
function canonicalizeResource(resource) {
|
|
16450
|
-
var url =
|
|
16450
|
+
var url = parse(resource, true), path3 = url.pathname, buf = [];
|
|
16451
16451
|
Object.keys(url.query).forEach(function(key) {
|
|
16452
16452
|
if (!~keys2.indexOf(key))
|
|
16453
16453
|
return;
|
|
@@ -41274,11 +41274,11 @@ var require_lib7 = __commonJS({
|
|
|
41274
41274
|
"../../node_modules/request/node_modules/qs/lib/index.js"(exports, module2) {
|
|
41275
41275
|
"use strict";
|
|
41276
41276
|
var stringify = require_stringify2();
|
|
41277
|
-
var
|
|
41277
|
+
var parse = require_parse();
|
|
41278
41278
|
var formats2 = require_formats();
|
|
41279
41279
|
module2.exports = {
|
|
41280
41280
|
formats: formats2,
|
|
41281
|
-
parse
|
|
41281
|
+
parse,
|
|
41282
41282
|
stringify
|
|
41283
41283
|
};
|
|
41284
41284
|
}
|
|
@@ -41870,7 +41870,7 @@ var require_uri_all = __commonJS({
|
|
|
41870
41870
|
}
|
|
41871
41871
|
var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
|
|
41872
41872
|
var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === void 0;
|
|
41873
|
-
function
|
|
41873
|
+
function parse(uriString) {
|
|
41874
41874
|
var options2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
41875
41875
|
var components = {};
|
|
41876
41876
|
var protocol = options2.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
|
|
@@ -42041,8 +42041,8 @@ var require_uri_all = __commonJS({
|
|
|
42041
42041
|
var skipNormalization = arguments[3];
|
|
42042
42042
|
var target = {};
|
|
42043
42043
|
if (!skipNormalization) {
|
|
42044
|
-
base3 =
|
|
42045
|
-
relative =
|
|
42044
|
+
base3 = parse(serialize(base3, options2), options2);
|
|
42045
|
+
relative = parse(serialize(relative, options2), options2);
|
|
42046
42046
|
}
|
|
42047
42047
|
options2 = options2 || {};
|
|
42048
42048
|
if (!options2.tolerant && relative.scheme) {
|
|
@@ -42093,24 +42093,24 @@ var require_uri_all = __commonJS({
|
|
|
42093
42093
|
}
|
|
42094
42094
|
function resolve(baseURI, relativeURI, options2) {
|
|
42095
42095
|
var schemelessOptions = assign({ scheme: "null" }, options2);
|
|
42096
|
-
return serialize(resolveComponents(
|
|
42096
|
+
return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
|
|
42097
42097
|
}
|
|
42098
42098
|
function normalize(uri, options2) {
|
|
42099
42099
|
if (typeof uri === "string") {
|
|
42100
|
-
uri = serialize(
|
|
42100
|
+
uri = serialize(parse(uri, options2), options2);
|
|
42101
42101
|
} else if (typeOf(uri) === "object") {
|
|
42102
|
-
uri =
|
|
42102
|
+
uri = parse(serialize(uri, options2), options2);
|
|
42103
42103
|
}
|
|
42104
42104
|
return uri;
|
|
42105
42105
|
}
|
|
42106
42106
|
function equal(uriA, uriB, options2) {
|
|
42107
42107
|
if (typeof uriA === "string") {
|
|
42108
|
-
uriA = serialize(
|
|
42108
|
+
uriA = serialize(parse(uriA, options2), options2);
|
|
42109
42109
|
} else if (typeOf(uriA) === "object") {
|
|
42110
42110
|
uriA = serialize(uriA, options2);
|
|
42111
42111
|
}
|
|
42112
42112
|
if (typeof uriB === "string") {
|
|
42113
|
-
uriB = serialize(
|
|
42113
|
+
uriB = serialize(parse(uriB, options2), options2);
|
|
42114
42114
|
} else if (typeOf(uriB) === "object") {
|
|
42115
42115
|
uriB = serialize(uriB, options2);
|
|
42116
42116
|
}
|
|
@@ -42125,7 +42125,7 @@ var require_uri_all = __commonJS({
|
|
|
42125
42125
|
var handler = {
|
|
42126
42126
|
scheme: "http",
|
|
42127
42127
|
domainHost: true,
|
|
42128
|
-
parse: function
|
|
42128
|
+
parse: function parse2(components, options2) {
|
|
42129
42129
|
if (!components.host) {
|
|
42130
42130
|
components.error = components.error || "HTTP URIs must have a host.";
|
|
42131
42131
|
}
|
|
@@ -42154,7 +42154,7 @@ var require_uri_all = __commonJS({
|
|
|
42154
42154
|
var handler$2 = {
|
|
42155
42155
|
scheme: "ws",
|
|
42156
42156
|
domainHost: true,
|
|
42157
|
-
parse: function
|
|
42157
|
+
parse: function parse2(components, options2) {
|
|
42158
42158
|
var wsComponents = components;
|
|
42159
42159
|
wsComponents.secure = isSecure(wsComponents);
|
|
42160
42160
|
wsComponents.resourceName = (wsComponents.path || "/") + (wsComponents.query ? "?" + wsComponents.query : "");
|
|
@@ -42330,7 +42330,7 @@ var require_uri_all = __commonJS({
|
|
|
42330
42330
|
var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
|
|
42331
42331
|
var handler$6 = {
|
|
42332
42332
|
scheme: "urn:uuid",
|
|
42333
|
-
parse: function
|
|
42333
|
+
parse: function parse2(urnComponents, options2) {
|
|
42334
42334
|
var uuidComponents = urnComponents;
|
|
42335
42335
|
uuidComponents.uuid = uuidComponents.nss;
|
|
42336
42336
|
uuidComponents.nss = void 0;
|
|
@@ -42355,7 +42355,7 @@ var require_uri_all = __commonJS({
|
|
|
42355
42355
|
exports2.SCHEMES = SCHEMES;
|
|
42356
42356
|
exports2.pctEncChar = pctEncChar;
|
|
42357
42357
|
exports2.pctDecChars = pctDecChars;
|
|
42358
|
-
exports2.parse =
|
|
42358
|
+
exports2.parse = parse;
|
|
42359
42359
|
exports2.removeDotSegments = removeDotSegments;
|
|
42360
42360
|
exports2.serialize = serialize;
|
|
42361
42361
|
exports2.resolveComponents = resolveComponents;
|
|
@@ -54462,6 +54462,15 @@ var DatasourceFeature = /* @__PURE__ */ ((DatasourceFeature2) => {
|
|
|
54462
54462
|
})(DatasourceFeature || {});
|
|
54463
54463
|
|
|
54464
54464
|
// ../types/src/sdk/search.ts
|
|
54465
|
+
var BasicOperator = /* @__PURE__ */ ((BasicOperator2) => {
|
|
54466
|
+
BasicOperator2["EQUAL"] = "equal";
|
|
54467
|
+
BasicOperator2["NOT_EQUAL"] = "notEqual";
|
|
54468
|
+
BasicOperator2["EMPTY"] = "empty";
|
|
54469
|
+
BasicOperator2["NOT_EMPTY"] = "notEmpty";
|
|
54470
|
+
BasicOperator2["FUZZY"] = "fuzzy";
|
|
54471
|
+
BasicOperator2["STRING"] = "string";
|
|
54472
|
+
return BasicOperator2;
|
|
54473
|
+
})(BasicOperator || {});
|
|
54465
54474
|
var ArrayOperator = /* @__PURE__ */ ((ArrayOperator2) => {
|
|
54466
54475
|
ArrayOperator2["CONTAINS"] = "contains";
|
|
54467
54476
|
ArrayOperator2["NOT_CONTAINS"] = "notContains";
|
|
@@ -54469,6 +54478,10 @@ var ArrayOperator = /* @__PURE__ */ ((ArrayOperator2) => {
|
|
|
54469
54478
|
ArrayOperator2["ONE_OF"] = "oneOf";
|
|
54470
54479
|
return ArrayOperator2;
|
|
54471
54480
|
})(ArrayOperator || {});
|
|
54481
|
+
var RangeOperator = /* @__PURE__ */ ((RangeOperator2) => {
|
|
54482
|
+
RangeOperator2["RANGE"] = "range";
|
|
54483
|
+
return RangeOperator2;
|
|
54484
|
+
})(RangeOperator || {});
|
|
54472
54485
|
|
|
54473
54486
|
// ../types/src/sdk/db.ts
|
|
54474
54487
|
var isDocument = (doc) => {
|
|
@@ -54520,7 +54533,7 @@ var PermissionType = /* @__PURE__ */ ((PermissionType2) => {
|
|
|
54520
54533
|
var isCloudAccount = (account) => account.hosting === "cloud" /* CLOUD */;
|
|
54521
54534
|
var isSSOAccount = (account) => account.authType === "sso" /* SSO */;
|
|
54522
54535
|
|
|
54523
|
-
// ../types/src/documents/app/automation.ts
|
|
54536
|
+
// ../types/src/documents/app/automation/automation.ts
|
|
54524
54537
|
var AutomationIOType = /* @__PURE__ */ ((AutomationIOType2) => {
|
|
54525
54538
|
AutomationIOType2["OBJECT"] = "object";
|
|
54526
54539
|
AutomationIOType2["STRING"] = "string";
|
|
@@ -54988,6 +55001,8 @@ function validate(cronExpression) {
|
|
|
54988
55001
|
// ../shared-core/src/helpers/schema.ts
|
|
54989
55002
|
var schema_exports = {};
|
|
54990
55003
|
__export(schema_exports, {
|
|
55004
|
+
decodeNonAscii: () => decodeNonAscii,
|
|
55005
|
+
encodeNonAscii: () => encodeNonAscii,
|
|
54991
55006
|
isDeprecatedSingleUserColumn: () => isDeprecatedSingleUserColumn,
|
|
54992
55007
|
isRequired: () => isRequired
|
|
54993
55008
|
});
|
|
@@ -54999,6 +55014,17 @@ function isRequired(constraints) {
|
|
|
54999
55014
|
const isRequired2 = !!constraints && (typeof constraints.presence !== "boolean" && constraints.presence?.allowEmpty === false || constraints.presence === true);
|
|
55000
55015
|
return isRequired2;
|
|
55001
55016
|
}
|
|
55017
|
+
function encodeNonAscii(str) {
|
|
55018
|
+
return str.split("").map((char) => {
|
|
55019
|
+
return char.charCodeAt(0) > 127 ? "\\u" + char.charCodeAt(0).toString(16).padStart(4, "0") : char;
|
|
55020
|
+
}).join("");
|
|
55021
|
+
}
|
|
55022
|
+
function decodeNonAscii(str) {
|
|
55023
|
+
return str.replace(
|
|
55024
|
+
/\\u([0-9a-fA-F]{4})/g,
|
|
55025
|
+
(match, p1) => String.fromCharCode(parseInt(p1, 16))
|
|
55026
|
+
);
|
|
55027
|
+
}
|
|
55002
55028
|
|
|
55003
55029
|
// ../shared-core/src/filters.ts
|
|
55004
55030
|
var import_lodash = require("lodash");
|
|
@@ -55102,7 +55128,7 @@ var getKeyNumbering = (key) => {
|
|
|
55102
55128
|
}
|
|
55103
55129
|
};
|
|
55104
55130
|
var ColumnSplitter = class {
|
|
55105
|
-
constructor(tables) {
|
|
55131
|
+
constructor(tables, opts) {
|
|
55106
55132
|
this.tableNames = tables.map((table) => table.name);
|
|
55107
55133
|
this.tableIds = tables.map((table) => table._id);
|
|
55108
55134
|
this.relationshipColumnNames = tables.flatMap(
|
|
@@ -55111,11 +55137,28 @@ var ColumnSplitter = class {
|
|
|
55111
55137
|
)
|
|
55112
55138
|
);
|
|
55113
55139
|
this.relationships = this.tableNames.concat(this.tableIds).concat(this.relationshipColumnNames).sort((a, b) => b.length - a.length);
|
|
55140
|
+
if (opts?.aliases) {
|
|
55141
|
+
this.aliases = {};
|
|
55142
|
+
for (const [key, value] of Object.entries(opts.aliases)) {
|
|
55143
|
+
this.aliases[value] = key;
|
|
55144
|
+
}
|
|
55145
|
+
}
|
|
55146
|
+
this.columnPrefix = opts?.columnPrefix;
|
|
55114
55147
|
}
|
|
55115
55148
|
run(key) {
|
|
55116
55149
|
let { prefix, key: splitKey } = getKeyNumbering(key);
|
|
55150
|
+
let tableName = void 0;
|
|
55151
|
+
if (this.aliases) {
|
|
55152
|
+
for (const possibleAlias of Object.keys(this.aliases || {})) {
|
|
55153
|
+
const withDot = `${possibleAlias}.`;
|
|
55154
|
+
if (splitKey.startsWith(withDot)) {
|
|
55155
|
+
tableName = this.aliases[possibleAlias];
|
|
55156
|
+
splitKey = splitKey.slice(withDot.length);
|
|
55157
|
+
}
|
|
55158
|
+
}
|
|
55159
|
+
}
|
|
55117
55160
|
let relationship;
|
|
55118
|
-
for (
|
|
55161
|
+
for (const possibleRelationship of this.relationships) {
|
|
55119
55162
|
const withDot = `${possibleRelationship}.`;
|
|
55120
55163
|
if (splitKey.startsWith(withDot)) {
|
|
55121
55164
|
const finalKeyParts = splitKey.split(withDot);
|
|
@@ -55125,7 +55168,13 @@ var ColumnSplitter = class {
|
|
|
55125
55168
|
break;
|
|
55126
55169
|
}
|
|
55127
55170
|
}
|
|
55171
|
+
if (this.columnPrefix) {
|
|
55172
|
+
if (splitKey.startsWith(this.columnPrefix)) {
|
|
55173
|
+
splitKey = decodeNonAscii(splitKey.slice(this.columnPrefix.length));
|
|
55174
|
+
}
|
|
55175
|
+
}
|
|
55128
55176
|
return {
|
|
55177
|
+
tableName,
|
|
55129
55178
|
numberPrefix: prefix,
|
|
55130
55179
|
relationshipPrefix: relationship,
|
|
55131
55180
|
column: splitKey
|
|
@@ -55466,7 +55515,7 @@ var sort = (docs, sort2, sortOrder, sortType = "string" /* STRING */) => {
|
|
|
55466
55515
|
if (!sort2 || !sortOrder || !sortType) {
|
|
55467
55516
|
return docs;
|
|
55468
55517
|
}
|
|
55469
|
-
const
|
|
55518
|
+
const parse = (x) => {
|
|
55470
55519
|
if (x == null) {
|
|
55471
55520
|
return x;
|
|
55472
55521
|
}
|
|
@@ -55476,8 +55525,8 @@ var sort = (docs, sort2, sortOrder, sortType = "string" /* STRING */) => {
|
|
|
55476
55525
|
return parseFloat(x);
|
|
55477
55526
|
};
|
|
55478
55527
|
return docs.slice().sort((a, b) => {
|
|
55479
|
-
const colA =
|
|
55480
|
-
const colB =
|
|
55528
|
+
const colA = parse(a[sort2]);
|
|
55529
|
+
const colB = parse(b[sort2]);
|
|
55481
55530
|
const result = colB == null || colA > colB ? 1 : -1;
|
|
55482
55531
|
if (sortOrder.toLowerCase() === "descending") {
|
|
55483
55532
|
return result * -1;
|
|
@@ -55514,6 +55563,7 @@ __export(utils_exports, {
|
|
|
55514
55563
|
filterValueToLabel: () => filterValueToLabel,
|
|
55515
55564
|
hasSchema: () => hasSchema,
|
|
55516
55565
|
parallelForeach: () => parallelForeach,
|
|
55566
|
+
trimOtherProps: () => trimOtherProps,
|
|
55517
55567
|
unreachable: () => unreachable
|
|
55518
55568
|
});
|
|
55519
55569
|
function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
|
|
@@ -55560,6 +55610,13 @@ function filterValueToLabel() {
|
|
|
55560
55610
|
function hasSchema(test) {
|
|
55561
55611
|
return typeof test === "object" && !Array.isArray(test) && test !== null && !(test instanceof Date) && Object.keys(test).length > 0;
|
|
55562
55612
|
}
|
|
55613
|
+
function trimOtherProps(object, allowedProps) {
|
|
55614
|
+
const result = Object.keys(object).filter((key) => allowedProps.includes(key)).reduce(
|
|
55615
|
+
(acc, key) => ({ ...acc, [key]: object[key] }),
|
|
55616
|
+
{}
|
|
55617
|
+
);
|
|
55618
|
+
return result;
|
|
55619
|
+
}
|
|
55563
55620
|
|
|
55564
55621
|
// ../shared-core/src/sdk/index.ts
|
|
55565
55622
|
var sdk_exports = {};
|
|
@@ -67424,62 +67481,6 @@ __export(sql_exports, {
|
|
|
67424
67481
|
// src/sql/sql.ts
|
|
67425
67482
|
var import_knex2 = require("knex");
|
|
67426
67483
|
|
|
67427
|
-
// src/sql/sqlStatements.ts
|
|
67428
|
-
var SqlStatements = class {
|
|
67429
|
-
constructor(client, table, { allOr, columnPrefix } = {}) {
|
|
67430
|
-
this.client = client;
|
|
67431
|
-
this.table = table;
|
|
67432
|
-
this.allOr = allOr;
|
|
67433
|
-
this.columnPrefix = columnPrefix;
|
|
67434
|
-
}
|
|
67435
|
-
getField(key) {
|
|
67436
|
-
const fieldName = key.split(".")[1];
|
|
67437
|
-
let found = this.table.schema[fieldName];
|
|
67438
|
-
if (!found && this.columnPrefix) {
|
|
67439
|
-
const prefixRemovedFieldName = fieldName.replace(this.columnPrefix, "");
|
|
67440
|
-
found = this.table.schema[prefixRemovedFieldName];
|
|
67441
|
-
}
|
|
67442
|
-
return found;
|
|
67443
|
-
}
|
|
67444
|
-
between(query, key, low, high) {
|
|
67445
|
-
const field = this.getField(key);
|
|
67446
|
-
if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
|
|
67447
|
-
query = query.whereRaw(
|
|
67448
|
-
`CAST(${key} AS INTEGER) BETWEEN CAST(? AS INTEGER) AND CAST(? AS INTEGER)`,
|
|
67449
|
-
[low, high]
|
|
67450
|
-
);
|
|
67451
|
-
} else {
|
|
67452
|
-
const fnc = this.allOr ? "orWhereBetween" : "whereBetween";
|
|
67453
|
-
query = query[fnc](key, [low, high]);
|
|
67454
|
-
}
|
|
67455
|
-
return query;
|
|
67456
|
-
}
|
|
67457
|
-
lte(query, key, low) {
|
|
67458
|
-
const field = this.getField(key);
|
|
67459
|
-
if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
|
|
67460
|
-
query = query.whereRaw(`CAST(${key} AS INTEGER) >= CAST(? AS INTEGER)`, [
|
|
67461
|
-
low
|
|
67462
|
-
]);
|
|
67463
|
-
} else {
|
|
67464
|
-
const fnc = this.allOr ? "orWhere" : "where";
|
|
67465
|
-
query = query[fnc](key, ">=", low);
|
|
67466
|
-
}
|
|
67467
|
-
return query;
|
|
67468
|
-
}
|
|
67469
|
-
gte(query, key, high) {
|
|
67470
|
-
const field = this.getField(key);
|
|
67471
|
-
if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
|
|
67472
|
-
query = query.whereRaw(`CAST(${key} AS INTEGER) <= CAST(? AS INTEGER)`, [
|
|
67473
|
-
high
|
|
67474
|
-
]);
|
|
67475
|
-
} else {
|
|
67476
|
-
const fnc = this.allOr ? "orWhere" : "where";
|
|
67477
|
-
query = query[fnc](key, "<=", high);
|
|
67478
|
-
}
|
|
67479
|
-
return query;
|
|
67480
|
-
}
|
|
67481
|
-
};
|
|
67482
|
-
|
|
67483
67484
|
// src/sql/sqlTable.ts
|
|
67484
67485
|
var import_knex = require("knex");
|
|
67485
67486
|
function isIgnoredType(type) {
|
|
@@ -67692,110 +67693,9 @@ var SqlTableQueryBuilder = class {
|
|
|
67692
67693
|
var sqlTable_default = SqlTableQueryBuilder;
|
|
67693
67694
|
|
|
67694
67695
|
// src/sql/sql.ts
|
|
67695
|
-
|
|
67696
|
-
|
|
67697
|
-
|
|
67698
|
-
switch (client) {
|
|
67699
|
-
case "sqlite3" /* SQL_LITE */:
|
|
67700
|
-
case "oracledb" /* ORACLE */:
|
|
67701
|
-
case "pg" /* POSTGRES */:
|
|
67702
|
-
return `"${str}"`;
|
|
67703
|
-
case "mssql" /* MS_SQL */:
|
|
67704
|
-
return `[${str}]`;
|
|
67705
|
-
case "mysql2" /* MY_SQL */:
|
|
67706
|
-
return `\`${str}\``;
|
|
67707
|
-
}
|
|
67708
|
-
}
|
|
67709
|
-
function quotedIdentifier(client, key) {
|
|
67710
|
-
return key.split(".").map((part) => quote(client, part)).join(".");
|
|
67711
|
-
}
|
|
67712
|
-
function parse(input) {
|
|
67713
|
-
if (Array.isArray(input)) {
|
|
67714
|
-
return JSON.stringify(input);
|
|
67715
|
-
}
|
|
67716
|
-
if (input == void 0) {
|
|
67717
|
-
return null;
|
|
67718
|
-
}
|
|
67719
|
-
if (typeof input !== "string") {
|
|
67720
|
-
return input;
|
|
67721
|
-
}
|
|
67722
|
-
if (isInvalidISODateString(input)) {
|
|
67723
|
-
return null;
|
|
67724
|
-
}
|
|
67725
|
-
if (isValidISODateString(input)) {
|
|
67726
|
-
return new Date(input.trim());
|
|
67727
|
-
}
|
|
67728
|
-
return input;
|
|
67729
|
-
}
|
|
67730
|
-
function parseBody(body2) {
|
|
67731
|
-
for (let [key, value] of Object.entries(body2)) {
|
|
67732
|
-
body2[key] = parse(value);
|
|
67733
|
-
}
|
|
67734
|
-
return body2;
|
|
67735
|
-
}
|
|
67736
|
-
function parseFilters(filters) {
|
|
67737
|
-
if (!filters) {
|
|
67738
|
-
return {};
|
|
67739
|
-
}
|
|
67740
|
-
for (let [key, value] of Object.entries(filters)) {
|
|
67741
|
-
let parsed;
|
|
67742
|
-
if (typeof value === "object") {
|
|
67743
|
-
parsed = parseFilters(value);
|
|
67744
|
-
} else {
|
|
67745
|
-
parsed = parse(value);
|
|
67746
|
-
}
|
|
67747
|
-
filters[key] = parsed;
|
|
67748
|
-
}
|
|
67749
|
-
return filters;
|
|
67750
|
-
}
|
|
67751
|
-
function generateSelectStatement(json, knex3) {
|
|
67752
|
-
const { resource, meta } = json;
|
|
67753
|
-
const client = knex3.client.config.client;
|
|
67754
|
-
if (!resource || !resource.fields || resource.fields.length === 0) {
|
|
67755
|
-
return "*";
|
|
67756
|
-
}
|
|
67757
|
-
const schema = meta.table.schema;
|
|
67758
|
-
return resource.fields.map((field) => {
|
|
67759
|
-
const parts = field.split(/\./g);
|
|
67760
|
-
let table = void 0;
|
|
67761
|
-
let column = void 0;
|
|
67762
|
-
if (parts.length === 1) {
|
|
67763
|
-
column = parts[0];
|
|
67764
|
-
}
|
|
67765
|
-
if (parts.length === 2) {
|
|
67766
|
-
table = parts[0];
|
|
67767
|
-
column = parts[1];
|
|
67768
|
-
}
|
|
67769
|
-
if (parts.length > 2) {
|
|
67770
|
-
table = parts[0];
|
|
67771
|
-
column = parts.slice(1).join(".");
|
|
67772
|
-
}
|
|
67773
|
-
if (!column) {
|
|
67774
|
-
throw new Error(`Invalid field name: ${field}`);
|
|
67775
|
-
}
|
|
67776
|
-
const columnSchema = schema[column];
|
|
67777
|
-
if (client === "pg" /* POSTGRES */ && columnSchema?.externalType?.includes("money")) {
|
|
67778
|
-
return knex3.raw(
|
|
67779
|
-
`${quotedIdentifier(
|
|
67780
|
-
client,
|
|
67781
|
-
[table, column].join(".")
|
|
67782
|
-
)}::money::numeric as ${quote(client, field)}`
|
|
67783
|
-
);
|
|
67784
|
-
}
|
|
67785
|
-
if (client === "mssql" /* MS_SQL */ && columnSchema?.type === "datetime" /* DATETIME */ && columnSchema.timeOnly) {
|
|
67786
|
-
return knex3.raw(`CONVERT(varchar, ${field}, 108) as "${field}"`);
|
|
67787
|
-
}
|
|
67788
|
-
if (table) {
|
|
67789
|
-
return knex3.raw(
|
|
67790
|
-
`${quote(client, table)}.${quote(client, column)} as ${quote(
|
|
67791
|
-
client,
|
|
67792
|
-
field
|
|
67793
|
-
)}`
|
|
67794
|
-
);
|
|
67795
|
-
} else {
|
|
67796
|
-
return knex3.raw(`${quote(client, field)} as ${quote(client, field)}`);
|
|
67797
|
-
}
|
|
67798
|
-
});
|
|
67696
|
+
function getBaseLimit() {
|
|
67697
|
+
const envLimit = environment_default.SQL_MAX_ROWS ? parseInt(environment_default.SQL_MAX_ROWS) : null;
|
|
67698
|
+
return envLimit || 5e3;
|
|
67799
67699
|
}
|
|
67800
67700
|
function getTableName(table) {
|
|
67801
67701
|
if (table?.sourceType === "internal" /* INTERNAL */ || table?.sourceId === INTERNAL_TABLE_SOURCE_ID) {
|
|
@@ -67820,23 +67720,203 @@ function convertBooleans(query) {
|
|
|
67820
67720
|
return query;
|
|
67821
67721
|
}
|
|
67822
67722
|
var InternalBuilder = class {
|
|
67823
|
-
constructor(client) {
|
|
67723
|
+
constructor(client, knex3, query) {
|
|
67824
67724
|
this.client = client;
|
|
67725
|
+
this.query = query;
|
|
67726
|
+
this.knex = knex3;
|
|
67727
|
+
this.splitter = new filters_exports.ColumnSplitter([this.table], {
|
|
67728
|
+
aliases: this.query.tableAliases,
|
|
67729
|
+
columnPrefix: this.query.meta.columnPrefix
|
|
67730
|
+
});
|
|
67731
|
+
}
|
|
67732
|
+
get table() {
|
|
67733
|
+
return this.query.meta.table;
|
|
67734
|
+
}
|
|
67735
|
+
getFieldSchema(key) {
|
|
67736
|
+
const { column } = this.splitter.run(key);
|
|
67737
|
+
return this.table.schema[column];
|
|
67738
|
+
}
|
|
67739
|
+
// Takes a string like foo and returns a quoted string like [foo] for SQL Server
|
|
67740
|
+
// and "foo" for Postgres.
|
|
67741
|
+
quote(str) {
|
|
67742
|
+
switch (this.client) {
|
|
67743
|
+
case "sqlite3" /* SQL_LITE */:
|
|
67744
|
+
case "oracledb" /* ORACLE */:
|
|
67745
|
+
case "pg" /* POSTGRES */:
|
|
67746
|
+
return `"${str}"`;
|
|
67747
|
+
case "mssql" /* MS_SQL */:
|
|
67748
|
+
return `[${str}]`;
|
|
67749
|
+
case "mysql2" /* MY_SQL */:
|
|
67750
|
+
return `\`${str}\``;
|
|
67751
|
+
}
|
|
67752
|
+
}
|
|
67753
|
+
// Takes a string like a.b.c and returns a quoted identifier like [a].[b].[c]
|
|
67754
|
+
// for SQL Server and `a`.`b`.`c` for MySQL.
|
|
67755
|
+
quotedIdentifier(key) {
|
|
67756
|
+
return key.split(".").map((part) => this.quote(part)).join(".");
|
|
67757
|
+
}
|
|
67758
|
+
generateSelectStatement() {
|
|
67759
|
+
const { resource, meta } = this.query;
|
|
67760
|
+
if (!resource || !resource.fields || resource.fields.length === 0) {
|
|
67761
|
+
return "*";
|
|
67762
|
+
}
|
|
67763
|
+
const schema = meta.table.schema;
|
|
67764
|
+
return resource.fields.map((field) => {
|
|
67765
|
+
const parts = field.split(/\./g);
|
|
67766
|
+
let table = void 0;
|
|
67767
|
+
let column = void 0;
|
|
67768
|
+
if (parts.length === 1) {
|
|
67769
|
+
column = parts[0];
|
|
67770
|
+
}
|
|
67771
|
+
if (parts.length === 2) {
|
|
67772
|
+
table = parts[0];
|
|
67773
|
+
column = parts[1];
|
|
67774
|
+
}
|
|
67775
|
+
if (parts.length > 2) {
|
|
67776
|
+
table = parts[0];
|
|
67777
|
+
column = parts.slice(1).join(".");
|
|
67778
|
+
}
|
|
67779
|
+
if (!column) {
|
|
67780
|
+
throw new Error(`Invalid field name: ${field}`);
|
|
67781
|
+
}
|
|
67782
|
+
const columnSchema = schema[column];
|
|
67783
|
+
if (this.client === "pg" /* POSTGRES */ && columnSchema?.externalType?.includes("money")) {
|
|
67784
|
+
return this.knex.raw(
|
|
67785
|
+
`${this.quotedIdentifier(
|
|
67786
|
+
[table, column].join(".")
|
|
67787
|
+
)}::money::numeric as ${this.quote(field)}`
|
|
67788
|
+
);
|
|
67789
|
+
}
|
|
67790
|
+
if (this.client === "mssql" /* MS_SQL */ && columnSchema?.type === "datetime" /* DATETIME */ && columnSchema.timeOnly) {
|
|
67791
|
+
return this.knex.raw(`CONVERT(varchar, ${field}, 108) as "${field}"`);
|
|
67792
|
+
}
|
|
67793
|
+
if (table) {
|
|
67794
|
+
return this.knex.raw(
|
|
67795
|
+
`${this.quote(table)}.${this.quote(column)} as ${this.quote(field)}`
|
|
67796
|
+
);
|
|
67797
|
+
} else {
|
|
67798
|
+
return this.knex.raw(`${this.quote(field)} as ${this.quote(field)}`);
|
|
67799
|
+
}
|
|
67800
|
+
});
|
|
67801
|
+
}
|
|
67802
|
+
// OracleDB can't use character-large-objects (CLOBs) in WHERE clauses,
|
|
67803
|
+
// so when we use them we need to wrap them in to_char(). This function
|
|
67804
|
+
// converts a field name to the appropriate identifier.
|
|
67805
|
+
convertClobs(field) {
|
|
67806
|
+
const parts = field.split(".");
|
|
67807
|
+
const col = parts.pop();
|
|
67808
|
+
const schema = this.table.schema[col];
|
|
67809
|
+
let identifier = this.quotedIdentifier(field);
|
|
67810
|
+
if (schema.type === "string" /* STRING */ || schema.type === "longform" /* LONGFORM */ || schema.type === "bb_reference_single" /* BB_REFERENCE_SINGLE */ || schema.type === "bb_reference" /* BB_REFERENCE */ || schema.type === "options" /* OPTIONS */ || schema.type === "barcodeqr" /* BARCODEQR */) {
|
|
67811
|
+
identifier = `to_char(${identifier})`;
|
|
67812
|
+
}
|
|
67813
|
+
return identifier;
|
|
67814
|
+
}
|
|
67815
|
+
parse(input, schema) {
|
|
67816
|
+
if (Array.isArray(input)) {
|
|
67817
|
+
return JSON.stringify(input);
|
|
67818
|
+
}
|
|
67819
|
+
if (input == void 0) {
|
|
67820
|
+
return null;
|
|
67821
|
+
}
|
|
67822
|
+
if (this.client === "oracledb" /* ORACLE */ && schema.type === "datetime" /* DATETIME */ && schema.timeOnly) {
|
|
67823
|
+
if (input instanceof Date) {
|
|
67824
|
+
const hours = input.getHours().toString().padStart(2, "0");
|
|
67825
|
+
const minutes = input.getMinutes().toString().padStart(2, "0");
|
|
67826
|
+
const seconds = input.getSeconds().toString().padStart(2, "0");
|
|
67827
|
+
return `${hours}:${minutes}:${seconds}`;
|
|
67828
|
+
}
|
|
67829
|
+
if (typeof input === "string") {
|
|
67830
|
+
return /* @__PURE__ */ new Date(`1970-01-01T${input}Z`);
|
|
67831
|
+
}
|
|
67832
|
+
}
|
|
67833
|
+
if (typeof input === "string") {
|
|
67834
|
+
if (isInvalidISODateString(input)) {
|
|
67835
|
+
return null;
|
|
67836
|
+
}
|
|
67837
|
+
if (isValidISODateString(input)) {
|
|
67838
|
+
return new Date(input.trim());
|
|
67839
|
+
}
|
|
67840
|
+
}
|
|
67841
|
+
return input;
|
|
67842
|
+
}
|
|
67843
|
+
parseBody(body2) {
|
|
67844
|
+
for (let [key, value] of Object.entries(body2)) {
|
|
67845
|
+
const { column } = this.splitter.run(key);
|
|
67846
|
+
const schema = this.table.schema[column];
|
|
67847
|
+
if (!schema) {
|
|
67848
|
+
continue;
|
|
67849
|
+
}
|
|
67850
|
+
body2[key] = this.parse(value, schema);
|
|
67851
|
+
}
|
|
67852
|
+
return body2;
|
|
67853
|
+
}
|
|
67854
|
+
parseFilters(filters) {
|
|
67855
|
+
for (const op of Object.values(BasicOperator)) {
|
|
67856
|
+
const filter = filters[op];
|
|
67857
|
+
if (!filter) {
|
|
67858
|
+
continue;
|
|
67859
|
+
}
|
|
67860
|
+
for (const key of Object.keys(filter)) {
|
|
67861
|
+
if (Array.isArray(filter[key])) {
|
|
67862
|
+
filter[key] = JSON.stringify(filter[key]);
|
|
67863
|
+
continue;
|
|
67864
|
+
}
|
|
67865
|
+
const { column } = this.splitter.run(key);
|
|
67866
|
+
const schema = this.table.schema[column];
|
|
67867
|
+
if (!schema) {
|
|
67868
|
+
continue;
|
|
67869
|
+
}
|
|
67870
|
+
filter[key] = this.parse(filter[key], schema);
|
|
67871
|
+
}
|
|
67872
|
+
}
|
|
67873
|
+
for (const op of Object.values(ArrayOperator)) {
|
|
67874
|
+
const filter = filters[op];
|
|
67875
|
+
if (!filter) {
|
|
67876
|
+
continue;
|
|
67877
|
+
}
|
|
67878
|
+
for (const key of Object.keys(filter)) {
|
|
67879
|
+
const { column } = this.splitter.run(key);
|
|
67880
|
+
const schema = this.table.schema[column];
|
|
67881
|
+
if (!schema) {
|
|
67882
|
+
continue;
|
|
67883
|
+
}
|
|
67884
|
+
filter[key] = filter[key].map((v) => this.parse(v, schema));
|
|
67885
|
+
}
|
|
67886
|
+
}
|
|
67887
|
+
for (const op of Object.values(RangeOperator)) {
|
|
67888
|
+
const filter = filters[op];
|
|
67889
|
+
if (!filter) {
|
|
67890
|
+
continue;
|
|
67891
|
+
}
|
|
67892
|
+
for (const key of Object.keys(filter)) {
|
|
67893
|
+
const { column } = this.splitter.run(key);
|
|
67894
|
+
const schema = this.table.schema[column];
|
|
67895
|
+
if (!schema) {
|
|
67896
|
+
continue;
|
|
67897
|
+
}
|
|
67898
|
+
const value = filter[key];
|
|
67899
|
+
if ("low" in value) {
|
|
67900
|
+
value.low = this.parse(value.low, schema);
|
|
67901
|
+
}
|
|
67902
|
+
if ("high" in value) {
|
|
67903
|
+
value.high = this.parse(value.high, schema);
|
|
67904
|
+
}
|
|
67905
|
+
}
|
|
67906
|
+
}
|
|
67907
|
+
return filters;
|
|
67825
67908
|
}
|
|
67826
67909
|
// right now we only do filters on the specific table being queried
|
|
67827
|
-
addFilters(query, filters,
|
|
67910
|
+
addFilters(query, filters, opts) {
|
|
67828
67911
|
if (!filters) {
|
|
67829
67912
|
return query;
|
|
67830
67913
|
}
|
|
67831
|
-
filters = parseFilters(filters);
|
|
67914
|
+
filters = this.parseFilters(filters);
|
|
67915
|
+
const aliases = this.query.tableAliases;
|
|
67832
67916
|
const allOr = filters.allOr;
|
|
67833
|
-
const
|
|
67834
|
-
allOr,
|
|
67835
|
-
columnPrefix: opts.columnPrefix
|
|
67836
|
-
});
|
|
67837
|
-
const tableName = this.client === "sqlite3" /* SQL_LITE */ ? table._id : table.name;
|
|
67917
|
+
const tableName = this.client === "sqlite3" /* SQL_LITE */ ? this.table._id : this.table.name;
|
|
67838
67918
|
function getTableAlias(name) {
|
|
67839
|
-
const alias =
|
|
67919
|
+
const alias = aliases?.[name];
|
|
67840
67920
|
return alias || name;
|
|
67841
67921
|
}
|
|
67842
67922
|
function iterate(structure, fn, complexKeyFn) {
|
|
@@ -67853,10 +67933,10 @@ var InternalBuilder = class {
|
|
|
67853
67933
|
),
|
|
67854
67934
|
castedTypeValue.values
|
|
67855
67935
|
);
|
|
67856
|
-
} else if (!opts
|
|
67936
|
+
} else if (!opts?.relationship && !isRelationshipField) {
|
|
67857
67937
|
const alias = getTableAlias(tableName);
|
|
67858
67938
|
fn(alias ? `${alias}.${updatedKey}` : updatedKey, value);
|
|
67859
|
-
} else if (opts
|
|
67939
|
+
} else if (opts?.relationship && isRelationshipField) {
|
|
67860
67940
|
const [filterTableName, property] = updatedKey.split(".");
|
|
67861
67941
|
const alias = getTableAlias(filterTableName);
|
|
67862
67942
|
fn(alias ? `${alias}.${property}` : property, value);
|
|
@@ -67870,10 +67950,9 @@ var InternalBuilder = class {
|
|
|
67870
67950
|
query = query[fnc](key, "ilike", `%${value}%`);
|
|
67871
67951
|
} else {
|
|
67872
67952
|
const rawFnc = `${fnc}Raw`;
|
|
67873
|
-
query = query[rawFnc](
|
|
67874
|
-
|
|
67875
|
-
|
|
67876
|
-
);
|
|
67953
|
+
query = query[rawFnc](`LOWER(${this.quotedIdentifier(key)}) LIKE ?`, [
|
|
67954
|
+
`%${value.toLowerCase()}%`
|
|
67955
|
+
]);
|
|
67877
67956
|
}
|
|
67878
67957
|
};
|
|
67879
67958
|
const contains = (mode, any = false) => {
|
|
@@ -67892,10 +67971,10 @@ var InternalBuilder = class {
|
|
|
67892
67971
|
const wrap = any ? "" : "'";
|
|
67893
67972
|
const op = any ? "\\?| array" : "@>";
|
|
67894
67973
|
const fieldNames = key.split(/\./g);
|
|
67895
|
-
const
|
|
67974
|
+
const table = fieldNames[0];
|
|
67896
67975
|
const col = fieldNames[1];
|
|
67897
67976
|
query = query[rawFnc](
|
|
67898
|
-
`${not}COALESCE("${
|
|
67977
|
+
`${not}COALESCE("${table}"."${col}"::jsonb ${op} ${wrap}${stringifyArray(
|
|
67899
67978
|
value,
|
|
67900
67979
|
any ? "'" : '"'
|
|
67901
67980
|
)}${wrap}, FALSE)`
|
|
@@ -67914,21 +67993,26 @@ var InternalBuilder = class {
|
|
|
67914
67993
|
const andOr = mode === filters?.containsAny ? " OR " : " AND ";
|
|
67915
67994
|
iterate(mode, (key, value) => {
|
|
67916
67995
|
let statement = "";
|
|
67996
|
+
const identifier = this.quotedIdentifier(key);
|
|
67917
67997
|
for (let i in value) {
|
|
67918
67998
|
if (typeof value[i] === "string") {
|
|
67919
67999
|
value[i] = `%"${value[i].toLowerCase()}"%`;
|
|
67920
68000
|
} else {
|
|
67921
68001
|
value[i] = `%${value[i]}%`;
|
|
67922
68002
|
}
|
|
67923
|
-
statement +=
|
|
67924
|
-
this.client,
|
|
67925
|
-
key
|
|
67926
|
-
)}), '') LIKE ?`;
|
|
68003
|
+
statement += `${statement ? andOr : ""}COALESCE(LOWER(${identifier}), '') LIKE ?`;
|
|
67927
68004
|
}
|
|
67928
68005
|
if (statement === "") {
|
|
67929
68006
|
return;
|
|
67930
68007
|
}
|
|
67931
|
-
|
|
68008
|
+
if (not) {
|
|
68009
|
+
query = query[rawFnc](
|
|
68010
|
+
`(NOT (${statement}) OR ${identifier} IS NULL)`,
|
|
68011
|
+
value
|
|
68012
|
+
);
|
|
68013
|
+
} else {
|
|
68014
|
+
query = query[rawFnc](statement, value);
|
|
68015
|
+
}
|
|
67932
68016
|
});
|
|
67933
68017
|
}
|
|
67934
68018
|
};
|
|
@@ -67937,10 +68021,23 @@ var InternalBuilder = class {
|
|
|
67937
68021
|
iterate(
|
|
67938
68022
|
filters.oneOf,
|
|
67939
68023
|
(key, array) => {
|
|
67940
|
-
|
|
68024
|
+
if (this.client === "oracledb" /* ORACLE */) {
|
|
68025
|
+
key = this.convertClobs(key);
|
|
68026
|
+
array = Array.isArray(array) ? array : [array];
|
|
68027
|
+
const binding = new Array(array.length).fill("?").join(",");
|
|
68028
|
+
query = query.whereRaw(`${key} IN (${binding})`, array);
|
|
68029
|
+
} else {
|
|
68030
|
+
query = query[fnc](key, Array.isArray(array) ? array : [array]);
|
|
68031
|
+
}
|
|
67941
68032
|
},
|
|
67942
68033
|
(key, array) => {
|
|
67943
|
-
|
|
68034
|
+
if (this.client === "oracledb" /* ORACLE */) {
|
|
68035
|
+
const keyStr = `(${key.map((k) => this.convertClobs(k)).join(",")})`;
|
|
68036
|
+
const binding = `(${array.map((a) => `(${new Array(a.length).fill("?").join(",")})`).join(",")})`;
|
|
68037
|
+
query = query.whereRaw(`${keyStr} IN ${binding}`, array.flat());
|
|
68038
|
+
} else {
|
|
68039
|
+
query = query[fnc](key, Array.isArray(array) ? array : [array]);
|
|
68040
|
+
}
|
|
67944
68041
|
}
|
|
67945
68042
|
);
|
|
67946
68043
|
}
|
|
@@ -67951,10 +68048,9 @@ var InternalBuilder = class {
|
|
|
67951
68048
|
query = query[fnc](key, "ilike", `${value}%`);
|
|
67952
68049
|
} else {
|
|
67953
68050
|
const rawFnc = `${fnc}Raw`;
|
|
67954
|
-
query = query[rawFnc](
|
|
67955
|
-
|
|
67956
|
-
|
|
67957
|
-
);
|
|
68051
|
+
query = query[rawFnc](`LOWER(${this.quotedIdentifier(key)}) LIKE ?`, [
|
|
68052
|
+
`${value.toLowerCase()}%`
|
|
68053
|
+
]);
|
|
67958
68054
|
}
|
|
67959
68055
|
});
|
|
67960
68056
|
}
|
|
@@ -67973,12 +68069,40 @@ var InternalBuilder = class {
|
|
|
67973
68069
|
value.high = "";
|
|
67974
68070
|
}
|
|
67975
68071
|
const lowValid = isValidFilter(value.low), highValid = isValidFilter(value.high);
|
|
68072
|
+
const schema = this.getFieldSchema(key);
|
|
68073
|
+
if (this.client === "oracledb" /* ORACLE */) {
|
|
68074
|
+
key = this.knex.raw(this.convertClobs(key));
|
|
68075
|
+
}
|
|
67976
68076
|
if (lowValid && highValid) {
|
|
67977
|
-
|
|
68077
|
+
if (schema?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
|
|
68078
|
+
query = query.whereRaw(
|
|
68079
|
+
`CAST(${key} AS INTEGER) BETWEEN CAST(? AS INTEGER) AND CAST(? AS INTEGER)`,
|
|
68080
|
+
[value.low, value.high]
|
|
68081
|
+
);
|
|
68082
|
+
} else {
|
|
68083
|
+
const fnc = allOr ? "orWhereBetween" : "whereBetween";
|
|
68084
|
+
query = query[fnc](key, [value.low, value.high]);
|
|
68085
|
+
}
|
|
67978
68086
|
} else if (lowValid) {
|
|
67979
|
-
|
|
68087
|
+
if (schema?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
|
|
68088
|
+
query = query.whereRaw(
|
|
68089
|
+
`CAST(${key} AS INTEGER) >= CAST(? AS INTEGER)`,
|
|
68090
|
+
[value.low]
|
|
68091
|
+
);
|
|
68092
|
+
} else {
|
|
68093
|
+
const fnc = allOr ? "orWhere" : "where";
|
|
68094
|
+
query = query[fnc](key, ">=", value.low);
|
|
68095
|
+
}
|
|
67980
68096
|
} else if (highValid) {
|
|
67981
|
-
|
|
68097
|
+
if (schema?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
|
|
68098
|
+
query = query.whereRaw(
|
|
68099
|
+
`CAST(${key} AS INTEGER) <= CAST(? AS INTEGER)`,
|
|
68100
|
+
[value.high]
|
|
68101
|
+
);
|
|
68102
|
+
} else {
|
|
68103
|
+
const fnc = allOr ? "orWhere" : "where";
|
|
68104
|
+
query = query[fnc](key, "<=", value.high);
|
|
68105
|
+
}
|
|
67982
68106
|
}
|
|
67983
68107
|
});
|
|
67984
68108
|
}
|
|
@@ -67987,20 +68111,18 @@ var InternalBuilder = class {
|
|
|
67987
68111
|
const fnc = allOr ? "orWhereRaw" : "whereRaw";
|
|
67988
68112
|
if (this.client === "mssql" /* MS_SQL */) {
|
|
67989
68113
|
query = query[fnc](
|
|
67990
|
-
`CASE WHEN ${quotedIdentifier(
|
|
67991
|
-
this.client,
|
|
67992
|
-
key
|
|
67993
|
-
)} = ? THEN 1 ELSE 0 END = 1`,
|
|
68114
|
+
`CASE WHEN ${this.quotedIdentifier(key)} = ? THEN 1 ELSE 0 END = 1`,
|
|
67994
68115
|
[value]
|
|
67995
68116
|
);
|
|
67996
68117
|
} else if (this.client === "oracledb" /* ORACLE */) {
|
|
68118
|
+
const identifier = this.convertClobs(key);
|
|
67997
68119
|
query = query[fnc](
|
|
67998
|
-
`
|
|
68120
|
+
`(${identifier} IS NOT NULL AND ${identifier} = ?)`,
|
|
67999
68121
|
[value]
|
|
68000
68122
|
);
|
|
68001
68123
|
} else {
|
|
68002
68124
|
query = query[fnc](
|
|
68003
|
-
`COALESCE(${quotedIdentifier(
|
|
68125
|
+
`COALESCE(${this.quotedIdentifier(key)} = ?, FALSE)`,
|
|
68004
68126
|
[value]
|
|
68005
68127
|
);
|
|
68006
68128
|
}
|
|
@@ -68011,20 +68133,18 @@ var InternalBuilder = class {
|
|
|
68011
68133
|
const fnc = allOr ? "orWhereRaw" : "whereRaw";
|
|
68012
68134
|
if (this.client === "mssql" /* MS_SQL */) {
|
|
68013
68135
|
query = query[fnc](
|
|
68014
|
-
`CASE WHEN ${quotedIdentifier(
|
|
68015
|
-
this.client,
|
|
68016
|
-
key
|
|
68017
|
-
)} = ? THEN 1 ELSE 0 END = 0`,
|
|
68136
|
+
`CASE WHEN ${this.quotedIdentifier(key)} = ? THEN 1 ELSE 0 END = 0`,
|
|
68018
68137
|
[value]
|
|
68019
68138
|
);
|
|
68020
68139
|
} else if (this.client === "oracledb" /* ORACLE */) {
|
|
68140
|
+
const identifier = this.convertClobs(key);
|
|
68021
68141
|
query = query[fnc](
|
|
68022
|
-
`
|
|
68142
|
+
`(${identifier} IS NOT NULL AND ${identifier} != ?) OR ${identifier} IS NULL`,
|
|
68023
68143
|
[value]
|
|
68024
68144
|
);
|
|
68025
68145
|
} else {
|
|
68026
68146
|
query = query[fnc](
|
|
68027
|
-
`COALESCE(${quotedIdentifier(
|
|
68147
|
+
`COALESCE(${this.quotedIdentifier(key)} != ?, TRUE)`,
|
|
68028
68148
|
[value]
|
|
68029
68149
|
);
|
|
68030
68150
|
}
|
|
@@ -68051,8 +68171,8 @@ var InternalBuilder = class {
|
|
|
68051
68171
|
if (filters.containsAny) {
|
|
68052
68172
|
contains(filters.containsAny, true);
|
|
68053
68173
|
}
|
|
68054
|
-
const tableRef =
|
|
68055
|
-
if (filters.documentType && !isExternalTable(table) && tableRef) {
|
|
68174
|
+
const tableRef = aliases?.[this.table._id] || this.table._id;
|
|
68175
|
+
if (filters.documentType && !isExternalTable(this.table) && tableRef) {
|
|
68056
68176
|
query.andWhereLike(
|
|
68057
68177
|
`${tableRef}._id`,
|
|
68058
68178
|
`${prefixed(filters.documentType)}%`
|
|
@@ -68060,34 +68180,39 @@ var InternalBuilder = class {
|
|
|
68060
68180
|
}
|
|
68061
68181
|
return query;
|
|
68062
68182
|
}
|
|
68063
|
-
addDistinctCount(query
|
|
68064
|
-
const
|
|
68065
|
-
const
|
|
68066
|
-
const
|
|
68067
|
-
const aliased = table.name && aliases?.[table.name] ? aliases[table.name] : table.name;
|
|
68183
|
+
addDistinctCount(query) {
|
|
68184
|
+
const primary = this.table.primary;
|
|
68185
|
+
const aliases = this.query.tableAliases;
|
|
68186
|
+
const aliased = this.table.name && aliases?.[this.table.name] ? aliases[this.table.name] : this.table.name;
|
|
68068
68187
|
if (!primary) {
|
|
68069
68188
|
throw new Error("SQL counting requires primary key to be supplied");
|
|
68070
68189
|
}
|
|
68071
68190
|
return query.countDistinct(`${aliased}.${primary[0]} as total`);
|
|
68072
68191
|
}
|
|
68073
|
-
addSorting(query
|
|
68074
|
-
let { sort: sort2 } =
|
|
68075
|
-
const
|
|
68076
|
-
const
|
|
68077
|
-
const
|
|
68078
|
-
const
|
|
68079
|
-
const aliased = tableName && aliases?.[tableName] ? aliases[tableName] : table?.name;
|
|
68192
|
+
addSorting(query) {
|
|
68193
|
+
let { sort: sort2 } = this.query;
|
|
68194
|
+
const primaryKey = this.table.primary;
|
|
68195
|
+
const tableName = getTableName(this.table);
|
|
68196
|
+
const aliases = this.query.tableAliases;
|
|
68197
|
+
const aliased = tableName && aliases?.[tableName] ? aliases[tableName] : this.table?.name;
|
|
68080
68198
|
if (!Array.isArray(primaryKey)) {
|
|
68081
68199
|
throw new Error("Sorting requires primary key to be specified for table");
|
|
68082
68200
|
}
|
|
68083
68201
|
if (sort2 && Object.keys(sort2 || {}).length > 0) {
|
|
68084
68202
|
for (let [key, value] of Object.entries(sort2)) {
|
|
68085
68203
|
const direction = value.direction === "ascending" /* ASCENDING */ ? "asc" : "desc";
|
|
68086
|
-
let nulls;
|
|
68087
|
-
if (this.client === "pg" /* POSTGRES */) {
|
|
68204
|
+
let nulls = void 0;
|
|
68205
|
+
if (this.client === "pg" /* POSTGRES */ || this.client === "oracledb" /* ORACLE */) {
|
|
68088
68206
|
nulls = value.direction === "ascending" /* ASCENDING */ ? "first" : "last";
|
|
68089
68207
|
}
|
|
68090
|
-
|
|
68208
|
+
let composite = `${aliased}.${key}`;
|
|
68209
|
+
if (this.client === "oracledb" /* ORACLE */) {
|
|
68210
|
+
query = query.orderByRaw(
|
|
68211
|
+
`${this.convertClobs(composite)} ${direction} nulls ${nulls}`
|
|
68212
|
+
);
|
|
68213
|
+
} else {
|
|
68214
|
+
query = query.orderBy(composite, direction, nulls);
|
|
68215
|
+
}
|
|
68091
68216
|
}
|
|
68092
68217
|
}
|
|
68093
68218
|
if (!sort2 || sort2[primaryKey[0]] === void 0) {
|
|
@@ -68162,23 +68287,41 @@ var InternalBuilder = class {
|
|
|
68162
68287
|
}
|
|
68163
68288
|
return query;
|
|
68164
68289
|
}
|
|
68165
|
-
|
|
68166
|
-
|
|
68167
|
-
|
|
68168
|
-
|
|
68169
|
-
|
|
68170
|
-
|
|
68171
|
-
|
|
68290
|
+
qualifiedKnex(opts) {
|
|
68291
|
+
let alias = this.query.tableAliases?.[this.query.endpoint.entityId];
|
|
68292
|
+
if (opts?.alias === false) {
|
|
68293
|
+
alias = void 0;
|
|
68294
|
+
} else if (typeof opts?.alias === "string") {
|
|
68295
|
+
alias = opts.alias;
|
|
68296
|
+
}
|
|
68297
|
+
return this.knex(
|
|
68298
|
+
this.tableNameWithSchema(this.query.endpoint.entityId, {
|
|
68299
|
+
alias,
|
|
68300
|
+
schema: this.query.endpoint.schema
|
|
68172
68301
|
})
|
|
68173
68302
|
);
|
|
68174
68303
|
}
|
|
68175
|
-
create(
|
|
68176
|
-
const {
|
|
68177
|
-
let query = this.
|
|
68178
|
-
const parsedBody = parseBody(body2);
|
|
68179
|
-
|
|
68180
|
-
|
|
68181
|
-
|
|
68304
|
+
create(opts) {
|
|
68305
|
+
const { body: body2 } = this.query;
|
|
68306
|
+
let query = this.qualifiedKnex({ alias: false });
|
|
68307
|
+
const parsedBody = this.parseBody(body2);
|
|
68308
|
+
if (this.client === "oracledb" /* ORACLE */) {
|
|
68309
|
+
for (const [column, schema] of Object.entries(
|
|
68310
|
+
this.query.meta.table.schema
|
|
68311
|
+
)) {
|
|
68312
|
+
if (schema.constraints?.presence === true || schema.type === "formula" /* FORMULA */ || schema.type === "auto" /* AUTO */ || schema.type === "link" /* LINK */) {
|
|
68313
|
+
continue;
|
|
68314
|
+
}
|
|
68315
|
+
const value = parsedBody[column];
|
|
68316
|
+
if (value == null) {
|
|
68317
|
+
parsedBody[column] = null;
|
|
68318
|
+
}
|
|
68319
|
+
}
|
|
68320
|
+
} else {
|
|
68321
|
+
for (let [key, value] of Object.entries(parsedBody)) {
|
|
68322
|
+
if (value == null) {
|
|
68323
|
+
delete parsedBody[key];
|
|
68324
|
+
}
|
|
68182
68325
|
}
|
|
68183
68326
|
}
|
|
68184
68327
|
if (opts.disableReturning) {
|
|
@@ -68187,40 +68330,40 @@ var InternalBuilder = class {
|
|
|
68187
68330
|
return query.insert(parsedBody).returning("*");
|
|
68188
68331
|
}
|
|
68189
68332
|
}
|
|
68190
|
-
bulkCreate(
|
|
68191
|
-
const {
|
|
68192
|
-
let query = this.
|
|
68333
|
+
bulkCreate() {
|
|
68334
|
+
const { body: body2 } = this.query;
|
|
68335
|
+
let query = this.qualifiedKnex({ alias: false });
|
|
68193
68336
|
if (!Array.isArray(body2)) {
|
|
68194
68337
|
return query;
|
|
68195
68338
|
}
|
|
68196
|
-
const parsedBody = body2.map((row) => parseBody(row));
|
|
68339
|
+
const parsedBody = body2.map((row) => this.parseBody(row));
|
|
68197
68340
|
return query.insert(parsedBody);
|
|
68198
68341
|
}
|
|
68199
|
-
bulkUpsert(
|
|
68200
|
-
const {
|
|
68201
|
-
let query = this.
|
|
68342
|
+
bulkUpsert() {
|
|
68343
|
+
const { body: body2 } = this.query;
|
|
68344
|
+
let query = this.qualifiedKnex({ alias: false });
|
|
68202
68345
|
if (!Array.isArray(body2)) {
|
|
68203
68346
|
return query;
|
|
68204
68347
|
}
|
|
68205
|
-
const parsedBody = body2.map((row) => parseBody(row));
|
|
68348
|
+
const parsedBody = body2.map((row) => this.parseBody(row));
|
|
68206
68349
|
if (this.client === "pg" /* POSTGRES */ || this.client === "sqlite3" /* SQL_LITE */ || this.client === "mysql2" /* MY_SQL */) {
|
|
68207
|
-
const primary =
|
|
68350
|
+
const primary = this.table.primary;
|
|
68208
68351
|
if (!primary) {
|
|
68209
68352
|
throw new Error("Primary key is required for upsert");
|
|
68210
68353
|
}
|
|
68211
68354
|
const ret = query.insert(parsedBody).onConflict(primary).merge();
|
|
68212
68355
|
return ret;
|
|
68213
|
-
} else if (this.client === "mssql" /* MS_SQL */) {
|
|
68356
|
+
} else if (this.client === "mssql" /* MS_SQL */ || this.client === "oracledb" /* ORACLE */) {
|
|
68214
68357
|
return query.insert(parsedBody);
|
|
68215
68358
|
}
|
|
68216
68359
|
return query.upsert(parsedBody);
|
|
68217
68360
|
}
|
|
68218
|
-
read(
|
|
68219
|
-
let { endpoint, filters, paginate, relationships, tableAliases } =
|
|
68361
|
+
read(opts = {}) {
|
|
68362
|
+
let { endpoint, filters, paginate, relationships, tableAliases } = this.query;
|
|
68220
68363
|
const { limits } = opts;
|
|
68221
68364
|
const counting = endpoint.operation === "COUNT" /* COUNT */;
|
|
68222
68365
|
const tableName = endpoint.entityId;
|
|
68223
|
-
let query = this.
|
|
68366
|
+
let query = this.qualifiedKnex();
|
|
68224
68367
|
let foundOffset = null;
|
|
68225
68368
|
let foundLimit = limits?.query || limits?.base;
|
|
68226
68369
|
if (paginate && paginate.page && paginate.limit) {
|
|
@@ -68241,23 +68384,20 @@ var InternalBuilder = class {
|
|
|
68241
68384
|
if (foundOffset != null) {
|
|
68242
68385
|
query = query.offset(foundOffset);
|
|
68243
68386
|
}
|
|
68244
|
-
query = this.addSorting(query
|
|
68387
|
+
query = this.addSorting(query);
|
|
68245
68388
|
}
|
|
68246
|
-
query = this.addFilters(query, filters
|
|
68247
|
-
columnPrefix: json.meta.columnPrefix,
|
|
68248
|
-
aliases: tableAliases
|
|
68249
|
-
});
|
|
68389
|
+
query = this.addFilters(query, filters);
|
|
68250
68390
|
const alias = tableAliases?.[tableName] || tableName;
|
|
68251
|
-
let preQuery =
|
|
68391
|
+
let preQuery = this.knex({
|
|
68252
68392
|
// the typescript definition for the knex constructor doesn't support this
|
|
68253
68393
|
// syntax, but it is the only way to alias a pre-query result as part of
|
|
68254
68394
|
// a query - there is an alias dictionary type, but it assumes it can only
|
|
68255
68395
|
// be a table name, not a pre-query
|
|
68256
68396
|
[alias]: query
|
|
68257
68397
|
});
|
|
68258
|
-
preQuery = !counting ? preQuery.select(generateSelectStatement(
|
|
68398
|
+
preQuery = !counting ? preQuery.select(this.generateSelectStatement()) : this.addDistinctCount(preQuery);
|
|
68259
68399
|
if (this.client !== "mssql" /* MS_SQL */ && !counting) {
|
|
68260
|
-
preQuery = this.addSorting(preQuery
|
|
68400
|
+
preQuery = this.addSorting(preQuery);
|
|
68261
68401
|
}
|
|
68262
68402
|
query = this.addRelationships(
|
|
68263
68403
|
preQuery,
|
|
@@ -68269,43 +68409,33 @@ var InternalBuilder = class {
|
|
|
68269
68409
|
if (limits?.base) {
|
|
68270
68410
|
query = query.limit(limits.base);
|
|
68271
68411
|
}
|
|
68272
|
-
return this.addFilters(query, filters,
|
|
68273
|
-
columnPrefix: json.meta.columnPrefix,
|
|
68274
|
-
relationship: true,
|
|
68275
|
-
aliases: tableAliases
|
|
68276
|
-
});
|
|
68412
|
+
return this.addFilters(query, filters, { relationship: true });
|
|
68277
68413
|
}
|
|
68278
|
-
update(
|
|
68279
|
-
const {
|
|
68280
|
-
let query = this.
|
|
68281
|
-
const parsedBody = parseBody(body2);
|
|
68282
|
-
query = this.addFilters(query, filters
|
|
68283
|
-
columnPrefix: json.meta.columnPrefix,
|
|
68284
|
-
aliases: tableAliases
|
|
68285
|
-
});
|
|
68414
|
+
update(opts) {
|
|
68415
|
+
const { body: body2, filters } = this.query;
|
|
68416
|
+
let query = this.qualifiedKnex();
|
|
68417
|
+
const parsedBody = this.parseBody(body2);
|
|
68418
|
+
query = this.addFilters(query, filters);
|
|
68286
68419
|
if (opts.disableReturning) {
|
|
68287
68420
|
return query.update(parsedBody);
|
|
68288
68421
|
} else {
|
|
68289
68422
|
return query.update(parsedBody).returning("*");
|
|
68290
68423
|
}
|
|
68291
68424
|
}
|
|
68292
|
-
delete(
|
|
68293
|
-
const {
|
|
68294
|
-
let query = this.
|
|
68295
|
-
query = this.addFilters(query, filters
|
|
68296
|
-
columnPrefix: json.meta.columnPrefix,
|
|
68297
|
-
aliases: tableAliases
|
|
68298
|
-
});
|
|
68425
|
+
delete(opts) {
|
|
68426
|
+
const { filters } = this.query;
|
|
68427
|
+
let query = this.qualifiedKnex();
|
|
68428
|
+
query = this.addFilters(query, filters);
|
|
68299
68429
|
if (opts.disableReturning) {
|
|
68300
68430
|
return query.delete();
|
|
68301
68431
|
} else {
|
|
68302
|
-
return query.delete().returning(generateSelectStatement(
|
|
68432
|
+
return query.delete().returning(this.generateSelectStatement());
|
|
68303
68433
|
}
|
|
68304
68434
|
}
|
|
68305
68435
|
};
|
|
68306
68436
|
var SqlQueryBuilder = class extends sqlTable_default {
|
|
68307
68437
|
// pass through client to get flavour of SQL
|
|
68308
|
-
constructor(client, limit2 =
|
|
68438
|
+
constructor(client, limit2 = getBaseLimit()) {
|
|
68309
68439
|
super(client);
|
|
68310
68440
|
this.limit = limit2;
|
|
68311
68441
|
}
|
|
@@ -68332,38 +68462,38 @@ var SqlQueryBuilder = class extends sqlTable_default {
|
|
|
68332
68462
|
const config = {
|
|
68333
68463
|
client: sqlClient
|
|
68334
68464
|
};
|
|
68335
|
-
if (sqlClient === "sqlite3" /* SQL_LITE */) {
|
|
68465
|
+
if (sqlClient === "sqlite3" /* SQL_LITE */ || sqlClient === "oracledb" /* ORACLE */) {
|
|
68336
68466
|
config.useNullAsDefault = true;
|
|
68337
68467
|
}
|
|
68338
68468
|
const client = (0, import_knex2.knex)(config);
|
|
68339
68469
|
let query;
|
|
68340
|
-
const builder = new InternalBuilder(sqlClient);
|
|
68470
|
+
const builder = new InternalBuilder(sqlClient, client, json);
|
|
68341
68471
|
switch (this._operation(json)) {
|
|
68342
68472
|
case "CREATE" /* CREATE */:
|
|
68343
|
-
query = builder.create(
|
|
68473
|
+
query = builder.create(opts);
|
|
68344
68474
|
break;
|
|
68345
68475
|
case "READ" /* READ */:
|
|
68346
|
-
query = builder.read(
|
|
68476
|
+
query = builder.read({
|
|
68347
68477
|
limits: {
|
|
68348
68478
|
query: this.limit,
|
|
68349
|
-
base:
|
|
68479
|
+
base: getBaseLimit()
|
|
68350
68480
|
}
|
|
68351
68481
|
});
|
|
68352
68482
|
break;
|
|
68353
68483
|
case "COUNT" /* COUNT */:
|
|
68354
|
-
query = builder.read(
|
|
68484
|
+
query = builder.read();
|
|
68355
68485
|
break;
|
|
68356
68486
|
case "UPDATE" /* UPDATE */:
|
|
68357
|
-
query = builder.update(
|
|
68487
|
+
query = builder.update(opts);
|
|
68358
68488
|
break;
|
|
68359
68489
|
case "DELETE" /* DELETE */:
|
|
68360
|
-
query = builder.delete(
|
|
68490
|
+
query = builder.delete(opts);
|
|
68361
68491
|
break;
|
|
68362
68492
|
case "BULK_CREATE" /* BULK_CREATE */:
|
|
68363
|
-
query = builder.bulkCreate(
|
|
68493
|
+
query = builder.bulkCreate();
|
|
68364
68494
|
break;
|
|
68365
68495
|
case "BULK_UPSERT" /* BULK_UPSERT */:
|
|
68366
|
-
query = builder.bulkUpsert(
|
|
68496
|
+
query = builder.bulkUpsert();
|
|
68367
68497
|
break;
|
|
68368
68498
|
case "CREATE_TABLE" /* CREATE_TABLE */:
|
|
68369
68499
|
case "UPDATE_TABLE" /* UPDATE_TABLE */:
|