rawsql-ts 0.14.4 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/transformers/DynamicQueryBuilder.d.ts +61 -11
- package/dist/src/transformers/ExistsPredicateInjector.d.ts +33 -0
- package/dist/src/transformers/OptimizeUnusedLeftJoins.d.ts +33 -0
- package/dist/src/transformers/SqlParamInjector.d.ts +1 -1
- package/dist/src/utils/serialTypeNormalization.d.ts +11 -0
- package/dist/transformers/DynamicQueryBuilder.js +114 -9
- package/dist/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/transformers/ExistsPredicateInjector.js +297 -0
- package/dist/transformers/ExistsPredicateInjector.js.map +1 -0
- package/dist/transformers/FixtureCteBuilder.js +5 -2
- package/dist/transformers/FixtureCteBuilder.js.map +1 -1
- package/dist/transformers/InsertResultSelectConverter.js +6 -4
- package/dist/transformers/InsertResultSelectConverter.js.map +1 -1
- package/dist/transformers/OptimizeUnusedLeftJoins.js +340 -0
- package/dist/transformers/OptimizeUnusedLeftJoins.js.map +1 -0
- package/dist/transformers/SqlParamInjector.js +6 -9
- package/dist/transformers/SqlParamInjector.js.map +1 -1
- package/dist/utils/serialTypeNormalization.js +40 -0
- package/dist/utils/serialTypeNormalization.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -584,9 +584,13 @@ const isValid = builder.validateSql('SELECT id FROM users');
|
|
|
584
584
|
console.log(isValid); // true
|
|
585
585
|
```
|
|
586
586
|
|
|
587
|
-
For more details, see the [DynamicQueryBuilder Usage Guide](../../docs/
|
|
588
|
-
|
|
589
|
-
---
|
|
587
|
+
For more details, see the [DynamicQueryBuilder Usage Guide](../../docs/guide/querybuilding-recipes.md).
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
### Correlated EXISTS filtering
|
|
592
|
+
|
|
593
|
+
`DynamicQueryBuilder` can append correlated `EXISTS`/`NOT EXISTS` predicates directly from filter metadata. Attach an `exists` or `notExists` object to a column entry, or use `$exists`/`$notExists` arrays when you need multiple anchors. Inside each subquery use `$c0`, `$c1`, … placeholders that correspond to the anchor columns, and pass `params` to bind any additional named parameters. Enable `existsStrict: true` in `QueryBuildOptions` to throw when placeholder numbering or anchor resolution fails instead of silently skipping the predicate.
|
|
590
594
|
|
|
591
595
|
## Query Flow Diagram Generation
|
|
592
596
|
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.getCompletionSuggestions = exports.getIntelliSenseInfo = exports.splitQueries = exports.resolveScope = exports.getCursorContext = exports.parseToPosition = exports.tableNameVariants = exports.normalizeTableName = exports.FilterableItem = exports.TableSchema = exports.unifyJsonMapping = exports.isLegacyFormat = exports.isUnifiedFormat = exports.isModelDrivenFormat = exports.processJsonMapping = exports.validateModelDrivenMapping = exports.convertModelDrivenMapping = exports.FixtureCteBuilder = exports.DuplicateDetectionMode = void 0;
|
|
17
|
+
exports.getCompletionSuggestions = exports.getIntelliSenseInfo = exports.splitQueries = exports.resolveScope = exports.getCursorContext = exports.parseToPosition = exports.tableNameVariants = exports.normalizeTableName = exports.FilterableItem = exports.TableSchema = exports.unifyJsonMapping = exports.isLegacyFormat = exports.isUnifiedFormat = exports.isModelDrivenFormat = exports.processJsonMapping = exports.validateModelDrivenMapping = exports.convertModelDrivenMapping = exports.optimizeUnusedCtesToFixedPoint = exports.optimizeUnusedCtes = exports.optimizeUnusedLeftJoinsToFixedPoint = exports.optimizeUnusedLeftJoins = exports.FixtureCteBuilder = exports.DuplicateDetectionMode = void 0;
|
|
18
18
|
// Entry point for rawsql-ts package
|
|
19
19
|
__exportStar(require("./parsers/SqlParser"), exports);
|
|
20
20
|
__exportStar(require("./parsers/SelectQueryParser"), exports);
|
|
@@ -85,6 +85,11 @@ __exportStar(require("./transformers/FilterableItemCollector"), exports);
|
|
|
85
85
|
var FixtureCteBuilder_1 = require("./transformers/FixtureCteBuilder");
|
|
86
86
|
Object.defineProperty(exports, "FixtureCteBuilder", { enumerable: true, get: function () { return FixtureCteBuilder_1.FixtureCteBuilder; } });
|
|
87
87
|
__exportStar(require("./transformers/DynamicQueryBuilder"), exports);
|
|
88
|
+
var OptimizeUnusedLeftJoins_1 = require("./transformers/OptimizeUnusedLeftJoins");
|
|
89
|
+
Object.defineProperty(exports, "optimizeUnusedLeftJoins", { enumerable: true, get: function () { return OptimizeUnusedLeftJoins_1.optimizeUnusedLeftJoins; } });
|
|
90
|
+
Object.defineProperty(exports, "optimizeUnusedLeftJoinsToFixedPoint", { enumerable: true, get: function () { return OptimizeUnusedLeftJoins_1.optimizeUnusedLeftJoinsToFixedPoint; } });
|
|
91
|
+
Object.defineProperty(exports, "optimizeUnusedCtes", { enumerable: true, get: function () { return OptimizeUnusedLeftJoins_1.optimizeUnusedCtes; } });
|
|
92
|
+
Object.defineProperty(exports, "optimizeUnusedCtesToFixedPoint", { enumerable: true, get: function () { return OptimizeUnusedLeftJoins_1.optimizeUnusedCtesToFixedPoint; } });
|
|
88
93
|
__exportStar(require("./transformers/TableColumnResolver"), exports);
|
|
89
94
|
__exportStar(require("./transformers/TableSourceCollector"), exports);
|
|
90
95
|
__exportStar(require("./transformers/JsonMappingConverter"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,oCAAoC;AACpC,sDAAoC;AACpC,8DAA4C;AAE5C,8DAA4C;AAC5C,8DAA4C;AAC5C,8DAA4C;AAC5C,6DAA2C;AAC3C,8DAA4C;AAC5C,6DAA2C;AAC3C,8DAA4C;AAC5C,4DAA0C;AAC1C,4DAA0C;AAC1C,6DAA2C;AAC3C,iEAA+C;AAC/C,kEAAgD;AAChD,mEAAiD;AACjD,mEAAiD;AACjD,sEAAoD;AAEpD,qDAAmC;AAEnC,6DAA2C;AAC3C,uDAAqC;AACrC,wDAAsC;AACtC,0DAAwC;AACxC,uDAAqC;AACrC,kDAAgC;AAChC,oDAAkC;AAClC,kDAAgC;AAChC,4DAA0C;AAC1C,uDAAqC;AACrC,uDAAqC;AACrC,uDAAqC;AACrC,4DAA0C;AAC1C,sDAAoC;AACpC,yDAAuC;AACvC,gEAA8C;AAE9C,8DAA4C;AAC5C,+DAA6C;AAC7C,6DAA2C;AAC3C,uEAAqD;AACrD,4EAA0D;AAC1D,oEAAkD;AAElD,6DAA2C;AAC3C,4DAA0C;AAC1C,8DAA4C;AAC5C,8DAA4C;AAC5C,sEAAoD;AACpD,sEAAoD;AAEpD,0EAAwD;AACxD,2DAAyC;AACzC,8DAA4C;AAC5C,0EAAwD;AACxD,8DAA4C,CAAC,0BAA0B;AACvE,kFAAgE;AAChE,6EAA2D;AAE3D,6EAA2D;AAC3D,6EAA2D;AAC3D,4EAA0D;AAC1D,6EAA2D;AAC3D,0EAAwD;AACxD,uEAAqD;AACrD,gEAA8C;AAC9C,kEAAgD;AAChD,sEAAoD;AACpD,2EAAyD;AACzD,sFAAkF;AAAzE,mIAAA,sBAAsB,OAAA;AAC/B,yEAAuD;AACvD,sEAAsH;AAA7G,sHAAA,iBAAiB,OAAA;AAC1B,qEAAmD;AACnD,qEAAmD;AACnD,sEAAoD;AACpD,sEAAoD;AACpD,qEAAmD;AACnD,gFAQ+C;AAN3C,mIAAA,yBAAyB,OAAA;AACzB,oIAAA,0BAA0B,OAAA;AAM9B,wEAM2C;AALvC,6DAA6D;AAC7D,wHAAA,kBAAkB,OAAA;AAClB,yHAAA,mBAAmB,OAAA;AACnB,qHAAA,eAAe,OAAA;AACf,oHAAA,cAAc,OAAA;AAGlB,qEAAqE;AACrE,wEAAqE;AAA5D,sHAAA,gBAAgB,OAAA;AACzB,2EAAyD;AACzD,iFAA+D;AAE/D,iEAA+C;AAC/C,kEAAmF;AAA1E,8GAAA,WAAW,OAAA;AACpB,yEAAuD;AACvD,kFAAwG;AAA/F,yHAAA,cAAc,OAAA;AACvB,2EAAyD;AACzD,kEAAgD;AAChD,iEAA+C;AAC/C,uEAAqD;AACrD,qEAAmD;AAEnD,6DAA2C;AAC3C,8DAA4C;AAC5C,wDAAsC;AACtC,wDAAsC;AACtC,uDAAqC;AAErC,4DAA0C;AAG1C,kDAAkD;AAClD,gEAA8C;AAE9C,wDAAsC;AAOtC,8DAA4C;AAK5C,6DAA2C;AAG3C,yDAA+E;AAAtE,oHAAA,kBAAkB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAE9C,8CAA8C;AAC9C,yDAAuC;AAEvC,qDAAqD;AACrD,2DAaiC;AAZ7B,0DAA0D;AAC1D,kHAAA,eAAe,OAAA;AACf,8CAA8C;AAC9C,mHAAA,gBAAgB,OAAA;AAChB,mDAAmD;AACnD,+GAAA,YAAY,OAAA;AACZ,yDAAyD;AACzD,+GAAA,YAAY,OAAA;AACZ,2DAA2D;AAC3D,sHAAA,mBAAmB,OAAA;AACnB,yDAAyD;AACzD,2HAAA,wBAAwB,OAAA;AAI5B,oEAAoE"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -69,6 +69,7 @@ export { DuplicateDetectionMode } from './transformers/SelectableColumnCollector
|
|
|
69
69
|
export * from './transformers/FilterableItemCollector';
|
|
70
70
|
export { FixtureCteBuilder, FixtureTableDefinition, FixtureColumnDefinition } from './transformers/FixtureCteBuilder';
|
|
71
71
|
export * from './transformers/DynamicQueryBuilder';
|
|
72
|
+
export { SchemaInfo, optimizeUnusedLeftJoins, optimizeUnusedLeftJoinsToFixedPoint, optimizeUnusedCtes, optimizeUnusedCtesToFixedPoint } from './transformers/OptimizeUnusedLeftJoins';
|
|
72
73
|
export * from './transformers/TableColumnResolver';
|
|
73
74
|
export * from './transformers/TableSourceCollector';
|
|
74
75
|
export * from './transformers/JsonMappingConverter';
|
|
@@ -3,18 +3,22 @@ import { SortConditions } from "./SqlSortInjector";
|
|
|
3
3
|
import { PaginationOptions } from "./SqlPaginationInjector";
|
|
4
4
|
import { JsonMapping } from "./PostgresJsonQueryBuilder";
|
|
5
5
|
import { SqlParameterValue } from "../models/ValueComponent";
|
|
6
|
+
import { type ExistsSubqueryDefinition } from "./ExistsPredicateInjector";
|
|
7
|
+
import { SchemaInfo } from "./OptimizeUnusedLeftJoins";
|
|
8
|
+
export type { ExistsSubqueryDefinition };
|
|
6
9
|
/**
|
|
7
|
-
*
|
|
10
|
+
* Object-form filter condition supporting scalar operators, logical grouping,
|
|
11
|
+
* and column-anchored EXISTS/NOT EXISTS predicates.
|
|
8
12
|
*
|
|
9
13
|
* @example
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
+
* const filter: FilterConditionObject = {
|
|
15
|
+
* min: 10,
|
|
16
|
+
* max: 100,
|
|
17
|
+
* exists: { sql: 'SELECT 1 FROM orders WHERE user_id = $c0' }
|
|
18
|
+
* };
|
|
14
19
|
* Related tests: packages/core/tests/transformers/DynamicQueryBuilder.test.ts
|
|
15
|
-
|
|
16
20
|
*/
|
|
17
|
-
export
|
|
21
|
+
export interface FilterConditionObject {
|
|
18
22
|
min?: SqlParameterValue;
|
|
19
23
|
max?: SqlParameterValue;
|
|
20
24
|
like?: string;
|
|
@@ -37,7 +41,13 @@ export type FilterConditionValue = SqlParameterValue | SqlParameterValue[] | {
|
|
|
37
41
|
[operator: string]: SqlParameterValue | string;
|
|
38
42
|
}[];
|
|
39
43
|
column?: string;
|
|
40
|
-
|
|
44
|
+
exists?: ExistsSubqueryDefinition;
|
|
45
|
+
notExists?: ExistsSubqueryDefinition;
|
|
46
|
+
}
|
|
47
|
+
export interface MultiColumnExistsDefinition extends ExistsSubqueryDefinition {
|
|
48
|
+
on: string[];
|
|
49
|
+
}
|
|
50
|
+
export type FilterConditionValue = SqlParameterValue | SqlParameterValue[] | FilterConditionObject | MultiColumnExistsDefinition[];
|
|
41
51
|
/**
|
|
42
52
|
* Filter conditions for dynamic query building.
|
|
43
53
|
*
|
|
@@ -92,6 +102,36 @@ export interface QueryBuildOptions {
|
|
|
92
102
|
* @default true
|
|
93
103
|
*/
|
|
94
104
|
jsonb?: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Throw when column-anchored EXISTS filters fail to resolve.
|
|
107
|
+
* Defaults to false so invalid definitions are skipped silently.
|
|
108
|
+
*/
|
|
109
|
+
existsStrict?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Schema metadata used when removing unused LEFT JOINs; overrides builder defaults.
|
|
112
|
+
*/
|
|
113
|
+
schemaInfo?: SchemaInfo;
|
|
114
|
+
/**
|
|
115
|
+
* Remove unused LEFT JOINs before further processing when schema info is available.
|
|
116
|
+
*/
|
|
117
|
+
removeUnusedLeftJoins?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Remove unused Common Table Expressions (CTEs) when they can be safely pruned.
|
|
120
|
+
* Defaults to false to preserve original WITH definitions.
|
|
121
|
+
*/
|
|
122
|
+
removeUnusedCtes?: boolean;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Builder-level configuration that can be reused across multiple build calls.
|
|
126
|
+
*/
|
|
127
|
+
export interface DynamicQueryBuilderOptions {
|
|
128
|
+
/** Optional resolver for table column names (retains backward compatibility). */
|
|
129
|
+
tableColumnResolver?: (tableName: string) => string[];
|
|
130
|
+
/**
|
|
131
|
+
* Schema metadata that may be applied by default when the optimizer is enabled.
|
|
132
|
+
* Schema info provided via QueryBuildOptions takes precedence.
|
|
133
|
+
*/
|
|
134
|
+
schemaInfo?: SchemaInfo;
|
|
95
135
|
}
|
|
96
136
|
/**
|
|
97
137
|
* DynamicQueryBuilder combines SQL parsing with dynamic condition injection (filters, sorts, paging, JSON serialization).
|
|
@@ -103,11 +143,14 @@ export interface QueryBuildOptions {
|
|
|
103
143
|
*/
|
|
104
144
|
export declare class DynamicQueryBuilder {
|
|
105
145
|
private tableColumnResolver?;
|
|
146
|
+
private defaultSchemaInfo?;
|
|
106
147
|
/**
|
|
107
|
-
* Creates a new DynamicQueryBuilder instance
|
|
108
|
-
*
|
|
148
|
+
* Creates a new DynamicQueryBuilder instance.
|
|
149
|
+
* Accepts either the legacy table resolver or an options object that can provide schema metadata.
|
|
150
|
+
*
|
|
151
|
+
* @param resolverOrOptions Optional resolver or configuration object
|
|
109
152
|
*/
|
|
110
|
-
constructor(
|
|
153
|
+
constructor(resolverOrOptions?: ((tableName: string) => string[]) | DynamicQueryBuilderOptions);
|
|
111
154
|
/**
|
|
112
155
|
* Builds a SelectQuery from SQL content with dynamic conditions.
|
|
113
156
|
* This is a pure function that does not perform any I/O operations.
|
|
@@ -129,6 +172,13 @@ export declare class DynamicQueryBuilder {
|
|
|
129
172
|
* ```
|
|
130
173
|
*/
|
|
131
174
|
buildQuery(sqlContent: string, options?: QueryBuildOptions): SelectQuery;
|
|
175
|
+
private extractExistsInstructions;
|
|
176
|
+
private handleMultiAnchorDefinitions;
|
|
177
|
+
private splitExistsProperties;
|
|
178
|
+
private isFilterConditionObject;
|
|
179
|
+
private isMultiColumnDefinitionArray;
|
|
180
|
+
private isMultiColumnDefinition;
|
|
181
|
+
private createExistsInstruction;
|
|
132
182
|
/**
|
|
133
183
|
* Builds a SelectQuery with only filtering applied.
|
|
134
184
|
* Convenience method for when you only need dynamic WHERE conditions.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SelectQuery } from "../models/SelectQuery";
|
|
2
|
+
import { SqlParameterValue } from "../models/ValueComponent";
|
|
3
|
+
/**
|
|
4
|
+
* Represents an EXISTS / NOT EXISTS instruction derived from filter metadata.
|
|
5
|
+
*/
|
|
6
|
+
export interface ExistsInstruction {
|
|
7
|
+
mode: "exists" | "notExists";
|
|
8
|
+
anchorColumns: string[];
|
|
9
|
+
sql: string;
|
|
10
|
+
params?: Record<string, SqlParameterValue>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Configuration that controls how EXISTS predicates are injected.
|
|
14
|
+
*/
|
|
15
|
+
export interface ExistsPredicateOptions {
|
|
16
|
+
tableColumnResolver?: (tableName: string) => string[];
|
|
17
|
+
strict?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Describes a correlated subquery that renders an EXISTS/NOT EXISTS predicate.
|
|
21
|
+
*/
|
|
22
|
+
export interface ExistsSubqueryDefinition {
|
|
23
|
+
/** SQL that references the `$c#` placeholders for the anchor columns. */
|
|
24
|
+
sql: string;
|
|
25
|
+
/** Optional named parameters that the subquery requires. */
|
|
26
|
+
params?: Record<string, SqlParameterValue>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Injects EXISTS/NOT EXISTS predicates into the provided SelectQuery.
|
|
30
|
+
* Each instruction is evaluated independently so failures can be skipped
|
|
31
|
+
* when `strict` is false.
|
|
32
|
+
*/
|
|
33
|
+
export declare function injectExistsPredicates(query: SelectQuery, instructions: ExistsInstruction[], options?: ExistsPredicateOptions): SelectQuery;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SelectQuery } from '../models/SelectQuery';
|
|
2
|
+
/**
|
|
3
|
+
* Captures the schema metadata required to safely evaluate LEFT JOIN removal.
|
|
4
|
+
*/
|
|
5
|
+
export interface SchemaTableInfo {
|
|
6
|
+
/** The fully qualified table name that appears in SQL references. */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Column names that exist on the table for any schema validation steps. */
|
|
9
|
+
columns: string[];
|
|
10
|
+
/**
|
|
11
|
+
* Unique key declarations for the table.
|
|
12
|
+
* Each entry is an array of column names that together form a uniqueness constraint.
|
|
13
|
+
*/
|
|
14
|
+
uniqueKeys: string[][];
|
|
15
|
+
}
|
|
16
|
+
/** Ordered set of table metadata consumed by the optimizer. */
|
|
17
|
+
export type SchemaInfo = SchemaTableInfo[];
|
|
18
|
+
/**
|
|
19
|
+
* Removes LEFT JOIN clauses from the provided query when AST references prove the join target is unused and schema metadata certifies the join column is unique.
|
|
20
|
+
*/
|
|
21
|
+
export declare const optimizeUnusedLeftJoins: (query: SelectQuery, schemaInfo: SchemaInfo) => SelectQuery;
|
|
22
|
+
/**
|
|
23
|
+
* Applies the unused left join optimizer until no further joins can be trimmed, ensuring cascading removals stabilize.
|
|
24
|
+
*/
|
|
25
|
+
export declare const optimizeUnusedLeftJoinsToFixedPoint: (query: SelectQuery, schemaInfo: SchemaInfo) => SelectQuery;
|
|
26
|
+
/**
|
|
27
|
+
* Removes unused SELECT-only CTEs from the query when AST references confirm they are never consumed.
|
|
28
|
+
*/
|
|
29
|
+
export declare const optimizeUnusedCtes: (query: SelectQuery) => SelectQuery;
|
|
30
|
+
/**
|
|
31
|
+
* Repeatedly prunes unused CTEs until a fixed point is reached so chained removals complete deterministically.
|
|
32
|
+
*/
|
|
33
|
+
export declare const optimizeUnusedCtesToFixedPoint: (query: SelectQuery) => SelectQuery;
|
|
@@ -27,7 +27,7 @@ export declare class SqlParamInjector {
|
|
|
27
27
|
* @returns The modified SelectQuery
|
|
28
28
|
* @throws Error when all parameters are undefined and allowAllUndefined is not set to true
|
|
29
29
|
*/
|
|
30
|
-
inject(query: SimpleSelectQuery | string, state: Record<string,
|
|
30
|
+
inject(query: SimpleSelectQuery | string, state: Record<string, StateParameterValue | null | undefined>): SelectQuery;
|
|
31
31
|
/**
|
|
32
32
|
* Type guard for OR conditions
|
|
33
33
|
*/
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts Postgres serial pseudo-type names into their real storage types so ZTD
|
|
3
|
+
* cast expressions never emit non-existent types.
|
|
4
|
+
*
|
|
5
|
+
* @param typeName Optional type name (possibly qualified) that is trimmed before normalization.
|
|
6
|
+
* @returns The normalized type name when a pseudo-type matches, the trimmed input when no match is found, or `undefined` when the argument is `undefined`.
|
|
7
|
+
* @example
|
|
8
|
+
* normalizeSerialPseudoType('serial') // 'integer'
|
|
9
|
+
* normalizeSerialPseudoType('public.BIGSERIAL') // 'public.bigint'
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeSerialPseudoType(typeName?: string): string | undefined;
|
|
@@ -9,6 +9,8 @@ const PostgresJsonQueryBuilder_1 = require("./PostgresJsonQueryBuilder");
|
|
|
9
9
|
const QueryBuilder_1 = require("./QueryBuilder");
|
|
10
10
|
const SqlParameterBinder_1 = require("./SqlParameterBinder");
|
|
11
11
|
const ParameterDetector_1 = require("../utils/ParameterDetector");
|
|
12
|
+
const ExistsPredicateInjector_1 = require("./ExistsPredicateInjector");
|
|
13
|
+
const OptimizeUnusedLeftJoins_1 = require("./OptimizeUnusedLeftJoins");
|
|
12
14
|
/**
|
|
13
15
|
* DynamicQueryBuilder combines SQL parsing with dynamic condition injection (filters, sorts, paging, JSON serialization).
|
|
14
16
|
*
|
|
@@ -19,11 +21,19 @@ const ParameterDetector_1 = require("../utils/ParameterDetector");
|
|
|
19
21
|
*/
|
|
20
22
|
class DynamicQueryBuilder {
|
|
21
23
|
/**
|
|
22
|
-
* Creates a new DynamicQueryBuilder instance
|
|
23
|
-
*
|
|
24
|
+
* Creates a new DynamicQueryBuilder instance.
|
|
25
|
+
* Accepts either the legacy table resolver or an options object that can provide schema metadata.
|
|
26
|
+
*
|
|
27
|
+
* @param resolverOrOptions Optional resolver or configuration object
|
|
24
28
|
*/
|
|
25
|
-
constructor(
|
|
26
|
-
|
|
29
|
+
constructor(resolverOrOptions) {
|
|
30
|
+
if (typeof resolverOrOptions === "function") {
|
|
31
|
+
this.tableColumnResolver = resolverOrOptions;
|
|
32
|
+
}
|
|
33
|
+
else if (resolverOrOptions) {
|
|
34
|
+
this.tableColumnResolver = resolverOrOptions.tableColumnResolver;
|
|
35
|
+
this.defaultSchemaInfo = resolverOrOptions.schemaInfo;
|
|
36
|
+
}
|
|
27
37
|
}
|
|
28
38
|
/**
|
|
29
39
|
* Builds a SelectQuery from SQL content with dynamic conditions.
|
|
@@ -46,6 +56,7 @@ class DynamicQueryBuilder {
|
|
|
46
56
|
* ```
|
|
47
57
|
*/
|
|
48
58
|
buildQuery(sqlContent, options = {}) {
|
|
59
|
+
var _a;
|
|
49
60
|
// Parse the base SQL
|
|
50
61
|
let parsedQuery;
|
|
51
62
|
try {
|
|
@@ -64,12 +75,19 @@ class DynamicQueryBuilder {
|
|
|
64
75
|
const parameterBinder = new SqlParameterBinder_1.SqlParameterBinder({ requireAllParameters: false });
|
|
65
76
|
modifiedQuery = parameterBinder.bind(modifiedQuery, hardcodedParams);
|
|
66
77
|
}
|
|
67
|
-
//
|
|
68
|
-
|
|
78
|
+
// Extract and remove any column-anchored EXISTS filters before injecting traditional ones.
|
|
79
|
+
const { filters: cleanedFilters, instructions: existsInstructions } = this.extractExistsInstructions(dynamicFilters);
|
|
80
|
+
if (Object.keys(cleanedFilters).length > 0) {
|
|
69
81
|
const paramInjector = new SqlParamInjector_1.SqlParamInjector(this.tableColumnResolver);
|
|
70
82
|
// Ensure we have a SimpleSelectQuery for the injector
|
|
71
83
|
const simpleQuery = QueryBuilder_1.QueryBuilder.buildSimpleQuery(modifiedQuery);
|
|
72
|
-
modifiedQuery = paramInjector.inject(simpleQuery,
|
|
84
|
+
modifiedQuery = paramInjector.inject(simpleQuery, cleanedFilters);
|
|
85
|
+
}
|
|
86
|
+
if (existsInstructions.length > 0) {
|
|
87
|
+
modifiedQuery = (0, ExistsPredicateInjector_1.injectExistsPredicates)(modifiedQuery, existsInstructions, {
|
|
88
|
+
tableColumnResolver: this.tableColumnResolver,
|
|
89
|
+
strict: !!options.existsStrict
|
|
90
|
+
});
|
|
73
91
|
}
|
|
74
92
|
}
|
|
75
93
|
// 2. Apply sorting second (after filtering to sort smaller dataset)
|
|
@@ -78,7 +96,8 @@ class DynamicQueryBuilder {
|
|
|
78
96
|
// Ensure we have a SimpleSelectQuery for the injector
|
|
79
97
|
const simpleQuery = QueryBuilder_1.QueryBuilder.buildSimpleQuery(modifiedQuery);
|
|
80
98
|
modifiedQuery = sortInjector.inject(simpleQuery, options.sort);
|
|
81
|
-
}
|
|
99
|
+
}
|
|
100
|
+
// 3. Apply pagination third (after filtering and sorting)
|
|
82
101
|
if (options.paging) {
|
|
83
102
|
const { page = 1, pageSize } = options.paging;
|
|
84
103
|
if (pageSize !== undefined) {
|
|
@@ -89,7 +108,16 @@ class DynamicQueryBuilder {
|
|
|
89
108
|
modifiedQuery = paginationInjector.inject(simpleQuery, paginationOptions);
|
|
90
109
|
}
|
|
91
110
|
}
|
|
92
|
-
// 4.
|
|
111
|
+
// 4. Remove unused LEFT JOINs when asked before serialization.
|
|
112
|
+
const effectiveSchemaInfo = (_a = options.schemaInfo) !== null && _a !== void 0 ? _a : this.defaultSchemaInfo;
|
|
113
|
+
if (options.removeUnusedLeftJoins && (effectiveSchemaInfo === null || effectiveSchemaInfo === void 0 ? void 0 : effectiveSchemaInfo.length)) {
|
|
114
|
+
modifiedQuery = (0, OptimizeUnusedLeftJoins_1.optimizeUnusedLeftJoinsToFixedPoint)(modifiedQuery, effectiveSchemaInfo);
|
|
115
|
+
}
|
|
116
|
+
// Remove unused CTEs before serialization when requested.
|
|
117
|
+
if (options.removeUnusedCtes) {
|
|
118
|
+
modifiedQuery = (0, OptimizeUnusedLeftJoins_1.optimizeUnusedCtesToFixedPoint)(modifiedQuery);
|
|
119
|
+
}
|
|
120
|
+
// Apply serialization last (transform the final query structure to JSON)
|
|
93
121
|
// Note: boolean values are handled at RawSqlClient level for auto-loading
|
|
94
122
|
if (options.serialize && typeof options.serialize === 'object') {
|
|
95
123
|
const jsonBuilder = new PostgresJsonQueryBuilder_1.PostgresJsonQueryBuilder();
|
|
@@ -99,6 +127,83 @@ class DynamicQueryBuilder {
|
|
|
99
127
|
}
|
|
100
128
|
return modifiedQuery;
|
|
101
129
|
}
|
|
130
|
+
extractExistsInstructions(filters) {
|
|
131
|
+
const cleanedFilters = {};
|
|
132
|
+
const instructions = [];
|
|
133
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
134
|
+
if (key === "$exists" || key === "$notExists") {
|
|
135
|
+
// Multi-anchor metadata arrives as arrays keyed by the special markers.
|
|
136
|
+
if (!this.isMultiColumnDefinitionArray(value)) {
|
|
137
|
+
throw new Error(`'${key}' must be an array of EXISTS definitions.`);
|
|
138
|
+
}
|
|
139
|
+
this.handleMultiAnchorDefinitions(key, value, instructions);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (this.isFilterConditionObject(value)) {
|
|
143
|
+
const { leftover, exists, notExists } = this.splitExistsProperties(value);
|
|
144
|
+
if (exists) {
|
|
145
|
+
instructions.push(this.createExistsInstruction([key], exists, "exists"));
|
|
146
|
+
}
|
|
147
|
+
if (notExists) {
|
|
148
|
+
instructions.push(this.createExistsInstruction([key], notExists, "notExists"));
|
|
149
|
+
}
|
|
150
|
+
if (leftover) {
|
|
151
|
+
cleanedFilters[key] = leftover;
|
|
152
|
+
}
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (this.isMultiColumnDefinitionArray(value)) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
cleanedFilters[key] = value;
|
|
159
|
+
}
|
|
160
|
+
return { filters: cleanedFilters, instructions };
|
|
161
|
+
}
|
|
162
|
+
handleMultiAnchorDefinitions(key, definitions, instructions) {
|
|
163
|
+
// Build instructions for each multi-anchor definition in the batch.
|
|
164
|
+
for (const definition of definitions) {
|
|
165
|
+
if (!definition.on || definition.on.length === 0) {
|
|
166
|
+
throw new Error(`Every ${key} instruction must specify an "on" array.`);
|
|
167
|
+
}
|
|
168
|
+
instructions.push(this.createExistsInstruction(definition.on, definition, key === "$notExists" ? "notExists" : "exists"));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
splitExistsProperties(value) {
|
|
172
|
+
const { exists, notExists, ...rest } = value;
|
|
173
|
+
const hasRemaining = Object.keys(rest).length > 0;
|
|
174
|
+
return {
|
|
175
|
+
leftover: hasRemaining ? rest : undefined,
|
|
176
|
+
exists: exists,
|
|
177
|
+
notExists: notExists
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
isFilterConditionObject(value) {
|
|
181
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
182
|
+
}
|
|
183
|
+
isMultiColumnDefinitionArray(value) {
|
|
184
|
+
return Array.isArray(value) && value.every(entry => this.isMultiColumnDefinition(entry));
|
|
185
|
+
}
|
|
186
|
+
isMultiColumnDefinition(value) {
|
|
187
|
+
if (!value || typeof value !== "object") {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
const candidate = value;
|
|
191
|
+
return (Array.isArray(candidate.on) &&
|
|
192
|
+
candidate.on.length > 0 &&
|
|
193
|
+
candidate.on.every(column => typeof column === "string") &&
|
|
194
|
+
typeof candidate.sql === "string");
|
|
195
|
+
}
|
|
196
|
+
createExistsInstruction(anchors, definition, mode) {
|
|
197
|
+
if (!definition.sql || typeof definition.sql !== "string") {
|
|
198
|
+
throw new Error("EXISTS definition must include a SQL string.");
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
mode,
|
|
202
|
+
anchorColumns: anchors,
|
|
203
|
+
sql: definition.sql,
|
|
204
|
+
params: definition.params
|
|
205
|
+
};
|
|
206
|
+
}
|
|
102
207
|
/**
|
|
103
208
|
* Builds a SelectQuery with only filtering applied.
|
|
104
209
|
* Convenience method for when you only need dynamic WHERE conditions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicQueryBuilder.js","sourceRoot":"","sources":["../../src/transformers/DynamicQueryBuilder.ts"],"names":[],"mappings":";;;AACA,oEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"DynamicQueryBuilder.js","sourceRoot":"","sources":["../../src/transformers/DynamicQueryBuilder.ts"],"names":[],"mappings":"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"}
|