@carbonorm/carbonnode 6.0.20 → 6.1.0
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/README.md +46 -1
- package/dist/constants/C6Constants.d.ts +342 -338
- package/dist/executors/SqlExecutor.d.ts +1 -0
- package/dist/index.cjs.js +538 -254
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +531 -255
- package/dist/index.esm.js.map +1 -1
- package/dist/orm/builders/AggregateBuilder.d.ts +5 -1
- package/dist/orm/builders/ConditionBuilder.d.ts +2 -3
- package/dist/orm/builders/ExpressionSerializer.d.ts +22 -0
- package/dist/orm/builders/PaginationBuilder.d.ts +4 -6
- package/dist/orm/queryHelpers.d.ts +12 -1
- package/dist/types/mysqlTypes.d.ts +6 -1
- package/dist/types/ormInterfaces.d.ts +6 -5
- package/package.json +2 -2
- package/scripts/assets/handlebars/C6.test.ts.handlebars +4 -4
- package/src/__tests__/expressServer.e2e.test.ts +26 -17
- package/src/__tests__/httpExecutorSingular.e2e.test.ts +53 -14
- package/src/__tests__/normalizeSingularRequest.test.ts +26 -8
- package/src/__tests__/sakila-db/C6.js +1 -1
- package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
- package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
- package/src/__tests__/sakila-db/C6.sqlAllowList.json +1 -1
- package/src/__tests__/sakila-db/C6.test.ts +4 -4
- package/src/__tests__/sakila-db/C6.ts +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +6 -6
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +19 -12
- package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +4 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +4 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +4 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +10 -10
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +4 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +4 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +4 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.join.json +10 -10
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +6 -6
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
- package/src/__tests__/sqlBuilders.complex.test.ts +62 -74
- package/src/__tests__/sqlBuilders.expressions.test.ts +58 -30
- package/src/__tests__/sqlBuilders.test.ts +68 -4
- package/src/constants/C6Constants.ts +3 -1
- package/src/executors/HttpExecutor.ts +2 -1
- package/src/executors/SqlExecutor.ts +25 -1
- package/src/index.ts +1 -0
- package/src/orm/builders/AggregateBuilder.ts +67 -106
- package/src/orm/builders/ConditionBuilder.ts +69 -93
- package/src/orm/builders/ExpressionSerializer.ts +275 -0
- package/src/orm/builders/PaginationBuilder.ts +24 -34
- package/src/orm/queryHelpers.ts +29 -0
- package/src/types/mysqlTypes.ts +130 -9
- package/src/types/ormInterfaces.ts +6 -7
- package/src/utils/normalizeSingularRequest.ts +11 -4
package/dist/index.cjs.js
CHANGED
|
@@ -163,6 +163,7 @@ var C6Constants = {
|
|
|
163
163
|
AND: 'AND',
|
|
164
164
|
BETWEEN: 'BETWEEN',
|
|
165
165
|
CONCAT: 'CONCAT',
|
|
166
|
+
CALL: 'CALL',
|
|
166
167
|
CONVERT_TZ: 'CONVERT_TZ',
|
|
167
168
|
COUNT: 'COUNT',
|
|
168
169
|
COUNT_ALL: 'COUNT_ALL',
|
|
@@ -217,6 +218,7 @@ var C6Constants = {
|
|
|
217
218
|
LESS_THAN: '<',
|
|
218
219
|
LESS_THAN_OR_EQUAL_TO: '<=',
|
|
219
220
|
LIKE: 'LIKE',
|
|
221
|
+
LIT: 'LIT',
|
|
220
222
|
LIMIT: 'LIMIT',
|
|
221
223
|
LOCALTIME: 'LOCALTIME',
|
|
222
224
|
LOCALTIMESTAMP: 'LOCALTIMESTAMP',
|
|
@@ -954,7 +956,7 @@ function colorSql(sql) {
|
|
|
954
956
|
return s;
|
|
955
957
|
}
|
|
956
958
|
|
|
957
|
-
var version = "6.0
|
|
959
|
+
var version = "6.1.0";
|
|
958
960
|
|
|
959
961
|
var DEFAULT_STEP = 8;
|
|
960
962
|
function parseSemver(version) {
|
|
@@ -1291,16 +1293,16 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1291
1293
|
}
|
|
1292
1294
|
query = this.request;
|
|
1293
1295
|
apiRequest = function () { return tslib.__awaiter(_this, void 0, void 0, function () {
|
|
1294
|
-
var _a, debug, _b, cacheResults, dataInsertMultipleRows, success,
|
|
1295
|
-
var
|
|
1296
|
+
var _a, debug, _b, cacheResults, _c, skipReactBootstrap, dataInsertMultipleRows, success, _d, fetchDependencies, _e, error, cachingConfirmed, cacheRequestData, cacheAllowListStatus, evictFromCache, querySerialized, cachedRequest, cachedData, apiResponse, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKeyList, primaryKeyFullyQualified, primaryKey, whereVal, whereIsEmpty, providedPrimary, primaryVal, axiosActiveRequest_1;
|
|
1297
|
+
var _f;
|
|
1296
1298
|
var _this = this;
|
|
1297
|
-
var
|
|
1298
|
-
return tslib.__generator(this, function (
|
|
1299
|
-
switch (
|
|
1299
|
+
var _g, _h, _j, _k, _l, _m;
|
|
1300
|
+
return tslib.__generator(this, function (_o) {
|
|
1301
|
+
switch (_o.label) {
|
|
1300
1302
|
case 0:
|
|
1301
|
-
_a = this.request, debug = _a.debug, _b = _a.cacheResults, cacheResults = _b === void 0 ? (C6.GET === requestMethod) : _b, dataInsertMultipleRows = _a.dataInsertMultipleRows, success = _a.success,
|
|
1303
|
+
_a = this.request, debug = _a.debug, _b = _a.cacheResults, cacheResults = _b === void 0 ? (C6.GET === requestMethod) : _b, _c = _a.skipReactBootstrap, skipReactBootstrap = _c === void 0 ? false : _c, dataInsertMultipleRows = _a.dataInsertMultipleRows, success = _a.success, _d = _a.fetchDependencies, fetchDependencies = _d === void 0 ? exports.eFetchDependencies.NONE : _d, _e = _a.error, error = _e === void 0 ? "An unexpected API error occurred!" : _e;
|
|
1302
1304
|
if (C6.GET === requestMethod
|
|
1303
|
-
&& undefined !== ((
|
|
1305
|
+
&& undefined !== ((_g = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _g === void 0 ? void 0 : _g[C6.PAGE])
|
|
1304
1306
|
&& 1 !== query[C6.PAGINATION][C6.PAGE]
|
|
1305
1307
|
&& isLocal()
|
|
1306
1308
|
&& shouldLog(exports.LogLevel.DEBUG, logContext)) {
|
|
@@ -1335,7 +1337,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1335
1337
|
if (!cachedRequest) return [3 /*break*/, 2];
|
|
1336
1338
|
return [4 /*yield*/, cachedRequest];
|
|
1337
1339
|
case 1:
|
|
1338
|
-
cachedData = (
|
|
1340
|
+
cachedData = (_o.sent()).data;
|
|
1339
1341
|
if (evictFromCache
|
|
1340
1342
|
&& cachedData
|
|
1341
1343
|
&& typeof cachedData === "object"
|
|
@@ -1357,9 +1359,9 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1357
1359
|
needsConditionOrPrimaryCheck = (PUT === requestMethod || DELETE === requestMethod)
|
|
1358
1360
|
&& false === skipPrimaryCheck;
|
|
1359
1361
|
TABLES = C6.TABLES;
|
|
1360
|
-
primaryKeyList = structuredClone((
|
|
1362
|
+
primaryKeyList = structuredClone((_h = TABLES[operatingTable]) === null || _h === void 0 ? void 0 : _h.PRIMARY);
|
|
1361
1363
|
primaryKeyFullyQualified = primaryKeyList === null || primaryKeyList === void 0 ? void 0 : primaryKeyList.pop();
|
|
1362
|
-
primaryKey = (
|
|
1364
|
+
primaryKey = (_j = primaryKeyFullyQualified === null || primaryKeyFullyQualified === void 0 ? void 0 : primaryKeyFullyQualified.split('.')) === null || _j === void 0 ? void 0 : _j.pop();
|
|
1363
1365
|
if (needsConditionOrPrimaryCheck) {
|
|
1364
1366
|
if (undefined === primaryKey) {
|
|
1365
1367
|
whereVal = query === null || query === void 0 ? void 0 : query[C6.WHERE];
|
|
@@ -1368,7 +1370,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1368
1370
|
(typeof whereVal === 'object' && !Array.isArray(whereVal) && Object.keys(whereVal).length === 0);
|
|
1369
1371
|
if (whereIsEmpty) {
|
|
1370
1372
|
logWithLevel(exports.LogLevel.ERROR, logContext, console.error, query);
|
|
1371
|
-
throw Error('Failed to parse primary key information. Query: (' + JSON.stringify(query) + ') Primary Key: (' + JSON.stringify(primaryKey) + ') TABLES[operatingTable]?.PRIMARY: (' + JSON.stringify((
|
|
1373
|
+
throw Error('Failed to parse primary key information. Query: (' + JSON.stringify(query) + ') Primary Key: (' + JSON.stringify(primaryKey) + ') TABLES[operatingTable]?.PRIMARY: (' + JSON.stringify((_k = TABLES[operatingTable]) === null || _k === void 0 ? void 0 : _k.PRIMARY) + ') for operatingTable (' + operatingTable + ').');
|
|
1372
1374
|
}
|
|
1373
1375
|
}
|
|
1374
1376
|
else {
|
|
@@ -1380,7 +1382,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1380
1382
|
}
|
|
1381
1383
|
throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
|
|
1382
1384
|
}
|
|
1383
|
-
providedPrimary = (
|
|
1385
|
+
providedPrimary = (_l = query === null || query === void 0 ? void 0 : query[primaryKey]) !== null && _l !== void 0 ? _l : (primaryKeyFullyQualified ? query === null || query === void 0 ? void 0 : query[primaryKeyFullyQualified] : undefined);
|
|
1384
1386
|
if (undefined === providedPrimary || null === providedPrimary) {
|
|
1385
1387
|
notifyToast("error", "The primary key (".concat(primaryKey, ") provided is undefined or null explicitly!!"));
|
|
1386
1388
|
throw Error('The primary key (' + primaryKey + ') provided in the request was exactly equal to undefined.');
|
|
@@ -1394,7 +1396,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1394
1396
|
&& undefined !== query
|
|
1395
1397
|
&& null !== query
|
|
1396
1398
|
&& undefined !== primaryKey) {
|
|
1397
|
-
primaryVal = (
|
|
1399
|
+
primaryVal = (_m = query[primaryKey]) !== null && _m !== void 0 ? _m : (primaryKeyFullyQualified ? query[primaryKeyFullyQualified] : undefined);
|
|
1398
1400
|
if (undefined !== primaryVal) {
|
|
1399
1401
|
restRequestUri += primaryVal + '/';
|
|
1400
1402
|
if (isLocal() && shouldLog(exports.LogLevel.DEBUG, logContext)) {
|
|
@@ -1422,7 +1424,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1422
1424
|
config: this.config,
|
|
1423
1425
|
request: this.request
|
|
1424
1426
|
});
|
|
1425
|
-
axiosActiveRequest_1 = (
|
|
1427
|
+
axiosActiveRequest_1 = (_f = axios)[requestMethod.toLowerCase()].apply(_f, tslib.__spreadArray([restRequestUri], (function () {
|
|
1426
1428
|
var convert = function (data) {
|
|
1427
1429
|
return convertForRequestBody(data, fullTableList, C6, function (message) { return notifyToast("error", message, toastOptions); });
|
|
1428
1430
|
};
|
|
@@ -1511,7 +1513,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1511
1513
|
request: _this.request,
|
|
1512
1514
|
response: response
|
|
1513
1515
|
}); };
|
|
1514
|
-
if (undefined !== reactBootstrap && response) {
|
|
1516
|
+
if (undefined !== reactBootstrap && response && !skipReactBootstrap) {
|
|
1515
1517
|
switch (requestMethod) {
|
|
1516
1518
|
case GET:
|
|
1517
1519
|
response.data && reactBootstrap.updateRestfulObjectArrays({
|
|
@@ -1808,6 +1810,318 @@ function convertHexIfBinary(_col, val, columnDef) {
|
|
|
1808
1810
|
return val;
|
|
1809
1811
|
}
|
|
1810
1812
|
|
|
1813
|
+
// ========================
|
|
1814
|
+
// SQL Operators & Expressions
|
|
1815
|
+
// ========================
|
|
1816
|
+
var SQL_KNOWN_FUNCTIONS = [
|
|
1817
|
+
'ADDDATE',
|
|
1818
|
+
'ADDTIME',
|
|
1819
|
+
'CONCAT',
|
|
1820
|
+
'CONVERT_TZ',
|
|
1821
|
+
'COUNT',
|
|
1822
|
+
'COUNT_ALL',
|
|
1823
|
+
'CURRENT_DATE',
|
|
1824
|
+
'CURRENT_TIMESTAMP',
|
|
1825
|
+
'DAY',
|
|
1826
|
+
'DAY_HOUR',
|
|
1827
|
+
'DAY_MICROSECOND',
|
|
1828
|
+
'DAY_MINUTE',
|
|
1829
|
+
'DAY_SECOND',
|
|
1830
|
+
'DAYNAME',
|
|
1831
|
+
'DAYOFMONTH',
|
|
1832
|
+
'DAYOFWEEK',
|
|
1833
|
+
'DAYOFYEAR',
|
|
1834
|
+
'DATE',
|
|
1835
|
+
'DATE_ADD',
|
|
1836
|
+
'DATEDIFF',
|
|
1837
|
+
'DATE_SUB',
|
|
1838
|
+
'DATE_FORMAT',
|
|
1839
|
+
'EXTRACT',
|
|
1840
|
+
'FROM_DAYS',
|
|
1841
|
+
'FROM_UNIXTIME',
|
|
1842
|
+
'GET_FORMAT',
|
|
1843
|
+
'GROUP_CONCAT',
|
|
1844
|
+
'HEX',
|
|
1845
|
+
'HOUR',
|
|
1846
|
+
'HOUR_MICROSECOND',
|
|
1847
|
+
'HOUR_MINUTE',
|
|
1848
|
+
'HOUR_SECOND',
|
|
1849
|
+
'INTERVAL',
|
|
1850
|
+
'LOCALTIME',
|
|
1851
|
+
'LOCALTIMESTAMP',
|
|
1852
|
+
'MAKEDATE',
|
|
1853
|
+
'MAKETIME',
|
|
1854
|
+
'MAX',
|
|
1855
|
+
'MBRContains',
|
|
1856
|
+
'MICROSECOND',
|
|
1857
|
+
'MIN',
|
|
1858
|
+
'MINUTE',
|
|
1859
|
+
'MINUTE_MICROSECOND',
|
|
1860
|
+
'MINUTE_SECOND',
|
|
1861
|
+
'MONTH',
|
|
1862
|
+
'MONTHNAME',
|
|
1863
|
+
'NOW',
|
|
1864
|
+
'POINT',
|
|
1865
|
+
'POLYGON',
|
|
1866
|
+
'SECOND',
|
|
1867
|
+
'SECOND_MICROSECOND',
|
|
1868
|
+
'ST_Area',
|
|
1869
|
+
'ST_AsBinary',
|
|
1870
|
+
'ST_AsText',
|
|
1871
|
+
'ST_Buffer',
|
|
1872
|
+
'ST_Contains',
|
|
1873
|
+
'ST_Crosses',
|
|
1874
|
+
'ST_Difference',
|
|
1875
|
+
'ST_Dimension',
|
|
1876
|
+
'ST_Disjoint',
|
|
1877
|
+
'ST_Distance',
|
|
1878
|
+
'ST_Distance_Sphere',
|
|
1879
|
+
'ST_EndPoint',
|
|
1880
|
+
'ST_Envelope',
|
|
1881
|
+
'ST_Equals',
|
|
1882
|
+
'ST_GeomFromGeoJSON',
|
|
1883
|
+
'ST_GeomFromText',
|
|
1884
|
+
'ST_GeomFromWKB',
|
|
1885
|
+
'ST_Intersects',
|
|
1886
|
+
'ST_Length',
|
|
1887
|
+
'ST_MakeEnvelope',
|
|
1888
|
+
'ST_Overlaps',
|
|
1889
|
+
'ST_Point',
|
|
1890
|
+
'ST_SetSRID',
|
|
1891
|
+
'ST_SRID',
|
|
1892
|
+
'ST_StartPoint',
|
|
1893
|
+
'ST_SymDifference',
|
|
1894
|
+
'ST_Touches',
|
|
1895
|
+
'ST_Union',
|
|
1896
|
+
'ST_Within',
|
|
1897
|
+
'ST_X',
|
|
1898
|
+
'ST_Y',
|
|
1899
|
+
'STR_TO_DATE',
|
|
1900
|
+
'SUBDATE',
|
|
1901
|
+
'SUBTIME',
|
|
1902
|
+
'SUM',
|
|
1903
|
+
'SYSDATE',
|
|
1904
|
+
'TIME',
|
|
1905
|
+
'TIME_FORMAT',
|
|
1906
|
+
'TIME_TO_SEC',
|
|
1907
|
+
'TIMEDIFF',
|
|
1908
|
+
'TIMESTAMP',
|
|
1909
|
+
'TIMESTAMPADD',
|
|
1910
|
+
'TIMESTAMPDIFF',
|
|
1911
|
+
'TO_DAYS',
|
|
1912
|
+
'TO_SECONDS',
|
|
1913
|
+
'TRANSACTION_TIMESTAMP',
|
|
1914
|
+
'UNHEX',
|
|
1915
|
+
'UNIX_TIMESTAMP',
|
|
1916
|
+
'UTC_DATE',
|
|
1917
|
+
'UTC_TIME',
|
|
1918
|
+
'UTC_TIMESTAMP',
|
|
1919
|
+
'WEEKDAY',
|
|
1920
|
+
'WEEKOFYEAR',
|
|
1921
|
+
'YEARWEEK',
|
|
1922
|
+
];
|
|
1923
|
+
|
|
1924
|
+
var IDENTIFIER_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
1925
|
+
var isFiniteNumber = function (value) {
|
|
1926
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
1927
|
+
};
|
|
1928
|
+
var normalizeToken = function (token) { return token.trim(); };
|
|
1929
|
+
var ensureParams = function (opts) {
|
|
1930
|
+
if (!opts.params) {
|
|
1931
|
+
throw new Error("".concat(opts.context, " requires parameter tracking for literal bindings."));
|
|
1932
|
+
}
|
|
1933
|
+
if (!opts.hooks.addParam) {
|
|
1934
|
+
throw new Error("".concat(opts.context, " requires addParam support for literal bindings."));
|
|
1935
|
+
}
|
|
1936
|
+
return opts.params;
|
|
1937
|
+
};
|
|
1938
|
+
var serializeStringReference = function (raw, opts) {
|
|
1939
|
+
var value = raw.trim();
|
|
1940
|
+
if (value === '*') {
|
|
1941
|
+
return {
|
|
1942
|
+
sql: value,
|
|
1943
|
+
isReference: true,
|
|
1944
|
+
isExpression: false,
|
|
1945
|
+
isSubSelect: false,
|
|
1946
|
+
};
|
|
1947
|
+
}
|
|
1948
|
+
if (!opts.hooks.isReference(value)) {
|
|
1949
|
+
throw new Error("Bare string '".concat(raw, "' is not a reference in ").concat(opts.context, ". Wrap literal strings with [C6C.LIT, value]."));
|
|
1950
|
+
}
|
|
1951
|
+
if (value.includes('.')) {
|
|
1952
|
+
opts.hooks.assertValidIdentifier(value, opts.context);
|
|
1953
|
+
}
|
|
1954
|
+
return {
|
|
1955
|
+
sql: value,
|
|
1956
|
+
isReference: true,
|
|
1957
|
+
isExpression: false,
|
|
1958
|
+
isSubSelect: false,
|
|
1959
|
+
};
|
|
1960
|
+
};
|
|
1961
|
+
var serializeLiteralValue = function (value, opts) {
|
|
1962
|
+
var _a;
|
|
1963
|
+
if (value === null || value === C6C.NULL) {
|
|
1964
|
+
return {
|
|
1965
|
+
sql: 'NULL',
|
|
1966
|
+
isReference: false,
|
|
1967
|
+
isExpression: false,
|
|
1968
|
+
isSubSelect: false,
|
|
1969
|
+
};
|
|
1970
|
+
}
|
|
1971
|
+
if (isFiniteNumber(value)) {
|
|
1972
|
+
return {
|
|
1973
|
+
sql: String(value),
|
|
1974
|
+
isReference: false,
|
|
1975
|
+
isExpression: false,
|
|
1976
|
+
isSubSelect: false,
|
|
1977
|
+
};
|
|
1978
|
+
}
|
|
1979
|
+
if (typeof value === 'boolean') {
|
|
1980
|
+
return {
|
|
1981
|
+
sql: value ? 'TRUE' : 'FALSE',
|
|
1982
|
+
isReference: false,
|
|
1983
|
+
isExpression: false,
|
|
1984
|
+
isSubSelect: false,
|
|
1985
|
+
};
|
|
1986
|
+
}
|
|
1987
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value)) {
|
|
1988
|
+
var params = ensureParams(opts);
|
|
1989
|
+
return {
|
|
1990
|
+
sql: opts.hooks.addParam(params, (_a = opts.contextColumn) !== null && _a !== void 0 ? _a : '', value),
|
|
1991
|
+
isReference: false,
|
|
1992
|
+
isExpression: false,
|
|
1993
|
+
isSubSelect: false,
|
|
1994
|
+
};
|
|
1995
|
+
}
|
|
1996
|
+
throw new Error("Unsupported literal value in ".concat(opts.context, ". Use [C6C.LIT, value] for non-reference strings or complex values."));
|
|
1997
|
+
};
|
|
1998
|
+
var validateAlias = function (aliasRaw, context) {
|
|
1999
|
+
if (typeof aliasRaw !== 'string' || aliasRaw.trim() === '') {
|
|
2000
|
+
throw new Error("[C6C.AS] in ".concat(context, " expects a non-empty alias string."));
|
|
2001
|
+
}
|
|
2002
|
+
var alias = aliasRaw.trim();
|
|
2003
|
+
if (!IDENTIFIER_REGEX.test(alias)) {
|
|
2004
|
+
throw new Error("[C6C.AS] alias '".concat(alias, "' in ").concat(context, " must be a valid SQL identifier."));
|
|
2005
|
+
}
|
|
2006
|
+
return alias;
|
|
2007
|
+
};
|
|
2008
|
+
var validateFunctionName = function (nameRaw, context) {
|
|
2009
|
+
if (typeof nameRaw !== 'string' || nameRaw.trim() === '') {
|
|
2010
|
+
throw new Error("[C6C.CALL] in ".concat(context, " expects the custom function name as a non-empty string."));
|
|
2011
|
+
}
|
|
2012
|
+
var name = normalizeToken(nameRaw);
|
|
2013
|
+
if (!IDENTIFIER_REGEX.test(name)) {
|
|
2014
|
+
throw new Error("[C6C.CALL] function '".concat(name, "' in ").concat(context, " must be a valid SQL identifier."));
|
|
2015
|
+
}
|
|
2016
|
+
return name;
|
|
2017
|
+
};
|
|
2018
|
+
var serializeFunctionArgs = function (args, opts) { return args
|
|
2019
|
+
.map(function (arg) { return serializeSqlExpression(arg, opts).sql; })
|
|
2020
|
+
.join(', '); };
|
|
2021
|
+
var serializeSqlExpression = function (value, opts) {
|
|
2022
|
+
var _a, _b, _c;
|
|
2023
|
+
if (value instanceof Map) {
|
|
2024
|
+
value = Object.fromEntries(value);
|
|
2025
|
+
}
|
|
2026
|
+
if (Array.isArray(value)) {
|
|
2027
|
+
if (value.length === 0) {
|
|
2028
|
+
throw new Error("Invalid empty expression array in ".concat(opts.context, "."));
|
|
2029
|
+
}
|
|
2030
|
+
var headRaw = value[0], tail = value.slice(1);
|
|
2031
|
+
if (typeof headRaw !== 'string') {
|
|
2032
|
+
throw new Error("Expression arrays in ".concat(opts.context, " must start with a string token."));
|
|
2033
|
+
}
|
|
2034
|
+
var head = normalizeToken(headRaw);
|
|
2035
|
+
var token = head.toUpperCase();
|
|
2036
|
+
if (token === C6C.AS) {
|
|
2037
|
+
if (tail.length !== 2) {
|
|
2038
|
+
throw new Error("[C6C.AS] in ".concat(opts.context, " expects [C6C.AS, expression, alias]."));
|
|
2039
|
+
}
|
|
2040
|
+
var inner = serializeSqlExpression(tail[0], opts);
|
|
2041
|
+
var alias = validateAlias(tail[1], opts.context);
|
|
2042
|
+
(_b = (_a = opts.hooks).onAlias) === null || _b === void 0 ? void 0 : _b.call(_a, alias);
|
|
2043
|
+
return {
|
|
2044
|
+
sql: "".concat(inner.sql, " AS ").concat(alias),
|
|
2045
|
+
isReference: false,
|
|
2046
|
+
isExpression: true,
|
|
2047
|
+
isSubSelect: inner.isSubSelect,
|
|
2048
|
+
};
|
|
2049
|
+
}
|
|
2050
|
+
if (token === C6C.DISTINCT) {
|
|
2051
|
+
if (tail.length !== 1) {
|
|
2052
|
+
throw new Error("[C6C.DISTINCT] in ".concat(opts.context, " expects [C6C.DISTINCT, expression]."));
|
|
2053
|
+
}
|
|
2054
|
+
var inner = serializeSqlExpression(tail[0], opts);
|
|
2055
|
+
return {
|
|
2056
|
+
sql: "DISTINCT ".concat(inner.sql),
|
|
2057
|
+
isReference: false,
|
|
2058
|
+
isExpression: true,
|
|
2059
|
+
isSubSelect: inner.isSubSelect,
|
|
2060
|
+
};
|
|
2061
|
+
}
|
|
2062
|
+
if (token === C6C.LIT || token === C6C.PARAM) {
|
|
2063
|
+
if (tail.length !== 1) {
|
|
2064
|
+
throw new Error("[".concat(head, "] in ").concat(opts.context, " expects [").concat(head, ", value]."));
|
|
2065
|
+
}
|
|
2066
|
+
var params = ensureParams(opts);
|
|
2067
|
+
return {
|
|
2068
|
+
sql: opts.hooks.addParam(params, (_c = opts.contextColumn) !== null && _c !== void 0 ? _c : '', tail[0]),
|
|
2069
|
+
isReference: false,
|
|
2070
|
+
isExpression: false,
|
|
2071
|
+
isSubSelect: false,
|
|
2072
|
+
};
|
|
2073
|
+
}
|
|
2074
|
+
if (token === C6C.SUBSELECT) {
|
|
2075
|
+
if (tail.length !== 1) {
|
|
2076
|
+
throw new Error("[C6C.SUBSELECT] in ".concat(opts.context, " expects [C6C.SUBSELECT, payload]."));
|
|
2077
|
+
}
|
|
2078
|
+
if (!opts.hooks.buildScalarSubSelect) {
|
|
2079
|
+
throw new Error("Scalar subselects in ".concat(opts.context, " require subselect builder support."));
|
|
2080
|
+
}
|
|
2081
|
+
var params = ensureParams(opts);
|
|
2082
|
+
var subSql = opts.hooks.buildScalarSubSelect(tail[0], params);
|
|
2083
|
+
return {
|
|
2084
|
+
sql: subSql,
|
|
2085
|
+
isReference: false,
|
|
2086
|
+
isExpression: true,
|
|
2087
|
+
isSubSelect: true,
|
|
2088
|
+
};
|
|
2089
|
+
}
|
|
2090
|
+
if (token === C6C.CALL) {
|
|
2091
|
+
var fnNameRaw = tail[0], args = tail.slice(1);
|
|
2092
|
+
var fnName = validateFunctionName(fnNameRaw, opts.context);
|
|
2093
|
+
var sqlArgs_1 = serializeFunctionArgs(args, opts);
|
|
2094
|
+
return {
|
|
2095
|
+
sql: "".concat(fnName, "(").concat(sqlArgs_1, ")"),
|
|
2096
|
+
isReference: false,
|
|
2097
|
+
isExpression: true,
|
|
2098
|
+
isSubSelect: false,
|
|
2099
|
+
};
|
|
2100
|
+
}
|
|
2101
|
+
if (tail.length >= 2 && String(tail[tail.length - 2]).toUpperCase() === C6C.AS) {
|
|
2102
|
+
throw new Error("Legacy positional AS syntax is not supported in ".concat(opts.context, ". Use [C6C.AS, expression, alias]."));
|
|
2103
|
+
}
|
|
2104
|
+
if (opts.hooks.isKnownFunction && !opts.hooks.isKnownFunction(head)) {
|
|
2105
|
+
throw new Error("Unknown SQL function '".concat(head, "' in ").concat(opts.context, ". Use [C6C.CALL, 'FUNCTION_NAME', ...args] for custom functions."));
|
|
2106
|
+
}
|
|
2107
|
+
var sqlArgs = serializeFunctionArgs(tail, opts);
|
|
2108
|
+
return {
|
|
2109
|
+
sql: "".concat(token, "(").concat(sqlArgs, ")"),
|
|
2110
|
+
isReference: false,
|
|
2111
|
+
isExpression: true,
|
|
2112
|
+
isSubSelect: false,
|
|
2113
|
+
};
|
|
2114
|
+
}
|
|
2115
|
+
if (typeof value === 'string') {
|
|
2116
|
+
return serializeStringReference(value, opts);
|
|
2117
|
+
}
|
|
2118
|
+
if (value && typeof value === 'object') {
|
|
2119
|
+
throw new Error("Object-rooted expressions are not supported in ".concat(opts.context, ". Use tuple syntax instead."));
|
|
2120
|
+
}
|
|
2121
|
+
return serializeLiteralValue(value, opts);
|
|
2122
|
+
};
|
|
2123
|
+
|
|
2124
|
+
var KNOWN_FUNCTION_LOOKUP = new Set(SQL_KNOWN_FUNCTIONS.map(function (name) { return String(name).toUpperCase(); }));
|
|
1811
2125
|
var AggregateBuilder = /** @class */ (function (_super) {
|
|
1812
2126
|
tslib.__extends(AggregateBuilder, _super);
|
|
1813
2127
|
function AggregateBuilder() {
|
|
@@ -1820,112 +2134,71 @@ var AggregateBuilder = /** @class */ (function (_super) {
|
|
|
1820
2134
|
AggregateBuilder.prototype.assertValidIdentifier = function (_identifier, _context) {
|
|
1821
2135
|
// no-op placeholder for subclasses that do not implement alias validation
|
|
1822
2136
|
};
|
|
1823
|
-
AggregateBuilder.prototype.
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
return
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
// function call like [FN, ...args], serialize the list as a comma-separated
|
|
1835
|
-
// literal sequence so parent calls (like ORDER BY FN(<here>)) can embed it.
|
|
1836
|
-
var isNumericString = function (s) { return /^-?\d+(?:\.\d+)?$/.test(String(s).trim()); };
|
|
1837
|
-
if (typeof field[0] !== 'string' || isNumericString(field[0])) {
|
|
1838
|
-
return field
|
|
1839
|
-
.map(function (arg) {
|
|
1840
|
-
if (Array.isArray(arg))
|
|
1841
|
-
return _this.buildAggregateField(arg, params);
|
|
1842
|
-
return String(arg);
|
|
1843
|
-
})
|
|
1844
|
-
.join(', ');
|
|
1845
|
-
}
|
|
1846
|
-
var fn = field[0], args = field.slice(1);
|
|
1847
|
-
var alias;
|
|
1848
|
-
if (args.length >= 2 && String(args[args.length - 2]).toUpperCase() === 'AS') {
|
|
1849
|
-
alias = String(args.pop());
|
|
1850
|
-
args.pop();
|
|
1851
|
-
}
|
|
1852
|
-
var F = String(fn).toUpperCase();
|
|
1853
|
-
var isGeomFromText = F === C6C.ST_GEOMFROMTEXT.toUpperCase();
|
|
1854
|
-
if (args.length === 1 && Array.isArray(args[0])) {
|
|
1855
|
-
args = args[0];
|
|
1856
|
-
}
|
|
1857
|
-
// Parameter placeholder helper: [C6C.PARAM, value]
|
|
1858
|
-
if (F === C6C.PARAM) {
|
|
1859
|
-
if (!params) {
|
|
1860
|
-
throw new Error('PARAM requires parameter tracking.');
|
|
1861
|
-
}
|
|
1862
|
-
var value = args[0];
|
|
1863
|
-
// Use empty column context; ORDER/SELECT literals have no column typing.
|
|
1864
|
-
// @ts-ignore addParam is provided by ConditionBuilder in our hierarchy.
|
|
1865
|
-
return this.addParam(params, '', value);
|
|
1866
|
-
}
|
|
1867
|
-
if (F === C6C.SUBSELECT) {
|
|
1868
|
-
if (!params) {
|
|
1869
|
-
throw new Error('Scalar subselects in SELECT require parameter tracking.');
|
|
1870
|
-
}
|
|
1871
|
-
var subRequest = args[0];
|
|
1872
|
-
var subSql = (_b = (_a = this).buildScalarSubSelect) === null || _b === void 0 ? void 0 : _b.call(_a, subRequest, params);
|
|
1873
|
-
if (!subSql) {
|
|
1874
|
-
throw new Error('Failed to build scalar subselect.');
|
|
1875
|
-
}
|
|
1876
|
-
var expr_1 = subSql;
|
|
1877
|
-
if (alias) {
|
|
1878
|
-
this.selectAliases.add(alias);
|
|
1879
|
-
expr_1 += " AS ".concat(alias);
|
|
1880
|
-
}
|
|
1881
|
-
logWithLevel(exports.LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(expr_1));
|
|
1882
|
-
return expr_1;
|
|
1883
|
-
}
|
|
1884
|
-
var identifierPathRegex = /^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/;
|
|
1885
|
-
var argList = args
|
|
1886
|
-
.map(function (arg, index) {
|
|
1887
|
-
if (Array.isArray(arg))
|
|
1888
|
-
return _this.buildAggregateField(arg, params);
|
|
1889
|
-
if (typeof arg === 'string') {
|
|
1890
|
-
if (identifierPathRegex.test(arg)) {
|
|
1891
|
-
_this.assertValidIdentifier(arg, 'SELECT expression');
|
|
1892
|
-
return arg;
|
|
1893
|
-
}
|
|
1894
|
-
// Treat numeric-looking strings as literals, not identifier paths
|
|
1895
|
-
if (isNumericString(arg))
|
|
1896
|
-
return arg;
|
|
1897
|
-
if (isGeomFromText && index === 0) {
|
|
1898
|
-
var trimmed = arg.trim();
|
|
1899
|
-
var alreadyQuoted = trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2;
|
|
1900
|
-
if (alreadyQuoted) {
|
|
1901
|
-
return trimmed;
|
|
1902
|
-
}
|
|
1903
|
-
var escaped = arg.replace(/'/g, "''");
|
|
1904
|
-
return "'".concat(escaped, "'");
|
|
1905
|
-
}
|
|
1906
|
-
return arg;
|
|
1907
|
-
}
|
|
1908
|
-
return String(arg);
|
|
1909
|
-
})
|
|
1910
|
-
.join(', ');
|
|
1911
|
-
var expr;
|
|
1912
|
-
if (F === 'DISTINCT') {
|
|
1913
|
-
expr = "DISTINCT ".concat(argList);
|
|
2137
|
+
AggregateBuilder.prototype.isReferenceExpression = function (value) {
|
|
2138
|
+
if (typeof value !== 'string')
|
|
2139
|
+
return false;
|
|
2140
|
+
var trimmed = value.trim();
|
|
2141
|
+
if (trimmed.length === 0)
|
|
2142
|
+
return false;
|
|
2143
|
+
if (trimmed === '*')
|
|
2144
|
+
return true;
|
|
2145
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.\*$/.test(trimmed)) {
|
|
2146
|
+
this.assertValidIdentifier(trimmed, 'SQL reference');
|
|
2147
|
+
return true;
|
|
1914
2148
|
}
|
|
1915
|
-
|
|
1916
|
-
|
|
2149
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed)) {
|
|
2150
|
+
this.assertValidIdentifier(trimmed, 'SQL reference');
|
|
2151
|
+
return true;
|
|
1917
2152
|
}
|
|
1918
|
-
if (
|
|
1919
|
-
|
|
1920
|
-
expr += " AS ".concat(alias);
|
|
2153
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed) && this.selectAliases.has(trimmed)) {
|
|
2154
|
+
return true;
|
|
1921
2155
|
}
|
|
1922
|
-
|
|
1923
|
-
|
|
2156
|
+
return false;
|
|
2157
|
+
};
|
|
2158
|
+
AggregateBuilder.prototype.isKnownFunction = function (functionName) {
|
|
2159
|
+
return KNOWN_FUNCTION_LOOKUP.has(functionName.trim().toUpperCase());
|
|
2160
|
+
};
|
|
2161
|
+
AggregateBuilder.prototype.serializeExpression = function (expression, params, context, contextColumn) {
|
|
2162
|
+
var _this = this;
|
|
2163
|
+
if (context === void 0) { context = 'SQL expression'; }
|
|
2164
|
+
return serializeSqlExpression(expression, {
|
|
2165
|
+
params: params,
|
|
2166
|
+
context: context,
|
|
2167
|
+
contextColumn: contextColumn,
|
|
2168
|
+
hooks: {
|
|
2169
|
+
assertValidIdentifier: function (identifier, hookContext) {
|
|
2170
|
+
_this.assertValidIdentifier(identifier, hookContext);
|
|
2171
|
+
},
|
|
2172
|
+
isReference: function (value) { return _this.isReferenceExpression(value); },
|
|
2173
|
+
addParam: function (target, column, value) {
|
|
2174
|
+
var addParam = _this.addParam;
|
|
2175
|
+
if (typeof addParam !== 'function') {
|
|
2176
|
+
throw new Error('Expression literal binding requires addParam support.');
|
|
2177
|
+
}
|
|
2178
|
+
return addParam.call(_this, target, column, value);
|
|
2179
|
+
},
|
|
2180
|
+
buildScalarSubSelect: function (subRequest, target) {
|
|
2181
|
+
var builder = _this.buildScalarSubSelect;
|
|
2182
|
+
if (typeof builder !== 'function') {
|
|
2183
|
+
throw new Error('Scalar subselects require SelectQueryBuilder context.');
|
|
2184
|
+
}
|
|
2185
|
+
return builder.call(_this, subRequest, target);
|
|
2186
|
+
},
|
|
2187
|
+
onAlias: function (alias) {
|
|
2188
|
+
_this.selectAliases.add(alias);
|
|
2189
|
+
},
|
|
2190
|
+
isKnownFunction: function (functionName) { return _this.isKnownFunction(functionName); },
|
|
2191
|
+
},
|
|
2192
|
+
});
|
|
2193
|
+
};
|
|
2194
|
+
AggregateBuilder.prototype.buildAggregateField = function (field, params) {
|
|
2195
|
+
var serialized = this.serializeExpression(field, params, 'SELECT expression');
|
|
2196
|
+
logWithLevel(exports.LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(serialized.sql));
|
|
2197
|
+
return serialized.sql;
|
|
1924
2198
|
};
|
|
1925
2199
|
return AggregateBuilder;
|
|
1926
2200
|
}(Executor));
|
|
1927
2201
|
|
|
1928
|
-
// Alias a table name with a given alias
|
|
1929
2202
|
var DERIVED_TABLE_PREFIX = '__c6DerivedTable__';
|
|
1930
2203
|
var DERIVED_ID_SYMBOL = Symbol('c6DerivedTableId');
|
|
1931
2204
|
var derivedTableLookup = new Map();
|
|
@@ -2003,6 +2276,29 @@ var bbox = function (minLng, minLat, maxLng, maxLat) {
|
|
|
2003
2276
|
var stContains = function (envelope, shape) {
|
|
2004
2277
|
return [C6C.ST_CONTAINS, envelope, shape];
|
|
2005
2278
|
};
|
|
2279
|
+
// Strongly-typed known function helper.
|
|
2280
|
+
var fn = function (functionName) {
|
|
2281
|
+
var args = [];
|
|
2282
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
2283
|
+
args[_i - 1] = arguments[_i];
|
|
2284
|
+
}
|
|
2285
|
+
return tslib.__spreadArray([functionName], args, true);
|
|
2286
|
+
};
|
|
2287
|
+
// Escape hatch for custom function names.
|
|
2288
|
+
var call = function (functionName) {
|
|
2289
|
+
var args = [];
|
|
2290
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
2291
|
+
args[_i - 1] = arguments[_i];
|
|
2292
|
+
}
|
|
2293
|
+
return tslib.__spreadArray([C6C.CALL, functionName], args, true);
|
|
2294
|
+
};
|
|
2295
|
+
var alias = function (expression, aliasName) { return [C6C.AS, expression, aliasName]; };
|
|
2296
|
+
var distinct = function (expression) { return [C6C.DISTINCT, expression]; };
|
|
2297
|
+
var lit = function (value) { return [C6C.LIT, value]; };
|
|
2298
|
+
var order = function (expression, direction) {
|
|
2299
|
+
if (direction === void 0) { direction = C6C.ASC; }
|
|
2300
|
+
return [expression, direction];
|
|
2301
|
+
};
|
|
2006
2302
|
|
|
2007
2303
|
var ConditionBuilder = /** @class */ (function (_super) {
|
|
2008
2304
|
tslib.__extends(ConditionBuilder, _super);
|
|
@@ -2109,6 +2405,26 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2109
2405
|
return true;
|
|
2110
2406
|
return false;
|
|
2111
2407
|
};
|
|
2408
|
+
ConditionBuilder.prototype.isReferenceExpression = function (value) {
|
|
2409
|
+
var trimmed = value.trim();
|
|
2410
|
+
if (trimmed === '*') {
|
|
2411
|
+
return true;
|
|
2412
|
+
}
|
|
2413
|
+
if (trimmed.includes('.')) {
|
|
2414
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.\*$/.test(trimmed)) {
|
|
2415
|
+
return true;
|
|
2416
|
+
}
|
|
2417
|
+
if (this.isTableReference(trimmed) || this.isColumnRef(trimmed)) {
|
|
2418
|
+
return true;
|
|
2419
|
+
}
|
|
2420
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed)) {
|
|
2421
|
+
this.assertValidIdentifier(trimmed, 'SQL reference');
|
|
2422
|
+
return true;
|
|
2423
|
+
}
|
|
2424
|
+
return false;
|
|
2425
|
+
}
|
|
2426
|
+
return _super.prototype.isReferenceExpression.call(this, trimmed);
|
|
2427
|
+
};
|
|
2112
2428
|
ConditionBuilder.prototype.execute = function () {
|
|
2113
2429
|
throw new Error("Method not implemented.");
|
|
2114
2430
|
};
|
|
@@ -2183,41 +2499,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2183
2499
|
ConditionBuilder.prototype.isOperator = function (op) {
|
|
2184
2500
|
return !!this.normalizeOperatorKey(op);
|
|
2185
2501
|
};
|
|
2186
|
-
ConditionBuilder.prototype.looksLikeSafeFunctionExpression = function (value) {
|
|
2187
|
-
if (typeof value !== 'string')
|
|
2188
|
-
return false;
|
|
2189
|
-
var trimmed = value.trim();
|
|
2190
|
-
if (trimmed.length === 0)
|
|
2191
|
-
return false;
|
|
2192
|
-
if (trimmed.includes(';') || trimmed.includes('--') || trimmed.includes('/*') || trimmed.includes('*/')) {
|
|
2193
|
-
return false;
|
|
2194
|
-
}
|
|
2195
|
-
if (!trimmed.includes('(') || !trimmed.endsWith(')')) {
|
|
2196
|
-
return false;
|
|
2197
|
-
}
|
|
2198
|
-
var functionMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)\s*\(/);
|
|
2199
|
-
if (!functionMatch) {
|
|
2200
|
-
return false;
|
|
2201
|
-
}
|
|
2202
|
-
var allowedCharacters = /^[A-Za-z0-9_().,'"\s-]+$/;
|
|
2203
|
-
if (!allowedCharacters.test(trimmed)) {
|
|
2204
|
-
return false;
|
|
2205
|
-
}
|
|
2206
|
-
var depth = 0;
|
|
2207
|
-
for (var _i = 0, trimmed_1 = trimmed; _i < trimmed_1.length; _i++) {
|
|
2208
|
-
var char = trimmed_1[_i];
|
|
2209
|
-
if (char === '(') {
|
|
2210
|
-
depth += 1;
|
|
2211
|
-
}
|
|
2212
|
-
else if (char === ')') {
|
|
2213
|
-
depth -= 1;
|
|
2214
|
-
if (depth < 0) {
|
|
2215
|
-
return false;
|
|
2216
|
-
}
|
|
2217
|
-
}
|
|
2218
|
-
}
|
|
2219
|
-
return depth === 0;
|
|
2220
|
-
};
|
|
2221
2502
|
ConditionBuilder.prototype.ensureWrapped = function (expression) {
|
|
2222
2503
|
var trimmed = expression.trim();
|
|
2223
2504
|
if (!trimmed)
|
|
@@ -2245,42 +2526,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2245
2526
|
})
|
|
2246
2527
|
.join(" ".concat(operator, " "));
|
|
2247
2528
|
};
|
|
2248
|
-
ConditionBuilder.prototype.normalizeFunctionField = function (field, params) {
|
|
2249
|
-
var _this = this;
|
|
2250
|
-
if (field instanceof Map) {
|
|
2251
|
-
field = Object.fromEntries(field);
|
|
2252
|
-
}
|
|
2253
|
-
if (Array.isArray(field)) {
|
|
2254
|
-
if (field.length === 0)
|
|
2255
|
-
return field;
|
|
2256
|
-
var fn = field[0], args = field.slice(1);
|
|
2257
|
-
var normalizedArgs = args.map(function (arg) { return _this.normalizeFunctionField(arg, params); });
|
|
2258
|
-
return tslib.__spreadArray([fn], normalizedArgs, true);
|
|
2259
|
-
}
|
|
2260
|
-
if (field && typeof field === 'object') {
|
|
2261
|
-
if (C6C.SUBSELECT in field) {
|
|
2262
|
-
var builder = this.buildScalarSubSelect;
|
|
2263
|
-
if (typeof builder !== 'function') {
|
|
2264
|
-
throw new Error('Scalar subselect handling requires JoinBuilder context.');
|
|
2265
|
-
}
|
|
2266
|
-
return builder.call(this, field[C6C.SUBSELECT], params);
|
|
2267
|
-
}
|
|
2268
|
-
var entries = Object.entries(field);
|
|
2269
|
-
if (entries.length === 1) {
|
|
2270
|
-
var _a = entries[0], key = _a[0], value = _a[1];
|
|
2271
|
-
if (this.isOperator(key)) {
|
|
2272
|
-
return this.buildOperatorExpression(key, value, params);
|
|
2273
|
-
}
|
|
2274
|
-
return this.buildFunctionCall(key, value, params);
|
|
2275
|
-
}
|
|
2276
|
-
}
|
|
2277
|
-
return field;
|
|
2278
|
-
};
|
|
2279
|
-
ConditionBuilder.prototype.buildFunctionCall = function (fn, value, params) {
|
|
2280
|
-
var args = Array.isArray(value) ? value : [value];
|
|
2281
|
-
var normalized = this.normalizeFunctionField(tslib.__spreadArray([fn], args, true), params);
|
|
2282
|
-
return this.buildAggregateField(normalized, params);
|
|
2283
|
-
};
|
|
2284
2529
|
ConditionBuilder.prototype.serializeOperand = function (operand, params, contextColumn) {
|
|
2285
2530
|
var _a;
|
|
2286
2531
|
var _this = this;
|
|
@@ -2295,18 +2540,14 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2295
2540
|
return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
|
|
2296
2541
|
}
|
|
2297
2542
|
if (typeof operand === 'string') {
|
|
2298
|
-
|
|
2299
|
-
|
|
2543
|
+
var trimmed = operand.trim();
|
|
2544
|
+
if (this.isReferenceExpression(trimmed) || this.isTableReference(trimmed) || this.isColumnRef(trimmed)) {
|
|
2545
|
+
return { sql: trimmed, isReference: true, isExpression: false, isSubSelect: false };
|
|
2300
2546
|
}
|
|
2301
|
-
|
|
2302
|
-
return { sql: operand.trim(), isReference: false, isExpression: true, isSubSelect: false };
|
|
2303
|
-
}
|
|
2304
|
-
return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
|
|
2547
|
+
throw new Error("Bare string '".concat(operand, "' is not a reference. Wrap literal strings with [C6C.LIT, value]."));
|
|
2305
2548
|
}
|
|
2306
2549
|
if (Array.isArray(operand)) {
|
|
2307
|
-
|
|
2308
|
-
var sql = this.buildAggregateField(normalized, params);
|
|
2309
|
-
return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
|
|
2550
|
+
return this.serializeExpression(operand, params, 'SQL expression', contextColumn);
|
|
2310
2551
|
}
|
|
2311
2552
|
if (operand instanceof Map) {
|
|
2312
2553
|
operand = Object.fromEntries(operand);
|
|
@@ -2324,24 +2565,38 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2324
2565
|
if (entries.length === 1) {
|
|
2325
2566
|
var _b = entries[0], key = _b[0], value = _b[1];
|
|
2326
2567
|
if (this.isOperator(key)) {
|
|
2327
|
-
var
|
|
2328
|
-
return { sql: this.ensureWrapped(
|
|
2568
|
+
var sql = this.buildOperatorExpression(key, value, params);
|
|
2569
|
+
return { sql: this.ensureWrapped(sql), isReference: false, isExpression: true, isSubSelect: false };
|
|
2329
2570
|
}
|
|
2330
2571
|
if (this.BOOLEAN_OPERATORS.has(key)) {
|
|
2331
|
-
var
|
|
2332
|
-
return { sql: this.ensureWrapped(
|
|
2572
|
+
var sql = this.buildBooleanExpression((_a = {}, _a[key] = value, _a), params, 'AND');
|
|
2573
|
+
return { sql: this.ensureWrapped(sql), isReference: false, isExpression: true, isSubSelect: false };
|
|
2333
2574
|
}
|
|
2334
|
-
|
|
2335
|
-
return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
|
|
2575
|
+
throw new Error('Object-rooted expressions are not supported. Use tuple syntax instead.');
|
|
2336
2576
|
}
|
|
2337
2577
|
}
|
|
2338
2578
|
throw new Error('Unsupported operand type in SQL expression.');
|
|
2339
2579
|
};
|
|
2580
|
+
ConditionBuilder.prototype.isExpressionTuple = function (value) {
|
|
2581
|
+
if (!Array.isArray(value) || value.length === 0 || typeof value[0] !== 'string') {
|
|
2582
|
+
return false;
|
|
2583
|
+
}
|
|
2584
|
+
var token = String(value[0]).toUpperCase();
|
|
2585
|
+
return (token === C6C.AS
|
|
2586
|
+
|| token === C6C.DISTINCT
|
|
2587
|
+
|| token === C6C.CALL
|
|
2588
|
+
|| token === C6C.LIT
|
|
2589
|
+
|| token === C6C.PARAM
|
|
2590
|
+
|| token === C6C.SUBSELECT
|
|
2591
|
+
|| this.isKnownFunction(value[0]));
|
|
2592
|
+
};
|
|
2340
2593
|
ConditionBuilder.prototype.isPlainArrayLiteral = function (value, allowColumnRefs) {
|
|
2341
2594
|
var _this = this;
|
|
2342
2595
|
if (allowColumnRefs === void 0) { allowColumnRefs = false; }
|
|
2343
2596
|
if (!Array.isArray(value))
|
|
2344
2597
|
return false;
|
|
2598
|
+
if (this.isExpressionTuple(value))
|
|
2599
|
+
return false;
|
|
2345
2600
|
return value.every(function (item) {
|
|
2346
2601
|
if (item === null)
|
|
2347
2602
|
return true;
|
|
@@ -2411,6 +2666,16 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2411
2666
|
|| this.isPlainObjectLiteral(normalized, allowColumnRefs)) {
|
|
2412
2667
|
return this.addParam(params, contextColumn !== null && contextColumn !== void 0 ? contextColumn : '', JSON.stringify(normalized));
|
|
2413
2668
|
}
|
|
2669
|
+
if (normalized === C6C.NULL
|
|
2670
|
+
|| normalized === null
|
|
2671
|
+
|| typeof normalized === 'string'
|
|
2672
|
+
|| typeof normalized === 'number'
|
|
2673
|
+
|| typeof normalized === 'boolean'
|
|
2674
|
+
|| normalized instanceof Date
|
|
2675
|
+
|| (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(normalized))) {
|
|
2676
|
+
var scalar = normalized === C6C.NULL ? null : normalized;
|
|
2677
|
+
return this.addParam(params, contextColumn !== null && contextColumn !== void 0 ? contextColumn : '', scalar);
|
|
2678
|
+
}
|
|
2414
2679
|
var sql;
|
|
2415
2680
|
var isReference;
|
|
2416
2681
|
var isExpression;
|
|
@@ -2494,7 +2759,10 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2494
2759
|
}
|
|
2495
2760
|
var payload = this.ensurePlainObject(payloadRaw);
|
|
2496
2761
|
var subSelect;
|
|
2497
|
-
if (payload &&
|
|
2762
|
+
if (Array.isArray(payload) && payload.length === 2 && String(payload[0]).toUpperCase() === C6C.SUBSELECT) {
|
|
2763
|
+
subSelect = this.ensurePlainObject(payload[1]);
|
|
2764
|
+
}
|
|
2765
|
+
else if (payload && typeof payload === 'object' && C6C.SUBSELECT in payload) {
|
|
2498
2766
|
subSelect = this.ensurePlainObject(payload[C6C.SUBSELECT]);
|
|
2499
2767
|
}
|
|
2500
2768
|
else if (payload && typeof payload === 'object') {
|
|
@@ -2588,7 +2856,11 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2588
2856
|
throw new Error('MATCH_AGAINST expects an array [search, mode?].');
|
|
2589
2857
|
}
|
|
2590
2858
|
var search = right[0], mode = right[1];
|
|
2591
|
-
var
|
|
2859
|
+
var searchInfo = this.serializeOperand(search, params, leftInfo_1.sql);
|
|
2860
|
+
if (searchInfo.isReference || searchInfo.isExpression || searchInfo.isSubSelect) {
|
|
2861
|
+
throw new Error('MATCH_AGAINST search payload must be a literal value (wrap strings with [C6C.LIT, value]).');
|
|
2862
|
+
}
|
|
2863
|
+
var placeholder = searchInfo.sql;
|
|
2592
2864
|
var againstClause = void 0;
|
|
2593
2865
|
switch (typeof mode === 'string' ? mode.toUpperCase() : '') {
|
|
2594
2866
|
case 'BOOLEAN':
|
|
@@ -2690,7 +2962,7 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2690
2962
|
if (!Array.isArray(value)) {
|
|
2691
2963
|
throw new Error("".concat(column, " expects an array of arguments."));
|
|
2692
2964
|
}
|
|
2693
|
-
return this.
|
|
2965
|
+
return this.serializeExpression(tslib.__spreadArray([column], value, true), params, "WHERE function ".concat(column), column).sql;
|
|
2694
2966
|
}
|
|
2695
2967
|
}
|
|
2696
2968
|
if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value)) {
|
|
@@ -3133,56 +3405,34 @@ var PaginationBuilder = /** @class */ (function (_super) {
|
|
|
3133
3405
|
*
|
|
3134
3406
|
* Accepted structures:
|
|
3135
3407
|
* ```ts
|
|
3136
|
-
* ORDER:
|
|
3137
|
-
*
|
|
3138
|
-
* [property_units.
|
|
3139
|
-
*
|
|
3140
|
-
* [C6Constants.ST_DISTANCE_SPHERE]: [property_units.LOCATION, F(property_units.LOCATION, "pu_target")]
|
|
3141
|
-
* }
|
|
3408
|
+
* ORDER: [
|
|
3409
|
+
* [property_units.UNIT_ID, "DESC"],
|
|
3410
|
+
* [[C6Constants.ST_DISTANCE_SPHERE, property_units.LOCATION, F(property_units.LOCATION, "pu_target")], "ASC"],
|
|
3411
|
+
* ]
|
|
3142
3412
|
* ```
|
|
3143
3413
|
*/
|
|
3144
3414
|
PaginationBuilder.prototype.buildPaginationClause = function (pagination, params) {
|
|
3145
|
-
var _this = this;
|
|
3146
3415
|
var sql = "";
|
|
3147
3416
|
/* -------- ORDER BY -------- */
|
|
3148
3417
|
if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
|
|
3149
3418
|
var orderParts = [];
|
|
3150
|
-
var
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3164
|
-
_this.assertValidIdentifier(arg, 'ORDER BY argument');
|
|
3165
|
-
return arg;
|
|
3166
|
-
}
|
|
3167
|
-
// numeric-looking strings should be treated as literals
|
|
3168
|
-
if (isNumericString_1(arg))
|
|
3169
|
-
return arg;
|
|
3170
|
-
return arg;
|
|
3171
|
-
}
|
|
3172
|
-
return String(arg);
|
|
3173
|
-
})
|
|
3174
|
-
.join(", ");
|
|
3175
|
-
orderParts.push("".concat(key, "(").concat(args, ")"));
|
|
3176
|
-
}
|
|
3177
|
-
// SIMPLE COLUMN + DIR (ASC/DESC)
|
|
3178
|
-
else {
|
|
3179
|
-
orderParts.push("".concat(key, " ").concat(String(val).toUpperCase()));
|
|
3419
|
+
var orderSpec = pagination[C6Constants.ORDER];
|
|
3420
|
+
if (!Array.isArray(orderSpec)) {
|
|
3421
|
+
throw new Error('PAGINATION.ORDER expects an array of terms using [expression, direction?] syntax.');
|
|
3422
|
+
}
|
|
3423
|
+
for (var _i = 0, orderSpec_1 = orderSpec; _i < orderSpec_1.length; _i++) {
|
|
3424
|
+
var rawTerm = orderSpec_1[_i];
|
|
3425
|
+
var expression = rawTerm;
|
|
3426
|
+
var direction = C6Constants.ASC;
|
|
3427
|
+
if (Array.isArray(rawTerm)
|
|
3428
|
+
&& rawTerm.length === 2
|
|
3429
|
+
&& typeof rawTerm[1] === 'string'
|
|
3430
|
+
&& (String(rawTerm[1]).toUpperCase() === C6Constants.ASC || String(rawTerm[1]).toUpperCase() === C6Constants.DESC)) {
|
|
3431
|
+
expression = rawTerm[0];
|
|
3432
|
+
direction = String(rawTerm[1]).toUpperCase();
|
|
3180
3433
|
}
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
for (var _i = 0, _a = Object.entries(pagination[C6Constants.ORDER]); _i < _a.length; _i++) {
|
|
3184
|
-
var _b = _a[_i], key = _b[0], val = _b[1];
|
|
3185
|
-
_loop_1(key, val);
|
|
3434
|
+
var serialized = this.serializeExpression(expression, params, 'ORDER BY expression');
|
|
3435
|
+
orderParts.push("".concat(serialized.sql, " ").concat(direction));
|
|
3186
3436
|
}
|
|
3187
3437
|
if (orderParts.length)
|
|
3188
3438
|
sql += " ORDER BY ".concat(orderParts.join(", "));
|
|
@@ -3472,7 +3722,7 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3472
3722
|
throw new Error("Singular request requires all primary key(s) [".concat(pkShorts.join(', '), "] for table (").concat(restModel.TABLE_NAME, "). Missing: [").concat(missing.join(', '), "]"));
|
|
3473
3723
|
}
|
|
3474
3724
|
// Strip API metadata that should remain at root
|
|
3475
|
-
var _d = request, dataInsertMultipleRows = _d.dataInsertMultipleRows, cacheResults = _d.cacheResults, fetchDependencies = _d.fetchDependencies, debug = _d.debug, success = _d.success, error = _d.error, rest = tslib.__rest(_d, ["dataInsertMultipleRows", "cacheResults", "fetchDependencies", "debug", "success", "error"]);
|
|
3725
|
+
var _d = request, dataInsertMultipleRows = _d.dataInsertMultipleRows, cacheResults = _d.cacheResults, skipReactBootstrap = _d.skipReactBootstrap, fetchDependencies = _d.fetchDependencies, debug = _d.debug, success = _d.success, error = _d.error, rest = tslib.__rest(_d, ["dataInsertMultipleRows", "cacheResults", "skipReactBootstrap", "fetchDependencies", "debug", "success", "error"]);
|
|
3476
3726
|
// Map short primary keys to fully-qualified column names
|
|
3477
3727
|
var shortToFull = {};
|
|
3478
3728
|
for (var _e = 0, _f = Object.entries(restModel.COLUMNS || {}); _e < _f.length; _e++) {
|
|
@@ -3484,22 +3734,26 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3484
3734
|
var k = _a[0], v = _a[1];
|
|
3485
3735
|
return [(_b = shortToFull[k]) !== null && _b !== void 0 ? _b : k, v];
|
|
3486
3736
|
}));
|
|
3737
|
+
var pkWhereExpressions = Object.fromEntries(Object.entries(pkFullValues).map(function (_a) {
|
|
3738
|
+
var column = _a[0], value = _a[1];
|
|
3739
|
+
return [column, [C6Constants.EQUAL, [C6Constants.LIT, value]]];
|
|
3740
|
+
}));
|
|
3487
3741
|
if (requestMethod === C6Constants.GET) {
|
|
3488
3742
|
var normalized_1 = {
|
|
3489
|
-
WHERE: tslib.__assign({},
|
|
3743
|
+
WHERE: tslib.__assign({}, pkWhereExpressions),
|
|
3490
3744
|
};
|
|
3491
3745
|
// Preserve pagination if any was added previously
|
|
3492
3746
|
if (request[C6Constants.PAGINATION]) {
|
|
3493
3747
|
normalized_1[C6Constants.PAGINATION] = request[C6Constants.PAGINATION];
|
|
3494
3748
|
}
|
|
3495
|
-
return tslib.__assign(tslib.__assign({}, normalized_1), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3749
|
+
return tslib.__assign(tslib.__assign({}, normalized_1), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3496
3750
|
}
|
|
3497
3751
|
if (requestMethod === C6Constants.DELETE) {
|
|
3498
3752
|
var normalized_2 = (_a = {},
|
|
3499
3753
|
_a[C6Constants.DELETE] = true,
|
|
3500
|
-
_a.WHERE = tslib.__assign({},
|
|
3754
|
+
_a.WHERE = tslib.__assign({}, pkWhereExpressions),
|
|
3501
3755
|
_a);
|
|
3502
|
-
return tslib.__assign(tslib.__assign({}, normalized_2), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3756
|
+
return tslib.__assign(tslib.__assign({}, normalized_2), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3503
3757
|
}
|
|
3504
3758
|
// PUT
|
|
3505
3759
|
var updateBody = {};
|
|
@@ -3518,9 +3772,9 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3518
3772
|
}
|
|
3519
3773
|
var normalized = (_b = {},
|
|
3520
3774
|
_b[C6Constants.UPDATE] = updateBody,
|
|
3521
|
-
_b.WHERE = tslib.__assign({},
|
|
3775
|
+
_b.WHERE = tslib.__assign({}, pkWhereExpressions),
|
|
3522
3776
|
_b);
|
|
3523
|
-
return tslib.__assign(tslib.__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3777
|
+
return tslib.__assign(tslib.__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3524
3778
|
}
|
|
3525
3779
|
|
|
3526
3780
|
var allowListCache = new Map();
|
|
@@ -4068,6 +4322,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4068
4322
|
C6Constants.REPLACE,
|
|
4069
4323
|
"dataInsertMultipleRows",
|
|
4070
4324
|
"cacheResults",
|
|
4325
|
+
"skipReactBootstrap",
|
|
4071
4326
|
"fetchDependencies",
|
|
4072
4327
|
"debug",
|
|
4073
4328
|
"success",
|
|
@@ -4151,9 +4406,10 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4151
4406
|
}
|
|
4152
4407
|
}
|
|
4153
4408
|
if (value !== undefined) {
|
|
4154
|
-
pkValues[pkShort] = value;
|
|
4409
|
+
pkValues[pkShort] = this_1.unwrapPrimaryKeyValue(value);
|
|
4155
4410
|
}
|
|
4156
4411
|
};
|
|
4412
|
+
var this_1 = this;
|
|
4157
4413
|
for (var _i = 0, primaryShorts_1 = primaryShorts; _i < primaryShorts_1.length; _i++) {
|
|
4158
4414
|
var pkShort = primaryShorts_1[_i];
|
|
4159
4415
|
_loop_1(pkShort);
|
|
@@ -4163,6 +4419,26 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4163
4419
|
}
|
|
4164
4420
|
return Object.keys(pkValues).length > 0 ? pkValues : null;
|
|
4165
4421
|
};
|
|
4422
|
+
SqlExecutor.prototype.unwrapPrimaryKeyValue = function (value) {
|
|
4423
|
+
if (!Array.isArray(value))
|
|
4424
|
+
return value;
|
|
4425
|
+
if (value.length === 2) {
|
|
4426
|
+
var head = value[0], tail = value[1];
|
|
4427
|
+
if (head === C6Constants.EQUAL) {
|
|
4428
|
+
return this.unwrapPrimaryKeyValue(tail);
|
|
4429
|
+
}
|
|
4430
|
+
if (head === C6Constants.LIT || head === C6Constants.PARAM) {
|
|
4431
|
+
return tail;
|
|
4432
|
+
}
|
|
4433
|
+
}
|
|
4434
|
+
if (value.length === 3) {
|
|
4435
|
+
var operator = value[1], right = value[2];
|
|
4436
|
+
if (operator === C6Constants.EQUAL) {
|
|
4437
|
+
return this.unwrapPrimaryKeyValue(right);
|
|
4438
|
+
}
|
|
4439
|
+
}
|
|
4440
|
+
return value;
|
|
4441
|
+
};
|
|
4166
4442
|
SqlExecutor.prototype.extractPrimaryKeyValuesFromData = function (data) {
|
|
4167
4443
|
if (!data)
|
|
4168
4444
|
return null;
|
|
@@ -4800,14 +5076,17 @@ exports.POST = POST;
|
|
|
4800
5076
|
exports.PUT = PUT;
|
|
4801
5077
|
exports.PaginationBuilder = PaginationBuilder;
|
|
4802
5078
|
exports.PostQueryBuilder = PostQueryBuilder;
|
|
5079
|
+
exports.SQL_KNOWN_FUNCTIONS = SQL_KNOWN_FUNCTIONS;
|
|
4803
5080
|
exports.SelectQueryBuilder = SelectQueryBuilder;
|
|
4804
5081
|
exports.SqlExecutor = SqlExecutor;
|
|
4805
5082
|
exports.TestRestfulResponse = TestRestfulResponse;
|
|
4806
5083
|
exports.UpdateQueryBuilder = UpdateQueryBuilder;
|
|
5084
|
+
exports.alias = alias;
|
|
4807
5085
|
exports.apiRequestCache = apiRequestCache;
|
|
4808
5086
|
exports.applyLogLevelDefaults = applyLogLevelDefaults;
|
|
4809
5087
|
exports.axiosInstance = axiosInstance;
|
|
4810
5088
|
exports.bbox = bbox;
|
|
5089
|
+
exports.call = call;
|
|
4811
5090
|
exports.carbonNodeQsStringify = carbonNodeQsStringify;
|
|
4812
5091
|
exports.checkAllRequestsComplete = checkAllRequestsComplete;
|
|
4813
5092
|
exports.checkCache = checkCache;
|
|
@@ -4820,10 +5099,12 @@ exports.convertHexIfBinary = convertHexIfBinary;
|
|
|
4820
5099
|
exports.derivedTable = derivedTable;
|
|
4821
5100
|
exports.determineRuntimeJsType = determineRuntimeJsType;
|
|
4822
5101
|
exports.distSphere = distSphere;
|
|
5102
|
+
exports.distinct = distinct;
|
|
4823
5103
|
exports.error = error;
|
|
4824
5104
|
exports.evictCacheEntry = evictCacheEntry;
|
|
4825
5105
|
exports.extractSqlEntries = extractSqlEntries;
|
|
4826
5106
|
exports.fieldEq = fieldEq;
|
|
5107
|
+
exports.fn = fn;
|
|
4827
5108
|
exports.getEnv = getEnv;
|
|
4828
5109
|
exports.getEnvBool = getEnvBool;
|
|
4829
5110
|
exports.getEnvDebug = getEnvDebug;
|
|
@@ -4837,6 +5118,7 @@ exports.isLocal = isLocal;
|
|
|
4837
5118
|
exports.isNode = isNode;
|
|
4838
5119
|
exports.isTest = isTest;
|
|
4839
5120
|
exports.isVerbose = isVerbose;
|
|
5121
|
+
exports.lit = lit;
|
|
4840
5122
|
exports.loadSqlAllowList = loadSqlAllowList;
|
|
4841
5123
|
exports.logSql = logSql;
|
|
4842
5124
|
exports.logWithLevel = logWithLevel;
|
|
@@ -4845,6 +5127,7 @@ exports.normalizeSql = normalizeSql;
|
|
|
4845
5127
|
exports.notifyToast = notifyToast;
|
|
4846
5128
|
exports.onError = onError;
|
|
4847
5129
|
exports.onSuccess = onSuccess;
|
|
5130
|
+
exports.order = order;
|
|
4848
5131
|
exports.parseLogLevel = parseLogLevel;
|
|
4849
5132
|
exports.removeInvalidKeys = removeInvalidKeys;
|
|
4850
5133
|
exports.removePrefixIfExists = removePrefixIfExists;
|
|
@@ -4853,6 +5136,7 @@ exports.resolveLogLevel = resolveLogLevel;
|
|
|
4853
5136
|
exports.restExpressRequest = restExpressRequest;
|
|
4854
5137
|
exports.restOrm = restOrm;
|
|
4855
5138
|
exports.restRequest = restRequest;
|
|
5139
|
+
exports.serializeSqlExpression = serializeSqlExpression;
|
|
4856
5140
|
exports.setCache = setCache;
|
|
4857
5141
|
exports.setToastHandler = setToastHandler;
|
|
4858
5142
|
exports.shouldLog = shouldLog;
|