@deterministic-code/datasources 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ArrayReader.d.ts +12 -0
- package/dist/BatchCommandIBulkWriteStrategy.d.ts +33 -0
- package/dist/BuiltRepository.d.ts +16 -0
- package/dist/BulkCRUDRepository.d.ts +17 -0
- package/dist/BulkCommand.d.ts +5 -0
- package/dist/BulkWriteEnrichment.d.ts +4 -0
- package/dist/CRUDRepository.d.ts +40 -0
- package/dist/CRUDRepositoryBuilder.d.ts +19 -0
- package/dist/CRUDRepositoryOptions.d.ts +7 -0
- package/dist/CRUDRepositoryStatements.d.ts +17 -0
- package/dist/CascadeDeleteEnrichmentStrategy.d.ts +7 -0
- package/dist/CascadeDeleteUpdateEnrichmentStrategy.d.ts +8 -0
- package/dist/CommandMiddlewareHost.d.ts +22 -0
- package/dist/ConsoleCommandMiddleware.d.ts +14 -0
- package/dist/CreateEnrichmentStrategy.d.ts +14 -0
- package/dist/Datasource.d.ts +30 -0
- package/dist/DatasourceError.d.ts +3 -0
- package/dist/DatasourceFactory.d.ts +12 -0
- package/dist/DatasourceOptions.d.ts +1 -0
- package/dist/DatasourceUrl.d.ts +12 -0
- package/dist/DatasourceUrlParser.d.ts +4 -0
- package/dist/DefaultCreateEnrichmentStrategy.d.ts +7 -0
- package/dist/DefaultReadonlyEnrichmentStrategy.d.ts +19 -0
- package/dist/DefaultUpdateEnrichmentStrategy.d.ts +7 -0
- package/dist/DefaultWriteEnrichmentStrategy.d.ts +21 -0
- package/dist/DeleteEnrichmentStrategy.d.ts +11 -0
- package/dist/DriverLoader.d.ts +5 -0
- package/dist/Enrichment.d.ts +13 -0
- package/dist/EnrichmentPropertyType.d.ts +7 -0
- package/dist/ExpectConsoleMiddleware.d.ts +15 -0
- package/dist/FirstResultReader.d.ts +19 -0
- package/dist/HashsetOptimizedReadonlyEnrichmentStrategy.d.ts +9 -0
- package/dist/IBulkWriteStrategy.d.ts +12 -0
- package/dist/ICRUDRepository.d.ts +12 -0
- package/dist/ICRUDRepositoryFactory.d.ts +7 -0
- package/dist/ICommand.d.ts +20 -0
- package/dist/ICommandMiddleware.d.ts +12 -0
- package/dist/IConnection.d.ts +12 -0
- package/dist/IDatasource.d.ts +18 -0
- package/dist/IDatasourceFactory.d.ts +5 -0
- package/dist/IDriver.d.ts +19 -0
- package/dist/IEnriched.d.ts +6 -0
- package/dist/IReader.d.ts +8 -0
- package/dist/IReadonlyEnrichmentStrategy.d.ts +7 -0
- package/dist/IReadonlyRepository.d.ts +11 -0
- package/dist/IRepository.d.ts +4 -0
- package/dist/IRepositoryFactory.d.ts +7 -0
- package/dist/IRepositoryTree.d.ts +4 -0
- package/dist/IRepositoryTreeNode.d.ts +7 -0
- package/dist/ITransaction.d.ts +8 -0
- package/dist/IUnitOfWork.d.ts +5 -0
- package/dist/IWriteEnrichmentStrategy.d.ts +7 -0
- package/dist/Information.d.ts +5 -0
- package/dist/IsolationLevel.d.ts +7 -0
- package/dist/LazyWriteEnrichmentStrategy.d.ts +4 -0
- package/dist/NestedToObjectEnrichmentStrategy.d.ts +10 -0
- package/dist/Parameter.d.ts +7 -0
- package/dist/ParameterDirection.d.ts +7 -0
- package/dist/ProviderCatalog.d.ts +7 -0
- package/dist/ProviderNotImplementedError.d.ts +4 -0
- package/dist/ProviderNotInstalledError.d.ts +4 -0
- package/dist/ReadonlyRepository.d.ts +59 -0
- package/dist/ReadonlyRepositoryBuilder.d.ts +12 -0
- package/dist/ReadonlyRepositoryMappingOptions.d.ts +14 -0
- package/dist/ReadonlyRepositoryStatements.d.ts +8 -0
- package/dist/RepositoryAccess.d.ts +11 -0
- package/dist/RepositoryFactory.d.ts +23 -0
- package/dist/RepositoryNotRegisteredError.d.ts +4 -0
- package/dist/RepositoryTree.d.ts +6 -0
- package/dist/RepositoryTreeNode.d.ts +9 -0
- package/dist/Response.d.ts +7 -0
- package/dist/Row.d.ts +2 -0
- package/dist/SingleCommandIBulkWriteStrategy.d.ts +11 -0
- package/dist/StatementMappers.d.ts +16 -0
- package/dist/StoredEnrichment.d.ts +11 -0
- package/dist/StoredProcedureBulkWriteStrategy.d.ts +27 -0
- package/dist/StreamingReader.d.ts +16 -0
- package/dist/UnitOfWorkTransaction.d.ts +12 -0
- package/dist/UpdateEnrichmentStrategy.d.ts +18 -0
- package/dist/WriteMode.d.ts +1 -0
- package/dist/builders/Field.d.ts +5 -0
- package/dist/builders/Scalar.d.ts +1 -0
- package/dist/builders/index.d.ts +2 -0
- package/dist/collectAsync.d.ts +1 -0
- package/dist/converters/Cell.d.ts +2 -0
- package/dist/converters/ChangeCasingConverter.d.ts +7 -0
- package/dist/converters/Constructable.d.ts +1 -0
- package/dist/converters/MetaDataRowTypeConverter.d.ts +14 -0
- package/dist/converters/PluralizerConverter.d.ts +4 -0
- package/dist/converters/RegexConverter.d.ts +7 -0
- package/dist/converters/ReplaceConverter.d.ts +7 -0
- package/dist/converters/RowTypeConverter.d.ts +10 -0
- package/dist/converters/ToLowerCaseConverter.d.ts +4 -0
- package/dist/converters/ToUpperCaseConverter.d.ts +4 -0
- package/dist/converters/TypeConverter.d.ts +5 -0
- package/dist/createCRUDRepositoryOptions.d.ts +7 -0
- package/dist/createReadonlyRepositoryMappingOptions.d.ts +6 -0
- package/dist/dotEnv.d.ts +5 -0
- package/dist/index.d.ts +119 -0
- package/dist/mappers/ChangeCasingMapper.d.ts +9 -0
- package/dist/mappers/DictionaryMapper.d.ts +8 -0
- package/dist/mappers/FlatToNestedMapper.d.ts +20 -0
- package/dist/mappers/IFlatToNestedMapper.d.ts +6 -0
- package/dist/mappers/IMapper.d.ts +4 -0
- package/dist/mappers/IdentityMapper.d.ts +5 -0
- package/dist/mappers/PluralizerMapper.d.ts +6 -0
- package/dist/mappers/RowTypeMapper.d.ts +6 -0
- package/dist/mappers/TransformConverterMapper.d.ts +5 -0
- package/dist/mappers/TransformMapper.d.ts +6 -0
- package/dist/mappers/TypeMap.d.ts +8 -0
- package/dist/mappers/TypeMapGroup.d.ts +5 -0
- package/dist/mocks/index.d.ts +9 -0
- package/dist/mocks/mock-command.d.ts +28 -0
- package/dist/mocks/mock-connection.d.ts +22 -0
- package/dist/mocks/mock-datasource.d.ts +24 -0
- package/dist/mocks/mock-driver.d.ts +15 -0
- package/dist/mocks/mock-reader.d.ts +14 -0
- package/dist/mocks/mock-repository.d.ts +42 -0
- package/dist/mocks/mock-select-statement.d.ts +10 -0
- package/dist/mocks/mock-transaction.d.ts +16 -0
- package/dist/mocks/mock-where.d.ts +8 -0
- package/dist/parametersToRecord.d.ts +2 -0
- package/dist/readerToAsyncIterable.d.ts +2 -0
- package/dist/splitStatements.d.ts +1 -0
- package/dist/statementParameters.d.ts +1 -0
- package/dist/statementUsesParameter.d.ts +1 -0
- package/dist/statements/Aggregate.d.ts +6 -0
- package/dist/statements/ArrayExpression.d.ts +5 -0
- package/dist/statements/BulkDeleteStatement.d.ts +11 -0
- package/dist/statements/BulkDeleteStatementTextRenderer.d.ts +4 -0
- package/dist/statements/BulkInsertStatement.d.ts +12 -0
- package/dist/statements/BulkInsertStatementTextRenderer.d.ts +4 -0
- package/dist/statements/BulkUpdateStatement.d.ts +16 -0
- package/dist/statements/BulkUpdateStatementTextRenderer.d.ts +8 -0
- package/dist/statements/CheckConstraint.d.ts +7 -0
- package/dist/statements/Cmp.d.ts +9 -0
- package/dist/statements/Column.d.ts +9 -0
- package/dist/statements/ColumnDefault.d.ts +5 -0
- package/dist/statements/Condition.d.ts +3 -0
- package/dist/statements/ConditionRenderer.d.ts +12 -0
- package/dist/statements/CreateIndexStatement.d.ts +10 -0
- package/dist/statements/CreateIndexStatementTextRenderer.d.ts +5 -0
- package/dist/statements/CreateTableStatement.d.ts +11 -0
- package/dist/statements/CreateTableStatementTextRenderer.d.ts +18 -0
- package/dist/statements/DefaultStatementTextRenderer.d.ts +5 -0
- package/dist/statements/DeleteStatement.d.ts +9 -0
- package/dist/statements/DeleteStatementTextRenderer.d.ts +7 -0
- package/dist/statements/ExecuteStoredProcedureStatement.d.ts +9 -0
- package/dist/statements/ExecuteStoredProcedureStatementTextRenderer.d.ts +4 -0
- package/dist/statements/ExpressionEvaluator.d.ts +5 -0
- package/dist/statements/ExpressionRenderer.d.ts +8 -0
- package/dist/statements/ForeignKey.d.ts +19 -0
- package/dist/statements/IBulkDeleteStatement.d.ts +3 -0
- package/dist/statements/IBulkInsertStatement.d.ts +3 -0
- package/dist/statements/IBulkUpdateStatement.d.ts +3 -0
- package/dist/statements/ICondition.d.ts +4 -0
- package/dist/statements/IConditionVisitor.d.ts +6 -0
- package/dist/statements/ICreateIndexStatement.d.ts +3 -0
- package/dist/statements/ICreateTableStatement.d.ts +3 -0
- package/dist/statements/IDeleteStatement.d.ts +5 -0
- package/dist/statements/IExecuteStoredProcedureStatement.d.ts +3 -0
- package/dist/statements/IExpression.d.ts +2 -0
- package/dist/statements/IInsertStatement.d.ts +3 -0
- package/dist/statements/IReturnStatement.d.ts +3 -0
- package/dist/statements/ISelectStatement.d.ts +5 -0
- package/dist/statements/IStatement.d.ts +4 -0
- package/dist/statements/IStatementVisitor.d.ts +26 -0
- package/dist/statements/ITableConstraint.d.ts +5 -0
- package/dist/statements/IUpdateStatement.d.ts +5 -0
- package/dist/statements/IWhere.d.ts +6 -0
- package/dist/statements/Identifier.d.ts +5 -0
- package/dist/statements/InsertStatement.d.ts +9 -0
- package/dist/statements/InsertStatementTextRenderer.d.ts +4 -0
- package/dist/statements/Join.d.ts +14 -0
- package/dist/statements/Literal.d.ts +6 -0
- package/dist/statements/Native.d.ts +5 -0
- package/dist/statements/NotNull.d.ts +4 -0
- package/dist/statements/Operator.d.ts +107 -0
- package/dist/statements/OrderBy.d.ts +10 -0
- package/dist/statements/PrimaryKey.d.ts +7 -0
- package/dist/statements/ReturnStatement.d.ts +9 -0
- package/dist/statements/ReturnStatementTextRenderer.d.ts +4 -0
- package/dist/statements/SelectInsertedIdStatement.d.ts +8 -0
- package/dist/statements/SelectInsertedIdStatementTextRenderer.d.ts +4 -0
- package/dist/statements/SelectStatement.d.ts +20 -0
- package/dist/statements/SelectStatementOptions.d.ts +15 -0
- package/dist/statements/SelectStatementTextRenderer.d.ts +19 -0
- package/dist/statements/StatementEvaluator.d.ts +4 -0
- package/dist/statements/StatementParser.d.ts +4 -0
- package/dist/statements/StatementRenderer.d.ts +42 -0
- package/dist/statements/StatementTextRenderer.d.ts +14 -0
- package/dist/statements/Subquery.d.ts +6 -0
- package/dist/statements/UniqueConstraint.d.ts +7 -0
- package/dist/statements/UpdateStatement.d.ts +14 -0
- package/dist/statements/UpdateStatementTextRenderer.d.ts +14 -0
- package/dist/statements/Where.d.ts +16 -0
- package/dist/statements/WhereText.d.ts +8 -0
- package/dist/statements/index.d.ts +75 -0
- package/dist/stubs/StubCommand.d.ts +15 -0
- package/dist/stubs/StubConnection.d.ts +13 -0
- package/dist/stubs/StubDatasource.d.ts +20 -0
- package/dist/stubs/StubReader.d.ts +11 -0
- package/dist/stubs/StubRepository.d.ts +22 -0
- package/dist/stubs/StubTransaction.d.ts +10 -0
- package/dist/stubs/createStubDatasource.d.ts +2 -0
- package/dist/stubs/index.d.ts +7 -0
- package/dist/stubs/notImplemented.d.ts +1 -0
- package/package.json +24 -4
- package/src/ArrayReader.test.ts +23 -0
- package/src/ArrayReader.ts +32 -0
- package/src/BatchCommandIBulkWriteStrategy.ts +228 -0
- package/src/BuiltRepository.ts +17 -0
- package/src/BulkCRUDRepository.test.ts +183 -0
- package/src/BulkCRUDRepository.ts +84 -0
- package/src/BulkCommand.ts +6 -0
- package/src/BulkWriteEnrichment.ts +19 -0
- package/src/BulkWriteStrategy.test.ts +293 -0
- package/src/CRUDRepository.test.ts +420 -0
- package/src/CRUDRepository.ts +264 -0
- package/src/CRUDRepositoryBuilder.ts +53 -0
- package/src/CRUDRepositoryOptions.test.ts +76 -0
- package/src/CRUDRepositoryOptions.ts +8 -0
- package/src/CRUDRepositoryStatements.ts +43 -0
- package/src/CascadeDeleteEnrichmentStrategy.ts +51 -0
- package/src/CascadeDeleteUpdateEnrichmentStrategy.ts +28 -0
- package/src/Command.test.ts +105 -0
- package/src/CommandMiddlewareHost.test.ts +98 -0
- package/src/CommandMiddlewareHost.ts +113 -0
- package/src/Connection.test.ts +34 -0
- package/src/ConsoleCommandMiddleware.test.ts +149 -0
- package/src/ConsoleCommandMiddleware.ts +64 -0
- package/src/CreateEnrichmentStrategy.ts +82 -0
- package/src/Datasource.test.ts +63 -0
- package/src/Datasource.ts +152 -0
- package/src/DatasourceError.test.ts +10 -0
- package/src/DatasourceError.ts +6 -0
- package/src/DatasourceFactory.test.ts +159 -0
- package/src/DatasourceFactory.ts +86 -0
- package/src/DatasourceOptions.ts +1 -0
- package/src/DatasourceUrl.ts +37 -0
- package/src/DatasourceUrlParser.test.ts +173 -0
- package/src/DatasourceUrlParser.ts +188 -0
- package/src/DefaultCreateEnrichmentStrategy.ts +21 -0
- package/src/DefaultReadonlyEnrichmentStrategy.ts +164 -0
- package/src/DefaultUpdateEnrichmentStrategy.ts +40 -0
- package/src/DefaultWriteEnrichmentStrategy.ts +151 -0
- package/src/DeleteEnrichmentStrategy.ts +56 -0
- package/src/DriverLoader.ts +97 -0
- package/src/Enrichment.ts +15 -0
- package/src/EnrichmentPropertyType.ts +9 -0
- package/src/ExpectConsoleMiddleware.test.ts +79 -0
- package/src/ExpectConsoleMiddleware.ts +47 -0
- package/src/FirstResultReader.test.ts +43 -0
- package/src/FirstResultReader.ts +49 -0
- package/src/HashsetOptimizedReadonlyEnrichmentStrategy.ts +80 -0
- package/src/IBulkWriteStrategy.ts +13 -0
- package/src/ICRUDRepository.ts +13 -0
- package/src/ICRUDRepositoryFactory.ts +8 -0
- package/src/ICommand.ts +45 -0
- package/src/ICommandMiddleware.ts +20 -0
- package/src/IConnection.ts +13 -0
- package/src/IDatasource.ts +27 -0
- package/src/IDatasourceFactory.ts +6 -0
- package/src/IDriver.ts +24 -0
- package/src/IEnriched.ts +11 -0
- package/src/IReader.ts +8 -0
- package/src/IReadonlyEnrichmentStrategy.ts +19 -0
- package/src/IReadonlyRepository.ts +21 -0
- package/src/IRepository.ts +5 -0
- package/src/IRepositoryFactory.ts +8 -0
- package/src/IRepositoryTree.ts +5 -0
- package/src/IRepositoryTreeNode.ts +8 -0
- package/src/ITransaction.ts +9 -0
- package/src/IUnitOfWork.ts +5 -0
- package/src/IWriteEnrichmentStrategy.ts +8 -0
- package/src/Information.ts +5 -0
- package/src/IsolationLevel.test.ts +13 -0
- package/src/IsolationLevel.ts +8 -0
- package/src/LazyWriteEnrichmentStrategy.ts +5 -0
- package/src/NestedToObjectEnrichmentStrategy.ts +33 -0
- package/src/Parameter.ts +8 -0
- package/src/ParameterDirection.ts +9 -0
- package/src/ProviderCatalog.test.ts +110 -0
- package/src/ProviderCatalog.ts +21 -0
- package/src/ProviderNotImplementedError.test.ts +11 -0
- package/src/ProviderNotImplementedError.ts +9 -0
- package/src/ProviderNotInstalledError.test.ts +11 -0
- package/src/ProviderNotInstalledError.ts +9 -0
- package/src/ReadonlyRepository.test.ts +406 -0
- package/src/ReadonlyRepository.ts +276 -0
- package/src/ReadonlyRepositoryBuilder.ts +53 -0
- package/src/ReadonlyRepositoryMappingOptions.ts +15 -0
- package/src/ReadonlyRepositoryStatements.ts +13 -0
- package/src/RepositoryAccess.ts +14 -0
- package/src/RepositoryFactory.test.ts +94 -0
- package/src/RepositoryFactory.ts +115 -0
- package/src/RepositoryNotRegisteredError.ts +9 -0
- package/src/RepositoryTree.ts +6 -0
- package/src/RepositoryTreeNode.ts +11 -0
- package/src/Response.ts +15 -0
- package/src/Row.ts +3 -0
- package/src/SingleCommandIBulkWriteStrategy.ts +35 -0
- package/src/StatementMappers.test.ts +221 -0
- package/src/StatementMappers.ts +110 -0
- package/src/StoredEnrichment.ts +25 -0
- package/src/StoredProcedureBulkWriteStrategy.ts +164 -0
- package/src/StreamingReader.test.ts +126 -0
- package/src/StreamingReader.ts +64 -0
- package/src/Transaction.test.ts +37 -0
- package/src/UnitOfWorkTransaction.test.ts +43 -0
- package/src/UnitOfWorkTransaction.ts +50 -0
- package/src/UpdateEnrichmentStrategy.ts +97 -0
- package/src/UserViewCRUDRepository.test.ts +323 -0
- package/src/WriteMode.ts +1 -0
- package/src/builders/Field.ts +6 -0
- package/src/builders/Scalar.ts +1 -0
- package/src/builders/builders.test.ts +404 -0
- package/src/builders/index.ts +2 -0
- package/src/collectAsync.ts +7 -0
- package/src/converters/Cell.ts +10 -0
- package/src/converters/ChangeCasingConverter.test.ts +34 -0
- package/src/converters/ChangeCasingConverter.ts +59 -0
- package/src/converters/Constructable.ts +1 -0
- package/src/converters/MetaDataRowTypeConverter.ts +80 -0
- package/src/converters/PluralizerConverter.test.ts +43 -0
- package/src/converters/PluralizerConverter.ts +67 -0
- package/src/converters/RegexConverter.test.ts +11 -0
- package/src/converters/RegexConverter.ts +14 -0
- package/src/converters/ReplaceConverter.test.ts +9 -0
- package/src/converters/ReplaceConverter.ts +6 -0
- package/src/converters/RowTypeConverter.test.ts +79 -0
- package/src/converters/RowTypeConverter.ts +33 -0
- package/src/converters/ToLowerCaseConverter.test.ts +9 -0
- package/src/converters/ToLowerCaseConverter.ts +4 -0
- package/src/converters/ToUpperCaseConverter.test.ts +9 -0
- package/src/converters/ToUpperCaseConverter.ts +4 -0
- package/src/converters/TypeConverter.ts +6 -0
- package/src/createCRUDRepositoryOptions.ts +21 -0
- package/src/createReadonlyRepositoryMappingOptions.ts +26 -0
- package/src/dotEnv.test.ts +21 -0
- package/src/dotEnv.ts +16 -0
- package/src/edgeCases.test.ts +485 -0
- package/src/index.ts +222 -0
- package/src/mappers/ChangeCasingMapper.test.ts +32 -0
- package/src/mappers/ChangeCasingMapper.ts +15 -0
- package/src/mappers/DictionaryMapper.test.ts +69 -0
- package/src/mappers/DictionaryMapper.ts +16 -0
- package/src/mappers/FlatToNestedMapper.test.ts +269 -0
- package/src/mappers/FlatToNestedMapper.ts +127 -0
- package/src/mappers/IFlatToNestedMapper.ts +7 -0
- package/src/mappers/IMapper.ts +4 -0
- package/src/mappers/IdentityMapper.test.ts +12 -0
- package/src/mappers/IdentityMapper.ts +6 -0
- package/src/mappers/PluralizerMapper.test.ts +40 -0
- package/src/mappers/PluralizerMapper.ts +9 -0
- package/src/mappers/RowTypeMapper.test.ts +12 -0
- package/src/mappers/RowTypeMapper.ts +13 -0
- package/src/mappers/TransformConverterMapper.test.ts +181 -0
- package/src/mappers/TransformConverterMapper.ts +11 -0
- package/src/mappers/TransformMapper.ts +8 -0
- package/src/mappers/TypeMap.ts +10 -0
- package/src/mappers/TypeMapGroup.ts +6 -0
- package/src/mappers/transformMapper.test.ts +66 -0
- package/src/mocks/MockCommand.test.ts +75 -0
- package/src/mocks/MockConnection.test.ts +34 -0
- package/src/mocks/MockDatasource.test.ts +40 -0
- package/src/mocks/MockReader.test.ts +17 -0
- package/src/mocks/MockRepository.test.ts +32 -0
- package/src/mocks/MockSelectStatement.test.ts +11 -0
- package/src/mocks/MockTransaction.test.ts +17 -0
- package/src/mocks/MockWhere.test.ts +11 -0
- package/src/mocks/index.ts +9 -0
- package/src/mocks/mock-command.ts +66 -0
- package/src/mocks/mock-connection.ts +57 -0
- package/src/mocks/mock-datasource.ts +65 -0
- package/src/mocks/mock-driver.ts +27 -0
- package/src/mocks/mock-reader.ts +38 -0
- package/src/mocks/mock-repository.ts +91 -0
- package/src/mocks/mock-select-statement.ts +17 -0
- package/src/mocks/mock-transaction.ts +31 -0
- package/src/mocks/mock-where.ts +13 -0
- package/src/parametersToRecord.test.ts +19 -0
- package/src/parametersToRecord.ts +11 -0
- package/src/public-surface.test.ts +23 -0
- package/src/readWithWhereClauseAndCustomFlatToNestedObjectMappingOptions.test.ts +126 -0
- package/src/readerToAsyncIterable.test.ts +39 -0
- package/src/readerToAsyncIterable.ts +11 -0
- package/src/repository.test.ts +410 -0
- package/src/repository.type.test.ts +29 -0
- package/src/splitStatements.ts +99 -0
- package/src/statementParameters.ts +22 -0
- package/src/statementUsesParameter.ts +4 -0
- package/src/statements/Aggregate.ts +9 -0
- package/src/statements/ArrayExpression.ts +5 -0
- package/src/statements/BulkDeleteStatement.ts +18 -0
- package/src/statements/BulkDeleteStatementTextRenderer.ts +16 -0
- package/src/statements/BulkInsertStatement.ts +37 -0
- package/src/statements/BulkInsertStatementTextRenderer.ts +10 -0
- package/src/statements/BulkUpdateStatement.ts +24 -0
- package/src/statements/BulkUpdateStatementTextRenderer.ts +29 -0
- package/src/statements/CheckConstraint.ts +9 -0
- package/src/statements/Cmp.ts +12 -0
- package/src/statements/Column.ts +10 -0
- package/src/statements/ColumnDefault.ts +6 -0
- package/src/statements/Condition.ts +3 -0
- package/src/statements/ConditionRenderer.ts +17 -0
- package/src/statements/CreateIndexStatement.ts +18 -0
- package/src/statements/CreateIndexStatementTextRenderer.ts +11 -0
- package/src/statements/CreateTableStatement.ts +18 -0
- package/src/statements/CreateTableStatementTextRenderer.ts +92 -0
- package/src/statements/DefaultStatementTextRenderer.ts +9 -0
- package/src/statements/DeleteStatement.ts +15 -0
- package/src/statements/DeleteStatementTextRenderer.ts +12 -0
- package/src/statements/ExecuteStoredProcedureStatement.ts +15 -0
- package/src/statements/ExecuteStoredProcedureStatementTextRenderer.ts +15 -0
- package/src/statements/ExpressionEvaluator.ts +166 -0
- package/src/statements/ExpressionRenderer.ts +161 -0
- package/src/statements/ForeignKey.ts +23 -0
- package/src/statements/IBulkDeleteStatement.ts +3 -0
- package/src/statements/IBulkInsertStatement.ts +3 -0
- package/src/statements/IBulkUpdateStatement.ts +3 -0
- package/src/statements/ICondition.ts +5 -0
- package/src/statements/IConditionVisitor.ts +7 -0
- package/src/statements/ICreateIndexStatement.ts +3 -0
- package/src/statements/ICreateTableStatement.ts +3 -0
- package/src/statements/IDeleteStatement.ts +6 -0
- package/src/statements/IExecuteStoredProcedureStatement.ts +3 -0
- package/src/statements/IExpression.ts +1 -0
- package/src/statements/IInsertStatement.ts +3 -0
- package/src/statements/IReturnStatement.ts +3 -0
- package/src/statements/ISelectStatement.ts +6 -0
- package/src/statements/IStatement.ts +5 -0
- package/src/statements/IStatementVisitor.ts +27 -0
- package/src/statements/ITableConstraint.ts +6 -0
- package/src/statements/IUpdateStatement.ts +6 -0
- package/src/statements/IWhere.ts +7 -0
- package/src/statements/Identifier.ts +5 -0
- package/src/statements/InsertStatement.ts +15 -0
- package/src/statements/InsertStatementTextRenderer.ts +7 -0
- package/src/statements/Join.ts +26 -0
- package/src/statements/Literal.ts +6 -0
- package/src/statements/Native.ts +5 -0
- package/src/statements/NotNull.ts +3 -0
- package/src/statements/Operator.ts +234 -0
- package/src/statements/OrderBy.ts +19 -0
- package/src/statements/PrimaryKey.ts +9 -0
- package/src/statements/ReturnStatement.ts +15 -0
- package/src/statements/ReturnStatementTextRenderer.ts +15 -0
- package/src/statements/SelectInsertedIdStatement.test.ts +11 -0
- package/src/statements/SelectInsertedIdStatement.ts +11 -0
- package/src/statements/SelectInsertedIdStatementTextRenderer.ts +7 -0
- package/src/statements/SelectStatement.ts +34 -0
- package/src/statements/SelectStatementOptions.ts +16 -0
- package/src/statements/SelectStatementTextRenderer.ts +71 -0
- package/src/statements/StatementCompile.test.ts +231 -0
- package/src/statements/StatementEvaluator.ts +5 -0
- package/src/statements/StatementParser.test.ts +304 -0
- package/src/statements/StatementParser.ts +461 -0
- package/src/statements/StatementRenderer.ts +120 -0
- package/src/statements/StatementTextRenderer.ts +60 -0
- package/src/statements/Subquery.ts +6 -0
- package/src/statements/UniqueConstraint.ts +9 -0
- package/src/statements/UpdateStatement.ts +34 -0
- package/src/statements/UpdateStatementTextRenderer.ts +63 -0
- package/src/statements/Where.ts +250 -0
- package/src/statements/WhereText.ts +10 -0
- package/src/statements/index.ts +75 -0
- package/src/stubs/StubCommand.ts +30 -0
- package/src/stubs/StubConnection.ts +21 -0
- package/src/stubs/StubDatasource.test.ts +99 -0
- package/src/stubs/StubDatasource.ts +60 -0
- package/src/stubs/StubReader.ts +25 -0
- package/src/stubs/StubRepository.ts +42 -0
- package/src/stubs/StubTransaction.ts +17 -0
- package/src/stubs/createStubDatasource.ts +4 -0
- package/src/stubs/index.ts +7 -0
- package/src/stubs/notImplemented.ts +5 -0
- package/src/tests/contact/Address.ts +14 -0
- package/src/tests/contact/AddressType.ts +6 -0
- package/src/tests/contact/Base.ts +7 -0
- package/src/tests/contact/Contact.ts +12 -0
- package/src/tests/contact/ContactBase.ts +8 -0
- package/src/tests/contact/ContactChangeLog.ts +8 -0
- package/src/tests/contact/ContactGroup.ts +6 -0
- package/src/tests/contact/ContactGroupBase.ts +6 -0
- package/src/tests/contact/ContactGroupMember.ts +6 -0
- package/src/tests/contact/ContactSource.ts +6 -0
- package/src/tests/contact/ContactType.ts +6 -0
- package/src/tests/contact/ContactsService.test.ts +118 -0
- package/src/tests/contact/ContactsService.ts +32 -0
- package/src/tests/contact/ImportContactRequest.ts +4 -0
- package/src/tests/contact/ImportContactResult.ts +5 -0
- package/src/tests/contact/LegacyContact.ts +7 -0
- package/src/tests/contact/LegacyMigrationResult.ts +5 -0
- package/src/tests/contact/Phone.ts +9 -0
- package/src/tests/contact/PhoneType.ts +6 -0
- package/src/tests/contact/asContactsView.ts +63 -0
- package/src/tests/contact/contactColumns.ts +40 -0
- package/src/tests/contact/contactLookupIds.ts +32 -0
- package/src/tests/contact/contactLookups.ts +6 -0
- package/src/tests/contact/contactsParity.ts +63 -0
- package/src/tests/contact/contactsServiceOf.ts +38 -0
- package/src/tests/contact/contactsView.ts +31 -0
- package/src/tests/contact/expectContactsView.ts +23 -0
- package/src/tests/contact/extraContact.ts +61 -0
- package/src/tests/contact/logMapped.ts +5 -0
- package/src/tests/contact/seedContacts.ts +31 -0
- package/README.md +0 -3
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
ArrayExpression,
|
|
4
|
+
DeleteStatement,
|
|
5
|
+
Identifier,
|
|
6
|
+
InsertStatement,
|
|
7
|
+
Join,
|
|
8
|
+
Literal,
|
|
9
|
+
Operator,
|
|
10
|
+
SelectStatement,
|
|
11
|
+
ExpressionEvaluator,
|
|
12
|
+
StatementParser,
|
|
13
|
+
Subquery,
|
|
14
|
+
UpdateStatement,
|
|
15
|
+
Where,
|
|
16
|
+
DefaultStatementTextRenderer,
|
|
17
|
+
} from "../index.ts";
|
|
18
|
+
import type { IExpression } from "./IExpression.ts";
|
|
19
|
+
|
|
20
|
+
const roundTrip = (sql: string): void => {
|
|
21
|
+
expect(DefaultStatementTextRenderer.instance.render(StatementParser.parse(sql))).toBe(sql);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
describe("StatementParser", () => {
|
|
25
|
+
it("round-trips the select grammar", () => {
|
|
26
|
+
for (const sql of [
|
|
27
|
+
"SELECT id FROM users WHERE name NOT LIKE $name",
|
|
28
|
+
"SELECT id FROM users WHERE age NOT BETWEEN $age_0 AND $age_1",
|
|
29
|
+
"SELECT DISTINCT status FROM orders GROUP BY status HAVING status = $status ORDER BY status ASC LIMIT 10 OFFSET 5",
|
|
30
|
+
'SELECT "user".id AS user_id FROM "user"',
|
|
31
|
+
"SELECT id FROM users WHERE 'a' = 'b'",
|
|
32
|
+
"SELECT id FROM users FULL JOIN profiles ON users.id = profiles.user_id AND profiles.active = $profiles.active",
|
|
33
|
+
"SELECT id FROM users WHERE EXISTS (SELECT id FROM posts WHERE posts.user_id = users.id)",
|
|
34
|
+
"SELECT id FROM users CROSS JOIN tags",
|
|
35
|
+
"SELECT id FROM users WHERE id IS NULL",
|
|
36
|
+
"SELECT id FROM users WHERE id IS NOT NULL",
|
|
37
|
+
"SELECT id FROM users WHERE name LIKE $name",
|
|
38
|
+
"SELECT id FROM users WHERE id IN ($id_0, $id_1)",
|
|
39
|
+
"SELECT id FROM users WHERE id NOT IN ($id_0)",
|
|
40
|
+
"SELECT id FROM users WHERE age BETWEEN $age_0 AND $age_1",
|
|
41
|
+
"SELECT id FROM users WHERE 1 = 0",
|
|
42
|
+
"SELECT id, name FROM users WHERE id = $id AND age > $age",
|
|
43
|
+
"SELECT status, COUNT(*) AS n, SUM(amount) AS total FROM orders INNER JOIN customers ON orders.customer_id = customers.id WHERE status = $status GROUP BY status ORDER BY total DESC, status ASC LIMIT 10",
|
|
44
|
+
])
|
|
45
|
+
roundTrip(sql);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("round-trips the write grammar", () => {
|
|
49
|
+
for (const sql of [
|
|
50
|
+
"INSERT INTO users (id, name) VALUES ($id, $name)",
|
|
51
|
+
'INSERT INTO "user" (id) VALUES ($id)',
|
|
52
|
+
"UPDATE users SET name = $name WHERE id = $id",
|
|
53
|
+
"UPDATE users SET name = $name, age = $age",
|
|
54
|
+
"UPDATE users SET name = $name WHERE name NOT LIKE $name",
|
|
55
|
+
"DELETE FROM users WHERE id = $id",
|
|
56
|
+
"DELETE FROM users",
|
|
57
|
+
'DELETE FROM "user" WHERE id = $id',
|
|
58
|
+
"DELETE FROM users WHERE name NOT LIKE $name",
|
|
59
|
+
])
|
|
60
|
+
roundTrip(sql);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("builds the write trees", () => {
|
|
64
|
+
expect(StatementParser.parse("INSERT INTO users (id, name) VALUES ($id, $name)")).toBeInstanceOf(
|
|
65
|
+
InsertStatement,
|
|
66
|
+
);
|
|
67
|
+
const update = StatementParser.parse("UPDATE users SET name = $name WHERE id = $id") as UpdateStatement;
|
|
68
|
+
expect((update.where as Where).condition).toBeInstanceOf(Operator.Equals);
|
|
69
|
+
const notLike = StatementParser.parse(
|
|
70
|
+
"UPDATE users SET name = $name WHERE name NOT LIKE $name",
|
|
71
|
+
) as UpdateStatement;
|
|
72
|
+
expect((notLike.where as Where).condition).toBeInstanceOf(Operator.NotLike);
|
|
73
|
+
const deleted = StatementParser.parse("DELETE FROM users WHERE id = $id") as DeleteStatement;
|
|
74
|
+
expect((deleted.where as Where).condition).toBeInstanceOf(Operator.Equals);
|
|
75
|
+
expect((StatementParser.parse("DELETE FROM users") as DeleteStatement).where).toBeUndefined();
|
|
76
|
+
expect(() => StatementParser.parse("INSERT INTO users (name) VALUES ('ada')")).toThrow("empty statement");
|
|
77
|
+
expect(() => StatementParser.parse("UPDATE users SET name = name WHERE id = $id")).toThrow("empty statement");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("builds the where tree", () => {
|
|
81
|
+
const notLike = StatementParser.parse("SELECT id FROM users WHERE name NOT LIKE $name") as SelectStatement;
|
|
82
|
+
expect((notLike.where as Where).condition).toBeInstanceOf(Operator.NotLike);
|
|
83
|
+
|
|
84
|
+
const exists = StatementParser.parse(
|
|
85
|
+
"SELECT id FROM users WHERE EXISTS (SELECT id FROM posts WHERE posts.user_id = users.id)",
|
|
86
|
+
) as SelectStatement;
|
|
87
|
+
expect((exists.where as Where).condition).toBeInstanceOf(Operator.Exists);
|
|
88
|
+
|
|
89
|
+
const full = StatementParser.parse(
|
|
90
|
+
"SELECT id FROM users FULL JOIN profiles ON users.id = profiles.user_id",
|
|
91
|
+
) as SelectStatement;
|
|
92
|
+
expect(full.joins[0]?.kind).toBe("full");
|
|
93
|
+
|
|
94
|
+
const cross = StatementParser.parse("SELECT id FROM users CROSS JOIN tags") as SelectStatement;
|
|
95
|
+
expect(cross.joins[0]?.kind).toBe("cross");
|
|
96
|
+
expect(cross.joins[0]?.on).toBeUndefined();
|
|
97
|
+
|
|
98
|
+
const shaped = StatementParser.parse(
|
|
99
|
+
"SELECT DISTINCT status FROM orders GROUP BY status HAVING status = $status ORDER BY status ASC LIMIT 10 OFFSET 5",
|
|
100
|
+
) as SelectStatement;
|
|
101
|
+
expect(shaped.distinct).toBe(true);
|
|
102
|
+
expect(shaped.limit).toBe(10);
|
|
103
|
+
expect(shaped.offset).toBe(5);
|
|
104
|
+
expect((shaped.having as Where).condition).toBeInstanceOf(Operator.Equals);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("keeps a string beside a column as its parameter", () => {
|
|
108
|
+
const query = StatementParser.parse("SELECT id FROM users WHERE name = 'ada'") as SelectStatement;
|
|
109
|
+
expect(DefaultStatementTextRenderer.instance.render(query)).toBe("SELECT id FROM users WHERE name = $name");
|
|
110
|
+
expect(query.where?.parameters).toEqual([{ name: "name", value: "ada" }]);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("evaluates the new predicates", () => {
|
|
114
|
+
const row = { name: "ada", age: 30, id: null };
|
|
115
|
+
const evaluator = new ExpressionEvaluator();
|
|
116
|
+
expect(evaluator.evaluate(new Operator.IsNull(new Identifier("id")), row)).toBe(true);
|
|
117
|
+
expect(evaluator.evaluate(new Operator.Like("name", "a%"), row)).toBe(true);
|
|
118
|
+
expect(evaluator.evaluate(new Operator.NotLike("name", "a%"), row)).toBe(false);
|
|
119
|
+
expect(evaluator.evaluate(new Operator.Between("age", 18, 40), row)).toBe(true);
|
|
120
|
+
expect(evaluator.evaluate(new Operator.NotBetween("age", 18, 40), row)).toBe(false);
|
|
121
|
+
expect(evaluator.evaluate(new Operator.NotIn("age", [1, 2]), row)).toBe(true);
|
|
122
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.NotLike("name", "%a")))).toBe("name NOT LIKE $name");
|
|
123
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.NotBetween("age", 1, 2)))).toBe(
|
|
124
|
+
"age NOT BETWEEN $age_0 AND $age_1",
|
|
125
|
+
);
|
|
126
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.NotIn("id", [])))).toBe("1 = 1");
|
|
127
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.Not(new Operator.Like("name", "%a"))))).toBe(
|
|
128
|
+
"NOT (name LIKE $name)",
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("parses the remaining select forms", () => {
|
|
133
|
+
for (const sql of [
|
|
134
|
+
"SELECT id FROM (SELECT id FROM users) AS u",
|
|
135
|
+
"SELECT id FROM users LEFT JOIN posts ON posts.user_id = users.id",
|
|
136
|
+
"SELECT id FROM users RIGHT JOIN tags ON tags.id = users.id",
|
|
137
|
+
"SELECT id FROM users WHERE NOT (name LIKE $name)",
|
|
138
|
+
"SELECT id FROM users WHERE id <> $id",
|
|
139
|
+
"SELECT id FROM users WHERE age <= $age",
|
|
140
|
+
"SELECT id FROM users WHERE age >= $age",
|
|
141
|
+
"SELECT id FROM users WHERE age < $age",
|
|
142
|
+
"SELECT id FROM users WHERE age > $age",
|
|
143
|
+
"SELECT id FROM users WHERE true",
|
|
144
|
+
"SELECT id FROM users WHERE false",
|
|
145
|
+
"SELECT id FROM users WHERE null",
|
|
146
|
+
"SELECT id FROM users WHERE 'o''brien' = 'x'",
|
|
147
|
+
'SELECT id FROM "a""b"',
|
|
148
|
+
"SELECT id FROM users WHERE id IN (SELECT id FROM posts)",
|
|
149
|
+
"SELECT id FROM users WHERE id NOT IN (SELECT id FROM posts)",
|
|
150
|
+
"SELECT id FROM users WHERE (SELECT id FROM posts) = id",
|
|
151
|
+
"SELECT MIN(n), MAX(amount) FROM orders",
|
|
152
|
+
"SELECT COUNT FROM users",
|
|
153
|
+
"SELECT id FROM users WHERE id = $id OR age = $age",
|
|
154
|
+
"SELECT id FROM users OFFSET 3",
|
|
155
|
+
"SELECT id FROM users GROUP BY a, b",
|
|
156
|
+
"SELECT * FROM users",
|
|
157
|
+
])
|
|
158
|
+
roundTrip(sql);
|
|
159
|
+
expect(DefaultStatementTextRenderer.instance.render(StatementParser.parse("SELECT id FROM users WHERE (id = $id)"))).toBe(
|
|
160
|
+
"SELECT id FROM users WHERE id = $id",
|
|
161
|
+
);
|
|
162
|
+
expect(() => StatementParser.parse("INSERT INTO users")).toThrow("empty statement");
|
|
163
|
+
expect(() => StatementParser.parse("ALTER TABLE users")).toThrow("empty statement");
|
|
164
|
+
expect(() => StatementParser.parse("SELECT id FROM users extra")).toThrow("empty statement");
|
|
165
|
+
expect(() => StatementParser.parse("SELECT id FROM users WHERE 'ab")).toThrow("empty statement");
|
|
166
|
+
expect(() => StatementParser.parse('SELECT id FROM "user')).toThrow("empty statement");
|
|
167
|
+
expect(() => StatementParser.parse("SELECT id FROM users WHERE id NOT = 1")).toThrow("empty statement");
|
|
168
|
+
expect(() => StatementParser.parse("SELECT id FROM users LIMIT")).toThrow("empty statement");
|
|
169
|
+
expect(() => StatementParser.parse("SELECT id FROM users WHERE id IS")).toThrow("empty statement");
|
|
170
|
+
expect(() => StatementParser.parse("SELECT id FROM users WHERE (id = $id")).toThrow("empty statement");
|
|
171
|
+
expect(() => StatementParser.parse("SELECT id FROM 1")).toThrow("empty statement");
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it("rewrites and collects the new operators", () => {
|
|
175
|
+
const same = (name: string): string => name;
|
|
176
|
+
const keep = <T>(_name: string, cell: T): T => cell;
|
|
177
|
+
const nested = new SelectStatement({
|
|
178
|
+
table: "posts",
|
|
179
|
+
fields: ["id"],
|
|
180
|
+
where: new Where(new Operator.Equals("id", 1)),
|
|
181
|
+
having: new Where(new Operator.Equals("n", 2)),
|
|
182
|
+
joins: [Join.inner("tags", "posts.id", "tags.post_id")],
|
|
183
|
+
});
|
|
184
|
+
const plain = new SelectStatement({ table: "dual", fields: ["1"] });
|
|
185
|
+
const mapped = new Where(
|
|
186
|
+
new Operator.And(
|
|
187
|
+
new Operator.Or(new Operator.IsNull(new Identifier("id")), new Operator.IsNotNull(new Identifier("id"))),
|
|
188
|
+
new Operator.Not(new Operator.Like(new Literal("a"), new Identifier("name"))),
|
|
189
|
+
),
|
|
190
|
+
).map(same, keep);
|
|
191
|
+
expect(DefaultStatementTextRenderer.instance.render(mapped)).toBe("(id IS NULL OR id IS NOT NULL) AND (NOT ('a' LIKE name))");
|
|
192
|
+
for (const op of [
|
|
193
|
+
new Operator.NotEquals("id", 1),
|
|
194
|
+
new Operator.GreaterThan("id", 1),
|
|
195
|
+
new Operator.LessThan("id", 1),
|
|
196
|
+
new Operator.GreaterThanOrEqual("id", 1),
|
|
197
|
+
new Operator.LessThanOrEqual("id", 1),
|
|
198
|
+
new Operator.Like("name", "a"),
|
|
199
|
+
new Operator.NotLike("name", "a"),
|
|
200
|
+
new Operator.Between("age", 1, 2),
|
|
201
|
+
new Operator.NotBetween("age", 1, 2),
|
|
202
|
+
new Operator.In("id", [1]),
|
|
203
|
+
new Operator.NotIn("id", [1]),
|
|
204
|
+
new Operator.Exists(new Subquery(nested)),
|
|
205
|
+
new Operator.Exists(new Subquery(plain)),
|
|
206
|
+
])
|
|
207
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(op).map(same, keep)).length).toBeGreaterThan(0);
|
|
208
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.Equals('"user"', 1)))).toBe('"user" = $user');
|
|
209
|
+
expect(new Where(new Operator.Equals('"a.b"', 1)).parameters).toEqual([
|
|
210
|
+
{ name: "a.b", value: 1 },
|
|
211
|
+
]);
|
|
212
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.In(new Identifier("id"), new Subquery(nested))))).toBe(
|
|
213
|
+
"id IN (SELECT id FROM posts INNER JOIN tags ON posts.id = tags.post_id WHERE id = $id HAVING n = $n)",
|
|
214
|
+
);
|
|
215
|
+
expect(
|
|
216
|
+
new Where(new Operator.NotIn(new Identifier("id"), new Subquery(nested))).parameters,
|
|
217
|
+
).toEqual([
|
|
218
|
+
{ name: "id", value: 1 },
|
|
219
|
+
{ name: "n", value: 2 },
|
|
220
|
+
]);
|
|
221
|
+
expect(
|
|
222
|
+
DefaultStatementTextRenderer.instance.render(new Where(new Operator.Between(new Literal(1), new Literal(0), new Literal(2)))),
|
|
223
|
+
).toBe("1 BETWEEN 0 AND 2");
|
|
224
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.NotBetween(new Literal(1), new Literal(0), new Literal(2))))).toBe(
|
|
225
|
+
"1 NOT BETWEEN 0 AND 2",
|
|
226
|
+
);
|
|
227
|
+
expect(new Where(new Operator.NotBetween(new Literal(1), new Literal(0), new Literal(2))).parameters).toEqual(
|
|
228
|
+
[],
|
|
229
|
+
);
|
|
230
|
+
expect(
|
|
231
|
+
DefaultStatementTextRenderer.instance.render(new Where(
|
|
232
|
+
new Operator.Between(new Identifier("age"), new Identifier("low"), new Identifier("high")),
|
|
233
|
+
).map(same, keep)),
|
|
234
|
+
).toBe("age BETWEEN low AND high");
|
|
235
|
+
expect(
|
|
236
|
+
DefaultStatementTextRenderer.instance.render(new Where(new Operator.In(new Identifier("id"), new Subquery(plain))).map(same, keep)),
|
|
237
|
+
).toBe("id IN (SELECT 1 FROM dual)");
|
|
238
|
+
const whereOnly = new SelectStatement({ where: new Where(new Operator.Equals("id", 1)) });
|
|
239
|
+
expect(new Where(new Operator.Exists(new Subquery(whereOnly))).map(same, keep)).toBeInstanceOf(Where);
|
|
240
|
+
const bare = new SelectStatement({ table: "posts", fields: ["id"], joins: [Join.cross("tags")] });
|
|
241
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Operator.Exists(new Subquery(bare))).map(same, keep))).toBe(
|
|
242
|
+
"EXISTS (SELECT id FROM posts CROSS JOIN tags)",
|
|
243
|
+
);
|
|
244
|
+
expect(new Where(new Operator.Exists(new Subquery(bare))).parameters).toEqual([]);
|
|
245
|
+
expect(new Where(new Operator.Exists(new Subquery(nested))).parameters).toEqual([
|
|
246
|
+
{ name: "id", value: 1 },
|
|
247
|
+
{ name: "n", value: 2 },
|
|
248
|
+
]);
|
|
249
|
+
expect(new Where(new Operator.NotIn("id", [1, 2])).parameters).toEqual([
|
|
250
|
+
{ name: "id_0", value: 1 },
|
|
251
|
+
{ name: "id_1", value: 2 },
|
|
252
|
+
]);
|
|
253
|
+
expect(new Where(new Operator.Between("age", 1, 2)).parameters).toEqual([
|
|
254
|
+
{ name: "age_0", value: 1 },
|
|
255
|
+
{ name: "age_1", value: 2 },
|
|
256
|
+
]);
|
|
257
|
+
expect(new Where(new Operator.NotBetween("age", 1, 2)).parameters).toEqual([
|
|
258
|
+
{ name: "age_0", value: 1 },
|
|
259
|
+
{ name: "age_1", value: 2 },
|
|
260
|
+
]);
|
|
261
|
+
expect(
|
|
262
|
+
DefaultStatementTextRenderer.instance.render(new Where(
|
|
263
|
+
new Operator.In(new Identifier("id"), new ArrayExpression([new Identifier("x")])),
|
|
264
|
+
).map(same, keep)),
|
|
265
|
+
).toBe("id IN ($id_0)");
|
|
266
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new Where(new Operator.Equals("id", 1))).map(same, keep))).toBe(
|
|
267
|
+
"id = $id",
|
|
268
|
+
);
|
|
269
|
+
expect(DefaultStatementTextRenderer.instance.render(new Where(new ArrayExpression([new Literal(1)])).map(same, keep))).toBe("1");
|
|
270
|
+
expect(Join.full("profiles", "users.id", "profiles.user_id").kind).toBe("full");
|
|
271
|
+
expect(() =>
|
|
272
|
+
DefaultStatementTextRenderer.instance.render(new SelectStatement({ table: "users", fields: ["id"], joins: [{ kind: "inner", table: "t" }] })),
|
|
273
|
+
).toThrow("empty join");
|
|
274
|
+
expect(() =>
|
|
275
|
+
DefaultStatementTextRenderer.instance.render(
|
|
276
|
+
new SelectStatement({ table: "users", fields: ["id"], offset: -1 }),
|
|
277
|
+
),
|
|
278
|
+
).toThrow("negative offset");
|
|
279
|
+
expect(() => new Where(new Ghost() as IExpression).map(same, keep)).toThrow("empty expression");
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
it("evaluates null patterns and rejects a subquery", () => {
|
|
283
|
+
const row = { name: "ada", age: 30, id: null };
|
|
284
|
+
const evaluator = new ExpressionEvaluator();
|
|
285
|
+
expect(evaluator.evaluate(new Operator.Like("name", null), row)).toBe(false);
|
|
286
|
+
expect(evaluator.evaluate(new Operator.NotLike("name", null), row)).toBe(true);
|
|
287
|
+
expect(evaluator.evaluate(new Operator.IsNotNull(new Identifier("name")), row)).toBe(true);
|
|
288
|
+
expect(evaluator.evaluate(new Operator.Like("name", "a_a"), row)).toBe(true);
|
|
289
|
+
expect(evaluator.evaluate(new Operator.Like("name", "a%"), row)).toBe(true);
|
|
290
|
+
expect(evaluator.evaluate(new Operator.Like("name", "z%"), row)).toBe(false);
|
|
291
|
+
expect(evaluator.evaluate(new Operator.Like("name", "___"), row)).toBe(true);
|
|
292
|
+
expect(evaluator.evaluate(new Operator.Like("name", "ada%"), row)).toBe(true);
|
|
293
|
+
expect(evaluator.evaluate(new Operator.Between("age", null, 40), row)).toBe(false);
|
|
294
|
+
expect(() => evaluator.evaluate(new Operator.Like("age", 1), row)).toThrow("empty like");
|
|
295
|
+
expect(() => evaluator.evaluate(new Operator.NotIn(new Identifier("id"), new Literal(1)), row)).toThrow(
|
|
296
|
+
"empty in",
|
|
297
|
+
);
|
|
298
|
+
const query = new Subquery(new SelectStatement({ table: "dual", fields: ["1"] }));
|
|
299
|
+
expect(() => evaluator.evaluate(new Operator.Exists(query), row)).toThrow("subquery is not evaluable");
|
|
300
|
+
expect(() => evaluator.evaluate(query, row)).toThrow("subquery is not evaluable");
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
class Ghost {}
|