@zmdb/sql 1.0.0-beta.1
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/LICENSE +674 -0
- package/README.md +35 -0
- package/dist/aggregations/index.d.ts +30 -0
- package/dist/aggregations/index.d.ts.map +1 -0
- package/dist/aggregations/index.js +52 -0
- package/dist/aggregations/index.js.map +1 -0
- package/dist/clauses.d.ts +112 -0
- package/dist/clauses.d.ts.map +1 -0
- package/dist/clauses.js +267 -0
- package/dist/clauses.js.map +1 -0
- package/dist/comments/index.d.ts +26 -0
- package/dist/comments/index.d.ts.map +1 -0
- package/dist/comments/index.js +28 -0
- package/dist/comments/index.js.map +1 -0
- package/dist/compiled-query.d.ts +12 -0
- package/dist/compiled-query.d.ts.map +1 -0
- package/dist/compiled-query.js +2 -0
- package/dist/compiled-query.js.map +1 -0
- package/dist/dialects/index.d.ts +19 -0
- package/dist/dialects/index.d.ts.map +1 -0
- package/dist/dialects/index.js +43 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/protocol.d.ts +230 -0
- package/dist/dialects/protocol.d.ts.map +1 -0
- package/dist/dialects/protocol.js +230 -0
- package/dist/dialects/protocol.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -0
- package/dist/expressions/index.d.ts +50 -0
- package/dist/expressions/index.d.ts.map +1 -0
- package/dist/expressions/index.js +77 -0
- package/dist/expressions/index.js.map +1 -0
- package/dist/extensions/index.d.ts +85 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +120 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/fts/index.d.ts +28 -0
- package/dist/fts/index.d.ts.map +1 -0
- package/dist/fts/index.js +110 -0
- package/dist/fts/index.js.map +1 -0
- package/dist/index.d.ts +128 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +364 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect/types.d.ts +58 -0
- package/dist/introspect/types.d.ts.map +1 -0
- package/dist/introspect/types.js +2 -0
- package/dist/introspect/types.js.map +1 -0
- package/dist/joins/index.d.ts +20 -0
- package/dist/joins/index.d.ts.map +1 -0
- package/dist/joins/index.js +24 -0
- package/dist/joins/index.js.map +1 -0
- package/dist/migrations/types.d.ts +100 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations/types.js +2 -0
- package/dist/migrations/types.js.map +1 -0
- package/dist/quoting.d.ts +40 -0
- package/dist/quoting.d.ts.map +1 -0
- package/dist/quoting.js +98 -0
- package/dist/quoting.js.map +1 -0
- package/dist/schema-objects/extensions.d.ts +5 -0
- package/dist/schema-objects/extensions.d.ts.map +1 -0
- package/dist/schema-objects/extensions.js +9 -0
- package/dist/schema-objects/extensions.js.map +1 -0
- package/dist/schema-objects/index.d.ts +25 -0
- package/dist/schema-objects/index.d.ts.map +1 -0
- package/dist/schema-objects/index.js +86 -0
- package/dist/schema-objects/index.js.map +1 -0
- package/dist/schema-objects/types.d.ts +62 -0
- package/dist/schema-objects/types.d.ts.map +1 -0
- package/dist/schema-objects/types.js +2 -0
- package/dist/schema-objects/types.js.map +1 -0
- package/dist/set-ops/index.d.ts +16 -0
- package/dist/set-ops/index.d.ts.map +1 -0
- package/dist/set-ops/index.js +41 -0
- package/dist/set-ops/index.js.map +1 -0
- package/package.json +70 -0
- package/src/aggregations/index.ts +127 -0
- package/src/clauses.ts +387 -0
- package/src/comments/index.ts +49 -0
- package/src/compiled-query.ts +12 -0
- package/src/dialects/index.ts +103 -0
- package/src/dialects/protocol.ts +478 -0
- package/src/errors.ts +18 -0
- package/src/expressions/index.ts +127 -0
- package/src/extensions/index.ts +235 -0
- package/src/fts/index.ts +157 -0
- package/src/index.ts +685 -0
- package/src/introspect/types.ts +60 -0
- package/src/joins/index.ts +69 -0
- package/src/migrations/types.ts +93 -0
- package/src/quoting.ts +111 -0
- package/src/schema-objects/extensions.ts +12 -0
- package/src/schema-objects/index.ts +125 -0
- package/src/schema-objects/types.ts +73 -0
- package/src/set-ops/index.ts +48 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type DialectTarget } from '../dialects/index.js';
|
|
2
|
+
/** Runtime brand for compiler-owned column expressions. */
|
|
3
|
+
export declare const EXPR: unique symbol;
|
|
4
|
+
declare const PHANTOM: unique symbol;
|
|
5
|
+
type ExpressionBrand<T> = {
|
|
6
|
+
readonly [EXPR]: true;
|
|
7
|
+
readonly [PHANTOM]?: T;
|
|
8
|
+
};
|
|
9
|
+
/** A deliberately closed expression over the column named by its SET key. */
|
|
10
|
+
export type ColumnExpr<T> = ExpressionBrand<T> & ({
|
|
11
|
+
readonly op: 'add' | 'sub' | 'mul';
|
|
12
|
+
readonly by: T;
|
|
13
|
+
} | {
|
|
14
|
+
readonly op: 'not';
|
|
15
|
+
} | {
|
|
16
|
+
readonly op: 'concat';
|
|
17
|
+
readonly with: string;
|
|
18
|
+
} | {
|
|
19
|
+
readonly op: 'coalesce';
|
|
20
|
+
readonly fallback: T;
|
|
21
|
+
} | {
|
|
22
|
+
readonly op: 'proposed';
|
|
23
|
+
});
|
|
24
|
+
/** A literal value or a compiler-owned expression for the same column type. */
|
|
25
|
+
export type SetValue<T> = T | ColumnExpr<T>;
|
|
26
|
+
export declare function inc<T extends number | bigint>(by?: T): ColumnExpr<T>;
|
|
27
|
+
export declare function dec<T extends number | bigint>(by?: T): ColumnExpr<T>;
|
|
28
|
+
export declare function mul<T extends number>(by: T): ColumnExpr<T>;
|
|
29
|
+
export declare function not(): ColumnExpr<boolean>;
|
|
30
|
+
export declare function concat(withText: string): ColumnExpr<string>;
|
|
31
|
+
export declare function coalesce<T>(fallback: T): ColumnExpr<T>;
|
|
32
|
+
export declare function proposed<T>(): ColumnExpr<T>;
|
|
33
|
+
export declare function isColumnExpr(value: unknown): value is ColumnExpr<unknown>;
|
|
34
|
+
interface EmittedExpr {
|
|
35
|
+
readonly sql: string;
|
|
36
|
+
readonly params: readonly unknown[];
|
|
37
|
+
}
|
|
38
|
+
interface EmitColumnExprOptions {
|
|
39
|
+
readonly dialect: DialectTarget;
|
|
40
|
+
readonly table: string;
|
|
41
|
+
readonly column: string;
|
|
42
|
+
readonly parameterIndex: number;
|
|
43
|
+
readonly scope: 'update' | 'upsert';
|
|
44
|
+
readonly currentReference?: string;
|
|
45
|
+
readonly proposedReference?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Emit one expression and only the parameters contributed by that expression. */
|
|
48
|
+
export declare function emitColumnExpr(expression: ColumnExpr<unknown>, options: EmitColumnExprOptions): EmittedExpr;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expressions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGzE,2DAA2D;AAC3D,eAAO,MAAM,IAAI,EAAE,OAAO,MAAyC,CAAC;AACpE,QAAA,MAAM,OAAO,EAAE,OAAO,MAAiD,CAAC;AAExE,KAAK,eAAe,CAAC,CAAC,IAAI;IACxB,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACxB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,GAC5C,CACI;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAA;CAAE,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAC9B,CAAC;AAEJ,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAW5C,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAKtE,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAKtE,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAE1D;AAED,wBAAgB,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAEzC;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAE3D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtD;AAED,wBAAgB,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAE3C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC,CAEzE;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAED,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,WAAW,CA0C3G"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { dialectTraits } from '../dialects/index.js';
|
|
2
|
+
import { formatPlaceholder, quoteIdentifier } from '../quoting.js';
|
|
3
|
+
/** Runtime brand for compiler-owned column expressions. */
|
|
4
|
+
export const EXPR = Symbol('zmdb.column-expression');
|
|
5
|
+
const PHANTOM = Symbol('zmdb.column-expression.phantom');
|
|
6
|
+
function brand(expression) {
|
|
7
|
+
Object.defineProperty(expression, EXPR, {
|
|
8
|
+
configurable: false,
|
|
9
|
+
enumerable: false,
|
|
10
|
+
writable: false,
|
|
11
|
+
});
|
|
12
|
+
return expression;
|
|
13
|
+
}
|
|
14
|
+
export function inc(by = 1) {
|
|
15
|
+
return brand({ [EXPR]: true, op: 'add', by });
|
|
16
|
+
}
|
|
17
|
+
export function dec(by = 1) {
|
|
18
|
+
return brand({ [EXPR]: true, op: 'sub', by });
|
|
19
|
+
}
|
|
20
|
+
export function mul(by) {
|
|
21
|
+
return brand({ [EXPR]: true, op: 'mul', by });
|
|
22
|
+
}
|
|
23
|
+
export function not() {
|
|
24
|
+
return brand({ [EXPR]: true, op: 'not' });
|
|
25
|
+
}
|
|
26
|
+
export function concat(withText) {
|
|
27
|
+
return brand({ [EXPR]: true, op: 'concat', with: withText });
|
|
28
|
+
}
|
|
29
|
+
export function coalesce(fallback) {
|
|
30
|
+
return brand({ [EXPR]: true, op: 'coalesce', fallback });
|
|
31
|
+
}
|
|
32
|
+
export function proposed() {
|
|
33
|
+
return brand({ [EXPR]: true, op: 'proposed' });
|
|
34
|
+
}
|
|
35
|
+
export function isColumnExpr(value) {
|
|
36
|
+
return typeof value === 'object' && value !== null && EXPR in value;
|
|
37
|
+
}
|
|
38
|
+
/** Emit one expression and only the parameters contributed by that expression. */
|
|
39
|
+
export function emitColumnExpr(expression, options) {
|
|
40
|
+
const { dialect, table, column, parameterIndex, scope } = options;
|
|
41
|
+
const traits = dialectTraits(dialect);
|
|
42
|
+
const quotedColumn = options.currentReference ?? quoteIdentifier(dialect, column);
|
|
43
|
+
const placeholder = formatPlaceholder(dialect, parameterIndex);
|
|
44
|
+
switch (expression.op) {
|
|
45
|
+
case 'add':
|
|
46
|
+
return { sql: `${quotedColumn} + ${placeholder}`, params: [expression.by] };
|
|
47
|
+
case 'sub':
|
|
48
|
+
return { sql: `${quotedColumn} - ${placeholder}`, params: [expression.by] };
|
|
49
|
+
case 'mul':
|
|
50
|
+
return { sql: `${quotedColumn} * ${placeholder}`, params: [expression.by] };
|
|
51
|
+
case 'not':
|
|
52
|
+
return {
|
|
53
|
+
sql: traits.booleanNot === 'not' ? `NOT ${quotedColumn}` : `~${quotedColumn}`,
|
|
54
|
+
params: [],
|
|
55
|
+
};
|
|
56
|
+
case 'concat':
|
|
57
|
+
return {
|
|
58
|
+
sql: traits.concat === 'function'
|
|
59
|
+
? `CONCAT(${quotedColumn}, ${placeholder})`
|
|
60
|
+
: `${quotedColumn} || ${placeholder}`,
|
|
61
|
+
params: [expression.with],
|
|
62
|
+
};
|
|
63
|
+
case 'coalesce':
|
|
64
|
+
return { sql: `COALESCE(${quotedColumn}, ${placeholder})`, params: [expression.fallback] };
|
|
65
|
+
case 'proposed':
|
|
66
|
+
if (scope !== 'upsert') {
|
|
67
|
+
throw new Error(`proposed() references the row being inserted and is only valid inside onConflict().doUpdate() ` +
|
|
68
|
+
`(${JSON.stringify(column)} on ${JSON.stringify(table)})`);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
sql: options.proposedReference ??
|
|
72
|
+
(traits.upsert === 'onDuplicateKey' ? `VALUES(${quotedColumn})` : `EXCLUDED.${quotedColumn}`),
|
|
73
|
+
params: [],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expressions/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { type DialectTarget } from '../dialects/index.js';
|
|
2
|
+
export type DistanceOp = 'l2' | 'cosine' | 'ip';
|
|
3
|
+
export declare const DISTANCE_OPERATORS: Readonly<{
|
|
4
|
+
l2: string;
|
|
5
|
+
cosine: string;
|
|
6
|
+
ip: string;
|
|
7
|
+
}>;
|
|
8
|
+
export type SpatialFn = 'st_contains' | 'st_within' | 'st_intersects' | 'st_dwithin';
|
|
9
|
+
type ExtensionMarker<Name extends string> = {
|
|
10
|
+
readonly __zmdbExt?: readonly [extension: string, name: Name, args: readonly (string | number)[]];
|
|
11
|
+
};
|
|
12
|
+
/** Keys whose declared column type carries `Ext<…, Name, …>`. */
|
|
13
|
+
export type ExtensionColumnOf<T, Name extends string> = {
|
|
14
|
+
[K in keyof T]-?: NonNullable<T[K]> extends ExtensionMarker<Name> ? (K extends string ? K : never) : never;
|
|
15
|
+
}[keyof T];
|
|
16
|
+
export type VectorColumnOf<T> = ExtensionColumnOf<T, 'vector'>;
|
|
17
|
+
export type GeometryColumnOf<T> = ExtensionColumnOf<T, 'geometry'>;
|
|
18
|
+
/** A GeoJSON geometry accepted by `ST_GeomFromGeoJSON`. */
|
|
19
|
+
export interface GeoJsonGeometry {
|
|
20
|
+
readonly type: string;
|
|
21
|
+
readonly coordinates: unknown;
|
|
22
|
+
}
|
|
23
|
+
/** The declared application geometry for one extension-backed column. */
|
|
24
|
+
export type GeometryValueOf<T, C extends GeometryColumnOf<T>> = NonNullable<T[C]> extends GeoJsonGeometry ? NonNullable<T[C]> : never;
|
|
25
|
+
type GeometryArguments<T> = {
|
|
26
|
+
[C in GeometryColumnOf<T>]: readonly [column: C, geometry: GeometryValueOf<T, C>];
|
|
27
|
+
}[GeometryColumnOf<T>];
|
|
28
|
+
type GeometryDistanceArguments<T> = {
|
|
29
|
+
[C in GeometryColumnOf<T>]: readonly [column: C, geometry: GeometryValueOf<T, C>, distance: number];
|
|
30
|
+
}[GeometryColumnOf<T>];
|
|
31
|
+
declare const EXTENSION_EXPRESSION: unique symbol;
|
|
32
|
+
export interface DistanceExpression<C extends string = string> {
|
|
33
|
+
readonly [EXTENSION_EXPRESSION]: 'distance';
|
|
34
|
+
readonly kind: 'distance';
|
|
35
|
+
readonly column: C;
|
|
36
|
+
readonly operator: DistanceOp;
|
|
37
|
+
readonly query: readonly number[];
|
|
38
|
+
as(alias: string): AliasedDistanceExpression<C>;
|
|
39
|
+
}
|
|
40
|
+
export interface AliasedDistanceExpression<C extends string = string> {
|
|
41
|
+
readonly [EXTENSION_EXPRESSION]: 'aliased-distance';
|
|
42
|
+
readonly kind: 'aliased';
|
|
43
|
+
readonly expression: DistanceExpression<C>;
|
|
44
|
+
readonly alias: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SpatialPredicate<C extends string = string> {
|
|
47
|
+
readonly [EXTENSION_EXPRESSION]: 'spatial';
|
|
48
|
+
readonly kind: 'spatial';
|
|
49
|
+
readonly fn: 'st_contains' | 'st_dwithin';
|
|
50
|
+
readonly col: C;
|
|
51
|
+
readonly value: GeoJsonGeometry;
|
|
52
|
+
readonly distance?: number;
|
|
53
|
+
}
|
|
54
|
+
/** Internal closed predicate shape shared with the dialect matrix. */
|
|
55
|
+
export interface SpatialPredicateNode {
|
|
56
|
+
readonly kind: 'spatial';
|
|
57
|
+
readonly fn: SpatialFn;
|
|
58
|
+
readonly col: string;
|
|
59
|
+
readonly value: unknown;
|
|
60
|
+
readonly distance?: number;
|
|
61
|
+
readonly connector?: 'AND' | 'OR';
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A pgvector distance expression. Supplying the declaration type makes the column
|
|
65
|
+
* argument the closed set of its `Ext<…, 'vector', …>` properties.
|
|
66
|
+
*/
|
|
67
|
+
export declare function distance<T extends object>(column: VectorColumnOf<T>, operator: DistanceOp, query: readonly number[]): DistanceExpression<VectorColumnOf<T>>;
|
|
68
|
+
/** A typed `ST_Contains(column, geometry)` predicate. */
|
|
69
|
+
export declare function stContains<T extends object>(...[column, geometry]: GeometryArguments<T>): SpatialPredicate<GeometryColumnOf<T>>;
|
|
70
|
+
/** A typed `ST_DWithin(column, geometry, distance)` predicate. */
|
|
71
|
+
export declare function stDWithin<T extends object>(...[column, geometry, maxDistance]: GeometryDistanceArguments<T>): SpatialPredicate<GeometryColumnOf<T>>;
|
|
72
|
+
/** Encode a numeric vector into pgvector's text input syntax before binding it. */
|
|
73
|
+
export declare function encodePgVector(value: unknown): string;
|
|
74
|
+
export declare function isDistanceExpression(value: unknown): value is DistanceExpression;
|
|
75
|
+
export declare function isAliasedDistanceExpression(value: unknown): value is AliasedDistanceExpression;
|
|
76
|
+
export declare function isSpatialPredicate(value: unknown): value is SpatialPredicate;
|
|
77
|
+
export declare function isDistanceOp(operator: string): operator is DistanceOp;
|
|
78
|
+
/** Render a compiler-owned distance expression and append its bound vector. */
|
|
79
|
+
export declare function renderDistanceExpression(dialect: DialectTarget, expression: DistanceExpression, parameters: unknown[]): string;
|
|
80
|
+
/** Render a selected distance expression with its compiler-quoted alias. */
|
|
81
|
+
export declare function renderAliasedDistanceExpression(dialect: DialectTarget, expression: AliasedDistanceExpression, parameters: unknown[]): string;
|
|
82
|
+
/** Render one of the closed PostGIS predicate nodes, binding every value operand. */
|
|
83
|
+
export declare function renderSpatialPredicate(dialect: DialectTarget, predicate: SpatialPredicateNode, parameters: unknown[]): string;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAItF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEhD,eAAO,MAAM,kBAAkB;;;;EAIQ,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,eAAe,GAAG,YAAY,CAAC;AASrF,KAAK,eAAe,CAAC,IAAI,SAAS,MAAM,IAAI;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;CACnG,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,IAAI;KACrD,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK;CAC3G,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC/D,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,yEAAyE;AACzE,MAAM,MAAM,eAAe,CAAC,CAAC,EAAE,CAAC,SAAS,gBAAgB,CAAC,CAAC,CAAC,IAC1D,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAExE,KAAK,iBAAiB,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAClF,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvB,KAAK,yBAAyB,CAAC,CAAC,IAAI;KACjC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC;CACpG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvB,QAAA,MAAM,oBAAoB,EAAE,OAAO,MAA4C,CAAC;AAEhF,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3D,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,UAAU,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAClE,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACzD,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,SAAS,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,aAAa,GAAG,YAAY,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAChB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;CACnC;AAeD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAgBvC;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC1C,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CASvC;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EACxC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAC/D,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAUvC;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUrD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,yBAAyB,CAE9F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,UAAU,CAErE;AAMD,+EAA+E;AAC/E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,OAAO,EAAE,GACpB,MAAM,CAOR;AAED,4EAA4E;AAC5E,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,yBAAyB,EACrC,UAAU,EAAE,OAAO,EAAE,GACpB,MAAM,CAKR;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,oBAAoB,EAC/B,UAAU,EAAE,OAAO,EAAE,GACpB,MAAM,CAcR"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { dialectName, dialectTraits } from '../dialects/index.js';
|
|
2
|
+
import { UnsupportedFeatureError } from '../errors.js';
|
|
3
|
+
import { formatPlaceholder, quoteColumn, quoteIdentifier } from '../quoting.js';
|
|
4
|
+
export const DISTANCE_OPERATORS = Object.freeze({
|
|
5
|
+
l2: '<->',
|
|
6
|
+
cosine: '<=>',
|
|
7
|
+
ip: '<#>',
|
|
8
|
+
});
|
|
9
|
+
const SPATIAL_FUNCTIONS = Object.freeze({
|
|
10
|
+
st_contains: 'ST_Contains',
|
|
11
|
+
st_within: 'ST_Within',
|
|
12
|
+
st_intersects: 'ST_Intersects',
|
|
13
|
+
st_dwithin: 'ST_DWithin',
|
|
14
|
+
});
|
|
15
|
+
const EXTENSION_EXPRESSION = Symbol('zmdb.extension-expression');
|
|
16
|
+
function aliasedDistance(expression, alias) {
|
|
17
|
+
const aliased = {
|
|
18
|
+
[EXTENSION_EXPRESSION]: 'aliased-distance',
|
|
19
|
+
kind: 'aliased',
|
|
20
|
+
expression,
|
|
21
|
+
alias,
|
|
22
|
+
};
|
|
23
|
+
return Object.freeze(aliased);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A pgvector distance expression. Supplying the declaration type makes the column
|
|
27
|
+
* argument the closed set of its `Ext<…, 'vector', …>` properties.
|
|
28
|
+
*/
|
|
29
|
+
export function distance(column, operator, query) {
|
|
30
|
+
if (!Object.hasOwn(DISTANCE_OPERATORS, operator)) {
|
|
31
|
+
throw new TypeError(`unknown distance operator ${JSON.stringify(operator)}; expected ${Object.keys(DISTANCE_OPERATORS).join(' | ')}`);
|
|
32
|
+
}
|
|
33
|
+
const expression = {
|
|
34
|
+
[EXTENSION_EXPRESSION]: 'distance',
|
|
35
|
+
kind: 'distance',
|
|
36
|
+
column,
|
|
37
|
+
operator,
|
|
38
|
+
query,
|
|
39
|
+
as: alias => aliasedDistance(expression, alias),
|
|
40
|
+
};
|
|
41
|
+
return Object.freeze(expression);
|
|
42
|
+
}
|
|
43
|
+
/** A typed `ST_Contains(column, geometry)` predicate. */
|
|
44
|
+
export function stContains(...[column, geometry]) {
|
|
45
|
+
const predicate = {
|
|
46
|
+
[EXTENSION_EXPRESSION]: 'spatial',
|
|
47
|
+
kind: 'spatial',
|
|
48
|
+
fn: 'st_contains',
|
|
49
|
+
col: column,
|
|
50
|
+
value: geometry,
|
|
51
|
+
};
|
|
52
|
+
return Object.freeze(predicate);
|
|
53
|
+
}
|
|
54
|
+
/** A typed `ST_DWithin(column, geometry, distance)` predicate. */
|
|
55
|
+
export function stDWithin(...[column, geometry, maxDistance]) {
|
|
56
|
+
const predicate = {
|
|
57
|
+
[EXTENSION_EXPRESSION]: 'spatial',
|
|
58
|
+
kind: 'spatial',
|
|
59
|
+
fn: 'st_dwithin',
|
|
60
|
+
col: column,
|
|
61
|
+
value: geometry,
|
|
62
|
+
distance: maxDistance,
|
|
63
|
+
};
|
|
64
|
+
return Object.freeze(predicate);
|
|
65
|
+
}
|
|
66
|
+
/** Encode a numeric vector into pgvector's text input syntax before binding it. */
|
|
67
|
+
export function encodePgVector(value) {
|
|
68
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
69
|
+
throw new TypeError('a pgvector query must be a non-empty numeric array');
|
|
70
|
+
}
|
|
71
|
+
for (const component of value) {
|
|
72
|
+
if (typeof component !== 'number' || !Number.isFinite(component)) {
|
|
73
|
+
throw new TypeError('a pgvector query may contain only finite numbers');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return `[${value.join(',')}]`;
|
|
77
|
+
}
|
|
78
|
+
export function isDistanceExpression(value) {
|
|
79
|
+
return value !== null && typeof value === 'object' && Reflect.get(value, EXTENSION_EXPRESSION) === 'distance';
|
|
80
|
+
}
|
|
81
|
+
export function isAliasedDistanceExpression(value) {
|
|
82
|
+
return value !== null && typeof value === 'object' && Reflect.get(value, EXTENSION_EXPRESSION) === 'aliased-distance';
|
|
83
|
+
}
|
|
84
|
+
export function isSpatialPredicate(value) {
|
|
85
|
+
return value !== null && typeof value === 'object' && Reflect.get(value, EXTENSION_EXPRESSION) === 'spatial';
|
|
86
|
+
}
|
|
87
|
+
export function isDistanceOp(operator) {
|
|
88
|
+
return Object.hasOwn(DISTANCE_OPERATORS, operator);
|
|
89
|
+
}
|
|
90
|
+
function requireExtensionFeature(feature, supported, dialect) {
|
|
91
|
+
if (!supported)
|
|
92
|
+
throw new UnsupportedFeatureError(feature, dialectName(dialect));
|
|
93
|
+
}
|
|
94
|
+
/** Render a compiler-owned distance expression and append its bound vector. */
|
|
95
|
+
export function renderDistanceExpression(dialect, expression, parameters) {
|
|
96
|
+
requireExtensionFeature(expression.operator, dialectTraits(dialect).vectorDistance, dialect);
|
|
97
|
+
parameters.push(encodePgVector(expression.query));
|
|
98
|
+
return `${quoteColumn(dialect, expression.column)} ${DISTANCE_OPERATORS[expression.operator]} ${formatPlaceholder(dialect, parameters.length)}`;
|
|
99
|
+
}
|
|
100
|
+
/** Render a selected distance expression with its compiler-quoted alias. */
|
|
101
|
+
export function renderAliasedDistanceExpression(dialect, expression, parameters) {
|
|
102
|
+
return `${renderDistanceExpression(dialect, expression.expression, parameters)} AS ${quoteIdentifier(dialect, expression.alias)}`;
|
|
103
|
+
}
|
|
104
|
+
/** Render one of the closed PostGIS predicate nodes, binding every value operand. */
|
|
105
|
+
export function renderSpatialPredicate(dialect, predicate, parameters) {
|
|
106
|
+
if (!Object.hasOwn(SPATIAL_FUNCTIONS, predicate.fn)) {
|
|
107
|
+
throw new TypeError(`unknown spatial predicate ${JSON.stringify(predicate.fn)}`);
|
|
108
|
+
}
|
|
109
|
+
requireExtensionFeature(predicate.fn, dialectTraits(dialect).spatialPredicates, dialect);
|
|
110
|
+
parameters.push(predicate.value);
|
|
111
|
+
const geometry = `ST_GeomFromGeoJSON(${formatPlaceholder(dialect, parameters.length)})`;
|
|
112
|
+
const column = quoteColumn(dialect, predicate.col);
|
|
113
|
+
if (predicate.fn !== 'st_dwithin')
|
|
114
|
+
return `${SPATIAL_FUNCTIONS[predicate.fn]}(${column}, ${geometry})`;
|
|
115
|
+
if (predicate.distance === undefined)
|
|
116
|
+
throw new TypeError('st_dwithin requires a distance');
|
|
117
|
+
parameters.push(predicate.distance);
|
|
118
|
+
return `ST_DWithin(${column}, ${geometry}, ${formatPlaceholder(dialect, parameters.length)})`;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ComparisonPredicate } from '../clauses.js';
|
|
2
|
+
import { type DialectTarget } from '../dialects/index.js';
|
|
3
|
+
import { UnsupportedFeatureError } from '../errors.js';
|
|
4
|
+
import { type CompiledQuery, type QueryCompilerOptions } from '../index.js';
|
|
5
|
+
export { UnsupportedFeatureError };
|
|
6
|
+
/**
|
|
7
|
+
* An FTS5 term, quoted so that its own quotes cannot end the string.
|
|
8
|
+
*
|
|
9
|
+
* `unknown` rather than `string`, because a `Predicate`'s value is `unknown` — every other
|
|
10
|
+
* operator takes one and binds it as a parameter — and the `String()` this always did is a
|
|
11
|
+
* better answer for a caller who passes a number than an assertion at the one call site.
|
|
12
|
+
*/
|
|
13
|
+
export declare function escapeFts5Term(term: unknown): string;
|
|
14
|
+
export interface FtsTableOptions {
|
|
15
|
+
ftsTable?: string | boolean | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface FtsOptions extends FtsTableOptions, QueryCompilerOptions {
|
|
18
|
+
}
|
|
19
|
+
export interface FtsSelect {
|
|
20
|
+
whereMatch(column: string, term: string, options?: FtsTableOptions | string | boolean): FtsSelect;
|
|
21
|
+
where(col: string, op: string, value: unknown): FtsSelect;
|
|
22
|
+
whereGroup(predicates: readonly ComparisonPredicate[]): FtsSelect;
|
|
23
|
+
limit(n: number): FtsSelect;
|
|
24
|
+
offset(n: number): FtsSelect;
|
|
25
|
+
compile(): CompiledQuery;
|
|
26
|
+
}
|
|
27
|
+
export declare function ftsSelectFrom(table: string, dialect: DialectTarget, options?: FtsOptions | string | boolean): FtsSelect;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EAEzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEpD;AAUD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,UAAW,SAAQ,eAAe,EAAE,oBAAoB;CAAG;AAgB5E,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAClG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1D,UAAU,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAClE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,IAAI,aAAa,CAAC;CAC1B;AAuFD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GACtC,SAAS,CAIX"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { frozenQuery, queryTelemetry, renderPredicate, tailClause, } from '../clauses.js';
|
|
2
|
+
import { dialectName, dialectTraits } from '../dialects/index.js';
|
|
3
|
+
import { UnsupportedFeatureError } from '../errors.js';
|
|
4
|
+
import {} from '../index.js';
|
|
5
|
+
import { formatPlaceholder, quoteColumn, quoteIdentifier, quoteTable } from '../quoting.js';
|
|
6
|
+
export { UnsupportedFeatureError };
|
|
7
|
+
/**
|
|
8
|
+
* An FTS5 term, quoted so that its own quotes cannot end the string.
|
|
9
|
+
*
|
|
10
|
+
* `unknown` rather than `string`, because a `Predicate`'s value is `unknown` — every other
|
|
11
|
+
* operator takes one and binds it as a parameter — and the `String()` this always did is a
|
|
12
|
+
* better answer for a caller who passes a number than an assertion at the one call site.
|
|
13
|
+
*/
|
|
14
|
+
export function escapeFts5Term(term) {
|
|
15
|
+
return `"${String(term).replace(/"/g, '""')}"`;
|
|
16
|
+
}
|
|
17
|
+
function parseTableSpec(spec) {
|
|
18
|
+
const m = /^(\S+)\s+(?:as\s+)?(\S+)$/i.exec(spec.trim());
|
|
19
|
+
if (m && m[1] && m[2]) {
|
|
20
|
+
return { baseName: m[1], alias: m[2] };
|
|
21
|
+
}
|
|
22
|
+
return { baseName: spec.trim() };
|
|
23
|
+
}
|
|
24
|
+
function make(d, s, telemetry) {
|
|
25
|
+
const next = (p) => make(d, { ...s, ...p }, telemetry);
|
|
26
|
+
return {
|
|
27
|
+
whereMatch: (column, term, options) => {
|
|
28
|
+
const ftsTable = s.ftsTable ?? (typeof options === 'string' || typeof options === 'boolean' ? options : options?.ftsTable);
|
|
29
|
+
return next({ preds: [...s.preds, { kind: 'match', col: column, value: term }], ftsTable });
|
|
30
|
+
},
|
|
31
|
+
where: (col, op, value) => next({ preds: [...s.preds, { kind: 'cmp', col, op, value }] }),
|
|
32
|
+
whereGroup: predicates => next({ preds: [...s.preds, { kind: 'group', predicates, connector: 'AND' }] }),
|
|
33
|
+
limit: n => next({ limitN: n }),
|
|
34
|
+
offset: n => next({ offsetN: n }),
|
|
35
|
+
compile: () => {
|
|
36
|
+
const params = [];
|
|
37
|
+
let text = '';
|
|
38
|
+
const fts = dialectTraits(d).fts;
|
|
39
|
+
if (fts === 'companionTable') {
|
|
40
|
+
const { baseName, alias } = parseTableSpec(s.table);
|
|
41
|
+
const quotedBaseTable = quoteTable(d, s.table);
|
|
42
|
+
const baseRef = alias ? quoteIdentifier(d, alias) : quoteColumn(d, baseName);
|
|
43
|
+
const hasMatch = s.preds.some(p => p.kind === 'match');
|
|
44
|
+
if (hasMatch) {
|
|
45
|
+
if (!s.ftsTable) {
|
|
46
|
+
throw new UnsupportedFeatureError('full-text search', dialectName(d));
|
|
47
|
+
}
|
|
48
|
+
const ftsTableName = typeof s.ftsTable === 'string' ? s.ftsTable : `${baseName}_fts`;
|
|
49
|
+
const ftsAlias = alias ? `${alias}_fts` : undefined;
|
|
50
|
+
const quotedFtsTable = ftsAlias
|
|
51
|
+
? `${quoteColumn(d, ftsTableName)} AS ${quoteIdentifier(d, ftsAlias)}`
|
|
52
|
+
: quoteColumn(d, ftsTableName);
|
|
53
|
+
const ftsRef = ftsAlias ? quoteIdentifier(d, ftsAlias) : quoteColumn(d, ftsTableName);
|
|
54
|
+
text = `SELECT * FROM ${quotedBaseTable} INNER JOIN ${quotedFtsTable} ON ${baseRef}.${quoteIdentifier(d, 'rowid')} = ${ftsRef}.${quoteIdentifier(d, 'rowid')}`;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
text = `SELECT * FROM ${quotedBaseTable}`;
|
|
58
|
+
}
|
|
59
|
+
if (s.preds.length > 0) {
|
|
60
|
+
const ftsTableName = typeof s.ftsTable === 'string' ? s.ftsTable : `${baseName}_fts`;
|
|
61
|
+
const ftsAlias = alias ? `${alias}_fts` : undefined;
|
|
62
|
+
const ftsRef = ftsAlias ? quoteIdentifier(d, ftsAlias) : quoteColumn(d, ftsTableName);
|
|
63
|
+
const parts = s.preds.map(p => {
|
|
64
|
+
if (p.kind === 'group')
|
|
65
|
+
return renderPredicate(d, p, params);
|
|
66
|
+
if (p.kind === 'match') {
|
|
67
|
+
const colName = p.col.slice(p.col.lastIndexOf('.') + 1);
|
|
68
|
+
params.push(escapeFts5Term(p.value));
|
|
69
|
+
return `${ftsRef}.${quoteIdentifier(d, colName)} MATCH ${formatPlaceholder(d, params.length)}`;
|
|
70
|
+
}
|
|
71
|
+
return renderPredicate(d, { col: p.col, op: p.op ?? '=', value: p.value }, params);
|
|
72
|
+
});
|
|
73
|
+
text += ` WHERE ${parts.join(' AND ')}`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
text = `SELECT * FROM ${quoteTable(d, s.table)}`;
|
|
78
|
+
if (s.preds.length > 0) {
|
|
79
|
+
const parts = s.preds.map(p => {
|
|
80
|
+
if (p.kind === 'group')
|
|
81
|
+
return renderPredicate(d, p, params);
|
|
82
|
+
if (p.kind !== 'match') {
|
|
83
|
+
return renderPredicate(d, { col: p.col, op: p.op ?? '=', value: p.value }, params);
|
|
84
|
+
}
|
|
85
|
+
params.push(p.value);
|
|
86
|
+
if (fts === 'tsvector') {
|
|
87
|
+
return `to_tsvector('english', ${quoteColumn(d, p.col)}) @@ to_tsquery('english', ${formatPlaceholder(d, params.length)})`;
|
|
88
|
+
}
|
|
89
|
+
if (fts === 'match') {
|
|
90
|
+
return `MATCH(${quoteColumn(d, p.col)}) AGAINST(${formatPlaceholder(d, params.length)} IN NATURAL LANGUAGE MODE)`;
|
|
91
|
+
}
|
|
92
|
+
if (fts === 'matchPlain') {
|
|
93
|
+
return `MATCH(${quoteColumn(d, p.col)}) AGAINST(${formatPlaceholder(d, params.length)})`;
|
|
94
|
+
}
|
|
95
|
+
throw new UnsupportedFeatureError('full-text search', dialectName(d));
|
|
96
|
+
});
|
|
97
|
+
text += ` WHERE ${parts.join(' AND ')}`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
text += tailClause(d, s);
|
|
101
|
+
return frozenQuery(text, params, queryTelemetry(d, 'SELECT', s.table, telemetry));
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function ftsSelectFrom(table, dialect, options) {
|
|
106
|
+
const ftsTable = typeof options === 'string' || typeof options === 'boolean' ? options : options?.ftsTable;
|
|
107
|
+
const telemetry = typeof options === 'object' && options?.telemetry === true;
|
|
108
|
+
return make(dialect, { table, preds: [], ftsTable }, telemetry);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fts/index.ts"],"names":[],"mappings":"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"}
|