rawsql-ts 0.11.19-beta → 0.11.21-beta

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.
@@ -1,5 +1,6 @@
1
1
  export * from './parsers/SelectQueryParser';
2
2
  export * from './parsers/InsertQueryParser';
3
+ export * from './parsers/WithClauseParser';
3
4
  export * from './models/BinarySelectQuery';
4
5
  export * from './models/SelectQuery';
5
6
  export * from './models/ValueComponent';
@@ -20,6 +21,7 @@ export * from './transformers/PostgresJsonQueryBuilder';
20
21
  export * from './transformers/QueryBuilder';
21
22
  export * from './transformers/SelectValueCollector';
22
23
  export * from './transformers/SelectableColumnCollector';
24
+ export { DuplicateDetectionMode } from './transformers/SelectableColumnCollector';
23
25
  export * from './transformers/TableColumnResolver';
24
26
  export * from './transformers/TableSourceCollector';
25
27
  export * from './transformers/JsonMappingConverter';
package/dist/src/index.js CHANGED
@@ -14,10 +14,11 @@ 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.unifyJsonMapping = exports.isLegacyFormat = exports.isUnifiedFormat = exports.isModelDrivenFormat = exports.processJsonMapping = exports.validateModelDrivenMapping = exports.convertModelDrivenMapping = void 0;
17
+ exports.unifyJsonMapping = exports.isLegacyFormat = exports.isUnifiedFormat = exports.isModelDrivenFormat = exports.processJsonMapping = exports.validateModelDrivenMapping = exports.convertModelDrivenMapping = exports.DuplicateDetectionMode = void 0;
18
18
  // Entry point for rawsql-ts package
19
19
  __exportStar(require("./parsers/SelectQueryParser"), exports);
20
20
  __exportStar(require("./parsers/InsertQueryParser"), exports);
21
+ __exportStar(require("./parsers/WithClauseParser"), exports);
21
22
  __exportStar(require("./models/BinarySelectQuery"), exports);
22
23
  __exportStar(require("./models/SelectQuery"), exports);
23
24
  __exportStar(require("./models/ValueComponent"), exports);
@@ -38,6 +39,8 @@ __exportStar(require("./transformers/PostgresJsonQueryBuilder"), exports);
38
39
  __exportStar(require("./transformers/QueryBuilder"), exports); // old name:QueryConverter
39
40
  __exportStar(require("./transformers/SelectValueCollector"), exports);
40
41
  __exportStar(require("./transformers/SelectableColumnCollector"), exports);
42
+ var SelectableColumnCollector_1 = require("./transformers/SelectableColumnCollector");
43
+ Object.defineProperty(exports, "DuplicateDetectionMode", { enumerable: true, get: function () { return SelectableColumnCollector_1.DuplicateDetectionMode; } });
41
44
  __exportStar(require("./transformers/TableColumnResolver"), exports);
42
45
  __exportStar(require("./transformers/TableSourceCollector"), exports);
