couchset 0.5.0 → 0.5.2
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 +93 -1
- package/dist/database.d.ts +6 -0
- package/dist/database.js +51 -2
- package/dist/database.js.map +1 -1
- package/dist/model/field-path.d.ts +8 -0
- package/dist/model/field-path.js +70 -0
- package/dist/model/field-path.js.map +1 -0
- package/dist/model/include.d.ts +36 -3
- package/dist/model/include.js +155 -49
- package/dist/model/include.js.map +1 -1
- package/dist/model/index.d.ts +4 -1
- package/dist/model/index.js +8 -1
- package/dist/model/index.js.map +1 -1
- package/dist/model/read-helpers.d.ts +6 -2
- package/dist/model/read-helpers.js +96 -23
- package/dist/model/read-helpers.js.map +1 -1
- package/dist/model/read-types.d.ts +51 -0
- package/dist/model/read-types.js +3 -0
- package/dist/model/read-types.js.map +1 -0
- package/dist/model/safe-query.d.ts +3 -0
- package/dist/model/safe-query.js +22 -2
- package/dist/model/safe-query.js.map +1 -1
- package/dist/next.d.ts +12 -2
- package/dist/next.js +3 -1
- package/dist/next.js.map +1 -1
- package/dist/next.types.js +149 -1
- package/dist/next.types.js.map +1 -1
- package/dist/pagination/pagination.js +3 -1
- package/dist/pagination/pagination.js.map +1 -1
- package/dist/pagination/types.d.ts +2 -0
- package/dist/pagination/types.js.map +1 -1
- package/dist/search/customQuery.d.ts +2 -0
- package/dist/search/customQuery.js +4 -1
- package/dist/search/customQuery.js.map +1 -1
- package/docs/beta-migration.md +1 -1
- package/docs/document-modeling.md +5 -1
- package/docs/joins-and-consistency.md +266 -0
- package/docs/next-primitives.md +4 -0
- package/package.json +2 -1
package/dist/model/include.js
CHANGED
|
@@ -25,10 +25,16 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
25
25
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
26
|
};
|
|
27
27
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
exports.buildIncludedSelectionQuery = exports.buildIncludeClauses = void 0;
|
|
29
|
-
var helpers_1 = require("../query/helpers");
|
|
30
|
-
var utils_1 = require("../query/utils");
|
|
28
|
+
exports.buildIncludedSelectionQuery = exports.buildIncludeClauses = exports.includeOperator = exports.joinField = void 0;
|
|
31
29
|
var keyspace_1 = require("./keyspace");
|
|
30
|
+
var field_path_1 = require("./field-path");
|
|
31
|
+
var joinField = function (path) { return ({ $field: path }); };
|
|
32
|
+
exports.joinField = joinField;
|
|
33
|
+
var identifier = function (name) {
|
|
34
|
+
if (!name || name.indexOf('\0') !== -1)
|
|
35
|
+
throw new Error('Empty or invalid identifier');
|
|
36
|
+
return (0, keyspace_1.escapeIdentifier)(name);
|
|
37
|
+
};
|
|
32
38
|
var comparisonOperators = {
|
|
33
39
|
$eq: '=',
|
|
34
40
|
$neq: '!=',
|
|
@@ -74,26 +80,31 @@ var IncludeParameterStore = /** @class */ (function () {
|
|
|
74
80
|
};
|
|
75
81
|
return IncludeParameterStore;
|
|
76
82
|
}());
|
|
77
|
-
var safeAlias =
|
|
78
|
-
|
|
83
|
+
var safeAlias = identifier;
|
|
84
|
+
var safeKeyspace = function (target) {
|
|
85
|
+
// Accept existing model.keyspace() output and simple dotted identifiers, never expressions.
|
|
86
|
+
var token = '(?:`(?:[^`]|``)+`|[A-Za-z_][A-Za-z0-9_-]*)';
|
|
87
|
+
if (!new RegExp("^(?:default:)?".concat(token, "(?:\\.").concat(token, "){0,2}$")).test(target))
|
|
88
|
+
throw new Error('Invalid include keyspace; use a model or identifier path');
|
|
89
|
+
return target.replace(/[A-Za-z_][A-Za-z0-9_-]*|`(?:[^`]|``)+`/g, function (part, offset) {
|
|
90
|
+
return target.slice(offset + part.length, offset + part.length + 1) === ':' || part.startsWith('`')
|
|
91
|
+
? part
|
|
92
|
+
: identifier(part);
|
|
93
|
+
});
|
|
79
94
|
};
|
|
80
95
|
var keyspaceFromInclude = function (include, defaultKeyspace) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
if (include.model) {
|
|
88
|
-
return include.model.keyspace();
|
|
89
|
-
}
|
|
90
|
-
return defaultKeyspace;
|
|
96
|
+
var _a;
|
|
97
|
+
var target = include.keyspace ||
|
|
98
|
+
(typeof include.model === 'string' ? include.model : (_a = include.model) === null || _a === void 0 ? void 0 : _a.keyspace()) ||
|
|
99
|
+
defaultKeyspace;
|
|
100
|
+
return safeKeyspace(target);
|
|
91
101
|
};
|
|
92
102
|
var sourceField = function (field, sourceAlias) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
103
|
+
var segments = (0, field_path_1.parseFieldPath)(field);
|
|
104
|
+
var qualified = segments.length > 1 && segments[0].name === sourceAlias && !segments[0].selectors.length;
|
|
105
|
+
return qualified
|
|
106
|
+
? (0, field_path_1.renderFieldPath)(segments)
|
|
107
|
+
: "".concat(identifier(sourceAlias), ".").concat((0, field_path_1.renderFieldPath)(segments));
|
|
97
108
|
};
|
|
98
109
|
var includeOperator = function (include) {
|
|
99
110
|
if (include.type === 'leftNest') {
|
|
@@ -105,22 +116,92 @@ var includeOperator = function (include) {
|
|
|
105
116
|
if (include.type === 'leftJoin') {
|
|
106
117
|
return 'LEFT JOIN';
|
|
107
118
|
}
|
|
119
|
+
if (include.type === 'join') {
|
|
120
|
+
return include.optional ? 'LEFT JOIN' : 'JOIN';
|
|
121
|
+
}
|
|
108
122
|
if (include.keys) {
|
|
109
123
|
return include.optional ? 'LEFT NEST' : 'NEST';
|
|
110
124
|
}
|
|
111
125
|
return include.optional ? 'LEFT JOIN' : 'JOIN';
|
|
112
126
|
};
|
|
113
|
-
|
|
127
|
+
exports.includeOperator = includeOperator;
|
|
128
|
+
var predicateExpr = function (predicate, store, aliases) {
|
|
129
|
+
if (!predicate || typeof predicate !== 'object')
|
|
130
|
+
throw new Error('Invalid ON predicate');
|
|
131
|
+
var keys = Object.keys(predicate);
|
|
132
|
+
if (keys.length === 1 && (keys[0] === '$and' || keys[0] === '$or')) {
|
|
133
|
+
var children = predicate[keys[0]];
|
|
134
|
+
if (!Array.isArray(children) || !children.length)
|
|
135
|
+
throw new Error('ON logical groups must be nonempty');
|
|
136
|
+
return "(".concat(children
|
|
137
|
+
.map(function (child) { return predicateExpr(child, store, aliases); })
|
|
138
|
+
.join(keys[0] === '$and' ? ' AND ' : ' OR '), ")");
|
|
139
|
+
}
|
|
140
|
+
var comparison = predicate;
|
|
141
|
+
if (keys.length !== 3 ||
|
|
142
|
+
!keys.includes('left') ||
|
|
143
|
+
!keys.includes('right') ||
|
|
144
|
+
!keys.includes('op') ||
|
|
145
|
+
!Object.prototype.hasOwnProperty.call(comparisonOperators, comparison.op))
|
|
146
|
+
throw new Error('Unsupported ON comparison');
|
|
147
|
+
var reference = function (value) {
|
|
148
|
+
if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)
|
|
149
|
+
throw new Error('Expected explicit joinField reference');
|
|
150
|
+
var segments = (0, field_path_1.parseFieldPath)(value.$field);
|
|
151
|
+
if (segments.length < 2 || segments[0].selectors.length || !aliases.has(segments[0].name))
|
|
152
|
+
throw new Error("Unknown ON alias: ".concat(segments[0].name));
|
|
153
|
+
return (0, field_path_1.renderFieldPath)(segments);
|
|
154
|
+
};
|
|
155
|
+
var right = comparison.right;
|
|
156
|
+
return "".concat(reference(comparison.left), " ").concat(comparisonOperators[comparison.op], " ").concat(right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')
|
|
157
|
+
? reference(right)
|
|
158
|
+
: store.add(right));
|
|
159
|
+
};
|
|
160
|
+
var buildIncludeClauses = function (keyspace, include, sourceAlias, store) {
|
|
114
161
|
if (include === void 0) { include = []; }
|
|
115
162
|
if (sourceAlias === void 0) { sourceAlias = 'doc'; }
|
|
163
|
+
if (store === void 0) { store = new IncludeParameterStore(); }
|
|
164
|
+
var aliases = new Set([sourceAlias]);
|
|
165
|
+
var reservedAliases = new Set(['__cs_root', '__proto__', 'constructor', 'prototype']);
|
|
166
|
+
var modes = new Set(include.map(function (item) { return (item.on || item.onRaw ? 'ansi' : 'keys'); }));
|
|
167
|
+
// Couchbase does not permit mixing lookup and ANSI joins in the same FROM clause.
|
|
168
|
+
if (modes.size > 1)
|
|
169
|
+
throw new Error('Cannot mix ANSI ON and ON KEYS includes');
|
|
116
170
|
return include
|
|
117
171
|
.map(function (item) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
172
|
+
if (aliases.has(item.as) || reservedAliases.has(item.as))
|
|
173
|
+
throw new Error("Duplicate or reserved include alias: ".concat(item.as));
|
|
174
|
+
aliases.add(item.as);
|
|
175
|
+
if (item.type && !['join', 'leftJoin', 'nest', 'leftNest'].includes(item.type))
|
|
176
|
+
throw new Error('Unsupported include type');
|
|
177
|
+
if ([
|
|
178
|
+
item.key !== undefined,
|
|
179
|
+
item.keys !== undefined,
|
|
180
|
+
item.on !== undefined,
|
|
181
|
+
item.onRaw !== undefined,
|
|
182
|
+
].filter(Boolean).length !== 1) {
|
|
183
|
+
throw new Error("include ".concat(item.as, " requires exactly one of key, keys, on, onRaw"));
|
|
184
|
+
}
|
|
185
|
+
var condition;
|
|
186
|
+
if (item.on)
|
|
187
|
+
condition = "ON ".concat(predicateExpr(item.on, store, aliases));
|
|
188
|
+
else if (item.onRaw) {
|
|
189
|
+
var values_1 = item.onRaw.values || [];
|
|
190
|
+
var index_1 = 0;
|
|
191
|
+
if (!item.onRaw.sql.trim())
|
|
192
|
+
throw new Error('onRaw requires SQL');
|
|
193
|
+
var sql = item.onRaw.sql.replace(/\?/g, function () {
|
|
194
|
+
if (index_1 >= values_1.length)
|
|
195
|
+
throw new Error('onRaw placeholder/value mismatch');
|
|
196
|
+
return store.add(values_1[index_1++]);
|
|
197
|
+
});
|
|
198
|
+
if (index_1 !== values_1.length)
|
|
199
|
+
throw new Error('onRaw placeholder/value mismatch');
|
|
200
|
+
condition = "ON (".concat(sql, ")");
|
|
121
201
|
}
|
|
122
|
-
|
|
123
|
-
|
|
202
|
+
else
|
|
203
|
+
condition = "ON KEYS ".concat(sourceField((item.key || item.keys), sourceAlias));
|
|
204
|
+
return "".concat((0, exports.includeOperator)(item), " ").concat(keyspaceFromInclude(item, keyspace), " AS ").concat(safeAlias(item.as), " ").concat(condition);
|
|
124
205
|
})
|
|
125
206
|
.join(' ');
|
|
126
207
|
};
|
|
@@ -201,46 +282,71 @@ var buildWhereExpr = function (expr, store, sourceAlias) {
|
|
|
201
282
|
var buildOrderByExpr = function (orderBy, sourceAlias) {
|
|
202
283
|
return orderBy
|
|
203
284
|
? " ORDER BY ".concat(Object.keys(orderBy)
|
|
204
|
-
.map(function (field) {
|
|
285
|
+
.map(function (field) {
|
|
286
|
+
if (!['ASC', 'DESC'].includes(orderBy[field]))
|
|
287
|
+
throw new Error('Unsupported order direction');
|
|
288
|
+
return "".concat(sourceField(field, sourceAlias), " ").concat(orderBy[field]);
|
|
289
|
+
})
|
|
205
290
|
.join(','))
|
|
206
291
|
: '';
|
|
207
292
|
};
|
|
293
|
+
var selectedObject = function (alias, fields) {
|
|
294
|
+
if (!fields)
|
|
295
|
+
return identifier(alias);
|
|
296
|
+
if (!fields.length || new Set(fields).size !== fields.length)
|
|
297
|
+
throw new Error('Projection must contain distinct fields');
|
|
298
|
+
return "{".concat(fields
|
|
299
|
+
.map(function (field) {
|
|
300
|
+
if (field.includes('.'))
|
|
301
|
+
throw new Error('Include projections support top-level fields only');
|
|
302
|
+
return "".concat(JSON.stringify(field), ": ").concat(identifier(alias), ".").concat(identifier(field));
|
|
303
|
+
})
|
|
304
|
+
.join(', '), "}");
|
|
305
|
+
};
|
|
208
306
|
var buildSelectExpr = function (select, include, sourceAlias) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
307
|
+
var all = !select || select === '*';
|
|
308
|
+
var structured = Array.isArray(select) &&
|
|
309
|
+
select.every(function (field) { return typeof field === 'string' && !field.includes('.'); });
|
|
310
|
+
var root = all
|
|
311
|
+
? identifier(sourceAlias)
|
|
312
|
+
: structured
|
|
313
|
+
? selectedObject(sourceAlias, select)
|
|
314
|
+
: undefined;
|
|
315
|
+
var relations = include.map(function (item) {
|
|
316
|
+
var alias = identifier(item.as);
|
|
317
|
+
if (!item.select)
|
|
318
|
+
return "".concat(alias, " AS ").concat(alias);
|
|
319
|
+
var object = selectedObject('__cs_item', item.select);
|
|
320
|
+
var expression = (0, exports.includeOperator)(item).includes('NEST')
|
|
321
|
+
? "ARRAY ".concat(object, " FOR ").concat(identifier('__cs_item'), " IN ").concat(alias, " END")
|
|
322
|
+
: "CASE WHEN ".concat(alias, " IS MISSING THEN MISSING WHEN ").concat(alias, " IS NULL THEN NULL ELSE ").concat(selectedObject(item.as, item.select), " END");
|
|
323
|
+
return "".concat(expression, " AS ").concat(alias);
|
|
324
|
+
});
|
|
325
|
+
if (structured &&
|
|
326
|
+
select.some(function (field) { return include.some(function (item) { return item.as === field; }); }))
|
|
327
|
+
throw new Error('Include alias conflicts with projected root field');
|
|
328
|
+
if (root)
|
|
212
329
|
return {
|
|
213
|
-
expr:
|
|
214
|
-
selectAll:
|
|
215
|
-
resultKey:
|
|
330
|
+
expr: __spreadArray(["".concat(root, " AS __cs_root")], __read(relations), false).join(', '),
|
|
331
|
+
selectAll: all,
|
|
332
|
+
resultKey: '__cs_root',
|
|
216
333
|
};
|
|
217
|
-
|
|
218
|
-
var includeSelect = include.map(function (item) {
|
|
219
|
-
var alias = safeAlias(item.as);
|
|
220
|
-
return "".concat(alias, " AS ").concat(alias);
|
|
221
|
-
});
|
|
222
|
-
if (typeof select === 'string') {
|
|
223
|
-
return { expr: __spreadArray([select], __read(includeSelect), false).join(','), selectAll: false };
|
|
224
|
-
}
|
|
225
|
-
var modelSelect = select.map(function (item) {
|
|
226
|
-
return typeof item === 'string'
|
|
227
|
-
? sourceField(item, sourceAlias)
|
|
228
|
-
: (0, helpers_1.buildSelectArrayExpr)([item]);
|
|
229
|
-
});
|
|
230
|
-
return { expr: __spreadArray(__spreadArray([], __read(modelSelect), false), __read(includeSelect), false).join(','), selectAll: false };
|
|
334
|
+
throw new Error('Includes support only * or top-level field-array projections; use queryRows for arbitrary SQL++ projections');
|
|
231
335
|
};
|
|
232
336
|
var buildIncludedSelectionQuery = function (args) {
|
|
233
|
-
var sourceAlias =
|
|
337
|
+
var sourceAlias = args.sourceAlias || 'doc';
|
|
338
|
+
if (sourceAlias === '__cs_root')
|
|
339
|
+
throw new Error('Reserved source alias');
|
|
234
340
|
var include = args.include || [];
|
|
235
341
|
var store = new IncludeParameterStore();
|
|
236
342
|
var limit = typeof args.limit === 'number' ? args.limit : 10;
|
|
237
343
|
var page = typeof args.page === 'number' ? args.page : 0;
|
|
238
344
|
var offset = typeof args.offset === 'number' ? args.offset : page * limit;
|
|
239
345
|
var _a = buildSelectExpr(args.select, include, sourceAlias), expr = _a.expr, selectAll = _a.selectAll, resultKey = _a.resultKey;
|
|
240
|
-
var joins = (0, exports.buildIncludeClauses)(args.keyspace, include, sourceAlias);
|
|
346
|
+
var joins = (0, exports.buildIncludeClauses)(args.keyspace, include, sourceAlias, store);
|
|
241
347
|
var limitExpr = " LIMIT ".concat(store.set('cs_limit', limit), " OFFSET ").concat(store.set('cs_offset', offset));
|
|
242
348
|
return {
|
|
243
|
-
query: "SELECT ".concat(expr, " FROM ").concat(args.keyspace, " AS ").concat(sourceAlias, " ").concat(joins).concat(buildWhereExpr(args.where, store, sourceAlias)).concat(buildOrderByExpr(args.orderBy, sourceAlias)).concat(limitExpr),
|
|
349
|
+
query: "SELECT ".concat(expr, " FROM ").concat(args.keyspace, " AS ").concat(identifier(sourceAlias), " ").concat(joins).concat(buildWhereExpr(args.where, store, sourceAlias)).concat(buildOrderByExpr(args.orderBy, sourceAlias)).concat(limitExpr),
|
|
244
350
|
parameters: store.parameters,
|
|
245
351
|
resultKey: resultKey,
|
|
246
352
|
selectAll: selectAll,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/model/include.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAsD;AAEtD,wCAAmD;AAEnD,uCAA4C;AAkC5C,IAAM,mBAAmB,GAA2B;IAChD,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,IAAI;CACb,CAAC;AAEF,IAAM,yBAAyB,GAA2B;IACtD,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,UAAU;CACvB,CAAC;AAEF,IAAM,wBAAwB,GAA2B;IACrD,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,gBAAgB;IAC/B,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,eAAe;CAChC,CAAC;AAEF,IAAM,2BAA2B,GAA2B;IACxD,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,aAAa;CACzB,CAAC;AAEF,IAAM,gBAAgB,GAA2B;IAC7C,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,IAAI;CACZ,CAAC;AAEF;IAAA;QACW,eAAU,GAAwB,EAAE,CAAC;QACpC,UAAK,GAAG,CAAC,CAAC;IAetB,CAAC;IAbU,mCAAG,GAAV,UAAW,KAAU;QACjB,IAAM,GAAG,GAAG,mBAAY,IAAI,CAAC,KAAK,CAAE,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAE7B,OAAO,WAAI,GAAG,CAAE,CAAC;IACrB,CAAC;IAEM,mCAAG,GAAV,UAAW,GAAW,EAAE,KAAU;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAE7B,OAAO,WAAI,GAAG,CAAE,CAAC;IACrB,CAAC;IACL,4BAAC;AAAD,CAAC,AAjBD,IAiBC;AAED,IAAM,SAAS,GAAG,UAAC,KAAa;IAC5B,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,2BAAgB,EAAC,KAAK,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,IAAM,mBAAmB,GAAG,UAAC,OAA0B,EAAE,eAAuB;IAC5E,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,eAAe,CAAC;AAC3B,CAAC,CAAC;AAEF,IAAM,WAAW,GAAG,UAAC,KAAa,EAAE,WAAmB;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAG,WAAW,MAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,UAAG,WAAW,cAAI,IAAA,2BAAmB,EAAC,KAAK,CAAC,CAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,IAAM,eAAe,GAAG,UAAC,OAA0B;IAC/C,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC,CAAC;AAEK,IAAM,mBAAmB,GAAG,UAC/B,QAAgB,EAChB,OAAiC,EACjC,WAAmB;IADnB,wBAAA,EAAA,YAAiC;IACjC,4BAAA,EAAA,mBAAmB;IAEnB,OAAO,OAAO;SACT,GAAG,CAAC,UAAC,IAAI;QACN,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;QAElC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,kBAAW,IAAI,CAAC,EAAE,0BAAuB,CAAC,CAAC;QAC/D,CAAC;QAED,IAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjC,OAAO,UAAG,eAAe,CAAC,IAAI,CAAC,cAAI,mBAAmB,CAClD,IAAI,EACJ,QAAQ,CACX,iBAAO,KAAK,sBAAY,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAE,CAAC;IAC7D,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC,CAAC;AArBW,QAAA,mBAAmB,uBAqB9B;AAEF,IAAM,kBAAkB,GAAG,UAAC,MAA2B;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAArC,CAAqC,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,IAAM,mBAAmB,GAAG,UACxB,SAAiB,EACjB,UAA+B,EAC/B,KAA4B,EAC5B,WAAmB;IAEnB,IAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAClD,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;SAC/B,GAAG,CAAC,UAAC,QAAQ;QACV,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3E,OAAO,UAAG,KAAK,cAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAE,CAAC;QAC5D,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtE,OAAO,UAAG,KAAK,SAAG,mBAAmB,CAAC,QAAQ,CAAC,SAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QACxF,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC5E,OAAO,UAAG,KAAK,cAAI,yBAAyB,CAAC,QAAQ,CAAC,cAAI,KAAK,CAAC,GAAG,CAC/D,UAAU,CAAC,QAAQ,CAAC,CACvB,CAAE,CAAC;QACR,CAAC;QAED,IACI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAA2B,EAAE,QAAQ,CAAC;YAC3E,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EACrC,CAAC;YACO,IAAA,KAAA,OAAa,UAAU,CAAC,QAAQ,CAAC,IAAA,EAAhC,IAAI,QAAA,EAAE,EAAE,QAAwB,CAAC;YAExC,OAAO,UAAG,KAAK,cAAI,2BAA2B,CAAC,QAAQ,CAAC,cAAI,KAAK,CAAC,GAAG,CACjE,IAAI,CACP,kBAAQ,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,8CAAuC,QAAQ,CAAE,CAAC,CAAC;IACvE,CAAC,CAAC;SACD,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAI,IAAI,MAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UACnB,KAA0B,EAC1B,KAA4B,EAC5B,WAAmB;IAEnB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACpB,GAAG,CAAC,UAAC,SAAS;QACX,IAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE/B,IACI,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAA3B,CAA2B,CAAC,EACpE,CAAC;YACC,OAAO,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAChC,OAAO,UAAG,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,cAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAE,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,2CAAoC,SAAS,CAAE,CAAC,CAAC;IACrE,CAAC,CAAC;SACD,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,IAAM,oBAAoB,GAAG,UACzB,MAAwB,EACxB,KAA4B,EAC5B,WAAmB;IAEnB,IAAI,CAAC,kBAAkB,CAAC,MAA6B,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC,MAA6B,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACrB,GAAG,CAAC,UAAC,GAAG;;QACL,IAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE1B,IACI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAC7D,CAAC;YACC,OAAO,WAAI,KAAK;iBACX,GAAG,CAAC,UAAC,IAAI;gBACN,OAAA,oBAAoB,CAAC,IAAwB,EAAE,KAAK,EAAE,WAAW,CAAC;YAAlE,CAAkE,CACrE;iBACA,IAAI,CAAC,WAAI,gBAAgB,CAAC,GAAG,CAAC,MAAG,CAAC,MAAG,CAAC;QAC/C,CAAC;QAED,IAAI,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,eAAQ,KAAK;iBACf,GAAG,CAAC,UAAC,IAAI;gBACN,OAAA,oBAAoB,CAAC,IAAwB,EAAE,KAAK,EAAE,WAAW,CAAC;YAAlE,CAAkE,CACrE;iBACA,IAAI,CAAC,OAAO,CAAC,MAAG,CAAC;QAC1B,CAAC;QAED,OAAO,oBAAoB,CAAC,CAAA,SAAC,GAAC,GAAG,IAAG,KAAK,IAAqB,CAAA,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACxF,CAAC,CAAC;SACD,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UACnB,IAAkC,EAClC,KAA4B,EAC5B,WAAmB;IAEnB,OAAO,IAAI,CAAC,CAAC,CAAC,iBAAU,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC,CAAC;AAEF,IAAM,gBAAgB,GAAG,UACrB,OAA6C,EAC7C,WAAmB;IAEnB,OAAO,OAAO;QACV,CAAC,CAAC,oBAAa,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;aAC5B,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,UAAG,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,cAAI,OAAO,CAAC,KAAK,CAAC,CAAE,EAAtD,CAAsD,CAAC;aACtE,IAAI,CAAC,GAAG,CAAC,CAAE;QAClB,CAAC,CAAC,EAAE,CAAC;AACb,CAAC,CAAC;AAEF,IAAM,eAAe,GAAG,UACpB,MAAkC,EAClC,OAA4B,EAC5B,WAAmB;IAEnB,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,IAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAlB,CAAkB,CAAC,CAAC;QAC1D,IAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,UAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAK,KAAK,CAAE,EAApC,CAAoC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE3F,OAAO;YACH,IAAI,EAAE,wBAAiB,WAAW,gBAAM,WAAW,mBAAS,WAAW,CAAE;YACzE,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,WAAW;SACzB,CAAC;IACN,CAAC;IAED,IAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,IAAI;QACnC,IAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjC,OAAO,UAAG,KAAK,iBAAO,KAAK,CAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAC,IAAI,EAAE,eAAC,MAAM,UAAK,aAAa,UAAE,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC;IAC1E,CAAC;IAED,IAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,UAAC,IAAI;QAChC,OAAO,OAAO,IAAI,KAAK,QAAQ;YAC3B,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC;YAChC,CAAC,CAAC,IAAA,8BAAoB,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,OAAO,EAAC,IAAI,EAAE,uCAAI,WAAW,kBAAK,aAAa,UAAE,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC;AAClF,CAAC,CAAC;AAEK,IAAM,2BAA2B,GAAG,UACvC,IAAgC;IAEhC,IAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IACzD,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,IAAM,KAAK,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC1C,IAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,IAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IACtE,IAAA,KAA+B,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,EAAhF,IAAI,UAAA,EAAE,SAAS,eAAA,EAAE,SAAS,eAAsD,CAAC;IACxF,IAAM,KAAK,GAAG,IAAA,2BAAmB,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACvE,IAAM,SAAS,GAAG,iBAAU,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,qBAAW,KAAK,CAAC,GAAG,CACxE,WAAW,EACX,MAAM,CACT,CAAE,CAAC;IAEJ,OAAO;QACH,KAAK,EAAE,iBAAU,IAAI,mBAAS,IAAI,CAAC,QAAQ,iBAAO,WAAW,cAAI,KAAK,SAAG,cAAc,CACnF,IAAI,CAAC,KAAK,EACV,KAAK,EACL,WAAW,CACd,SAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,SAAG,SAAS,CAAE;QAC7D,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,WAAA;QACT,SAAS,WAAA;KACZ,CAAC;AACN,CAAC,CAAC;AA1BW,QAAA,2BAA2B,+BA0BtC","sourcesContent":["import {buildSelectArrayExpr} from '../query/helpers';\nimport {LogicalWhereExpr, SortType} from '../query/interface/query.types';\nimport {escapeReservedWords} from '../query/utils';\n\nimport {escapeIdentifier} from './keyspace';\n\nexport type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';\n\nexport interface IncludeDefinition {\n as: string;\n key?: string;\n keys?: string;\n keyspace?: string;\n model?: string | {keyspace: () => string};\n type?: IncludeType;\n optional?: boolean;\n}\n\nexport interface IncludedSelectionQueryArgs {\n keyspace: string;\n collectionName: string;\n select?: any[] | string;\n where?: LogicalWhereExpr;\n orderBy?: Record<string, SortType>;\n include?: IncludeDefinition[];\n limit?: number;\n page?: number;\n offset?: number;\n sourceAlias?: string;\n}\n\nexport interface IncludedSelectionQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n resultKey?: string;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass IncludeParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n\n public set(key: string, value: any): string {\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst safeAlias = (alias: string): string => {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(alias) ? alias : escapeIdentifier(alias);\n};\n\nconst keyspaceFromInclude = (include: IncludeDefinition, defaultKeyspace: string): string => {\n if (include.keyspace) {\n return include.keyspace;\n }\n\n if (typeof include.model === 'string') {\n return include.model;\n }\n\n if (include.model) {\n return include.model.keyspace();\n }\n\n return defaultKeyspace;\n};\n\nconst sourceField = (field: string, sourceAlias: string): string => {\n if (field.indexOf(`${sourceAlias}.`) === 0) {\n return field;\n }\n\n return `${sourceAlias}.${escapeReservedWords(field)}`;\n};\n\nconst includeOperator = (include: IncludeDefinition): string => {\n if (include.type === 'leftNest') {\n return 'LEFT NEST';\n }\n\n if (include.type === 'nest') {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n if (include.type === 'leftJoin') {\n return 'LEFT JOIN';\n }\n\n if (include.keys) {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n};\n\nexport const buildIncludeClauses = (\n keyspace: string,\n include: IncludeDefinition[] = [],\n sourceAlias = 'doc'\n): string => {\n return include\n .map((item) => {\n const key = item.key || item.keys;\n\n if (!key) {\n throw new Error(`include ${item.as} requires key or keys`);\n }\n\n const alias = safeAlias(item.as);\n\n return `${includeOperator(item)} ${keyspaceFromInclude(\n item,\n keyspace\n )} AS ${alias} ON KEYS ${sourceField(key, sourceAlias)}`;\n })\n .join(' ');\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n const field = sourceField(fieldName, sourceAlias);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${store.add(comparison[operator])}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${store.add(\n comparison[operator]\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${store.add(\n from\n )} AND ${store.add(to)}`;\n }\n\n throw new Error(`Unsupported include where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (\n field: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store, sourceAlias);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${sourceField(fieldName, sourceAlias)}=${store.add(value)}`;\n }\n\n throw new Error(`Unsupported include where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store, sourceAlias);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store, sourceAlias);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return expr ? ` WHERE ${buildWhereClauseExpr(expr, store, sourceAlias)}` : '';\n};\n\nconst buildOrderByExpr = (\n orderBy: Record<string, SortType> | undefined,\n sourceAlias: string\n): string => {\n return orderBy\n ? ` ORDER BY ${Object.keys(orderBy)\n .map((field) => `${sourceField(field, sourceAlias)} ${orderBy[field]}`)\n .join(',')}`\n : '';\n};\n\nconst buildSelectExpr = (\n select: any[] | string | undefined,\n include: IncludeDefinition[],\n sourceAlias: string\n): {expr: string; selectAll: boolean; resultKey?: string} => {\n if (!select || select === '*') {\n const aliases = include.map((item) => safeAlias(item.as));\n const mergeObject = aliases.map((alias) => `${JSON.stringify(alias)}: ${alias}`).join(',');\n\n return {\n expr: `OBJECT_CONCAT(${sourceAlias}, {${mergeObject}}) AS ${sourceAlias}`,\n selectAll: true,\n resultKey: sourceAlias,\n };\n }\n\n const includeSelect = include.map((item) => {\n const alias = safeAlias(item.as);\n\n return `${alias} AS ${alias}`;\n });\n\n if (typeof select === 'string') {\n return {expr: [select, ...includeSelect].join(','), selectAll: false};\n }\n\n const modelSelect = select.map((item) => {\n return typeof item === 'string'\n ? sourceField(item, sourceAlias)\n : buildSelectArrayExpr([item]);\n });\n\n return {expr: [...modelSelect, ...includeSelect].join(','), selectAll: false};\n};\n\nexport const buildIncludedSelectionQuery = (\n args: IncludedSelectionQueryArgs\n): IncludedSelectionQuery => {\n const sourceAlias = safeAlias(args.sourceAlias || 'doc');\n const include = args.include || [];\n const store = new IncludeParameterStore();\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const page = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : page * limit;\n const {expr, selectAll, resultKey} = buildSelectExpr(args.select, include, sourceAlias);\n const joins = buildIncludeClauses(args.keyspace, include, sourceAlias);\n const limitExpr = ` LIMIT ${store.set('cs_limit', limit)} OFFSET ${store.set(\n 'cs_offset',\n offset\n )}`;\n\n return {\n query: `SELECT ${expr} FROM ${args.keyspace} AS ${sourceAlias} ${joins}${buildWhereExpr(\n args.where,\n store,\n sourceAlias\n )}${buildOrderByExpr(args.orderBy, sourceAlias)}${limitExpr}`,\n parameters: store.parameters,\n resultKey,\n selectAll,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/model/include.ts"],"names":[],"mappings":"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","sourcesContent":["import {LogicalWhereExpr, SortType} from '../query/interface/query.types';\n\nimport {escapeIdentifier} from './keyspace';\nimport {parseFieldPath, renderFieldPath} from './field-path';\n\nexport type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';\n\nexport interface IncludeDefinition {\n as: string;\n /** ANSI predicate; mutually exclusive with key/keys. */\n on?: JoinPredicate;\n /** Explicit trusted SQL++ escape hatch. Values still use positional placeholders. */\n onRaw?: {sql: string; values?: readonly unknown[]};\n /** Top-level fields retained from the related document. */\n select?: readonly string[];\n key?: string;\n keys?: string;\n keyspace?: string;\n model?:\n | string\n | {keyspace: () => string; parse?: <T>(data: T) => T; parseProjection?: <T>(data: T) => T};\n type?: IncludeType;\n optional?: boolean;\n}\n\n/** A field operand is explicit; bare strings are always parameter values. */\nexport interface JoinField {\n readonly $field: string;\n}\nexport type JoinPredicate =\n | {$and: readonly JoinPredicate[]}\n | {$or: readonly JoinPredicate[]}\n | {left: JoinField; op: '$eq' | '$neq' | '$gt' | '$gte' | '$lt' | '$lte'; right: unknown};\nexport const joinField = (path: string): JoinField => ({$field: path});\n\nconst identifier = (name: string): string => {\n if (!name || name.indexOf('\\0') !== -1) throw new Error('Empty or invalid identifier');\n return escapeIdentifier(name);\n};\n\nexport interface IncludedSelectionQueryArgs {\n keyspace: string;\n collectionName: string;\n select?: readonly any[] | string;\n where?: LogicalWhereExpr;\n orderBy?: Record<string, SortType>;\n include?: readonly IncludeDefinition[];\n limit?: number;\n page?: number;\n offset?: number;\n sourceAlias?: string;\n}\n\nexport interface IncludedSelectionQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n resultKey?: string;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass IncludeParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n\n public set(key: string, value: any): string {\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst safeAlias = identifier;\n\nconst safeKeyspace = (target: string): string => {\n // Accept existing model.keyspace() output and simple dotted identifiers, never expressions.\n const token = '(?:`(?:[^`]|``)+`|[A-Za-z_][A-Za-z0-9_-]*)';\n if (!new RegExp(`^(?:default:)?${token}(?:\\\\.${token}){0,2}$`).test(target))\n throw new Error('Invalid include keyspace; use a model or identifier path');\n return target.replace(/[A-Za-z_][A-Za-z0-9_-]*|`(?:[^`]|``)+`/g, (part, offset) =>\n target.slice(offset + part.length, offset + part.length + 1) === ':' || part.startsWith('`')\n ? part\n : identifier(part)\n );\n};\nconst keyspaceFromInclude = (include: IncludeDefinition, defaultKeyspace: string): string => {\n const target =\n include.keyspace ||\n (typeof include.model === 'string' ? include.model : include.model?.keyspace()) ||\n defaultKeyspace;\n return safeKeyspace(target);\n};\n\nconst sourceField = (field: string, sourceAlias: string): string => {\n const segments = parseFieldPath(field);\n const qualified =\n segments.length > 1 && segments[0].name === sourceAlias && !segments[0].selectors.length;\n return qualified\n ? renderFieldPath(segments)\n : `${identifier(sourceAlias)}.${renderFieldPath(segments)}`;\n};\n\nexport const includeOperator = (include: IncludeDefinition): string => {\n if (include.type === 'leftNest') {\n return 'LEFT NEST';\n }\n\n if (include.type === 'nest') {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n if (include.type === 'leftJoin') {\n return 'LEFT JOIN';\n }\n\n if (include.type === 'join') {\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n }\n\n if (include.keys) {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n};\n\nconst predicateExpr = (\n predicate: JoinPredicate,\n store: IncludeParameterStore,\n aliases: Set<string>\n): string => {\n if (!predicate || typeof predicate !== 'object') throw new Error('Invalid ON predicate');\n const keys = Object.keys(predicate);\n if (keys.length === 1 && (keys[0] === '$and' || keys[0] === '$or')) {\n const children = (predicate as any)[keys[0]];\n if (!Array.isArray(children) || !children.length)\n throw new Error('ON logical groups must be nonempty');\n return `(${children\n .map((child) => predicateExpr(child, store, aliases))\n .join(keys[0] === '$and' ? ' AND ' : ' OR ')})`;\n }\n const comparison = predicate as any;\n if (\n keys.length !== 3 ||\n !keys.includes('left') ||\n !keys.includes('right') ||\n !keys.includes('op') ||\n !Object.prototype.hasOwnProperty.call(comparisonOperators, comparison.op)\n )\n throw new Error('Unsupported ON comparison');\n const reference = (value: any): string => {\n if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)\n throw new Error('Expected explicit joinField reference');\n const segments = parseFieldPath(value.$field);\n if (segments.length < 2 || segments[0].selectors.length || !aliases.has(segments[0].name))\n throw new Error(`Unknown ON alias: ${segments[0].name}`);\n return renderFieldPath(segments);\n };\n const right = comparison.right;\n return `${reference(comparison.left)} ${comparisonOperators[comparison.op]} ${\n right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')\n ? reference(right)\n : store.add(right)\n }`;\n};\n\nexport const buildIncludeClauses = (\n keyspace: string,\n include: readonly IncludeDefinition[] = [],\n sourceAlias = 'doc',\n store = new IncludeParameterStore()\n): string => {\n const aliases = new Set([sourceAlias]);\n const reservedAliases = new Set(['__cs_root', '__proto__', 'constructor', 'prototype']);\n const modes = new Set(include.map((item) => (item.on || item.onRaw ? 'ansi' : 'keys')));\n // Couchbase does not permit mixing lookup and ANSI joins in the same FROM clause.\n if (modes.size > 1) throw new Error('Cannot mix ANSI ON and ON KEYS includes');\n return include\n .map((item) => {\n if (aliases.has(item.as) || reservedAliases.has(item.as))\n throw new Error(`Duplicate or reserved include alias: ${item.as}`);\n aliases.add(item.as);\n if (item.type && !['join', 'leftJoin', 'nest', 'leftNest'].includes(item.type))\n throw new Error('Unsupported include type');\n if (\n [\n item.key !== undefined,\n item.keys !== undefined,\n item.on !== undefined,\n item.onRaw !== undefined,\n ].filter(Boolean).length !== 1\n ) {\n throw new Error(`include ${item.as} requires exactly one of key, keys, on, onRaw`);\n }\n let condition: string;\n if (item.on) condition = `ON ${predicateExpr(item.on, store, aliases)}`;\n else if (item.onRaw) {\n const values = item.onRaw.values || [];\n let index = 0;\n if (!item.onRaw.sql.trim()) throw new Error('onRaw requires SQL');\n const sql = item.onRaw.sql.replace(/\\?/g, () => {\n if (index >= values.length) throw new Error('onRaw placeholder/value mismatch');\n return store.add(values[index++]);\n });\n if (index !== values.length) throw new Error('onRaw placeholder/value mismatch');\n condition = `ON (${sql})`;\n } else\n condition = `ON KEYS ${sourceField(\n (item.key || item.keys) as string,\n sourceAlias\n )}`;\n return `${includeOperator(item)} ${keyspaceFromInclude(item, keyspace)} AS ${safeAlias(\n item.as\n )} ${condition}`;\n })\n .join(' ');\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n const field = sourceField(fieldName, sourceAlias);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${store.add(comparison[operator])}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${store.add(\n comparison[operator]\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${store.add(\n from\n )} AND ${store.add(to)}`;\n }\n\n throw new Error(`Unsupported include where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (\n field: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store, sourceAlias);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${sourceField(fieldName, sourceAlias)}=${store.add(value)}`;\n }\n\n throw new Error(`Unsupported include where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store, sourceAlias);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store, sourceAlias);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return expr ? ` WHERE ${buildWhereClauseExpr(expr, store, sourceAlias)}` : '';\n};\n\nconst buildOrderByExpr = (\n orderBy: Record<string, SortType> | undefined,\n sourceAlias: string\n): string => {\n return orderBy\n ? ` ORDER BY ${Object.keys(orderBy)\n .map((field) => {\n if (!['ASC', 'DESC'].includes(orderBy[field]))\n throw new Error('Unsupported order direction');\n return `${sourceField(field, sourceAlias)} ${orderBy[field]}`;\n })\n .join(',')}`\n : '';\n};\n\nconst selectedObject = (alias: string, fields?: readonly string[]): string => {\n if (!fields) return identifier(alias);\n if (!fields.length || new Set(fields).size !== fields.length)\n throw new Error('Projection must contain distinct fields');\n return `{${fields\n .map((field) => {\n if (field.includes('.'))\n throw new Error('Include projections support top-level fields only');\n return `${JSON.stringify(field)}: ${identifier(alias)}.${identifier(field)}`;\n })\n .join(', ')}}`;\n};\n\nconst buildSelectExpr = (\n select: readonly any[] | string | undefined,\n include: readonly IncludeDefinition[],\n sourceAlias: string\n): {expr: string; selectAll: boolean; resultKey?: string} => {\n const all = !select || select === '*';\n const structured =\n Array.isArray(select) &&\n select.every((field) => typeof field === 'string' && !field.includes('.'));\n const root = all\n ? identifier(sourceAlias)\n : structured\n ? selectedObject(sourceAlias, select as string[])\n : undefined;\n const relations = include.map((item) => {\n const alias = identifier(item.as);\n if (!item.select) return `${alias} AS ${alias}`;\n const object = selectedObject('__cs_item', item.select);\n const expression = includeOperator(item).includes('NEST')\n ? `ARRAY ${object} FOR ${identifier('__cs_item')} IN ${alias} END`\n : `CASE WHEN ${alias} IS MISSING THEN MISSING WHEN ${alias} IS NULL THEN NULL ELSE ${selectedObject(\n item.as,\n item.select\n )} END`;\n return `${expression} AS ${alias}`;\n });\n if (\n structured &&\n (select as string[]).some((field) => include.some((item) => item.as === field))\n )\n throw new Error('Include alias conflicts with projected root field');\n if (root)\n return {\n expr: [`${root} AS __cs_root`, ...relations].join(', '),\n selectAll: all,\n resultKey: '__cs_root',\n };\n throw new Error(\n 'Includes support only * or top-level field-array projections; use queryRows for arbitrary SQL++ projections'\n );\n};\n\nexport const buildIncludedSelectionQuery = (\n args: IncludedSelectionQueryArgs\n): IncludedSelectionQuery => {\n const sourceAlias = args.sourceAlias || 'doc';\n if (sourceAlias === '__cs_root') throw new Error('Reserved source alias');\n const include = args.include || [];\n const store = new IncludeParameterStore();\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const page = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : page * limit;\n const {expr, selectAll, resultKey} = buildSelectExpr(args.select, include, sourceAlias);\n const joins = buildIncludeClauses(args.keyspace, include, sourceAlias, store);\n const limitExpr = ` LIMIT ${store.set('cs_limit', limit)} OFFSET ${store.set(\n 'cs_offset',\n offset\n )}`;\n\n return {\n query: `SELECT ${expr} FROM ${args.keyspace} AS ${identifier(\n sourceAlias\n )} ${joins}${buildWhereExpr(args.where, store, sourceAlias)}${buildOrderByExpr(\n args.orderBy,\n sourceAlias\n )}${limitExpr}`,\n parameters: store.parameters,\n resultKey,\n selectAll,\n };\n};\n"]}
|
package/dist/model/index.d.ts
CHANGED
|
@@ -27,7 +27,8 @@ export type { ModelPageResult, ModelReadArgs } from './read-helpers';
|
|
|
27
27
|
export type { QueryLogger, QueryPageOptions, QueryPageResult, QueryParameters, SafeQueryOptions, } from './safe-query';
|
|
28
28
|
export type { FindByIdWithMetaResult, PatchByIdArgs } from './write-helpers';
|
|
29
29
|
export type { Hydrated } from './hydrated-document';
|
|
30
|
-
export type { IncludeDefinition, IncludeType } from './include';
|
|
30
|
+
export type { IncludeDefinition, IncludeType, JoinField, JoinPredicate } from './include';
|
|
31
|
+
export { joinField } from './include';
|
|
31
32
|
export type { EnsureIndexOptions, ModelIndexDefinition } from './indexes';
|
|
32
33
|
export type { TtlOptions } from './ttl';
|
|
33
34
|
export type { ParseHook, ValidationHook } from './validation';
|
|
@@ -234,6 +235,8 @@ export declare class Model {
|
|
|
234
235
|
id: string;
|
|
235
236
|
}>(data: T & AutoModelFields): Hydrated<T>;
|
|
236
237
|
parse<T>(data: T): T;
|
|
238
|
+
/** Decode present projection fields without invoking full-document parse hooks. */
|
|
239
|
+
parseProjection<T>(data: T): T;
|
|
237
240
|
/** @internal Used by the typed client before a document reaches the SDK. */
|
|
238
241
|
serialize<T>(data: T): T;
|
|
239
242
|
/** @internal Used by patch helpers and transaction-bound models. */
|
package/dist/model/index.js
CHANGED
|
@@ -97,7 +97,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
97
97
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
98
98
|
};
|
|
99
99
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
100
|
-
exports.Model = void 0;
|
|
100
|
+
exports.Model = exports.joinField = void 0;
|
|
101
101
|
var utils_1 = require("../utils");
|
|
102
102
|
var connection_1 = __importDefault(require("../connection"));
|
|
103
103
|
var default_scope_1 = require("./default-scope");
|
|
@@ -108,6 +108,8 @@ var write_helpers_1 = require("./write-helpers");
|
|
|
108
108
|
var hydrated_document_1 = require("./hydrated-document");
|
|
109
109
|
var indexes_1 = require("./indexes");
|
|
110
110
|
var validation_1 = require("./validation");
|
|
111
|
+
var include_1 = require("./include");
|
|
112
|
+
Object.defineProperty(exports, "joinField", { enumerable: true, get: function () { return include_1.joinField; } });
|
|
111
113
|
var Model = /** @class */ (function () {
|
|
112
114
|
function Model(name, options, connection) {
|
|
113
115
|
this.scope = '_default';
|
|
@@ -322,6 +324,7 @@ var Model = /** @class */ (function () {
|
|
|
322
324
|
cluster: this.couchbaseConnection().cluster,
|
|
323
325
|
parse: function (data) { return _this.parse(data); },
|
|
324
326
|
resultKey: this.queryResultKey(),
|
|
327
|
+
parseProjection: function (data) { return _this.parseProjection(data); },
|
|
325
328
|
};
|
|
326
329
|
};
|
|
327
330
|
Model.prototype.readArgs = function (args) {
|
|
@@ -756,6 +759,10 @@ var Model = /** @class */ (function () {
|
|
|
756
759
|
var parsedDates = (0, validation_1.parseDateFields)(parsed, this.dateFields);
|
|
757
760
|
return this.parseHook ? this.parseHook(parsedDates) : parsedDates;
|
|
758
761
|
};
|
|
762
|
+
/** Decode present projection fields without invoking full-document parse hooks. */
|
|
763
|
+
Model.prototype.parseProjection = function (data) {
|
|
764
|
+
return (0, validation_1.parseDateFields)((0, utils_1.parseSchema)(this.schema, this.deserialize(data)), this.dateFields);
|
|
765
|
+
};
|
|
759
766
|
/** @internal Used by the typed client before a document reaches the SDK. */
|
|
760
767
|
Model.prototype.serialize = function (data) {
|
|
761
768
|
var _this = this;
|