couchset 0.5.1 → 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.
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface PathSegment {
|
|
2
|
+
name: string;
|
|
3
|
+
selectors: string[];
|
|
4
|
+
}
|
|
5
|
+
/** Parse data paths, not SQL expressions. Backticks delimit literal field names. */
|
|
6
|
+
export declare const parseFieldPath: (path: string) => PathSegment[];
|
|
7
|
+
export declare const renderFieldPath: (segments: readonly PathSegment[]) => string;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderFieldPath = exports.parseFieldPath = void 0;
|
|
4
|
+
var keyspace_1 = require("./keyspace");
|
|
5
|
+
/** Parse data paths, not SQL expressions. Backticks delimit literal field names. */
|
|
6
|
+
var parseFieldPath = function (path) {
|
|
7
|
+
var invalid = function () {
|
|
8
|
+
throw new Error("Invalid field path: ".concat(JSON.stringify(path)));
|
|
9
|
+
};
|
|
10
|
+
if (typeof path !== 'string' || !path.length || /[\x00-\x1f\x7f]/.test(path))
|
|
11
|
+
invalid();
|
|
12
|
+
var segments = [];
|
|
13
|
+
var position = 0;
|
|
14
|
+
while (position < path.length) {
|
|
15
|
+
var name_1 = '';
|
|
16
|
+
if (path[position] === '`') {
|
|
17
|
+
position++;
|
|
18
|
+
var closed_1 = false;
|
|
19
|
+
while (position < path.length) {
|
|
20
|
+
var character = path[position++];
|
|
21
|
+
if (character !== '`')
|
|
22
|
+
name_1 += character;
|
|
23
|
+
else if (path[position] === '`') {
|
|
24
|
+
name_1 += '`';
|
|
25
|
+
position++;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
closed_1 = true;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (!closed_1)
|
|
33
|
+
invalid();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
while (position < path.length && !'.[]'.includes(path[position])) {
|
|
37
|
+
name_1 += path[position++];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (!name_1)
|
|
41
|
+
invalid();
|
|
42
|
+
var selectors = [];
|
|
43
|
+
while (path[position] === '[') {
|
|
44
|
+
var end = path.indexOf(']', position + 1);
|
|
45
|
+
if (end < 0)
|
|
46
|
+
invalid();
|
|
47
|
+
var selector = path.slice(position + 1, end);
|
|
48
|
+
if (selector !== '*' &&
|
|
49
|
+
(!/^(0|[1-9]\d*)$/.test(selector) || !Number.isSafeInteger(Number(selector))))
|
|
50
|
+
invalid();
|
|
51
|
+
selectors.push("[".concat(selector, "]"));
|
|
52
|
+
position = end + 1;
|
|
53
|
+
}
|
|
54
|
+
segments.push({ name: name_1, selectors: selectors });
|
|
55
|
+
if (position === path.length)
|
|
56
|
+
break;
|
|
57
|
+
if (path[position++] !== '.' || position === path.length)
|
|
58
|
+
invalid();
|
|
59
|
+
}
|
|
60
|
+
return segments;
|
|
61
|
+
};
|
|
62
|
+
exports.parseFieldPath = parseFieldPath;
|
|
63
|
+
var renderFieldPath = function (segments) {
|
|
64
|
+
return segments.map(function (_a) {
|
|
65
|
+
var name = _a.name, selectors = _a.selectors;
|
|
66
|
+
return (0, keyspace_1.escapeIdentifier)(name) + selectors.join('');
|
|
67
|
+
}).join('.');
|
|
68
|
+
};
|
|
69
|
+
exports.renderFieldPath = renderFieldPath;
|
|
70
|
+
//# sourceMappingURL=field-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-path.js","sourceRoot":"","sources":["../../src/model/field-path.ts"],"names":[],"mappings":"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","sourcesContent":["import {escapeIdentifier} from './keyspace';\n\ninterface PathSegment {\n name: string;\n selectors: string[];\n}\n\n/** Parse data paths, not SQL expressions. Backticks delimit literal field names. */\nexport const parseFieldPath = (path: string): PathSegment[] => {\n const invalid = (): never => {\n throw new Error(`Invalid field path: ${JSON.stringify(path)}`);\n };\n if (typeof path !== 'string' || !path.length || /[\\x00-\\x1f\\x7f]/.test(path)) invalid();\n const segments: PathSegment[] = [];\n let position = 0;\n while (position < path.length) {\n let name = '';\n if (path[position] === '`') {\n position++;\n let closed = false;\n while (position < path.length) {\n const character = path[position++];\n if (character !== '`') name += character;\n else if (path[position] === '`') {\n name += '`';\n position++;\n } else {\n closed = true;\n break;\n }\n }\n if (!closed) invalid();\n } else {\n while (position < path.length && !'.[]'.includes(path[position])) {\n name += path[position++];\n }\n }\n if (!name) invalid();\n const selectors: string[] = [];\n while (path[position] === '[') {\n const end = path.indexOf(']', position + 1);\n if (end < 0) invalid();\n const selector = path.slice(position + 1, end);\n if (\n selector !== '*' &&\n (!/^(0|[1-9]\\d*)$/.test(selector) || !Number.isSafeInteger(Number(selector)))\n )\n invalid();\n selectors.push(`[${selector}]`);\n position = end + 1;\n }\n segments.push({name, selectors});\n if (position === path.length) break;\n if (path[position++] !== '.' || position === path.length) invalid();\n }\n return segments;\n};\n\nexport const renderFieldPath = (segments: readonly PathSegment[]): string =>\n segments.map(({name, selectors}) => escapeIdentifier(name) + selectors.join('')).join('.');\n"]}
|
package/dist/model/include.js
CHANGED
|
@@ -27,6 +27,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
27
27
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
28
|
exports.buildIncludedSelectionQuery = exports.buildIncludeClauses = exports.includeOperator = exports.joinField = void 0;
|
|
29
29
|
var keyspace_1 = require("./keyspace");
|
|
30
|
+
var field_path_1 = require("./field-path");
|
|
30
31
|
var joinField = function (path) { return ({ $field: path }); };
|
|
31
32
|
exports.joinField = joinField;
|
|
32
33
|
var identifier = function (name) {
|
|
@@ -34,7 +35,6 @@ var identifier = function (name) {
|
|
|
34
35
|
throw new Error('Empty or invalid identifier');
|
|
35
36
|
return (0, keyspace_1.escapeIdentifier)(name);
|
|
36
37
|
};
|
|
37
|
-
var fieldPath = function (path) { return path.split('.').map(identifier).join('.'); };
|
|
38
38
|
var comparisonOperators = {
|
|
39
39
|
$eq: '=',
|
|
40
40
|
$neq: '!=',
|
|
@@ -100,10 +100,11 @@ var keyspaceFromInclude = function (include, defaultKeyspace) {
|
|
|
100
100
|
return safeKeyspace(target);
|
|
101
101
|
};
|
|
102
102
|
var sourceField = function (field, sourceAlias) {
|
|
103
|
-
var
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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));
|
|
107
108
|
};
|
|
108
109
|
var includeOperator = function (include) {
|
|
109
110
|
if (include.type === 'leftNest') {
|
|
@@ -146,10 +147,10 @@ var predicateExpr = function (predicate, store, aliases) {
|
|
|
146
147
|
var reference = function (value) {
|
|
147
148
|
if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)
|
|
148
149
|
throw new Error('Expected explicit joinField reference');
|
|
149
|
-
var
|
|
150
|
-
if (
|
|
151
|
-
throw new Error("Unknown ON alias: ".concat(
|
|
152
|
-
return
|
|
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);
|
|
153
154
|
};
|
|
154
155
|
var right = comparison.right;
|
|
155
156
|
return "".concat(reference(comparison.left), " ").concat(comparisonOperators[comparison.op], " ").concat(right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')
|
|
@@ -1 +1 @@
|
|
|
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';\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};\nconst fieldPath = (path: string): string => path.split('.').map(identifier).join('.');\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 prefix = `${sourceAlias}.`;\n return field.indexOf(prefix) === 0\n ? fieldPath(field)\n : `${identifier(sourceAlias)}.${fieldPath(field)}`;\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 parts = value.$field.split('.');\n if (parts.length < 2 || !aliases.has(parts[0]))\n throw new Error(`Unknown ON alias: ${parts[0]}`);\n return fieldPath(value.$field);\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"]}
|
|
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"]}
|
|
@@ -46,9 +46,17 @@ result.items[0]?.creator?.birthday; // Date | undefined
|
|
|
46
46
|
A `joinField('alias.path')` is a field reference; an ordinary string on the
|
|
47
47
|
right is always a bound value, even when it contains a dot. Aliases must refer
|
|
48
48
|
to the root (default `doc`), the current include, or an earlier include. Field
|
|
49
|
-
paths use dots as separators and quote every identifier segment.
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
paths use dots as separators and quote every identifier segment. Nonnegative
|
|
50
|
+
integer indexes (`[0]`, `[1]`) and wildcard traversal (`[*]`) remain SQL++ array
|
|
51
|
+
operators. This parsing applies to `key`/`keys`, joined WHERE/orderBy fields,
|
|
52
|
+
and `joinField` references, including source-qualified paths. Alias strings
|
|
53
|
+
are quoted, including reserved words. Backtick-delimited segments represent
|
|
54
|
+
literal field names; double a backtick inside such a segment to escape it.
|
|
55
|
+
For example, the path string '`media[*]`' names a literal field, while
|
|
56
|
+
'media[*].mediaId' traverses the media array. Empty segments, unmatched brackets,
|
|
57
|
+
negative/decimal indexes, slices, expression indexes, and unsafe-size indexes
|
|
58
|
+
are rejected. Top-level projection arrays remain literal field selections;
|
|
59
|
+
this change does not add array-expression projections or a fluent path builder.
|
|
52
60
|
|
|
53
61
|
Comparisons support `$eq`, `$neq`, `$gt`, `$gte`, `$lt`, and `$lte`. Nest nonempty
|
|
54
62
|
`$and` and `$or` arrays to combine predicates:
|
|
@@ -226,3 +234,33 @@ type fixture; the corrected live run passed all 20 probes. These observations
|
|
|
226
234
|
validate this local server and synthetic workload; they do not establish a
|
|
227
235
|
concurrent multi-document snapshot, a production index plan, or compatibility
|
|
228
236
|
with every supported server version.
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
### Array-path compatibility regression
|
|
240
|
+
|
|
241
|
+
The include identifier-quoting change initially quoted `media[*]` and
|
|
242
|
+
`participantIds[0]` as whole field names. The validated path parser restores
|
|
243
|
+
array traversal without interpolating SQL expressions or changing value binding:
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
const results = await battles.findMany({
|
|
247
|
+
where: {'participantIds[0]': 'profile::demo'},
|
|
248
|
+
include: [{
|
|
249
|
+
as: 'mediaDocuments',
|
|
250
|
+
model: mediaModel,
|
|
251
|
+
keys: 'media[*].mediaId',
|
|
252
|
+
type: 'leftNest',
|
|
253
|
+
}],
|
|
254
|
+
});
|
|
255
|
+
// ON KEYS `doc`.`media`[*].`mediaId`
|
|
256
|
+
// Root _type filter plus `doc`.`participantIds`[0]=$cs_param_1
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
For an opt-in regression probe, run `npm run build` then
|
|
260
|
+
`node scripts/live-array-path-probe.cjs`. It reads `.env`, requires a loopback
|
|
261
|
+
server, creates a uniquely named scope and indexes, and removes that scope in
|
|
262
|
+
`finally`. It writes a sanitized JSON report to the OS temporary directory.
|
|
263
|
+
Eight probes passed locally on Query 8.0.3 on 2026-09-05, verifying media
|
|
264
|
+
hydration/codecs, `[0]` and `[1]` filters, nested wildcard paths, aliases, sort
|
|
265
|
+
expressions, ANSI references, literal bracket-containing fields, and LEFT NEST
|
|
266
|
+
pagination. Nested result assertions compare membership, not source-key order.
|