43
46
  __exportStar(require("./transformers/JsonMappingConverter"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,oCAAoC;AACpC,8DAA4C;AAC5C,8DAA4C;AAE5C,6DAA2C;AAC3C,uDAAqC;AACrC,0DAAwC;AACxC,uDAAqC;AACrC,oDAAkC;AAClC,kDAAgC;AAEhC,8DAA4C;AAC5C,+DAA6C;AAC7C,6DAA2C;AAC3C,uEAAqD;AACrD,oEAAkD;AAClD,6DAA2C;AAC3C,4DAA0C;AAC1C,0EAAwD;AACxD,2DAAyC;AACzC,8DAA4C;AAC5C,0EAAwD;AACxD,8DAA4C,CAAC,0BAA0B;AACvE,sEAAoD;AACpD,2EAAyD;AACzD,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,2EAAyD;AACzD,kEAAgD;AAChD,iEAA+C;AAC/C,uEAAqD;AACrD,qEAAmD;AAEnD,6DAA2C;AAC3C,8DAA4C;AAC5C,wDAAsC;AACtC,wDAAsC;AACtC,uDAAqC;AAGrC,oEAAoE"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,oCAAoC;AACpC,8DAA4C;AAC5C,8DAA4C;AAC5C,6DAA2C;AAE3C,6DAA2C;AAC3C,uDAAqC;AACrC,0DAAwC;AACxC,uDAAqC;AACrC,oDAAkC;AAClC,kDAAgC;AAEhC,8DAA4C;AAC5C,+DAA6C;AAC7C,6DAA2C;AAC3C,uEAAqD;AACrD,oEAAkD;AAClD,6DAA2C;AAC3C,4DAA0C;AAC1C,0EAAwD;AACxD,2DAAyC;AACzC,8DAA4C;AAC5C,0EAAwD;AACxD,8DAA4C,CAAC,0BAA0B;AACvE,sEAAoD;AACpD,2EAAyD;AACzD,sFAAkF;AAAzE,mIAAA,sBAAsB,OAAA;AAC/B,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,2EAAyD;AACzD,kEAAgD;AAChD,iEAA+C;AAC/C,uEAAqD;AACrD,qEAAmD;AAEnD,6DAA2C;AAC3C,8DAA4C;AAC5C,wDAAsC;AACtC,wDAAsC;AACtC,uDAAqC;AAGrC,oEAAoE"}
@@ -1,7 +1,58 @@
1
1
  import { WithClause } from "../models/Clause";
2
2
  import { Lexeme } from "../models/Lexeme";
3
+ /**
4
+ * Parser for SQL WITH clauses (Common Table Expressions - CTEs).
5
+ * Parses only the WITH clause portion of SQL, not the entire query.
6
+ *
7
+ * **Note**: For most use cases, use `SelectQueryParser` which provides more comprehensive SQL parsing.
8
+ * This parser should only be used for the special case where you need to analyze only the WITH clause portion.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Parses only the WITH clause, not the following SELECT
13
+ * const sql = "WITH recursive_cte AS (SELECT 1 as n UNION SELECT n+1 FROM recursive_cte WHERE n < 10)";
14
+ * const withClause = WithClauseParser.parse(sql);
15
+ * console.log(withClause.recursive); // true
16
+ * console.log(withClause.tables.length); // 1
17
+ * ```
18
+ */
3
19
  export declare class WithClauseParser {
20
+ /**
21
+ * Parses a SQL string containing only a WITH clause into a WithClause AST.
22
+ * The input should contain only the WITH clause, not the subsequent main query.
23
+ *
24
+ * @param query - The SQL string containing only the WITH clause
25
+ * @returns The parsed WithClause object
26
+ * @throws Error if the syntax is invalid or there are unexpected tokens after the WITH clause
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // Correct: Only the WITH clause
31
+ * const sql = "WITH users_data AS (SELECT id, name FROM users)";
32
+ * const withClause = WithClauseParser.parse(sql);
33
+ *
34
+ * // Error: Contains SELECT after WITH clause
35
+ * // const badSql = "WITH users_data AS (SELECT id, name FROM users) SELECT * FROM users_data";
36
+ * ```
37
+ */
4
38
  static parse(query: string): WithClause;
39
+ /**
40
+ * Parses a WITH clause from an array of lexemes starting at the specified index.
41
+ *
42
+ * @param lexemes - Array of lexemes to parse from
43
+ * @param index - Starting index in the lexemes array
44
+ * @returns Object containing the parsed WithClause and the new index position
45
+ * @throws Error if the syntax is invalid or WITH keyword is not found
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const tokenizer = new SqlTokenizer("WITH cte AS (SELECT 1)");
50
+ * const lexemes = tokenizer.readLexmes();
51
+ * const result = WithClauseParser.parseFromLexeme(lexemes, 0);
52
+ * console.log(result.value.tables.length); // 1
53
+ * console.log(result.newIndex); // position after the WITH clause
54
+ * ```
55
+ */
5
56
  static parseFromLexeme(lexemes: Lexeme[], index: number): {
6
57
  value: WithClause;
7
58
  newIndex: number;
@@ -5,8 +5,41 @@ const Clause_1 = require("../models/Clause");
5
5
  const Lexeme_1 = require("../models/Lexeme");
6
6
  const SqlTokenizer_1 = require("./SqlTokenizer");
7
7
  const CommonTableParser_1 = require("./CommonTableParser");
8
+ /**
9
+ * Parser for SQL WITH clauses (Common Table Expressions - CTEs).
10
+ * Parses only the WITH clause portion of SQL, not the entire query.
11
+ *
12
+ * **Note**: For most use cases, use `SelectQueryParser` which provides more comprehensive SQL parsing.
13
+ * This parser should only be used for the special case where you need to analyze only the WITH clause portion.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Parses only the WITH clause, not the following SELECT
18
+ * const sql = "WITH recursive_cte AS (SELECT 1 as n UNION SELECT n+1 FROM recursive_cte WHERE n < 10)";
19
+ * const withClause = WithClauseParser.parse(sql);
20
+ * console.log(withClause.recursive); // true
21
+ * console.log(withClause.tables.length); // 1
22
+ * ```
23
+ */
8
24
  class WithClauseParser {
9
- // Parse SQL string to AST (was: parse)
25
+ /**
26
+ * Parses a SQL string containing only a WITH clause into a WithClause AST.
27
+ * The input should contain only the WITH clause, not the subsequent main query.
28
+ *
29
+ * @param query - The SQL string containing only the WITH clause
30
+ * @returns The parsed WithClause object
31
+ * @throws Error if the syntax is invalid or there are unexpected tokens after the WITH clause
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * // Correct: Only the WITH clause
36
+ * const sql = "WITH users_data AS (SELECT id, name FROM users)";
37
+ * const withClause = WithClauseParser.parse(sql);
38
+ *
39
+ * // Error: Contains SELECT after WITH clause
40
+ * // const badSql = "WITH users_data AS (SELECT id, name FROM users) SELECT * FROM users_data";
41
+ * ```
42
+ */
10
43
  static parse(query) {
11
44
  const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
12
45
  const lexemes = tokenizer.readLexmes(); // Get tokens
@@ -18,7 +51,23 @@ class WithClauseParser {
18
51
  }
19
52
  return result.value;
20
53
  }
21
- // Parse from lexeme array (was: parse)
54
+ /**
55
+ * Parses a WITH clause from an array of lexemes starting at the specified index.
56
+ *
57
+ * @param lexemes - Array of lexemes to parse from
58
+ * @param index - Starting index in the lexemes array
59
+ * @returns Object containing the parsed WithClause and the new index position
60
+ * @throws Error if the syntax is invalid or WITH keyword is not found
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const tokenizer = new SqlTokenizer("WITH cte AS (SELECT 1)");
65
+ * const lexemes = tokenizer.readLexmes();
66
+ * const result = WithClauseParser.parseFromLexeme(lexemes, 0);
67
+ * console.log(result.value.tables.length); // 1
68
+ * console.log(result.newIndex); // position after the WITH clause
69
+ * ```
70
+ */
22
71
  static parseFromLexeme(lexemes, index) {
23
72
  let idx = index;
24
73
  // Capture comments from the WITH keyword
@@ -1 +1 @@
1
- {"version":3,"file":"WithClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/WithClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,6CAAqD;AACrD,iDAA8C;AAC9C,2DAAwD;AAExD,MAAa,gBAAgB;IACzB,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,gEAAgE,CAAC,CAAC;QACvL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,yCAAyC;QACzC,MAAM,iBAAiB,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAE9E,sBAAsB;QACtB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACtE,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0BAA0B,CAAC,CAAC;QAC/E,CAAC;QAED,8BAA8B;QAC9B,MAAM,SAAS,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;QAC3F,IAAI,SAAS,EAAE,CAAC;YACZ,GAAG,EAAE,CAAC;QACV,CAAC;QAED,aAAa;QACb,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,qCAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAExB,mCAAmC;QACnC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,GAAG,EAAE,CAAC,CAAC,aAAa;YAEpB,wDAAwD;YACxD,yEAAyE;YACzE,MAAM,SAAS,GAAG,qCAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7B,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,mCAAmC;QACnC,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrD,UAAU,CAAC,QAAQ,GAAG,iBAAiB,CAAC;QAExC,OAAO;YACH,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,GAAG;SAChB,CAAC;IACN,CAAC;CACJ;AAjED,4CAiEC"}
1
+ {"version":3,"file":"WithClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/WithClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,6CAAqD;AACrD,iDAA8C;AAC9C,2DAAwD;AAExD;;;;;;;;;;;;;;;GAeG;AACH,MAAa,gBAAgB;IACzB;;;;;;;;;;;;;;;;;OAiBG;IACI,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,gEAAgE,CAAC,CAAC;QACvL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACI,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,yCAAyC;QACzC,MAAM,iBAAiB,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAE9E,sBAAsB;QACtB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACtE,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0BAA0B,CAAC,CAAC;QAC/E,CAAC;QAED,8BAA8B;QAC9B,MAAM,SAAS,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;QAC3F,IAAI,SAAS,EAAE,CAAC;YACZ,GAAG,EAAE,CAAC;QACV,CAAC;QAED,aAAa;QACb,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,qCAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAExB,mCAAmC;QACnC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,GAAG,EAAE,CAAC,CAAC,aAAa;YAEpB,wDAAwD;YACxD,yEAAyE;YACzE,MAAM,SAAS,GAAG,qCAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7B,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,mCAAmC;QACnC,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrD,UAAU,CAAC,QAAQ,GAAG,iBAAiB,CAAC;QAExC,OAAO;YACH,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,GAAG;SAChB,CAAC;IACN,CAAC;CACJ;AAlGD,4CAkGC"}
@@ -20,28 +20,58 @@ import { SqlComponent, SqlComponentVisitor } from "../models/SqlComponent";
20
20
  import { ValueComponent } from "../models/ValueComponent";
21
21
  import { TableColumnResolver } from "./TableColumnResolver";
22
22
  /**
23
- * A visitor that collects all ColumnReference instances from SimpleSelectQuery structures.
23
+ * A visitor that collects all ColumnReference instances from SQL query structures.
24
24
  * This visitor scans through all clauses and collects all unique ColumnReference objects.
25
- * It does not scan Common Table Expressions (CTEs) or subqueries.
25
+ * It supports both regular column collection and upstream column collection for maximum
26
+ * search conditions in DynamicQuery scenarios.
26
27
  *
27
- * IMPORTANT: This collector only supports SimpleSelectQuery. BinarySelectQuery
28
- * (UNION/INTERSECT/EXCEPT) will throw an error and should be decomposed into
29
- * individual SimpleSelectQuery branches before using this collector.
28
+ * Supported query types:
29
+ * - SimpleSelectQuery: Basic SELECT queries with all standard clauses
30
+ * - BinarySelectQuery: UNION, INTERSECT, EXCEPT queries (collects from both sides)
31
+ * - Common Table Expressions (CTEs) within queries
32
+ * - Subqueries and nested queries
30
33
  *
31
34
  * Behavioral notes:
32
- * - Only collects column references to tables defined in the root FROM/JOIN clauses
35
+ * - Collects column references to tables defined in the root FROM/JOIN clauses
33
36
  * - For aliased columns (e.g., 'title as name'), collects both the original column
34
37
  * reference ('title') AND the alias ('name') to enable complete dependency tracking
38
+ * - When upstream option is enabled, collects all available columns from upstream sources
39
+ * (CTEs, subqueries, and tables) for maximum search conditions in DynamicQuery
40
+ * - Automatically removes duplicates based on the specified duplicate detection mode
35
41
  *
36
42
  * Use cases:
37
43
  * - Dependency analysis and schema migration tools
38
- * - Column usage tracking within individual SELECT branches
44
+ * - Column usage tracking across complex queries including unions and CTEs
39
45
  * - Security analysis for column-level access control
46
+ * - DynamicQuery maximum search condition column discovery
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * // Basic usage - collect only referenced columns
51
+ * const collector = new SelectableColumnCollector();
52
+ * const columns = collector.collect(query);
53
+ *
54
+ * // With upstream collection for DynamicQuery
55
+ * const upstreamCollector = new SelectableColumnCollector(
56
+ * null, false, DuplicateDetectionMode.ColumnNameOnly,
57
+ * { upstream: true }
58
+ * );
59
+ * const allColumns = upstreamCollector.collect(query);
60
+ *
61
+ * // Works with union queries and CTEs
62
+ * const unionQuery = SelectQueryParser.parse(`
63
+ * SELECT name, email FROM users
64
+ * UNION
65
+ * SELECT name, email FROM customers
66
+ * `);
67
+ * const unionColumns = collector.collect(unionQuery);
68
+ * ```
40
69
  */
41
70
  export declare class SelectableColumnCollector implements SqlComponentVisitor<void> {
42
71
  private handlers;
43
72
  private selectValues;
44
73
  private visitedNodes;
74
+ private uniqueKeys;
45
75
  private isRootVisit;
46
76
  private tableColumnResolver;
47
77
  private commonTableCollector;
@@ -57,10 +87,28 @@ export declare class SelectableColumnCollector implements SqlComponentVisitor<vo
57
87
  * @param {DuplicateDetectionMode} [duplicateDetection=DuplicateDetectionMode.ColumnNameOnly] - Specifies the duplicate detection mode: 'columnNameOnly' (default, only column name is used), or 'fullName' (table name + column name).
58
88
  * @param {Object} [options={}] - Additional options for the collector.
59
89
  * @param {boolean} [options.ignoreCaseAndUnderscore=false] - If true, column names are compared without considering case and underscores.
90
+ * @param {boolean} [options.upstream=false] - If true, collect all columns available from upstream sources for maximum search conditions in DynamicQuery.
60
91
  */
61
92
  constructor(tableColumnResolver?: TableColumnResolver | null, includeWildCard?: boolean, duplicateDetection?: DuplicateDetectionMode, options?: {
62
93
  ignoreCaseAndUnderscore?: boolean;
94
+ upstream?: boolean;
63
95
  });
96
+ /**
97
+ * Initialize instance properties.
98
+ */
99
+ private initializeProperties;
100
+ /**
101
+ * Initialize the handler map for different SQL component types.
102
+ */
103
+ private initializeHandlers;
104
+ /**
105
+ * Initialize handlers for SQL clause types.
106
+ */
107
+ private initializeClauseHandlers;
108
+ /**
109
+ * Initialize handlers for value component types.
110
+ */
111
+ private initializeValueComponentHandlers;
64
112
  getValues(): {
65
113
  name: string;
66
114
  value: ValueComponent;
@@ -75,10 +123,18 @@ export declare class SelectableColumnCollector implements SqlComponentVisitor<vo
75
123
  private reset;
76
124
  /**
77
125
  * Add a select value as unique, according to the duplicate detection option.
78
- * If duplicateDetection is 'columnNameOnly', only column name is checked.
79
- * If duplicateDetection is 'fullName', both table and column name are checked.
126
+ * Uses efficient Set-based duplicate detection for better performance.
80
127
  */
81
128
  private addSelectValueAsUnique;
129
+ /**
130
+ * Generate a unique key based on the duplicate detection mode.
131
+ */
132
+ private generateUniqueKey;
133
+ /**
134
+ * Normalize column name based on options.
135
+ * Ensures safe string handling to prevent injection attacks.
136
+ */
137
+ private normalizeColumnName;
82
138
  /**
83
139
  * Main entry point for the visitor pattern.
84
140
  * Implements the shallow visit pattern to distinguish between root and recursive visits.
@@ -93,6 +149,10 @@ export declare class SelectableColumnCollector implements SqlComponentVisitor<vo
93
149
  * Process a SimpleSelectQuery to collect ColumnReferences from all its clauses
94
150
  */
95
151
  private visitSimpleSelectQuery;
152
+ /**
153
+ * Process a BinarySelectQuery (UNION, INTERSECT, EXCEPT) to collect ColumnReferences from both sides
154
+ */
155
+ private visitBinarySelectQuery;
96
156
  private visitSelectClause;
97
157
  private visitFromClause;
98
158
  private visitWhereClause;
@@ -118,4 +178,29 @@ export declare class SelectableColumnCollector implements SqlComponentVisitor<vo
118
178
  private visitArrayQueryExpression;
119
179
  private visitValueList;
120
180
  private visitPartitionByClause;
181
+ /**
182
+ * Collect all upstream columns available for DynamicQuery maximum search conditions.
183
+ * This includes columns from CTEs, subqueries, and tables that can be used for filtering.
184
+ */
185
+ private collectUpstreamColumns;
186
+ /**
187
+ * Collect upstream columns from a specific source (table, subquery, or CTE).
188
+ */
189
+ private collectUpstreamColumnsFromSource;
190
+ /**
191
+ * Collect upstream columns from a table source using table column resolver.
192
+ */
193
+ private collectUpstreamColumnsFromTable;
194
+ /**
195
+ * Collect upstream columns from a subquery source.
196
+ */
197
+ private collectUpstreamColumnsFromSubquery;
198
+ /**
199
+ * Collect upstream columns from a CTE.
200
+ */
201
+ private collectUpstreamColumnsFromCTE;
202
+ /**
203
+ * Find a CTE by name in the common tables.
204
+ */
205
+ private findCTEByName;
121
206
  }