rawsql-ts 0.16.0 → 0.18.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/LICENSE +21 -21
- package/README.md +161 -875
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +23 -21
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/models/Clause.d.ts +15 -3
- package/dist/esm/models/Clause.js +2 -1
- package/dist/esm/models/Clause.js.map +1 -1
- package/dist/esm/models/CreateTableQuery.d.ts +3 -0
- package/dist/esm/models/CreateTableQuery.js +5 -4
- package/dist/esm/models/CreateTableQuery.js.map +1 -1
- package/dist/esm/models/DDLStatements.d.ts +71 -0
- package/dist/esm/models/DDLStatements.js +63 -0
- package/dist/esm/models/DDLStatements.js.map +1 -1
- package/dist/esm/models/KeywordTrie.d.ts +2 -3
- package/dist/esm/models/KeywordTrie.js +26 -27
- package/dist/esm/models/KeywordTrie.js.map +1 -1
- package/dist/esm/models/SqlPrintToken.d.ts +1 -0
- package/dist/esm/models/SqlPrintToken.js +1 -0
- package/dist/esm/models/SqlPrintToken.js.map +1 -1
- package/dist/esm/parsers/CheckpointStatementParser.d.ts +8 -0
- package/dist/esm/parsers/CheckpointStatementParser.js +14 -0
- package/dist/esm/parsers/CheckpointStatementParser.js.map +1 -0
- package/dist/esm/parsers/ClusterStatementParser.d.ts +8 -0
- package/dist/esm/parsers/ClusterStatementParser.js +14 -0
- package/dist/esm/parsers/ClusterStatementParser.js.map +1 -0
- package/dist/esm/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/esm/parsers/CommentOnParser.d.ts +23 -0
- package/dist/esm/parsers/CommentOnParser.js +61 -0
- package/dist/esm/parsers/CommentOnParser.js.map +1 -0
- package/dist/esm/parsers/CommonTableParser.d.ts +5 -1
- package/dist/esm/parsers/CommonTableParser.js +94 -16
- package/dist/esm/parsers/CommonTableParser.js.map +1 -1
- package/dist/esm/parsers/CreateIndexParser.js +12 -6
- package/dist/esm/parsers/CreateIndexParser.js.map +1 -1
- package/dist/esm/parsers/CreateTableParser.d.ts +2 -0
- package/dist/esm/parsers/CreateTableParser.js +11 -2
- package/dist/esm/parsers/CreateTableParser.js.map +1 -1
- package/dist/esm/parsers/ExplainStatementParser.js.map +1 -1
- package/dist/esm/parsers/FullNameParser.js +35 -3
- package/dist/esm/parsers/FullNameParser.js.map +1 -1
- package/dist/esm/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/esm/parsers/ReindexStatementParser.d.ts +8 -0
- package/dist/esm/parsers/ReindexStatementParser.js +14 -0
- package/dist/esm/parsers/ReindexStatementParser.js.map +1 -0
- package/dist/esm/parsers/SelectQueryParser.js.map +1 -1
- package/dist/esm/parsers/SourceParser.js +6 -1
- package/dist/esm/parsers/SourceParser.js.map +1 -1
- package/dist/esm/parsers/SqlParser.d.ts +12 -2
- package/dist/esm/parsers/SqlParser.js +117 -251
- package/dist/esm/parsers/SqlParser.js.map +1 -1
- package/dist/esm/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/esm/parsers/SqlPrintTokenParser.js +32 -4
- package/dist/esm/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/parsers/SqlTokenizer.d.ts +5 -0
- package/dist/esm/parsers/SqlTokenizer.js +181 -67
- package/dist/esm/parsers/SqlTokenizer.js.map +1 -1
- package/dist/esm/parsers/UsingClauseParser.js.map +1 -1
- package/dist/esm/parsers/VacuumStatementParser.d.ts +8 -0
- package/dist/esm/parsers/VacuumStatementParser.js +14 -0
- package/dist/esm/parsers/VacuumStatementParser.js.map +1 -0
- package/dist/esm/tokenReaders/CommandTokenReader.js +22 -4
- package/dist/esm/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js +30 -13
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/TokenReaderManager.d.ts +0 -7
- package/dist/esm/tokenReaders/TokenReaderManager.js +16 -48
- package/dist/esm/tokenReaders/TokenReaderManager.js.map +1 -1
- package/dist/esm/transformers/AliasRenamer.d.ts +1 -0
- package/dist/esm/transformers/AliasRenamer.js +7 -1
- package/dist/esm/transformers/AliasRenamer.js.map +1 -1
- package/dist/esm/transformers/CTECollector.d.ts +5 -2
- package/dist/esm/transformers/CTECollector.js +49 -0
- package/dist/esm/transformers/CTECollector.js.map +1 -1
- package/dist/esm/transformers/CTEDependencyTracer.d.ts +6 -1
- package/dist/esm/transformers/CTEDependencyTracer.js +44 -2
- package/dist/esm/transformers/CTEDependencyTracer.js.map +1 -1
- package/dist/esm/transformers/CTEDisabler.d.ts +6 -0
- package/dist/esm/transformers/CTEDisabler.js +19 -0
- package/dist/esm/transformers/CTEDisabler.js.map +1 -1
- package/dist/esm/transformers/CTERenamer.js +5 -2
- package/dist/esm/transformers/CTERenamer.js.map +1 -1
- package/dist/esm/transformers/ColumnReferenceCollector.d.ts +4 -0
- package/dist/esm/transformers/ColumnReferenceCollector.js +69 -1
- package/dist/esm/transformers/ColumnReferenceCollector.js.map +1 -1
- package/dist/esm/transformers/DeleteResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/DynamicQueryBuilder.d.ts +88 -16
- package/dist/esm/transformers/DynamicQueryBuilder.js +146 -18
- package/dist/esm/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/esm/transformers/ExistsPredicateInjector.d.ts +33 -0
- package/dist/esm/transformers/ExistsPredicateInjector.js +294 -0
- package/dist/esm/transformers/ExistsPredicateInjector.js.map +1 -0
- package/dist/esm/transformers/FixtureCteBuilder.js +5 -2
- package/dist/esm/transformers/FixtureCteBuilder.js.map +1 -1
- package/dist/esm/transformers/InsertResultSelectConverter.d.ts +1 -0
- package/dist/esm/transformers/InsertResultSelectConverter.js +28 -7
- package/dist/esm/transformers/InsertResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/LinePrinter.d.ts +4 -2
- package/dist/esm/transformers/LinePrinter.js +93 -22
- package/dist/esm/transformers/LinePrinter.js.map +1 -1
- package/dist/esm/transformers/MergeResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/OptimizeUnusedLeftJoins.d.ts +33 -0
- package/dist/esm/transformers/OptimizeUnusedLeftJoins.js +333 -0
- package/dist/esm/transformers/OptimizeUnusedLeftJoins.js.map +1 -0
- package/dist/esm/transformers/PruneOptionalConditionBranches.d.ts +22 -0
- package/dist/esm/transformers/PruneOptionalConditionBranches.js +265 -0
- package/dist/esm/transformers/PruneOptionalConditionBranches.js.map +1 -0
- package/dist/esm/transformers/SSSQLFilterBuilder.d.ts +30 -0
- package/dist/esm/transformers/SSSQLFilterBuilder.js +253 -0
- package/dist/esm/transformers/SSSQLFilterBuilder.js.map +1 -0
- package/dist/esm/transformers/SchemaCollector.d.ts +3 -0
- package/dist/esm/transformers/SchemaCollector.js +37 -1
- package/dist/esm/transformers/SchemaCollector.js.map +1 -1
- package/dist/esm/transformers/SelectValueCollector.d.ts +5 -0
- package/dist/esm/transformers/SelectValueCollector.js +44 -2
- package/dist/esm/transformers/SelectValueCollector.js.map +1 -1
- package/dist/esm/transformers/SqlParamInjector.d.ts +5 -1
- package/dist/esm/transformers/SqlParamInjector.js +47 -11
- package/dist/esm/transformers/SqlParamInjector.js.map +1 -1
- package/dist/esm/transformers/SqlPrinter.js +8 -2
- package/dist/esm/transformers/SqlPrinter.js.map +1 -1
- package/dist/esm/transformers/TableSourceCollector.d.ts +9 -1
- package/dist/esm/transformers/TableSourceCollector.js +72 -5
- package/dist/esm/transformers/TableSourceCollector.js.map +1 -1
- package/dist/esm/transformers/UpdateResultSelectConverter.js.map +1 -1
- package/dist/esm/transformers/UpstreamSelectQueryFinder.d.ts +5 -0
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js +46 -1
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/esm/utils/CommentUtils.d.ts +1 -0
- package/dist/esm/utils/CommentUtils.js +14 -4
- package/dist/esm/utils/CommentUtils.js.map +1 -1
- package/dist/esm/utils/MultiQuerySplitter.d.ts +7 -11
- package/dist/esm/utils/MultiQuerySplitter.js +105 -66
- package/dist/esm/utils/MultiQuerySplitter.js.map +1 -1
- package/dist/esm/utils/ParameterRemover.d.ts +4 -0
- package/dist/esm/utils/ParameterRemover.js +23 -0
- package/dist/esm/utils/ParameterRemover.js.map +1 -1
- package/dist/esm/utils/RelationGraph.d.ts +43 -0
- package/dist/esm/utils/RelationGraph.js +117 -0
- package/dist/esm/utils/RelationGraph.js.map +1 -0
- package/dist/esm/utils/ScopeResolver.d.ts +5 -2
- package/dist/esm/utils/ScopeResolver.js +37 -18
- package/dist/esm/utils/ScopeResolver.js.map +1 -1
- package/dist/esm/utils/charLookupTable.d.ts +6 -0
- package/dist/esm/utils/charLookupTable.js +9 -1
- package/dist/esm/utils/charLookupTable.js.map +1 -1
- package/dist/esm/utils/serialTypeNormalization.d.ts +15 -0
- package/dist/esm/utils/serialTypeNormalization.js +55 -0
- package/dist/esm/utils/serialTypeNormalization.js.map +1 -0
- package/dist/esm/utils/stringUtils.js +51 -26
- package/dist/esm/utils/stringUtils.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +22 -20
- package/dist/index.min.js.map +4 -4
- package/dist/models/CreateTableQuery.js +5 -4
- package/dist/models/CreateTableQuery.js.map +1 -1
- package/dist/models/DDLStatements.js +14 -1
- package/dist/models/DDLStatements.js.map +1 -1
- package/dist/models/KeywordTrie.js +26 -27
- package/dist/models/KeywordTrie.js.map +1 -1
- package/dist/models/SqlPrintToken.js +1 -0
- package/dist/models/SqlPrintToken.js.map +1 -1
- package/dist/parsers/CommentOnParser.js +65 -0
- package/dist/parsers/CommentOnParser.js.map +1 -0
- package/dist/parsers/CreateIndexParser.js +12 -6
- package/dist/parsers/CreateIndexParser.js.map +1 -1
- package/dist/parsers/CreateTableParser.js +6 -1
- package/dist/parsers/CreateTableParser.js.map +1 -1
- package/dist/parsers/FullNameParser.js +35 -3
- package/dist/parsers/FullNameParser.js.map +1 -1
- package/dist/parsers/SqlParser.js +93 -307
- package/dist/parsers/SqlParser.js.map +1 -1
- package/dist/parsers/SqlPrintTokenParser.js +27 -3
- package/dist/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/parsers/SqlTokenizer.js +176 -67
- package/dist/parsers/SqlTokenizer.js.map +1 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/models/CreateTableQuery.d.ts +3 -0
- package/dist/src/models/DDLStatements.d.ts +15 -0
- package/dist/src/models/KeywordTrie.d.ts +2 -3
- package/dist/src/models/SqlPrintToken.d.ts +1 -0
- package/dist/src/parsers/CommentOnParser.d.ts +23 -0
- package/dist/src/parsers/CreateTableParser.d.ts +1 -0
- package/dist/src/parsers/SqlParser.d.ts +8 -2
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/src/parsers/SqlTokenizer.d.ts +5 -0
- package/dist/src/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
- package/dist/src/tokenReaders/TokenReaderManager.d.ts +0 -7
- package/dist/src/transformers/DynamicQueryBuilder.d.ts +21 -13
- package/dist/src/transformers/LinePrinter.d.ts +4 -2
- package/dist/src/transformers/PruneOptionalConditionBranches.d.ts +22 -0
- package/dist/src/transformers/SSSQLFilterBuilder.d.ts +30 -0
- package/dist/src/utils/CommentUtils.d.ts +1 -0
- package/dist/src/utils/MultiQuerySplitter.d.ts +7 -11
- package/dist/src/utils/RelationGraph.d.ts +43 -0
- package/dist/tokenReaders/CommandTokenReader.js +21 -4
- package/dist/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/tokenReaders/StringSpecifierTokenReader.js +30 -13
- package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
- package/dist/tokenReaders/TokenReaderManager.js +16 -48
- package/dist/tokenReaders/TokenReaderManager.js.map +1 -1
- package/dist/transformers/DynamicQueryBuilder.js +28 -95
- package/dist/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/transformers/LinePrinter.js +93 -22
- package/dist/transformers/LinePrinter.js.map +1 -1
- package/dist/transformers/PruneOptionalConditionBranches.js +270 -0
- package/dist/transformers/PruneOptionalConditionBranches.js.map +1 -0
- package/dist/transformers/SSSQLFilterBuilder.js +259 -0
- package/dist/transformers/SSSQLFilterBuilder.js.map +1 -0
- package/dist/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/utils/CommentUtils.js +14 -4
- package/dist/utils/CommentUtils.js.map +1 -1
- package/dist/utils/MultiQuerySplitter.js +105 -66
- package/dist/utils/MultiQuerySplitter.js.map +1 -1
- package/dist/utils/RelationGraph.js +123 -0
- package/dist/utils/RelationGraph.js.map +1 -0
- package/dist/utils/stringUtils.js +42 -23
- package/dist/utils/stringUtils.js.map +1 -1
- package/package.json +4 -4
|
@@ -3,18 +3,23 @@ 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 { SchemaInfo } from "./OptimizeUnusedLeftJoins";
|
|
7
|
+
import { OptionalConditionParameterStates, OptionalConditionPruningParameters } from "./PruneOptionalConditionBranches";
|
|
8
|
+
import type { ExistsSubqueryDefinition } from "./ExistsPredicateInjector";
|
|
9
|
+
export type { ExistsSubqueryDefinition };
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
11
|
+
* Object-form filter condition supporting scalar operators, logical grouping,
|
|
12
|
+
* and column-anchored EXISTS/NOT EXISTS predicates.
|
|
8
13
|
*
|
|
9
14
|
* @example
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
15
|
+
* const filter: FilterConditionObject = {
|
|
16
|
+
* min: 10,
|
|
17
|
+
* max: 100,
|
|
18
|
+
* exists: { sql: 'SELECT 1 FROM orders WHERE user_id = $c0' }
|
|
19
|
+
* };
|
|
14
20
|
* Related tests: packages/core/tests/transformers/DynamicQueryBuilder.test.ts
|
|
15
|
-
|
|
16
21
|
*/
|
|
17
|
-
export
|
|
22
|
+
export interface FilterConditionObject {
|
|
18
23
|
min?: SqlParameterValue;
|
|
19
24
|
max?: SqlParameterValue;
|
|
20
25
|
like?: string;
|
|
@@ -37,7 +42,13 @@ export type FilterConditionValue = SqlParameterValue | SqlParameterValue[] | {
|
|
|
37
42
|
[operator: string]: SqlParameterValue | string;
|
|
38
43
|
}[];
|
|
39
44
|
column?: string;
|
|
40
|
-
|
|
45
|
+
exists?: ExistsSubqueryDefinition;
|
|
46
|
+
notExists?: ExistsSubqueryDefinition;
|
|
47
|
+
}
|
|
48
|
+
export interface MultiColumnExistsDefinition extends ExistsSubqueryDefinition {
|
|
49
|
+
on: string[];
|
|
50
|
+
}
|
|
51
|
+
export type FilterConditionValue = SqlParameterValue | SqlParameterValue[] | FilterConditionObject | MultiColumnExistsDefinition[];
|
|
41
52
|
/**
|
|
42
53
|
* Filter conditions for dynamic query building.
|
|
43
54
|
*
|
|
@@ -74,12 +85,25 @@ export type FilterConditions = Record<string, FilterConditionValue>;
|
|
|
74
85
|
* Options for dynamic query building
|
|
75
86
|
*/
|
|
76
87
|
export interface QueryBuildOptions {
|
|
77
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Legacy filter input for named-parameter binding only.
|
|
90
|
+
* Dynamic predicate injection is no longer supported and will fail fast.
|
|
91
|
+
*/
|
|
78
92
|
filter?: FilterConditions;
|
|
79
93
|
/** Sort conditions to inject into ORDER BY clause */
|
|
80
94
|
sort?: SortConditions;
|
|
81
95
|
/** Pagination options to inject LIMIT/OFFSET clauses */
|
|
82
96
|
paging?: PaginationOptions;
|
|
97
|
+
/**
|
|
98
|
+
* Columns that should remain in the SELECT clause.
|
|
99
|
+
* When specified, every other column is removed so the output matches this whitelist.
|
|
100
|
+
*/
|
|
101
|
+
includeColumns?: string[];
|
|
102
|
+
/**
|
|
103
|
+
* Columns that should be removed from the SELECT clause.
|
|
104
|
+
* Filters apply subtractively and only drop columns that exist in the original output.
|
|
105
|
+
*/
|
|
106
|
+
excludeColumns?: string[];
|
|
83
107
|
/** JSON serialization mapping to transform results into hierarchical JSON
|
|
84
108
|
* - JsonMapping object: explicit mapping configuration
|
|
85
109
|
* - true: auto-load mapping from corresponding .json file
|
|
@@ -92,6 +116,46 @@ export interface QueryBuildOptions {
|
|
|
92
116
|
* @default true
|
|
93
117
|
*/
|
|
94
118
|
jsonb?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Throw when column-anchored EXISTS filters fail to resolve.
|
|
121
|
+
* Defaults to false so invalid definitions are skipped silently.
|
|
122
|
+
*/
|
|
123
|
+
existsStrict?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Schema metadata used when removing unused LEFT JOINs; overrides builder defaults.
|
|
126
|
+
*/
|
|
127
|
+
schemaInfo?: SchemaInfo;
|
|
128
|
+
/**
|
|
129
|
+
* Remove unused LEFT JOINs before further processing when schema info is available.
|
|
130
|
+
*/
|
|
131
|
+
removeUnusedLeftJoins?: boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Remove unused Common Table Expressions (CTEs) when they can be safely pruned.
|
|
134
|
+
* Defaults to false to preserve original WITH definitions.
|
|
135
|
+
*/
|
|
136
|
+
removeUnusedCtes?: boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Explicit opt-in values for truthful optional condition branches in source SQL.
|
|
139
|
+
* Only listed parameter names are eligible for pruning, and `null`/`undefined` are treated as absent-equivalent.
|
|
140
|
+
*/
|
|
141
|
+
optionalConditionParameters?: OptionalConditionPruningParameters;
|
|
142
|
+
/**
|
|
143
|
+
* Legacy state-map form for optional branch pruning.
|
|
144
|
+
* Prefer `optionalConditionParameters` for new code so SQL-facing null semantics stay intuitive.
|
|
145
|
+
*/
|
|
146
|
+
optionalConditionParameterStates?: OptionalConditionParameterStates;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Builder-level configuration that can be reused across multiple build calls.
|
|
150
|
+
*/
|
|
151
|
+
export interface DynamicQueryBuilderOptions {
|
|
152
|
+
/** Optional resolver for table column names (retains backward compatibility). */
|
|
153
|
+
tableColumnResolver?: (tableName: string) => string[];
|
|
154
|
+
/**
|
|
155
|
+
* Schema metadata that may be applied by default when the optimizer is enabled.
|
|
156
|
+
* Schema info provided via QueryBuildOptions takes precedence.
|
|
157
|
+
*/
|
|
158
|
+
schemaInfo?: SchemaInfo;
|
|
95
159
|
}
|
|
96
160
|
/**
|
|
97
161
|
* DynamicQueryBuilder combines SQL parsing with dynamic condition injection (filters, sorts, paging, JSON serialization).
|
|
@@ -103,11 +167,14 @@ export interface QueryBuildOptions {
|
|
|
103
167
|
*/
|
|
104
168
|
export declare class DynamicQueryBuilder {
|
|
105
169
|
private tableColumnResolver?;
|
|
170
|
+
private defaultSchemaInfo?;
|
|
106
171
|
/**
|
|
107
|
-
* Creates a new DynamicQueryBuilder instance
|
|
108
|
-
*
|
|
172
|
+
* Creates a new DynamicQueryBuilder instance.
|
|
173
|
+
* Accepts either the legacy table resolver or an options object that can provide schema metadata.
|
|
174
|
+
*
|
|
175
|
+
* @param resolverOrOptions Optional resolver or configuration object
|
|
109
176
|
*/
|
|
110
|
-
constructor(
|
|
177
|
+
constructor(resolverOrOptions?: ((tableName: string) => string[]) | DynamicQueryBuilderOptions);
|
|
111
178
|
/**
|
|
112
179
|
* Builds a SelectQuery from SQL content with dynamic conditions.
|
|
113
180
|
* This is a pure function that does not perform any I/O operations.
|
|
@@ -129,13 +196,18 @@ export declare class DynamicQueryBuilder {
|
|
|
129
196
|
* ```
|
|
130
197
|
*/
|
|
131
198
|
buildQuery(sqlContent: string, options?: QueryBuildOptions): SelectQuery;
|
|
199
|
+
private resolveOptionalConditionPruningParameters;
|
|
200
|
+
private applyColumnFilters;
|
|
201
|
+
private normalizeColumnList;
|
|
202
|
+
private normalizeColumnIdentifier;
|
|
203
|
+
private getSelectItemName;
|
|
132
204
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
205
|
+
* Legacy helper for binding existing named parameters without adding new runtime predicates.
|
|
206
|
+
* Dynamic WHERE-condition injection is no longer supported; use SSSQL scaffold/refresh instead.
|
|
135
207
|
*
|
|
136
208
|
* @param sqlContent Raw SQL string to parse and modify
|
|
137
|
-
* @param filter
|
|
138
|
-
* @returns Modified SelectQuery
|
|
209
|
+
* @param filter Named parameters to bind when they already exist in the SQL
|
|
210
|
+
* @returns Modified SelectQuery after binding existing named parameters
|
|
139
211
|
*/
|
|
140
212
|
buildFilteredQuery(sqlContent: string, filter: FilterConditions): SelectQuery;
|
|
141
213
|
/**
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { SelectQueryParser } from "../parsers/SelectQueryParser";
|
|
2
|
-
import { SqlParamInjector } from "./SqlParamInjector";
|
|
3
2
|
import { SqlSortInjector } from "./SqlSortInjector";
|
|
4
3
|
import { SqlPaginationInjector } from "./SqlPaginationInjector";
|
|
5
4
|
import { PostgresJsonQueryBuilder } from "./PostgresJsonQueryBuilder";
|
|
6
5
|
import { QueryBuilder } from "./QueryBuilder";
|
|
7
6
|
import { SqlParameterBinder } from "./SqlParameterBinder";
|
|
8
7
|
import { ParameterDetector } from "../utils/ParameterDetector";
|
|
8
|
+
import { ColumnReference } from "../models/ValueComponent";
|
|
9
|
+
import { optimizeUnusedLeftJoinsToFixedPoint, optimizeUnusedCtesToFixedPoint } from "./OptimizeUnusedLeftJoins";
|
|
10
|
+
import { pruneOptionalConditionBranches } from "./PruneOptionalConditionBranches";
|
|
9
11
|
/**
|
|
10
12
|
* DynamicQueryBuilder combines SQL parsing with dynamic condition injection (filters, sorts, paging, JSON serialization).
|
|
11
13
|
*
|
|
@@ -16,11 +18,19 @@ import { ParameterDetector } from "../utils/ParameterDetector";
|
|
|
16
18
|
*/
|
|
17
19
|
export class DynamicQueryBuilder {
|
|
18
20
|
/**
|
|
19
|
-
* Creates a new DynamicQueryBuilder instance
|
|
20
|
-
*
|
|
21
|
+
* Creates a new DynamicQueryBuilder instance.
|
|
22
|
+
* Accepts either the legacy table resolver or an options object that can provide schema metadata.
|
|
23
|
+
*
|
|
24
|
+
* @param resolverOrOptions Optional resolver or configuration object
|
|
21
25
|
*/
|
|
22
|
-
constructor(
|
|
23
|
-
|
|
26
|
+
constructor(resolverOrOptions) {
|
|
27
|
+
if (typeof resolverOrOptions === "function") {
|
|
28
|
+
this.tableColumnResolver = resolverOrOptions;
|
|
29
|
+
}
|
|
30
|
+
else if (resolverOrOptions) {
|
|
31
|
+
this.tableColumnResolver = resolverOrOptions.tableColumnResolver;
|
|
32
|
+
this.defaultSchemaInfo = resolverOrOptions.schemaInfo;
|
|
33
|
+
}
|
|
24
34
|
}
|
|
25
35
|
/**
|
|
26
36
|
* Builds a SelectQuery from SQL content with dynamic conditions.
|
|
@@ -43,6 +53,7 @@ export class DynamicQueryBuilder {
|
|
|
43
53
|
* ```
|
|
44
54
|
*/
|
|
45
55
|
buildQuery(sqlContent, options = {}) {
|
|
56
|
+
var _a;
|
|
46
57
|
// Parse the base SQL
|
|
47
58
|
let parsedQuery;
|
|
48
59
|
try {
|
|
@@ -53,7 +64,7 @@ export class DynamicQueryBuilder {
|
|
|
53
64
|
}
|
|
54
65
|
// Apply dynamic modifications in the correct order
|
|
55
66
|
let modifiedQuery = parsedQuery;
|
|
56
|
-
// 1. Bind
|
|
67
|
+
// 1. Bind existing named parameters, but fail fast for legacy runtime filter assembly.
|
|
57
68
|
if (options.filter && Object.keys(options.filter).length > 0) {
|
|
58
69
|
const { hardcodedParams, dynamicFilters } = ParameterDetector.separateFilters(modifiedQuery, options.filter);
|
|
59
70
|
// Bind hardcoded parameters if any exist
|
|
@@ -61,12 +72,9 @@ export class DynamicQueryBuilder {
|
|
|
61
72
|
const parameterBinder = new SqlParameterBinder({ requireAllParameters: false });
|
|
62
73
|
modifiedQuery = parameterBinder.bind(modifiedQuery, hardcodedParams);
|
|
63
74
|
}
|
|
64
|
-
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
// Ensure we have a SimpleSelectQuery for the injector
|
|
68
|
-
const simpleQuery = QueryBuilder.buildSimpleQuery(modifiedQuery);
|
|
69
|
-
modifiedQuery = paramInjector.inject(simpleQuery, dynamicFilters);
|
|
75
|
+
const hasLegacyDynamicFilters = Object.keys(dynamicFilters).length > 0;
|
|
76
|
+
if (hasLegacyDynamicFilters) {
|
|
77
|
+
throw new Error("DynamicQueryBuilder no longer injects runtime filter predicates. Use `ztd query sssql scaffold` to author optional filters, `ztd query sssql refresh` to refresh them, and `optionalConditionParameters` at runtime for pruning only.");
|
|
70
78
|
}
|
|
71
79
|
}
|
|
72
80
|
// 2. Apply sorting second (after filtering to sort smaller dataset)
|
|
@@ -75,7 +83,8 @@ export class DynamicQueryBuilder {
|
|
|
75
83
|
// Ensure we have a SimpleSelectQuery for the injector
|
|
76
84
|
const simpleQuery = QueryBuilder.buildSimpleQuery(modifiedQuery);
|
|
77
85
|
modifiedQuery = sortInjector.inject(simpleQuery, options.sort);
|
|
78
|
-
}
|
|
86
|
+
}
|
|
87
|
+
// 3. Apply pagination third (after filtering and sorting)
|
|
79
88
|
if (options.paging) {
|
|
80
89
|
const { page = 1, pageSize } = options.paging;
|
|
81
90
|
if (pageSize !== undefined) {
|
|
@@ -86,7 +95,23 @@ export class DynamicQueryBuilder {
|
|
|
86
95
|
modifiedQuery = paginationInjector.inject(simpleQuery, paginationOptions);
|
|
87
96
|
}
|
|
88
97
|
}
|
|
89
|
-
// 4. Apply
|
|
98
|
+
// 4. Apply column projection filters before any optimizer passes.
|
|
99
|
+
modifiedQuery = this.applyColumnFilters(modifiedQuery, options);
|
|
100
|
+
// 5. Prune supported truthful optional branches before structural optimizers.
|
|
101
|
+
const optionalConditionParameters = this.resolveOptionalConditionPruningParameters(options);
|
|
102
|
+
if (Object.keys(optionalConditionParameters).length > 0) {
|
|
103
|
+
modifiedQuery = pruneOptionalConditionBranches(modifiedQuery, optionalConditionParameters);
|
|
104
|
+
}
|
|
105
|
+
// 6. Remove unused LEFT JOINs when asked before serialization.
|
|
106
|
+
const effectiveSchemaInfo = (_a = options.schemaInfo) !== null && _a !== void 0 ? _a : this.defaultSchemaInfo;
|
|
107
|
+
if (options.removeUnusedLeftJoins && (effectiveSchemaInfo === null || effectiveSchemaInfo === void 0 ? void 0 : effectiveSchemaInfo.length)) {
|
|
108
|
+
modifiedQuery = optimizeUnusedLeftJoinsToFixedPoint(modifiedQuery, effectiveSchemaInfo);
|
|
109
|
+
}
|
|
110
|
+
// 7. Remove unused CTEs before serialization when requested.
|
|
111
|
+
if (options.removeUnusedCtes) {
|
|
112
|
+
modifiedQuery = optimizeUnusedCtesToFixedPoint(modifiedQuery);
|
|
113
|
+
}
|
|
114
|
+
// Apply serialization last (transform the final query structure to JSON)
|
|
90
115
|
// Note: boolean values are handled at RawSqlClient level for auto-loading
|
|
91
116
|
if (options.serialize && typeof options.serialize === 'object') {
|
|
92
117
|
const jsonBuilder = new PostgresJsonQueryBuilder();
|
|
@@ -96,13 +121,116 @@ export class DynamicQueryBuilder {
|
|
|
96
121
|
}
|
|
97
122
|
return modifiedQuery;
|
|
98
123
|
}
|
|
124
|
+
resolveOptionalConditionPruningParameters(options) {
|
|
125
|
+
if (options.optionalConditionParameters) {
|
|
126
|
+
return options.optionalConditionParameters;
|
|
127
|
+
}
|
|
128
|
+
if (!options.optionalConditionParameterStates) {
|
|
129
|
+
return {};
|
|
130
|
+
}
|
|
131
|
+
const legacyParameters = {};
|
|
132
|
+
// Preserve backward compatibility for the state-map API while the value-based API becomes the primary entry point.
|
|
133
|
+
for (const [parameterName, state] of Object.entries(options.optionalConditionParameterStates)) {
|
|
134
|
+
legacyParameters[parameterName] = state === 'absent'
|
|
135
|
+
? null
|
|
136
|
+
: '__RAWSQL_OPTIONAL_CONDITION_PRESENT__';
|
|
137
|
+
}
|
|
138
|
+
return legacyParameters;
|
|
139
|
+
}
|
|
140
|
+
applyColumnFilters(query, options) {
|
|
141
|
+
const hasIncludeFilters = Array.isArray(options.includeColumns) && options.includeColumns.length > 0;
|
|
142
|
+
const hasExcludeFilters = Array.isArray(options.excludeColumns) && options.excludeColumns.length > 0;
|
|
143
|
+
if (!hasIncludeFilters && !hasExcludeFilters) {
|
|
144
|
+
return query;
|
|
145
|
+
}
|
|
146
|
+
if (hasIncludeFilters && hasExcludeFilters) {
|
|
147
|
+
throw new Error("includeColumns and excludeColumns cannot be used together.");
|
|
148
|
+
}
|
|
149
|
+
const simpleQuery = QueryBuilder.buildSimpleQuery(query);
|
|
150
|
+
const metadata = simpleQuery.selectClause.items.map(item => {
|
|
151
|
+
const name = this.getSelectItemName(item);
|
|
152
|
+
return {
|
|
153
|
+
item,
|
|
154
|
+
normalized: name ? this.normalizeColumnIdentifier(name) : null
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
const availableColumns = new Set(metadata
|
|
158
|
+
.map(entry => entry.normalized)
|
|
159
|
+
.filter((name) => name !== null));
|
|
160
|
+
const includeFilters = hasIncludeFilters ? this.normalizeColumnList(options.includeColumns) : null;
|
|
161
|
+
const excludeFilters = hasExcludeFilters ? this.normalizeColumnList(options.excludeColumns) : null;
|
|
162
|
+
const includeSet = includeFilters ? new Set(includeFilters.map(entry => entry.normalized)) : null;
|
|
163
|
+
const excludeSet = excludeFilters ? new Set(excludeFilters.map(entry => entry.normalized)) : null;
|
|
164
|
+
if (includeFilters) {
|
|
165
|
+
const missing = includeFilters.filter(entry => !availableColumns.has(entry.normalized));
|
|
166
|
+
if (missing.length > 0) {
|
|
167
|
+
throw new Error(`Column${missing.length === 1 ? "" : "s"} not found in SELECT clause: ${missing
|
|
168
|
+
.map(entry => `'${entry.original}'`)
|
|
169
|
+
.join(", ")}.`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (excludeFilters) {
|
|
173
|
+
const missing = excludeFilters.filter(entry => !availableColumns.has(entry.normalized));
|
|
174
|
+
if (missing.length > 0) {
|
|
175
|
+
throw new Error(`Column${missing.length === 1 ? "" : "s"} not found in SELECT clause: ${missing
|
|
176
|
+
.map(entry => `'${entry.original}'`)
|
|
177
|
+
.join(", ")}.`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const filteredItems = metadata
|
|
181
|
+
.filter(entry => {
|
|
182
|
+
if (!entry.normalized) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
if (includeSet) {
|
|
186
|
+
return includeSet.has(entry.normalized);
|
|
187
|
+
}
|
|
188
|
+
if (excludeSet) {
|
|
189
|
+
return !excludeSet.has(entry.normalized);
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
})
|
|
193
|
+
.map(entry => entry.item);
|
|
194
|
+
if (filteredItems.length === 0) {
|
|
195
|
+
throw new Error("Column filtering removed every SELECT item.");
|
|
196
|
+
}
|
|
197
|
+
simpleQuery.selectClause.items = filteredItems;
|
|
198
|
+
return simpleQuery;
|
|
199
|
+
}
|
|
200
|
+
normalizeColumnList(columns) {
|
|
201
|
+
return columns.map(column => {
|
|
202
|
+
if (typeof column !== "string") {
|
|
203
|
+
throw new Error("Column filters must be strings.");
|
|
204
|
+
}
|
|
205
|
+
const trimmed = column.trim();
|
|
206
|
+
if (trimmed === "") {
|
|
207
|
+
throw new Error("Column filters must not be empty.");
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
normalized: this.normalizeColumnIdentifier(trimmed),
|
|
211
|
+
original: trimmed
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
normalizeColumnIdentifier(value) {
|
|
216
|
+
return value.trim().toLowerCase();
|
|
217
|
+
}
|
|
218
|
+
getSelectItemName(item) {
|
|
219
|
+
if (item.identifier) {
|
|
220
|
+
return item.identifier.name;
|
|
221
|
+
}
|
|
222
|
+
if (item.value instanceof ColumnReference) {
|
|
223
|
+
return item.value.column.name;
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
99
227
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
228
|
+
* Legacy helper for binding existing named parameters without adding new runtime predicates.
|
|
229
|
+
* Dynamic WHERE-condition injection is no longer supported; use SSSQL scaffold/refresh instead.
|
|
102
230
|
*
|
|
103
231
|
* @param sqlContent Raw SQL string to parse and modify
|
|
104
|
-
* @param filter
|
|
105
|
-
* @returns Modified SelectQuery
|
|
232
|
+
* @param filter Named parameters to bind when they already exist in the SQL
|
|
233
|
+
* @returns Modified SelectQuery after binding existing named parameters
|
|
106
234
|
*/
|
|
107
235
|
buildFilteredQuery(sqlContent, filter) {
|
|
108
236
|
return this.buildQuery(sqlContent, { filter });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicQueryBuilder.js","sourceRoot":"","sources":["../../../src/transformers/DynamicQueryBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"DynamicQueryBuilder.js","sourceRoot":"","sources":["../../../src/transformers/DynamicQueryBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|