rawsql-ts 0.12.0 → 0.13.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 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +16 -16
- package/dist/esm/index.min.js.map +3 -3
- package/dist/esm/src/index.d.ts +12 -0
- package/dist/esm/src/index.js +11 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/models/Clause.d.ts +7 -3
- package/dist/esm/src/models/Clause.js +17 -4
- package/dist/esm/src/models/Clause.js.map +1 -1
- package/dist/esm/src/models/DDLStatements.d.ts +14 -2
- package/dist/esm/src/models/DDLStatements.js +12 -0
- package/dist/esm/src/models/DDLStatements.js.map +1 -1
- package/dist/esm/src/models/InsertQuery.d.ts +1 -4
- package/dist/esm/src/models/InsertQuery.js +3 -5
- package/dist/esm/src/models/InsertQuery.js.map +1 -1
- package/dist/esm/src/models/SqlPrintToken.d.ts +1 -0
- package/dist/esm/src/models/SqlPrintToken.js +1 -0
- package/dist/esm/src/models/SqlPrintToken.js.map +1 -1
- package/dist/esm/src/models/TableDefinitionModel.d.ts +39 -0
- package/dist/esm/src/models/TableDefinitionModel.js +77 -0
- package/dist/esm/src/models/TableDefinitionModel.js.map +1 -0
- package/dist/esm/src/models/ValuesQuery.d.ts +2 -0
- package/dist/esm/src/models/ValuesQuery.js +1 -0
- package/dist/esm/src/models/ValuesQuery.js.map +1 -1
- package/dist/esm/src/parsers/AlterTableParser.js +1 -1
- package/dist/esm/src/parsers/AlterTableParser.js.map +1 -1
- package/dist/esm/src/parsers/InsertQueryParser.js +4 -1
- package/dist/esm/src/parsers/InsertQueryParser.js.map +1 -1
- package/dist/esm/src/parsers/ReturningClauseParser.js +33 -47
- package/dist/esm/src/parsers/ReturningClauseParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlParser.d.ts +0 -1
- package/dist/esm/src/parsers/SqlParser.js +44 -58
- package/dist/esm/src/parsers/SqlParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/esm/src/parsers/SqlPrintTokenParser.js +23 -5
- package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js +7 -0
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/DDLDiffGenerator.d.ts +14 -0
- package/dist/esm/src/transformers/DDLDiffGenerator.js +197 -0
- package/dist/esm/src/transformers/DDLDiffGenerator.js.map +1 -0
- package/dist/esm/src/transformers/DDLGeneralizer.d.ts +13 -0
- package/dist/esm/src/transformers/DDLGeneralizer.js +98 -0
- package/dist/esm/src/transformers/DDLGeneralizer.js.map +1 -0
- package/dist/esm/src/transformers/DDLToFixtureConverter.d.ts +19 -0
- package/dist/esm/src/transformers/DDLToFixtureConverter.js +202 -0
- package/dist/esm/src/transformers/DDLToFixtureConverter.js.map +1 -0
- package/dist/esm/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
- package/dist/esm/src/transformers/DeleteResultSelectConverter.js +394 -0
- package/dist/esm/src/transformers/DeleteResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/FixtureCteBuilder.d.ts +60 -0
- package/dist/esm/src/transformers/FixtureCteBuilder.js +147 -0
- package/dist/esm/src/transformers/FixtureCteBuilder.js.map +1 -0
- package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
- package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
- package/dist/esm/src/transformers/InsertResultSelectConverter.d.ts +64 -0
- package/dist/esm/src/transformers/InsertResultSelectConverter.js +495 -0
- package/dist/esm/src/transformers/InsertResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/MergeResultSelectConverter.d.ts +38 -0
- package/dist/esm/src/transformers/MergeResultSelectConverter.js +306 -0
- package/dist/esm/src/transformers/MergeResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/QueryBuilder.d.ts +11 -0
- package/dist/esm/src/transformers/QueryBuilder.js +19 -3
- package/dist/esm/src/transformers/QueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/SelectResultSelectConverter.d.ts +10 -0
- package/dist/esm/src/transformers/SelectResultSelectConverter.js +32 -0
- package/dist/esm/src/transformers/SelectResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/SimulatedSelectConverter.d.ts +23 -0
- package/dist/esm/src/transformers/SimulatedSelectConverter.js +61 -0
- package/dist/esm/src/transformers/SimulatedSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
- package/dist/esm/src/transformers/UpdateResultSelectConverter.js +340 -0
- package/dist/esm/src/transformers/UpdateResultSelectConverter.js.map +1 -0
- package/dist/esm/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
- package/dist/esm/src/utils/SelectQueryWithClauseHelper.js +43 -0
- package/dist/esm/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
- package/dist/esm/src/utils/ValueComponentRewriter.d.ts +3 -0
- package/dist/esm/src/utils/ValueComponentRewriter.js +180 -0
- package/dist/esm/src/utils/ValueComponentRewriter.js.map +1 -0
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/formatters/OriginalFormatRestorer.js +139 -0
- package/dist/formatters/OriginalFormatRestorer.js.map +1 -0
- package/dist/index.js +144 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +17 -17
- package/dist/index.min.js.map +3 -3
- package/dist/models/BinarySelectQuery.js +198 -0
- package/dist/models/BinarySelectQuery.js.map +1 -0
- package/dist/models/CTEError.js +37 -0
- package/dist/models/CTEError.js.map +1 -0
- package/dist/models/Clause.js +535 -0
- package/dist/models/Clause.js.map +1 -0
- package/dist/models/CreateTableQuery.js +135 -0
- package/dist/models/CreateTableQuery.js.map +1 -0
- package/dist/models/DDLStatements.js +275 -0
- package/dist/models/DDLStatements.js.map +1 -0
- package/dist/models/DeleteQuery.js +20 -0
- package/dist/models/DeleteQuery.js.map +1 -0
- package/dist/models/FormattingLexeme.js +3 -0
- package/dist/models/FormattingLexeme.js.map +1 -0
- package/dist/models/HintClause.js +41 -0
- package/dist/models/HintClause.js.map +1 -0
- package/dist/models/InsertQuery.js +23 -0
- package/dist/models/InsertQuery.js.map +1 -0
- package/dist/models/KeywordTrie.js +54 -0
- package/dist/models/KeywordTrie.js.map +1 -0
- package/dist/models/Lexeme.js +22 -0
- package/dist/models/Lexeme.js.map +1 -0
- package/dist/models/MergeQuery.js +104 -0
- package/dist/models/MergeQuery.js.map +1 -0
- package/dist/models/SelectQuery.js +22 -0
- package/dist/models/SelectQuery.js.map +1 -0
- package/dist/models/SimpleSelectQuery.js +648 -0
- package/dist/models/SimpleSelectQuery.js.map +1 -0
- package/dist/models/SqlComponent.js +73 -0
- package/dist/models/SqlComponent.js.map +1 -0
- package/dist/models/SqlPrintToken.js +143 -0
- package/dist/models/SqlPrintToken.js.map +1 -0
- package/dist/models/TableDefinitionModel.js +86 -0
- package/dist/models/TableDefinitionModel.js.map +1 -0
- package/dist/models/UpdateQuery.js +29 -0
- package/dist/models/UpdateQuery.js.map +1 -0
- package/dist/models/ValueComponent.js +380 -0
- package/dist/models/ValueComponent.js.map +1 -0
- package/dist/models/ValuesQuery.js +62 -0
- package/dist/models/ValuesQuery.js.map +1 -0
- package/dist/parsers/AlterTableParser.js +490 -0
- package/dist/parsers/AlterTableParser.js.map +1 -0
- package/dist/parsers/AnalyzeStatementParser.js +94 -0
- package/dist/parsers/AnalyzeStatementParser.js.map +1 -0
- package/dist/parsers/CommandExpressionParser.js +213 -0
- package/dist/parsers/CommandExpressionParser.js.map +1 -0
- package/dist/parsers/CommonTableParser.js +177 -0
- package/dist/parsers/CommonTableParser.js.map +1 -0
- package/dist/parsers/CreateIndexParser.js +241 -0
- package/dist/parsers/CreateIndexParser.js.map +1 -0
- package/dist/parsers/CreateTableParser.js +738 -0
- package/dist/parsers/CreateTableParser.js.map +1 -0
- package/dist/parsers/DeleteClauseParser.js +37 -0
- package/dist/parsers/DeleteClauseParser.js.map +1 -0
- package/dist/parsers/DeleteQueryParser.js +77 -0
- package/dist/parsers/DeleteQueryParser.js.map +1 -0
- package/dist/parsers/DropConstraintParser.js +51 -0
- package/dist/parsers/DropConstraintParser.js.map +1 -0
- package/dist/parsers/DropIndexParser.js +73 -0
- package/dist/parsers/DropIndexParser.js.map +1 -0
- package/dist/parsers/DropTableParser.js +63 -0
- package/dist/parsers/DropTableParser.js.map +1 -0
- package/dist/parsers/ExplainStatementParser.js +189 -0
- package/dist/parsers/ExplainStatementParser.js.map +1 -0
- package/dist/parsers/FetchClauseParser.js +89 -0
- package/dist/parsers/FetchClauseParser.js.map +1 -0
- package/dist/parsers/ForClauseParser.js +58 -0
- package/dist/parsers/ForClauseParser.js.map +1 -0
- package/dist/parsers/FromClauseParser.js +54 -0
- package/dist/parsers/FromClauseParser.js.map +1 -0
- package/dist/parsers/FullNameParser.js +110 -0
- package/dist/parsers/FullNameParser.js.map +1 -0
- package/dist/parsers/FunctionExpressionParser.js +524 -0
- package/dist/parsers/FunctionExpressionParser.js.map +1 -0
- package/dist/parsers/GroupByParser.js +58 -0
- package/dist/parsers/GroupByParser.js.map +1 -0
- package/dist/parsers/HavingParser.js +36 -0
- package/dist/parsers/HavingParser.js.map +1 -0
- package/dist/parsers/IdentifierDecorator.js +17 -0
- package/dist/parsers/IdentifierDecorator.js.map +1 -0
- package/dist/parsers/IdentifierParser.js +15 -0
- package/dist/parsers/IdentifierParser.js.map +1 -0
- package/dist/parsers/InsertQueryParser.js +162 -0
- package/dist/parsers/InsertQueryParser.js.map +1 -0
- package/dist/parsers/JoinClauseParser.js +117 -0
- package/dist/parsers/JoinClauseParser.js.map +1 -0
- package/dist/parsers/JoinOnClauseParser.js +21 -0
- package/dist/parsers/JoinOnClauseParser.js.map +1 -0
- package/dist/parsers/JoinUsingClauseParser.js +23 -0
- package/dist/parsers/JoinUsingClauseParser.js.map +1 -0
- package/dist/parsers/KeywordParser.js +99 -0
- package/dist/parsers/KeywordParser.js.map +1 -0
- package/dist/parsers/LimitClauseParser.js +38 -0
- package/dist/parsers/LimitClauseParser.js.map +1 -0
- package/dist/parsers/LiteralParser.js +48 -0
- package/dist/parsers/LiteralParser.js.map +1 -0
- package/dist/parsers/MergeQueryParser.js +483 -0
- package/dist/parsers/MergeQueryParser.js.map +1 -0
- package/dist/parsers/OffsetClauseParser.js +42 -0
- package/dist/parsers/OffsetClauseParser.js.map +1 -0
- package/dist/parsers/OrderByClauseParser.js +108 -0
- package/dist/parsers/OrderByClauseParser.js.map +1 -0
- package/dist/parsers/OverExpressionParser.js +44 -0
- package/dist/parsers/OverExpressionParser.js.map +1 -0
- package/dist/parsers/ParameterDecorator.js +40 -0
- package/dist/parsers/ParameterDecorator.js.map +1 -0
- package/dist/parsers/ParameterExpressionParser.js +24 -0
- package/dist/parsers/ParameterExpressionParser.js.map +1 -0
- package/dist/parsers/ParenExpressionParser.js +109 -0
- package/dist/parsers/ParenExpressionParser.js.map +1 -0
- package/dist/parsers/ParseError.js +25 -0
- package/dist/parsers/ParseError.js.map +1 -0
- package/dist/parsers/PartitionByParser.js +53 -0
- package/dist/parsers/PartitionByParser.js.map +1 -0
- package/dist/parsers/ReturningClauseParser.js +64 -0
- package/dist/parsers/ReturningClauseParser.js.map +1 -0
- package/dist/parsers/SelectClauseParser.js +244 -0
- package/dist/parsers/SelectClauseParser.js.map +1 -0
- package/dist/parsers/SelectQueryParser.js +564 -0
- package/dist/parsers/SelectQueryParser.js.map +1 -0
- package/dist/parsers/SequenceParser.js +245 -0
- package/dist/parsers/SequenceParser.js.map +1 -0
- package/dist/parsers/SetClauseParser.js +125 -0
- package/dist/parsers/SetClauseParser.js.map +1 -0
- package/dist/parsers/SourceAliasExpressionParser.js +60 -0
- package/dist/parsers/SourceAliasExpressionParser.js.map +1 -0
- package/dist/parsers/SourceExpressionParser.js +69 -0
- package/dist/parsers/SourceExpressionParser.js.map +1 -0
- package/dist/parsers/SourceParser.js +144 -0
- package/dist/parsers/SourceParser.js.map +1 -0
- package/dist/parsers/SqlParser.js +431 -0
- package/dist/parsers/SqlParser.js.map +1 -0
- package/dist/parsers/SqlPrintTokenParser.js +3289 -0
- package/dist/parsers/SqlPrintTokenParser.js.map +1 -0
- package/dist/parsers/SqlTokenizer.js +553 -0
- package/dist/parsers/SqlTokenizer.js.map +1 -0
- package/dist/parsers/StringSpecifierExpressionParser.js +22 -0
- package/dist/parsers/StringSpecifierExpressionParser.js.map +1 -0
- package/dist/parsers/UnaryExpressionParser.js +39 -0
- package/dist/parsers/UnaryExpressionParser.js.map +1 -0
- package/dist/parsers/UpdateClauseParser.js +21 -0
- package/dist/parsers/UpdateClauseParser.js.map +1 -0
- package/dist/parsers/UpdateQueryParser.js +98 -0
- package/dist/parsers/UpdateQueryParser.js.map +1 -0
- package/dist/parsers/UsingClauseParser.js +33 -0
- package/dist/parsers/UsingClauseParser.js.map +1 -0
- package/dist/parsers/ValueParser.js +562 -0
- package/dist/parsers/ValueParser.js.map +1 -0
- package/dist/parsers/ValuesQueryParser.js +112 -0
- package/dist/parsers/ValuesQueryParser.js.map +1 -0
- package/dist/parsers/WhereClauseParser.js +51 -0
- package/dist/parsers/WhereClauseParser.js.map +1 -0
- package/dist/parsers/WindowClauseParser.js +57 -0
- package/dist/parsers/WindowClauseParser.js.map +1 -0
- package/dist/parsers/WindowExpressionParser.js +163 -0
- package/dist/parsers/WindowExpressionParser.js.map +1 -0
- package/dist/parsers/WithClauseParser.js +165 -0
- package/dist/parsers/WithClauseParser.js.map +1 -0
- package/dist/parsers/utils/LexemeCommentUtils.js +29 -0
- package/dist/parsers/utils/LexemeCommentUtils.js.map +1 -0
- package/dist/reporting/models/DataFlowEdge.js +58 -0
- package/dist/reporting/models/DataFlowEdge.js.map +1 -0
- package/dist/reporting/models/DataFlowGraph.js +138 -0
- package/dist/reporting/models/DataFlowGraph.js.map +1 -0
- package/dist/reporting/models/DataFlowNode.js +148 -0
- package/dist/reporting/models/DataFlowNode.js.map +1 -0
- package/dist/reporting/services/CTEHandler.js +58 -0
- package/dist/reporting/services/CTEHandler.js.map +1 -0
- package/dist/reporting/services/DataSourceHandler.js +95 -0
- package/dist/reporting/services/DataSourceHandler.js.map +1 -0
- package/dist/reporting/services/JoinHandler.js +84 -0
- package/dist/reporting/services/JoinHandler.js.map +1 -0
- package/dist/reporting/services/ProcessHandler.js +26 -0
- package/dist/reporting/services/ProcessHandler.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.js +13 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/Clause.d.ts +7 -3
- package/dist/src/models/Clause.js +16 -3
- package/dist/src/models/Clause.js.map +1 -1
- package/dist/src/models/DDLStatements.d.ts +97 -2
- package/dist/src/models/DDLStatements.js +14 -1
- package/dist/src/models/DDLStatements.js.map +1 -1
- package/dist/src/models/InsertQuery.d.ts +1 -4
- package/dist/src/models/InsertQuery.js +3 -5
- package/dist/src/models/InsertQuery.js.map +1 -1
- package/dist/src/models/SqlPrintToken.d.ts +6 -0
- package/dist/src/models/SqlPrintToken.js +1 -0
- package/dist/src/models/SqlPrintToken.js.map +1 -1
- package/dist/src/models/TableDefinitionModel.d.ts +41 -0
- package/dist/src/models/TableDefinitionModel.js +85 -0
- package/dist/src/models/TableDefinitionModel.js.map +1 -0
- package/dist/src/models/ValueComponent.d.ts +2 -1
- package/dist/src/models/ValuesQuery.d.ts +2 -0
- package/dist/src/models/ValuesQuery.js +1 -0
- package/dist/src/models/ValuesQuery.js.map +1 -1
- package/dist/src/parsers/AlterTableParser.d.ts +1 -0
- package/dist/src/parsers/AlterTableParser.js +26 -5
- package/dist/src/parsers/AlterTableParser.js.map +1 -1
- package/dist/src/parsers/FunctionExpressionParser.d.ts +1 -0
- package/dist/src/parsers/InsertQueryParser.js +4 -1
- package/dist/src/parsers/InsertQueryParser.js.map +1 -1
- package/dist/src/parsers/ReturningClauseParser.js +33 -47
- package/dist/src/parsers/ReturningClauseParser.js.map +1 -1
- package/dist/src/parsers/SequenceParser.d.ts +16 -0
- package/dist/src/parsers/SqlParser.d.ts +4 -3
- package/dist/src/parsers/SqlParser.js +44 -63
- package/dist/src/parsers/SqlParser.js.map +1 -1
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +9 -0
- package/dist/src/parsers/SqlPrintTokenParser.js +22 -4
- package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/src/parsers/SqlTokenizer.d.ts +1 -0
- package/dist/src/tokenReaders/LiteralTokenReader.js +7 -0
- package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/src/transformers/DDLDiffGenerator.d.ts +18 -0
- package/dist/src/transformers/DDLDiffGenerator.js +313 -0
- package/dist/src/transformers/DDLDiffGenerator.js.map +1 -0
- package/dist/src/transformers/DDLGeneralizer.d.ts +13 -0
- package/dist/src/transformers/DDLGeneralizer.js +119 -0
- package/dist/src/transformers/DDLGeneralizer.js.map +1 -0
- package/dist/src/transformers/DDLToFixtureConverter.d.ts +19 -0
- package/dist/src/transformers/DDLToFixtureConverter.js +206 -0
- package/dist/src/transformers/DDLToFixtureConverter.js.map +1 -0
- package/dist/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
- package/dist/src/transformers/DeleteResultSelectConverter.js +398 -0
- package/dist/src/transformers/DeleteResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/FixtureCteBuilder.d.ts +60 -0
- package/dist/src/transformers/FixtureCteBuilder.js +151 -0
- package/dist/src/transformers/FixtureCteBuilder.js.map +1 -0
- package/dist/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
- package/dist/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
- package/dist/src/transformers/InsertResultSelectConverter.d.ts +67 -0
- package/dist/src/transformers/InsertResultSelectConverter.js +499 -0
- package/dist/src/transformers/InsertResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/MergeResultSelectConverter.d.ts +38 -0
- package/dist/src/transformers/MergeResultSelectConverter.js +310 -0
- package/dist/src/transformers/MergeResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/QueryBuilder.d.ts +11 -0
- package/dist/src/transformers/QueryBuilder.js +19 -3
- package/dist/src/transformers/QueryBuilder.js.map +1 -1
- package/dist/src/transformers/SelectResultSelectConverter.d.ts +10 -0
- package/dist/src/transformers/SelectResultSelectConverter.js +36 -0
- package/dist/src/transformers/SelectResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/SimulatedSelectConverter.d.ts +23 -0
- package/dist/src/transformers/SimulatedSelectConverter.js +65 -0
- package/dist/src/transformers/SimulatedSelectConverter.js.map +1 -0
- package/dist/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
- package/dist/src/transformers/UpdateResultSelectConverter.js +344 -0
- package/dist/src/transformers/UpdateResultSelectConverter.js.map +1 -0
- package/dist/src/types/GenericFixture.d.ts +17 -0
- package/dist/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
- package/dist/src/utils/SelectQueryWithClauseHelper.js +47 -0
- package/dist/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
- package/dist/src/utils/TableNameUtils.d.ts +10 -0
- package/dist/src/utils/ValueComponentRewriter.d.ts +3 -0
- package/dist/src/utils/ValueComponentRewriter.js +183 -0
- package/dist/src/utils/ValueComponentRewriter.js.map +1 -0
- package/dist/tokenReaders/BaseTokenReader.js +86 -0
- package/dist/tokenReaders/BaseTokenReader.js.map +1 -0
- package/dist/tokenReaders/CommandTokenReader.js +221 -0
- package/dist/tokenReaders/CommandTokenReader.js.map +1 -0
- package/dist/tokenReaders/EscapedIdentifierTokenReader.js +99 -0
- package/dist/tokenReaders/EscapedIdentifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/FunctionTokenReader.js +47 -0
- package/dist/tokenReaders/FunctionTokenReader.js.map +1 -0
- package/dist/tokenReaders/IdentifierTokenReader.js +34 -0
- package/dist/tokenReaders/IdentifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/LiteralTokenReader.js +329 -0
- package/dist/tokenReaders/LiteralTokenReader.js.map +1 -0
- package/dist/tokenReaders/OperatorTokenReader.js +152 -0
- package/dist/tokenReaders/OperatorTokenReader.js.map +1 -0
- package/dist/tokenReaders/ParameterTokenReader.js +190 -0
- package/dist/tokenReaders/ParameterTokenReader.js.map +1 -0
- package/dist/tokenReaders/StringSpecifierTokenReader.js +31 -0
- package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/SymbolTokenReader.js +35 -0
- package/dist/tokenReaders/SymbolTokenReader.js.map +1 -0
- package/dist/tokenReaders/TokenReaderManager.js +110 -0
- package/dist/tokenReaders/TokenReaderManager.js.map +1 -0
- package/dist/tokenReaders/TypeTokenReader.js +69 -0
- package/dist/tokenReaders/TypeTokenReader.js.map +1 -0
- package/dist/transformers/AliasRenamer.js +600 -0
- package/dist/transformers/AliasRenamer.js.map +1 -0
- package/dist/transformers/CTEBuilder.js +188 -0
- package/dist/transformers/CTEBuilder.js.map +1 -0
- package/dist/transformers/CTECollector.js +409 -0
- package/dist/transformers/CTECollector.js.map +1 -0
- package/dist/transformers/CTEComposer.js +302 -0
- package/dist/transformers/CTEComposer.js.map +1 -0
- package/dist/transformers/CTEDependencyAnalyzer.js +285 -0
- package/dist/transformers/CTEDependencyAnalyzer.js.map +1 -0
- package/dist/transformers/CTEDependencyTracer.js +253 -0
- package/dist/transformers/CTEDependencyTracer.js.map +1 -0
- package/dist/transformers/CTEDisabler.js +355 -0
- package/dist/transformers/CTEDisabler.js.map +1 -0
- package/dist/transformers/CTEInjector.js +83 -0
- package/dist/transformers/CTEInjector.js.map +1 -0
- package/dist/transformers/CTENormalizer.js +46 -0
- package/dist/transformers/CTENormalizer.js.map +1 -0
- package/dist/transformers/CTEQueryDecomposer.js +589 -0
- package/dist/transformers/CTEQueryDecomposer.js.map +1 -0
- package/dist/transformers/CTERenamer.js +486 -0
- package/dist/transformers/CTERenamer.js.map +1 -0
- package/dist/transformers/CTETableReferenceCollector.js +358 -0
- package/dist/transformers/CTETableReferenceCollector.js.map +1 -0
- package/dist/transformers/ColumnReferenceCollector.js +478 -0
- package/dist/transformers/ColumnReferenceCollector.js.map +1 -0
- package/dist/transformers/DDLDiffGenerator.js +313 -0
- package/dist/transformers/DDLDiffGenerator.js.map +1 -0
- package/dist/transformers/DDLGeneralizer.js +119 -0
- package/dist/transformers/DDLGeneralizer.js.map +1 -0
- package/dist/transformers/DDLToFixtureConverter.js +206 -0
- package/dist/transformers/DDLToFixtureConverter.js.map +1 -0
- package/dist/transformers/DeleteResultSelectConverter.js +414 -0
- package/dist/transformers/DeleteResultSelectConverter.js.map +1 -0
- package/dist/transformers/DynamicQueryBuilder.js +164 -0
- package/dist/transformers/DynamicQueryBuilder.js.map +1 -0
- package/dist/transformers/EnhancedJsonMapping.js +223 -0
- package/dist/transformers/EnhancedJsonMapping.js.map +1 -0
- package/dist/transformers/FilterableItemCollector.js +259 -0
- package/dist/transformers/FilterableItemCollector.js.map +1 -0
- package/dist/transformers/FixtureCteBuilder.js +151 -0
- package/dist/transformers/FixtureCteBuilder.js.map +1 -0
- package/dist/transformers/FormatOptionResolver.js +67 -0
- package/dist/transformers/FormatOptionResolver.js.map +1 -0
- package/dist/transformers/Formatter.js +38 -0
- package/dist/transformers/Formatter.js.map +1 -0
- package/dist/transformers/InsertQuerySelectValuesConverter.js +125 -0
- package/dist/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
- package/dist/transformers/InsertResultSelectConverter.js +589 -0
- package/dist/transformers/InsertResultSelectConverter.js.map +1 -0
- package/dist/transformers/JoinAggregationDecomposer.js +497 -0
- package/dist/transformers/JoinAggregationDecomposer.js.map +1 -0
- package/dist/transformers/JsonMappingConverter.js +392 -0
- package/dist/transformers/JsonMappingConverter.js.map +1 -0
- package/dist/transformers/JsonMappingUnifier.js +216 -0
- package/dist/transformers/JsonMappingUnifier.js.map +1 -0
- package/dist/transformers/LinePrinter.js +148 -0
- package/dist/transformers/LinePrinter.js.map +1 -0
- package/dist/transformers/MergeResultSelectConverter.js +310 -0
- package/dist/transformers/MergeResultSelectConverter.js.map +1 -0
- package/dist/transformers/ModelDrivenJsonMapping.js +122 -0
- package/dist/transformers/ModelDrivenJsonMapping.js.map +1 -0
- package/dist/transformers/OnelineFormattingHelper.js +99 -0
- package/dist/transformers/OnelineFormattingHelper.js.map +1 -0
- package/dist/transformers/ParameterCollector.js +37 -0
- package/dist/transformers/ParameterCollector.js.map +1 -0
- package/dist/transformers/PostgresArrayEntityCteBuilder.js +458 -0
- package/dist/transformers/PostgresArrayEntityCteBuilder.js.map +1 -0
- package/dist/transformers/PostgresJsonQueryBuilder.js +245 -0
- package/dist/transformers/PostgresJsonQueryBuilder.js.map +1 -0
- package/dist/transformers/PostgresObjectEntityCteBuilder.js +347 -0
- package/dist/transformers/PostgresObjectEntityCteBuilder.js.map +1 -0
- package/dist/transformers/QueryBuilder.js +649 -0
- package/dist/transformers/QueryBuilder.js.map +1 -0
- package/dist/transformers/QueryFlowDiagramGenerator.js +157 -0
- package/dist/transformers/QueryFlowDiagramGenerator.js.map +1 -0
- package/dist/transformers/SchemaCollector.js +523 -0
- package/dist/transformers/SchemaCollector.js.map +1 -0
- package/dist/transformers/SelectResultSelectConverter.js +36 -0
- package/dist/transformers/SelectResultSelectConverter.js.map +1 -0
- package/dist/transformers/SelectValueCollector.js +244 -0
- package/dist/transformers/SelectValueCollector.js.map +1 -0
- package/dist/transformers/SelectableColumnCollector.js +674 -0
- package/dist/transformers/SelectableColumnCollector.js.map +1 -0
- package/dist/transformers/SimulatedSelectConverter.js +65 -0
- package/dist/transformers/SimulatedSelectConverter.js.map +1 -0
- package/dist/transformers/SmartRenamer.js +422 -0
- package/dist/transformers/SmartRenamer.js.map +1 -0
- package/dist/transformers/SqlFormatter.js +77 -0
- package/dist/transformers/SqlFormatter.js.map +1 -0
- package/dist/transformers/SqlIdentifierRenamer.js +504 -0
- package/dist/transformers/SqlIdentifierRenamer.js.map +1 -0
- package/dist/transformers/SqlOutputToken.js +13 -0
- package/dist/transformers/SqlOutputToken.js.map +1 -0
- package/dist/transformers/SqlPaginationInjector.js +108 -0
- package/dist/transformers/SqlPaginationInjector.js.map +1 -0
- package/dist/transformers/SqlParamInjector.js +802 -0
- package/dist/transformers/SqlParamInjector.js.map +1 -0
- package/dist/transformers/SqlParameterBinder.js +70 -0
- package/dist/transformers/SqlParameterBinder.js.map +1 -0
- package/dist/transformers/SqlPrinter.js +1478 -0
- package/dist/transformers/SqlPrinter.js.map +1 -0
- package/dist/transformers/SqlSortInjector.js +153 -0
- package/dist/transformers/SqlSortInjector.js.map +1 -0
- package/dist/transformers/TableColumnResolver.js +3 -0
- package/dist/transformers/TableColumnResolver.js.map +1 -0
- package/dist/transformers/TableSourceCollector.js +439 -0
- package/dist/transformers/TableSourceCollector.js.map +1 -0
- package/dist/transformers/TypeTransformationPostProcessor.js +363 -0
- package/dist/transformers/TypeTransformationPostProcessor.js.map +1 -0
- package/dist/transformers/UpdateResultSelectConverter.js +359 -0
- package/dist/transformers/UpdateResultSelectConverter.js.map +1 -0
- package/dist/transformers/UpstreamSelectQueryFinder.js +184 -0
- package/dist/transformers/UpstreamSelectQueryFinder.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/Formatting.js +3 -0
- package/dist/types/Formatting.js.map +1 -0
- package/dist/types/GenericFixture.js +3 -0
- package/dist/types/GenericFixture.js.map +1 -0
- package/dist/utils/CTERegionDetector.js +464 -0
- package/dist/utils/CTERegionDetector.js.map +1 -0
- package/dist/utils/CommentEditor.js +345 -0
- package/dist/utils/CommentEditor.js.map +1 -0
- package/dist/utils/CommentUtils.js +69 -0
- package/dist/utils/CommentUtils.js.map +1 -0
- package/dist/utils/CursorContextAnalyzer.js +338 -0
- package/dist/utils/CursorContextAnalyzer.js.map +1 -0
- package/dist/utils/IntelliSenseApi.js +292 -0
- package/dist/utils/IntelliSenseApi.js.map +1 -0
- package/dist/utils/JsonSchemaValidator.js +215 -0
- package/dist/utils/JsonSchemaValidator.js.map +1 -0
- package/dist/utils/KeywordCache.js +206 -0
- package/dist/utils/KeywordCache.js.map +1 -0
- package/dist/utils/LexemeCursor.js +314 -0
- package/dist/utils/LexemeCursor.js.map +1 -0
- package/dist/utils/MultiQuerySplitter.js +292 -0
- package/dist/utils/MultiQuerySplitter.js.map +1 -0
- package/dist/utils/OperatorPrecedence.js +107 -0
- package/dist/utils/OperatorPrecedence.js.map +1 -0
- package/dist/utils/ParameterDetector.js +53 -0
- package/dist/utils/ParameterDetector.js.map +1 -0
- package/dist/utils/ParameterHelper.js +31 -0
- package/dist/utils/ParameterHelper.js.map +1 -0
- package/dist/utils/ParameterRemover.js +783 -0
- package/dist/utils/ParameterRemover.js.map +1 -0
- package/dist/utils/ParserStringUtils.js +31 -0
- package/dist/utils/ParserStringUtils.js.map +1 -0
- package/dist/utils/PositionAwareParser.js +363 -0
- package/dist/utils/PositionAwareParser.js.map +1 -0
- package/dist/utils/SchemaManager.js +217 -0
- package/dist/utils/SchemaManager.js.map +1 -0
- package/dist/utils/ScopeResolver.js +272 -0
- package/dist/utils/ScopeResolver.js.map +1 -0
- package/dist/utils/SelectQueryWithClauseHelper.js +47 -0
- package/dist/utils/SelectQueryWithClauseHelper.js.map +1 -0
- package/dist/utils/SqlSchemaValidator.js +55 -0
- package/dist/utils/SqlSchemaValidator.js.map +1 -0
- package/dist/utils/TableNameUtils.js +35 -0
- package/dist/utils/TableNameUtils.js.map +1 -0
- package/dist/utils/TextPositionUtils.js +128 -0
- package/dist/utils/TextPositionUtils.js.map +1 -0
- package/dist/utils/ValueComponentRewriter.js +187 -0
- package/dist/utils/ValueComponentRewriter.js.map +1 -0
- package/dist/utils/charLookupTable.js +73 -0
- package/dist/utils/charLookupTable.js.map +1 -0
- package/dist/utils/stringUtils.js +230 -0
- package/dist/utils/stringUtils.js.map +1 -0
- package/package.json +62 -62
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CTEComposer = void 0;
|
|
4
|
+
const SimpleSelectQuery_1 = require("../models/SimpleSelectQuery");
|
|
5
|
+
const SelectQueryParser_1 = require("../parsers/SelectQueryParser");
|
|
6
|
+
const SqlFormatter_1 = require("./SqlFormatter");
|
|
7
|
+
const SqlSchemaValidator_1 = require("../utils/SqlSchemaValidator");
|
|
8
|
+
const CTEDependencyAnalyzer_1 = require("./CTEDependencyAnalyzer");
|
|
9
|
+
/**
|
|
10
|
+
* Composes edited CTEs back into a unified SQL query
|
|
11
|
+
*
|
|
12
|
+
* Takes CTEs that were individually edited after decomposition and reconstructs them
|
|
13
|
+
* into a proper WITH clause structure. This completes the CTE debugging workflow:
|
|
14
|
+
* 1. Use CTEQueryDecomposer to break down complex CTEs
|
|
15
|
+
* 2. Edit individual CTEs to fix issues
|
|
16
|
+
* 3. Use CTEComposer to reconstruct the unified query
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // After decomposing and editing CTEs
|
|
21
|
+
* const composer = new CTEComposer({
|
|
22
|
+
* preset: 'postgres',
|
|
23
|
+
* validateSchema: true,
|
|
24
|
+
* schema: { users: ['id', 'name', 'active'] }
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* const editedCTEs = [
|
|
28
|
+
* { name: 'base_data', query: 'select * from users where active = true' },
|
|
29
|
+
* { name: 'filtered_data', query: 'select * from base_data where region = "US"' }
|
|
30
|
+
* ];
|
|
31
|
+
*
|
|
32
|
+
* const composedSQL = composer.compose(editedCTEs, 'select * from filtered_data');
|
|
33
|
+
* // Dependencies are automatically analyzed and sorted
|
|
34
|
+
* // Result: "with base_data as (...), filtered_data as (...) select * from filtered_data"
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
class CTEComposer {
|
|
40
|
+
/**
|
|
41
|
+
* Creates a new CTEComposer instance
|
|
42
|
+
* @param options - Configuration options extending SqlFormatterOptions
|
|
43
|
+
*/
|
|
44
|
+
constructor(options = {}) {
|
|
45
|
+
this.knownCTENames = [];
|
|
46
|
+
this.options = options;
|
|
47
|
+
this.formatter = new SqlFormatter_1.SqlFormatter(options);
|
|
48
|
+
this.dependencyAnalyzer = new CTEDependencyAnalyzer_1.CTEDependencyAnalyzer();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compose edited CTEs and root query into a unified SQL query
|
|
52
|
+
*
|
|
53
|
+
* This method:
|
|
54
|
+
* 1. Extracts pure SELECT queries from edited CTEs (removes any WITH clauses)
|
|
55
|
+
* 2. Builds a temporary query to analyze dependencies automatically
|
|
56
|
+
* 3. Sorts CTEs by dependency order using topological sort
|
|
57
|
+
* 4. Validates schema if options.validateSchema is enabled
|
|
58
|
+
* 5. Applies formatter options for consistent output
|
|
59
|
+
* 6. Constructs the final WITH clause with proper recursive handling
|
|
60
|
+
*
|
|
61
|
+
* @param editedCTEs - Array of edited CTEs with name and query only
|
|
62
|
+
* @param rootQuery - The main query that uses the CTEs (without WITH clause)
|
|
63
|
+
* @returns Composed SQL query with properly structured WITH clause
|
|
64
|
+
* @throws Error if schema validation fails or circular dependencies are detected
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const editedCTEs = [
|
|
69
|
+
* { name: 'base_data', query: 'select * from users where active = true' },
|
|
70
|
+
* { name: 'filtered_data', query: 'select * from base_data where region = "US"' }
|
|
71
|
+
* ];
|
|
72
|
+
*
|
|
73
|
+
* const result = composer.compose(editedCTEs, 'select count(*) from filtered_data');
|
|
74
|
+
* // Dependencies automatically analyzed and sorted
|
|
75
|
+
* // Result: "with base_data as (...), filtered_data as (...) select count(*) from filtered_data"
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
compose(editedCTEs, rootQuery) {
|
|
79
|
+
if (editedCTEs.length === 0) {
|
|
80
|
+
return rootQuery;
|
|
81
|
+
}
|
|
82
|
+
// Set known CTE names for WITH clause filtering
|
|
83
|
+
this.knownCTENames = editedCTEs.map(cte => cte.name);
|
|
84
|
+
// Extract pure queries and detect recursion
|
|
85
|
+
const pureQueries = editedCTEs.map(cte => ({
|
|
86
|
+
name: cte.name,
|
|
87
|
+
query: this.extractPureQuery(cte.query, cte.name)
|
|
88
|
+
}));
|
|
89
|
+
// Build temporary query to analyze dependencies
|
|
90
|
+
const tempQuery = this.buildTempQueryForAnalysis(pureQueries, rootQuery);
|
|
91
|
+
// Analyze dependencies
|
|
92
|
+
const dependencyGraph = this.dependencyAnalyzer.analyzeDependencies(tempQuery);
|
|
93
|
+
// Sort CTEs by dependencies
|
|
94
|
+
const sortedCTEs = this.sortCTEsByDependencies(pureQueries, dependencyGraph);
|
|
95
|
+
// Check for recursive CTEs by analyzing original queries
|
|
96
|
+
const isRecursive = this.detectRecursiveFromOriginalQueries(editedCTEs);
|
|
97
|
+
// Special handling for recursive CTEs: Current implementation preserves recursive CTEs as-is
|
|
98
|
+
// This is expected behavior for now as recursive CTEs require complex handling
|
|
99
|
+
// Build WITH clause with sorted CTEs
|
|
100
|
+
const cteDefinitions = sortedCTEs.map(cte => {
|
|
101
|
+
return `${cte.name} as (${cte.query})`;
|
|
102
|
+
});
|
|
103
|
+
const withKeyword = isRecursive ? "with recursive" : "with";
|
|
104
|
+
const composedQuery = `${withKeyword} ${cteDefinitions.join(", ")} ${rootQuery}`;
|
|
105
|
+
// Validate schema if requested
|
|
106
|
+
if (this.options.validateSchema && this.options.schema) {
|
|
107
|
+
this.validateComposedQuery(composedQuery);
|
|
108
|
+
}
|
|
109
|
+
// Apply formatting if options specify it
|
|
110
|
+
return this.formatFinalQuery(composedQuery);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Extract pure SELECT query from a query that may contain WITH clause
|
|
114
|
+
* If query contains WITH with known CTEs, extract main SELECT and ignore old definitions
|
|
115
|
+
* If query contains WITH with unknown CTEs, preserve entire query
|
|
116
|
+
* @param query The query that may contain WITH clause
|
|
117
|
+
* @param cteName The name of the CTE to extract (if query contains WITH)
|
|
118
|
+
* @returns Pure SELECT query without WITH clause, or entire query if it contains new sub-CTEs
|
|
119
|
+
*/
|
|
120
|
+
extractPureQuery(query, cteName) {
|
|
121
|
+
// Simple regex to check if query starts with WITH
|
|
122
|
+
const withPattern = /^\s*with\s+/i;
|
|
123
|
+
if (!withPattern.test(query)) {
|
|
124
|
+
return query;
|
|
125
|
+
}
|
|
126
|
+
// Check if this is a recursive CTE by looking for "WITH RECURSIVE"
|
|
127
|
+
const recursivePattern = /^\s*with\s+recursive\s+/i;
|
|
128
|
+
if (recursivePattern.test(query)) {
|
|
129
|
+
// For recursive CTEs, preserve the entire query as-is
|
|
130
|
+
return query;
|
|
131
|
+
}
|
|
132
|
+
// Parse the query to check what CTEs are defined in the WITH clause
|
|
133
|
+
try {
|
|
134
|
+
const parsed = SelectQueryParser_1.SelectQueryParser.parse(query);
|
|
135
|
+
if (parsed.withClause && parsed.withClause.tables) {
|
|
136
|
+
// Check if WITH clause contains only known CTEs from our composition
|
|
137
|
+
const knownCTENames = this.getKnownCTENames();
|
|
138
|
+
const withCTENames = parsed.withClause.tables.map(cte => this.getCTEName(cte));
|
|
139
|
+
// If all CTEs in WITH clause are known (old definitions), extract main SELECT
|
|
140
|
+
const hasOnlyKnownCTEs = withCTENames.every(name => knownCTENames.includes(name));
|
|
141
|
+
if (hasOnlyKnownCTEs) {
|
|
142
|
+
// Remove WITH clause and format just the main query
|
|
143
|
+
const queryWithoutWith = new SimpleSelectQuery_1.SimpleSelectQuery({
|
|
144
|
+
selectClause: parsed.selectClause,
|
|
145
|
+
fromClause: parsed.fromClause,
|
|
146
|
+
whereClause: parsed.whereClause,
|
|
147
|
+
groupByClause: parsed.groupByClause,
|
|
148
|
+
havingClause: parsed.havingClause,
|
|
149
|
+
orderByClause: parsed.orderByClause,
|
|
150
|
+
windowClause: parsed.windowClause,
|
|
151
|
+
limitClause: parsed.limitClause,
|
|
152
|
+
offsetClause: parsed.offsetClause,
|
|
153
|
+
fetchClause: parsed.fetchClause,
|
|
154
|
+
forClause: parsed.forClause,
|
|
155
|
+
withClause: undefined // withClause removed
|
|
156
|
+
});
|
|
157
|
+
// Use a formatter without quotes for extraction to preserve original format
|
|
158
|
+
const extractFormatter = new SqlFormatter_1.SqlFormatter({
|
|
159
|
+
identifierEscape: { start: "", end: "" }
|
|
160
|
+
});
|
|
161
|
+
return extractFormatter.format(queryWithoutWith).formattedSql;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
// If parsing fails, fall through to preserve entire query
|
|
167
|
+
}
|
|
168
|
+
// If query contains WITH clause with unknown CTEs, preserve it like a recursive CTE
|
|
169
|
+
// This handles the case where user edited a CTE and added new sub-CTEs
|
|
170
|
+
return query;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get list of known CTE names from current composition context
|
|
174
|
+
*/
|
|
175
|
+
getKnownCTENames() {
|
|
176
|
+
// This will be set during composition to track known CTE names
|
|
177
|
+
return this.knownCTENames || [];
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Extract CTE name from CommonTable
|
|
181
|
+
*/
|
|
182
|
+
getCTEName(cte) {
|
|
183
|
+
return cte.aliasExpression.table.name;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Extract CTE definition using regex as fallback
|
|
187
|
+
*/
|
|
188
|
+
extractCTEWithRegex(query, cteName) {
|
|
189
|
+
// More robust regex to extract CTE definition
|
|
190
|
+
// Pattern: cteName as (...) accounting for nested parentheses
|
|
191
|
+
const ctePattern = new RegExp(`${cteName}\\s+as\\s*\\(`, 'i');
|
|
192
|
+
const match = query.match(ctePattern);
|
|
193
|
+
if (!match) {
|
|
194
|
+
return query;
|
|
195
|
+
}
|
|
196
|
+
// Find the start of the CTE definition (after "as (")
|
|
197
|
+
const startIndex = match.index + match[0].length;
|
|
198
|
+
// Use parentheses counting to find the end of the CTE definition
|
|
199
|
+
let parenCount = 1;
|
|
200
|
+
let endIndex = startIndex;
|
|
201
|
+
while (endIndex < query.length && parenCount > 0) {
|
|
202
|
+
const char = query[endIndex];
|
|
203
|
+
if (char === '(') {
|
|
204
|
+
parenCount++;
|
|
205
|
+
}
|
|
206
|
+
else if (char === ')') {
|
|
207
|
+
parenCount--;
|
|
208
|
+
}
|
|
209
|
+
endIndex++;
|
|
210
|
+
}
|
|
211
|
+
if (parenCount === 0) {
|
|
212
|
+
// Extract the content between parentheses
|
|
213
|
+
const cteDefinition = query.substring(startIndex, endIndex - 1).trim();
|
|
214
|
+
return cteDefinition;
|
|
215
|
+
}
|
|
216
|
+
return query;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Build a temporary query for dependency analysis
|
|
220
|
+
*/
|
|
221
|
+
buildTempQueryForAnalysis(pureQueries, rootQuery) {
|
|
222
|
+
const cteDefinitions = pureQueries.map(cte => `${cte.name} as (${cte.query})`);
|
|
223
|
+
const tempSql = `with ${cteDefinitions.join(", ")} ${rootQuery}`;
|
|
224
|
+
try {
|
|
225
|
+
return SelectQueryParser_1.SelectQueryParser.parse(tempSql);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw new Error(`Failed to parse temporary query for dependency analysis: ${error}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Sort CTEs by dependencies using dependency graph
|
|
233
|
+
*/
|
|
234
|
+
sortCTEsByDependencies(pureQueries, dependencyGraph) {
|
|
235
|
+
// Create a map for quick lookup
|
|
236
|
+
const queryMap = new Map();
|
|
237
|
+
pureQueries.forEach(cte => queryMap.set(cte.name, cte.query));
|
|
238
|
+
// Return CTEs in dependency order
|
|
239
|
+
return dependencyGraph.nodes.map(node => ({
|
|
240
|
+
name: node.name,
|
|
241
|
+
query: queryMap.get(node.name) || ""
|
|
242
|
+
})).filter(cte => cte.query !== "");
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Detect if any CTEs are recursive by analyzing original queries
|
|
246
|
+
*/
|
|
247
|
+
detectRecursiveFromOriginalQueries(editedCTEs) {
|
|
248
|
+
// Check if any of the original queries contain "with recursive"
|
|
249
|
+
return editedCTEs.some(cte => {
|
|
250
|
+
const queryLower = cte.query.toLowerCase();
|
|
251
|
+
return queryLower.includes('with recursive');
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Detect if any CTEs are recursive
|
|
256
|
+
*/
|
|
257
|
+
detectRecursiveCTEs(query) {
|
|
258
|
+
if (!query.withClause)
|
|
259
|
+
return false;
|
|
260
|
+
// Check if the query text contains "recursive"
|
|
261
|
+
const queryText = this.formatter.format(query).formattedSql.toLowerCase();
|
|
262
|
+
return queryText.includes('with recursive');
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Validate the composed query against schema
|
|
266
|
+
*/
|
|
267
|
+
validateComposedQuery(composedQuery) {
|
|
268
|
+
try {
|
|
269
|
+
const parsed = SelectQueryParser_1.SelectQueryParser.parse(composedQuery);
|
|
270
|
+
// Convert schema to TableSchema format
|
|
271
|
+
const tableSchemas = Object.entries(this.options.schema).map(([name, columns]) => ({
|
|
272
|
+
name,
|
|
273
|
+
columns
|
|
274
|
+
}));
|
|
275
|
+
SqlSchemaValidator_1.SqlSchemaValidator.validate(parsed, tableSchemas);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (error instanceof Error) {
|
|
279
|
+
throw new Error(`Schema validation failed: ${error.message}`);
|
|
280
|
+
}
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Apply formatting to the final query
|
|
286
|
+
*/
|
|
287
|
+
formatFinalQuery(composedQuery) {
|
|
288
|
+
if (this.options.preset || this.options.keywordCase) {
|
|
289
|
+
try {
|
|
290
|
+
const parsed = SelectQueryParser_1.SelectQueryParser.parse(composedQuery);
|
|
291
|
+
return this.formatter.format(parsed).formattedSql;
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
// If parsing fails, return unformatted query
|
|
295
|
+
return composedQuery;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return composedQuery;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
exports.CTEComposer = CTEComposer;
|
|
302
|
+
//# sourceMappingURL=CTEComposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CTEComposer.js","sourceRoot":"","sources":["../../src/transformers/CTEComposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CTEDependencyAnalyzer = void 0;
|
|
4
|
+
const SimpleSelectQuery_1 = require("../models/SimpleSelectQuery");
|
|
5
|
+
const CTECollector_1 = require("./CTECollector");
|
|
6
|
+
const TableSourceCollector_1 = require("./TableSourceCollector");
|
|
7
|
+
const CTETableReferenceCollector_1 = require("./CTETableReferenceCollector");
|
|
8
|
+
/**
|
|
9
|
+
* Analyzer for CTE dependencies in SQL queries.
|
|
10
|
+
* Provides functionality to analyze dependencies, detect circular references,
|
|
11
|
+
* and generate topological ordering of CTEs.
|
|
12
|
+
*/
|
|
13
|
+
class CTEDependencyAnalyzer {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.dependencyGraph = null;
|
|
16
|
+
this.cteMap = new Map();
|
|
17
|
+
// For analyzing CTE-to-CTE dependencies within WITH clause
|
|
18
|
+
// Excludes CTEs from results to avoid circular references
|
|
19
|
+
this.sourceCollector = new TableSourceCollector_1.TableSourceCollector(false);
|
|
20
|
+
// For analyzing main query references to CTEs
|
|
21
|
+
// Includes CTEs in results to detect CTE usage
|
|
22
|
+
this.cteReferenceCollector = new CTETableReferenceCollector_1.CTETableReferenceCollector();
|
|
23
|
+
this.cteCollector = new CTECollector_1.CTECollector();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Analyzes the dependencies between CTEs in the given query
|
|
27
|
+
* @param query The query to analyze
|
|
28
|
+
* @returns The dependency graph
|
|
29
|
+
*/
|
|
30
|
+
analyzeDependencies(query) {
|
|
31
|
+
const ctes = this.cteCollector.collect(query);
|
|
32
|
+
this.buildCTEMap(ctes);
|
|
33
|
+
this.dependencyGraph = this.buildDependencyGraph(ctes, query);
|
|
34
|
+
return this.dependencyGraph;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Gets the list of CTEs that the specified CTE depends on
|
|
38
|
+
* @param cteName The name of the CTE
|
|
39
|
+
* @returns Array of CTE names this CTE depends on
|
|
40
|
+
*/
|
|
41
|
+
getDependencies(cteName) {
|
|
42
|
+
this.ensureAnalyzed();
|
|
43
|
+
const node = this.findNodeByName(cteName);
|
|
44
|
+
return node ? [...node.dependencies] : [];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Gets the list of CTEs that depend on the specified CTE
|
|
48
|
+
* @param cteName The name of the CTE
|
|
49
|
+
* @returns Array of CTE names that depend on this CTE
|
|
50
|
+
*/
|
|
51
|
+
getDependents(cteName) {
|
|
52
|
+
this.ensureAnalyzed();
|
|
53
|
+
const node = this.findNodeByName(cteName);
|
|
54
|
+
return node ? [...node.dependents] : [];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Gets the list of CTEs that are directly referenced by the main query
|
|
58
|
+
* @returns Array of CTE names referenced by the main query
|
|
59
|
+
*/
|
|
60
|
+
getMainQueryDependencies() {
|
|
61
|
+
this.ensureAnalyzed();
|
|
62
|
+
const mainQueryNode = this.findNodeByName(CTEDependencyAnalyzer.MAIN_QUERY_NAME);
|
|
63
|
+
return mainQueryNode ? [...mainQueryNode.dependencies] : [];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Gets nodes by type (CTE or ROOT)
|
|
67
|
+
* @param nodeType The type of nodes to retrieve
|
|
68
|
+
* @returns Array of nodes of the specified type
|
|
69
|
+
*/
|
|
70
|
+
getNodesByType(nodeType) {
|
|
71
|
+
this.ensureAnalyzed();
|
|
72
|
+
return this.dependencyGraph.nodes.filter(n => n.type === nodeType);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Gets the main query node
|
|
76
|
+
* @returns The main query node or undefined if not found
|
|
77
|
+
*/
|
|
78
|
+
getMainQueryNode() {
|
|
79
|
+
this.ensureAnalyzed();
|
|
80
|
+
return this.findNodeByName(CTEDependencyAnalyzer.MAIN_QUERY_NAME);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Checks if there are any circular dependencies in the CTE graph
|
|
84
|
+
* @returns true if circular dependencies exist, false otherwise
|
|
85
|
+
*/
|
|
86
|
+
hasCircularDependency() {
|
|
87
|
+
this.ensureAnalyzed();
|
|
88
|
+
try {
|
|
89
|
+
this.getExecutionOrder();
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (error instanceof Error && error.message.includes(CTEDependencyAnalyzer.ERROR_MESSAGES.CIRCULAR_REFERENCE)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Gets the topological sort order for CTE execution
|
|
101
|
+
* @returns Array of CTE names in execution order
|
|
102
|
+
* @throws Error if circular dependencies are detected
|
|
103
|
+
*/
|
|
104
|
+
getExecutionOrder() {
|
|
105
|
+
this.ensureAnalyzed();
|
|
106
|
+
const visited = new Set();
|
|
107
|
+
const visiting = new Set();
|
|
108
|
+
const result = [];
|
|
109
|
+
// Build adjacency list from dependency graph
|
|
110
|
+
const dependencyMap = new Map();
|
|
111
|
+
for (const node of this.dependencyGraph.nodes) {
|
|
112
|
+
dependencyMap.set(node.name, new Set(node.dependencies));
|
|
113
|
+
}
|
|
114
|
+
const visit = (nodeName) => {
|
|
115
|
+
if (visited.has(nodeName))
|
|
116
|
+
return;
|
|
117
|
+
if (visiting.has(nodeName)) {
|
|
118
|
+
throw new Error(`${CTEDependencyAnalyzer.ERROR_MESSAGES.CIRCULAR_REFERENCE}: ${nodeName}`);
|
|
119
|
+
}
|
|
120
|
+
visiting.add(nodeName);
|
|
121
|
+
const deps = dependencyMap.get(nodeName) || new Set();
|
|
122
|
+
for (const dep of deps) {
|
|
123
|
+
visit(dep);
|
|
124
|
+
}
|
|
125
|
+
visiting.delete(nodeName);
|
|
126
|
+
visited.add(nodeName);
|
|
127
|
+
result.push(nodeName);
|
|
128
|
+
};
|
|
129
|
+
// Visit all nodes
|
|
130
|
+
for (const node of this.dependencyGraph.nodes) {
|
|
131
|
+
if (!visited.has(node.name)) {
|
|
132
|
+
visit(node.name);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Builds the dependency graph from the given CTEs and main query
|
|
139
|
+
* @param ctes Array of CommonTable objects
|
|
140
|
+
* @param mainQuery The main query that may reference CTEs
|
|
141
|
+
* @returns The constructed dependency graph
|
|
142
|
+
*/
|
|
143
|
+
buildDependencyGraph(ctes, mainQuery) {
|
|
144
|
+
const nodes = [];
|
|
145
|
+
const edges = [];
|
|
146
|
+
const dependencyMap = new Map();
|
|
147
|
+
const dependentMap = new Map();
|
|
148
|
+
// Initialize maps for all CTEs and main query
|
|
149
|
+
for (const cte of ctes) {
|
|
150
|
+
const name = CTEDependencyAnalyzer.getCTEName(cte);
|
|
151
|
+
dependencyMap.set(name, new Set());
|
|
152
|
+
dependentMap.set(name, new Set());
|
|
153
|
+
}
|
|
154
|
+
dependencyMap.set(CTEDependencyAnalyzer.MAIN_QUERY_NAME, new Set());
|
|
155
|
+
dependentMap.set(CTEDependencyAnalyzer.MAIN_QUERY_NAME, new Set());
|
|
156
|
+
// Analyze dependencies for each CTE
|
|
157
|
+
for (const cte of ctes) {
|
|
158
|
+
const cteName = CTEDependencyAnalyzer.getCTEName(cte);
|
|
159
|
+
// Find all table/CTE references in this CTE's query
|
|
160
|
+
// Uses sourceCollector which excludes CTEs to get only real table dependencies
|
|
161
|
+
const referencedTables = this.sourceCollector.collect(cte.query);
|
|
162
|
+
for (const referencedTable of referencedTables) {
|
|
163
|
+
const referencedName = referencedTable.table.name;
|
|
164
|
+
// Only consider references to other CTEs in our collection
|
|
165
|
+
if (this.cteMap.has(referencedName) && referencedName !== cteName) {
|
|
166
|
+
dependencyMap.get(cteName).add(referencedName);
|
|
167
|
+
dependentMap.get(referencedName).add(cteName);
|
|
168
|
+
edges.push({
|
|
169
|
+
from: cteName,
|
|
170
|
+
to: referencedName
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Analyze main query references to CTEs (excluding WITH clause)
|
|
176
|
+
const mainQueryWithoutCTE = this.getMainQueryWithoutCTE(mainQuery);
|
|
177
|
+
if (mainQueryWithoutCTE) {
|
|
178
|
+
// Uses cteReferenceCollector which includes CTEs to detect CTE usage in main query
|
|
179
|
+
const mainQueryReferences = this.cteReferenceCollector.collect(mainQueryWithoutCTE);
|
|
180
|
+
for (const referencedTable of mainQueryReferences) {
|
|
181
|
+
const referencedName = referencedTable.table.name;
|
|
182
|
+
// If main query references a CTE, create dependency edge
|
|
183
|
+
if (this.cteMap.has(referencedName)) {
|
|
184
|
+
dependencyMap.get(CTEDependencyAnalyzer.MAIN_QUERY_NAME).add(referencedName);
|
|
185
|
+
dependentMap.get(referencedName).add(CTEDependencyAnalyzer.MAIN_QUERY_NAME);
|
|
186
|
+
edges.push({
|
|
187
|
+
from: CTEDependencyAnalyzer.MAIN_QUERY_NAME,
|
|
188
|
+
to: referencedName
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Create CTE nodes
|
|
194
|
+
for (const cte of ctes) {
|
|
195
|
+
const name = CTEDependencyAnalyzer.getCTEName(cte);
|
|
196
|
+
nodes.push({
|
|
197
|
+
name,
|
|
198
|
+
type: 'CTE',
|
|
199
|
+
cte,
|
|
200
|
+
dependencies: Array.from(dependencyMap.get(name) || new Set()),
|
|
201
|
+
dependents: Array.from(dependentMap.get(name) || new Set())
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
// Create main query node
|
|
205
|
+
nodes.push({
|
|
206
|
+
name: CTEDependencyAnalyzer.MAIN_QUERY_NAME,
|
|
207
|
+
type: 'ROOT',
|
|
208
|
+
cte: null,
|
|
209
|
+
dependencies: Array.from(dependencyMap.get(CTEDependencyAnalyzer.MAIN_QUERY_NAME) || new Set()),
|
|
210
|
+
dependents: Array.from(dependentMap.get(CTEDependencyAnalyzer.MAIN_QUERY_NAME) || new Set())
|
|
211
|
+
});
|
|
212
|
+
return { nodes, edges };
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Ensures that dependency analysis has been performed
|
|
216
|
+
* @throws Error if analyzeDependencies has not been called
|
|
217
|
+
*/
|
|
218
|
+
ensureAnalyzed() {
|
|
219
|
+
if (!this.dependencyGraph) {
|
|
220
|
+
throw new Error(CTEDependencyAnalyzer.ERROR_MESSAGES.NOT_ANALYZED);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Builds the CTE name-to-object mapping for quick lookups
|
|
225
|
+
* @param ctes Array of CommonTable objects
|
|
226
|
+
*/
|
|
227
|
+
buildCTEMap(ctes) {
|
|
228
|
+
this.cteMap.clear();
|
|
229
|
+
for (const cte of ctes) {
|
|
230
|
+
const name = CTEDependencyAnalyzer.getCTEName(cte);
|
|
231
|
+
this.cteMap.set(name, cte);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Finds a node in the dependency graph by CTE name
|
|
236
|
+
* @param cteName The name of the CTE to find
|
|
237
|
+
* @returns The CTENode if found, undefined otherwise
|
|
238
|
+
*/
|
|
239
|
+
findNodeByName(cteName) {
|
|
240
|
+
var _a;
|
|
241
|
+
return (_a = this.dependencyGraph) === null || _a === void 0 ? void 0 : _a.nodes.find(n => n.name === cteName);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Gets the main query without the WITH clause for analyzing main query dependencies
|
|
245
|
+
* @param query The complete query with WITH clause
|
|
246
|
+
* @returns A query without WITH clause, or null if no main query exists
|
|
247
|
+
*/
|
|
248
|
+
getMainQueryWithoutCTE(query) {
|
|
249
|
+
if (!query.withClause) {
|
|
250
|
+
// No WITH clause, return the query as-is
|
|
251
|
+
return query;
|
|
252
|
+
}
|
|
253
|
+
// Create a copy of the query without the WITH clause
|
|
254
|
+
const mainQueryCopy = new SimpleSelectQuery_1.SimpleSelectQuery({
|
|
255
|
+
selectClause: query.selectClause,
|
|
256
|
+
fromClause: query.fromClause,
|
|
257
|
+
whereClause: query.whereClause,
|
|
258
|
+
groupByClause: query.groupByClause,
|
|
259
|
+
havingClause: query.havingClause,
|
|
260
|
+
orderByClause: query.orderByClause,
|
|
261
|
+
limitClause: query.limitClause,
|
|
262
|
+
offsetClause: query.offsetClause,
|
|
263
|
+
fetchClause: query.fetchClause,
|
|
264
|
+
forClause: query.forClause,
|
|
265
|
+
windowClause: query.windowClause,
|
|
266
|
+
// Intentionally skip withClause (defaults to null)
|
|
267
|
+
});
|
|
268
|
+
return mainQueryCopy;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Extracts the name from a CommonTable
|
|
272
|
+
* @param cte The CommonTable object
|
|
273
|
+
* @returns The name of the CTE
|
|
274
|
+
*/
|
|
275
|
+
static getCTEName(cte) {
|
|
276
|
+
return cte.aliasExpression.table.name;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
exports.CTEDependencyAnalyzer = CTEDependencyAnalyzer;
|
|
280
|
+
CTEDependencyAnalyzer.ERROR_MESSAGES = {
|
|
281
|
+
NOT_ANALYZED: "Must call analyzeDependencies first",
|
|
282
|
+
CIRCULAR_REFERENCE: "Circular reference detected in CTE"
|
|
283
|
+
};
|
|
284
|
+
CTEDependencyAnalyzer.MAIN_QUERY_NAME = 'MAIN_QUERY';
|
|
285
|
+
//# sourceMappingURL=CTEDependencyAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CTEDependencyAnalyzer.js","sourceRoot":"","sources":["../../src/transformers/CTEDependencyAnalyzer.ts"],"names":[],"mappings":";;;AACA,mEAAgE;AAChE,iDAA8C;AAC9C,iEAA8D;AAC9D,6EAA0E;AAkC1E;;;;GAIG;AACH,MAAa,qBAAqB;IAc9B;QAHQ,oBAAe,GAA8B,IAAI,CAAC;QAClD,WAAM,GAA6B,IAAI,GAAG,EAAE,CAAC;QAGjD,2DAA2D;QAC3D,0DAA0D;QAC1D,IAAI,CAAC,eAAe,GAAG,IAAI,2CAAoB,CAAC,KAAK,CAAC,CAAC;QAEvD,gDAAgD;QAChD,+CAA+C;QAC/C,IAAI,CAAC,qBAAqB,GAAG,IAAI,uDAA0B,EAAE,CAAC;QAE9D,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CAAC,KAAwB;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,OAAe;QAClC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAC,OAAe;QAChC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACI,wBAAwB;QAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACjF,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,QAAkB;QACpC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,eAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED;;;OAGG;IACI,gBAAgB;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,qBAAqB;QACxB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC;YACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC5G,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,iBAAiB;QACpB,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,6CAA6C;QAC7C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,eAAgB,CAAC,KAAK,EAAE,CAAC;YAC7C,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,EAAE;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAClC,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,GAAG,qBAAqB,CAAC,cAAc,CAAC,kBAAkB,KAAK,QAAQ,EAAE,CAAC,CAAC;YAC/F,CAAC;YAED,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEvB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YAED,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,kBAAkB;QAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,eAAgB,CAAC,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACK,oBAAoB,CAAC,IAAmB,EAAE,SAA4B;QAC1E,MAAM,KAAK,GAAc,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAc,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;QAEpD,8CAA8C;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACnD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;YAC3C,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;QAC9C,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,qBAAqB,CAAC,eAAe,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;QAC5E,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,eAAe,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;QAE3E,oCAAoC;QACpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAEtD,oDAAoD;YACpD,+EAA+E;YAC/E,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEjE,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;gBAC7C,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAElD,2DAA2D;gBAC3D,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;oBAChE,aAAa,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBAChD,YAAY,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAE/C,KAAK,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,OAAO;wBACb,EAAE,EAAE,cAAc;qBACrB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;QAED,gEAAgE;QAChE,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,mBAAmB,EAAE,CAAC;YACtB,mFAAmF;YACnF,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAEpF,KAAK,MAAM,eAAe,IAAI,mBAAmB,EAAE,CAAC;gBAChD,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAElD,yDAAyD;gBACzD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;oBAClC,aAAa,CAAC,GAAG,CAAC,qBAAqB,CAAC,eAAe,CAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBAC9E,YAAY,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;oBAE7E,KAAK,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,qBAAqB,CAAC,eAAe;wBAC3C,EAAE,EAAE,cAAc;qBACrB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC;gBACP,IAAI;gBACJ,IAAI,EAAE,KAAK;gBACX,GAAG;gBACH,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;gBAC9D,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;aAC9D,CAAC,CAAC;QACP,CAAC;QAED,yBAAyB;QACzB,KAAK,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,qBAAqB,CAAC,eAAe;YAC3C,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,IAAI;YACT,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAC/F,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;SAC/F,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACK,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACvE,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,IAAmB;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,OAAe;;QAClC,OAAO,MAAA,IAAI,CAAC,eAAe,0CAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACK,sBAAsB,CAAC,KAAwB;QACnD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACpB,yCAAyC;YACzC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,qDAAqD;QACrD,MAAM,aAAa,GAAG,IAAI,qCAAiB,CAAC;YACxC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,mDAAmD;SACtD,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,UAAU,CAAC,GAAgB;QACtC,OAAO,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1C,CAAC;;AAvTL,sDAwTC;AAvT2B,oCAAc,GAAG;IACrC,YAAY,EAAE,qCAAqC;IACnD,kBAAkB,EAAE,oCAAoC;CAClD,AAH4B,CAG3B;AAEa,qCAAe,GAAG,YAAqB,AAAxB,CAAyB"}
|