@effect-app/infra 4.0.0-beta.31 → 4.0.0-beta.310
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/CHANGELOG.md +2361 -0
- package/_check.sh +1 -1
- package/dist/CUPS.d.ts +29 -10
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +35 -14
- package/dist/ClusterCosmos.d.ts +64 -0
- package/dist/ClusterCosmos.d.ts.map +1 -0
- package/dist/ClusterCosmos.js +547 -0
- package/dist/ClusterServiceBus.d.ts +67 -0
- package/dist/ClusterServiceBus.d.ts.map +1 -0
- package/dist/ClusterServiceBus.js +82 -0
- package/dist/ContextProvider.d.ts +34 -0
- package/dist/ContextProvider.d.ts.map +1 -0
- package/dist/ContextProvider.js +40 -0
- package/dist/Emailer/Sendgrid.d.ts +110 -146
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +24 -19
- package/dist/Emailer/fake.d.ts +1 -1
- package/dist/Emailer/fake.d.ts.map +1 -1
- package/dist/Emailer/fake.js +4 -4
- package/dist/MainFiberSet.d.ts +12 -8
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +23 -7
- package/dist/QueueMaker/errors.d.ts +4 -2
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/errors.js +4 -2
- package/dist/{adapters/SQL → SQL}/Model.d.ts +31 -42
- package/dist/SQL/Model.d.ts.map +1 -0
- package/dist/SQL/Model.js +469 -0
- package/dist/SQL.d.ts.map +1 -0
- package/dist/{adapters/SQL.js → SQL.js} +1 -1
- package/dist/Store/Cosmos/query.d.ts +14 -3
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +179 -41
- package/dist/Store/Cosmos.d.ts +2 -2
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +385 -254
- package/dist/Store/Disk.d.ts +4 -4
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +79 -39
- package/dist/Store/Memory.d.ts +5 -9
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +324 -67
- package/dist/Store/SQL/Pg.d.ts +4 -0
- package/dist/Store/SQL/Pg.d.ts.map +1 -0
- package/dist/Store/SQL/Pg.js +253 -0
- package/dist/Store/SQL/query.d.ts +49 -0
- package/dist/Store/SQL/query.d.ts.map +1 -0
- package/dist/Store/SQL/query.js +527 -0
- package/dist/Store/SQL.d.ts +21 -0
- package/dist/Store/SQL.d.ts.map +1 -0
- package/dist/Store/SQL.js +472 -0
- package/dist/Store/codeFilter.d.ts +4 -4
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +6 -4
- package/dist/Store/index.d.ts +6 -4
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +18 -5
- package/dist/Store/utils.d.ts +5 -2
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +9 -5
- package/dist/WorkflowEngineCosmos.d.ts +29 -0
- package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
- package/dist/WorkflowEngineCosmos.js +542 -0
- package/dist/WorkflowEngineSqlite.d.ts +24 -0
- package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
- package/dist/WorkflowEngineSqlite.js +550 -0
- package/dist/arbs.d.ts +1 -1
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +5 -3
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +5 -0
- package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
- package/dist/cosmos-client.d.ts.map +1 -0
- package/dist/cosmos-client.js +11 -0
- package/dist/errorReporter.d.ts +6 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +23 -27
- package/dist/fileUtil.d.ts +1 -1
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/fileUtil.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/internal/RequestContextMiddleware.d.ts +5 -0
- package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
- package/dist/internal/RequestContextMiddleware.js +45 -0
- package/dist/internal/auth.d.ts +53 -0
- package/dist/internal/auth.d.ts.map +1 -0
- package/dist/internal/auth.js +180 -0
- package/dist/internal/events.d.ts +11 -0
- package/dist/internal/events.d.ts.map +1 -0
- package/dist/internal/events.js +49 -0
- package/dist/internal/health.d.ts.map +1 -0
- package/dist/internal/health.js +5 -0
- package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
- package/dist/layerUtils.d.ts.map +1 -0
- package/dist/layerUtils.js +17 -0
- package/dist/logger/jsonLogger.d.ts +1 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +5 -3
- package/dist/logger/logFmtLogger.d.ts +1 -1
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +3 -3
- package/dist/logger/shared.d.ts +2 -2
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +5 -5
- package/dist/logger.d.ts.map +1 -1
- package/dist/middlewares.d.ts.map +1 -0
- package/dist/{api/middlewares.js → middlewares.js} +1 -1
- package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
- package/dist/mongo-client.d.ts.map +1 -0
- package/dist/mongo-client.js +15 -0
- package/dist/otel.d.ts +75 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +84 -0
- package/dist/rateLimit.d.ts +11 -3
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +7 -12
- package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +5 -2
- package/dist/redis-client.d.ts.map +1 -0
- package/dist/redis-client.js +98 -0
- package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
- package/dist/reportError.d.ts.map +1 -0
- package/dist/reportError.js +28 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
- package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
- package/dist/routing/middleware/middleware.d.ts +48 -0
- package/dist/routing/middleware/middleware.d.ts.map +1 -0
- package/dist/routing/middleware/middleware.js +152 -0
- package/dist/{api/routing → routing}/middleware.d.ts +0 -1
- package/dist/routing/middleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware.js +1 -2
- package/dist/routing/schema/jwt.d.ts.map +1 -0
- package/dist/routing/schema/jwt.js +13 -0
- package/dist/routing/tsort.d.ts.map +1 -0
- package/dist/routing/tsort.js +51 -0
- package/dist/{api/routing → routing}/utils.d.ts +3 -3
- package/dist/routing/utils.d.ts.map +1 -0
- package/dist/routing/utils.js +45 -0
- package/dist/routing.d.ts +182 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +256 -0
- package/dist/test.d.ts +2 -2
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +2 -2
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +14 -0
- package/docs/cluster-storage.md +26 -0
- package/docs/workflow-engine.md +262 -0
- package/examples/query.ts +47 -39
- package/package.json +38 -352
- package/src/CUPS.ts +53 -14
- package/src/ClusterCosmos.ts +1118 -0
- package/src/ClusterServiceBus.ts +242 -0
- package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
- package/src/Emailer/Sendgrid.ts +83 -60
- package/src/Emailer/fake.ts +4 -4
- package/src/MainFiberSet.ts +32 -13
- package/src/QueueMaker/errors.ts +3 -1
- package/src/{adapters/SQL → SQL}/Model.ts +42 -41
- package/src/SQL.ts +1 -0
- package/src/Store/Cosmos/query.ts +218 -54
- package/src/Store/Cosmos.ts +529 -365
- package/src/Store/Disk.ts +112 -70
- package/src/Store/Memory.ts +365 -99
- package/src/Store/SQL/Pg.ts +389 -0
- package/src/Store/SQL/query.ts +603 -0
- package/src/Store/SQL.ts +766 -0
- package/src/Store/codeFilter.ts +8 -6
- package/src/Store/index.ts +25 -10
- package/src/Store/utils.ts +32 -25
- package/src/WorkflowEngineCosmos.ts +749 -0
- package/src/WorkflowEngineSqlite.ts +813 -0
- package/src/arbs.ts +5 -3
- package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
- package/src/errorReporter.ts +68 -78
- package/src/fileUtil.ts +1 -1
- package/src/index.ts +2 -1
- package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
- package/src/internal/auth.ts +272 -0
- package/src/{api/internal → internal}/events.ts +22 -13
- package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
- package/src/logger/jsonLogger.ts +5 -3
- package/src/logger/logFmtLogger.ts +3 -3
- package/src/logger/shared.ts +5 -4
- package/src/middlewares.ts +10 -0
- package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
- package/src/otel.ts +177 -0
- package/src/rateLimit.ts +34 -23
- package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
- package/src/{api/reportError.ts → reportError.ts} +3 -2
- package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
- package/src/routing/middleware/middleware.ts +196 -0
- package/src/routing/middleware.ts +4 -0
- package/src/{api/routing → routing}/schema/jwt.ts +2 -1
- package/src/{api/routing → routing}/utils.ts +2 -1
- package/src/routing.ts +823 -0
- package/src/test.ts +4 -4
- package/src/vitest.ts +1 -1
- package/test/auth.test.ts +101 -0
- package/test/cluster-cosmos.test.ts +612 -0
- package/test/cluster-servicebus.test.ts +180 -0
- package/test/cluster-sqlite.test.ts +205 -0
- package/test/contextProvider.test.ts +15 -12
- package/test/controller.test.ts +28 -32
- package/test/cosmos-query.test.ts +228 -0
- package/test/dist/auth.test.d.ts.map +1 -0
- package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
- package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
- package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/cosmos-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +29 -11
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +17 -10
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/repository-ext.test.d.ts.map +1 -0
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/router-generator.test.d.ts.map +1 -0
- package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
- package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
- package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
- package/test/dist/sql-store.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
- package/test/fixtures.ts +16 -9
- package/test/layerUtils.test.ts +2 -2
- package/test/query.test.ts +1130 -41
- package/test/rawQuery.test.ts +340 -22
- package/test/repository-ext.test.ts +426 -0
- package/test/requires.test.ts +10 -5
- package/test/router-generator.test.ts +187 -0
- package/test/routing-interruptibility.test.ts +66 -0
- package/test/rpc-context-map-streaming.test.ts +262 -0
- package/test/rpc-e2e-invalidation.test.ts +418 -0
- package/test/rpc-multi-middleware.test.ts +85 -10
- package/test/rpc-stream-fullstack.test.ts +304 -0
- package/test/sql-store.test.ts +1711 -0
- package/test/validateSample.test.ts +26 -14
- package/test/workflow-engine-cosmos.test.ts +345 -0
- package/test/workflow-engine-sqlite.test.ts +297 -0
- package/tsconfig.examples.json +1 -1
- package/tsconfig.json +9 -2
- package/tsconfig.src.json +35 -35
- package/tsconfig.test.json +2 -2
- package/dist/Emailer/service.d.ts +0 -55
- package/dist/Emailer/service.d.ts.map +0 -1
- package/dist/Emailer/service.js +0 -6
- package/dist/Emailer.d.ts +0 -2
- package/dist/Emailer.d.ts.map +0 -1
- package/dist/Emailer.js +0 -2
- package/dist/Model/Repository/ext.d.ts +0 -41
- package/dist/Model/Repository/ext.d.ts.map +0 -1
- package/dist/Model/Repository/ext.js +0 -65
- package/dist/Model/Repository/internal/internal.d.ts +0 -59
- package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
- package/dist/Model/Repository/internal/internal.js +0 -316
- package/dist/Model/Repository/legacy.d.ts +0 -19
- package/dist/Model/Repository/legacy.d.ts.map +0 -1
- package/dist/Model/Repository/legacy.js +0 -2
- package/dist/Model/Repository/makeRepo.d.ts +0 -49
- package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
- package/dist/Model/Repository/makeRepo.js +0 -24
- package/dist/Model/Repository/service.d.ts +0 -89
- package/dist/Model/Repository/service.d.ts.map +0 -1
- package/dist/Model/Repository/service.js +0 -2
- package/dist/Model/Repository/validation.d.ts +0 -42
- package/dist/Model/Repository/validation.d.ts.map +0 -1
- package/dist/Model/Repository/validation.js +0 -32
- package/dist/Model/Repository.d.ts +0 -6
- package/dist/Model/Repository.d.ts.map +0 -1
- package/dist/Model/Repository.js +0 -6
- package/dist/Model/dsl.d.ts +0 -32
- package/dist/Model/dsl.d.ts.map +0 -1
- package/dist/Model/dsl.js +0 -44
- package/dist/Model/filter/filterApi.d.ts +0 -30
- package/dist/Model/filter/filterApi.d.ts.map +0 -1
- package/dist/Model/filter/filterApi.js +0 -2
- package/dist/Model/filter/types/errors.d.ts +0 -29
- package/dist/Model/filter/types/errors.d.ts.map +0 -1
- package/dist/Model/filter/types/errors.js +0 -2
- package/dist/Model/filter/types/fields.d.ts +0 -15
- package/dist/Model/filter/types/fields.d.ts.map +0 -1
- package/dist/Model/filter/types/fields.js +0 -2
- package/dist/Model/filter/types/path/common.d.ts +0 -316
- package/dist/Model/filter/types/path/common.d.ts.map +0 -1
- package/dist/Model/filter/types/path/common.js +0 -2
- package/dist/Model/filter/types/path/eager.d.ts +0 -95
- package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
- package/dist/Model/filter/types/path/eager.js +0 -31
- package/dist/Model/filter/types/path/index.d.ts +0 -4
- package/dist/Model/filter/types/path/index.d.ts.map +0 -1
- package/dist/Model/filter/types/path/index.js +0 -3
- package/dist/Model/filter/types/utils.d.ts +0 -79
- package/dist/Model/filter/types/utils.d.ts.map +0 -1
- package/dist/Model/filter/types/utils.js +0 -2
- package/dist/Model/filter/types/validator.d.ts +0 -30
- package/dist/Model/filter/types/validator.d.ts.map +0 -1
- package/dist/Model/filter/types/validator.js +0 -2
- package/dist/Model/filter/types.d.ts +0 -5
- package/dist/Model/filter/types.d.ts.map +0 -1
- package/dist/Model/filter/types.js +0 -7
- package/dist/Model/query/dsl.d.ts +0 -248
- package/dist/Model/query/dsl.d.ts.map +0 -1
- package/dist/Model/query/dsl.js +0 -104
- package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
- package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
- package/dist/Model/query/new-kid-interpreter.js +0 -165
- package/dist/Model/query.d.ts +0 -15
- package/dist/Model/query.d.ts.map +0 -1
- package/dist/Model/query.js +0 -3
- package/dist/Model.d.ts +0 -4
- package/dist/Model.d.ts.map +0 -1
- package/dist/Model.js +0 -4
- package/dist/Operations.d.ts +0 -55
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -102
- package/dist/OperationsRepo.d.ts +0 -41
- package/dist/OperationsRepo.d.ts.map +0 -1
- package/dist/OperationsRepo.js +0 -14
- package/dist/QueueMaker/SQLQueue.d.ts +0 -16
- package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
- package/dist/QueueMaker/SQLQueue.js +0 -130
- package/dist/QueueMaker/memQueue.d.ts +0 -11
- package/dist/QueueMaker/memQueue.d.ts.map +0 -1
- package/dist/QueueMaker/memQueue.js +0 -76
- package/dist/QueueMaker/sbqueue.d.ts +0 -12
- package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
- package/dist/QueueMaker/sbqueue.js +0 -91
- package/dist/QueueMaker/service.d.ts +0 -11
- package/dist/QueueMaker/service.d.ts.map +0 -1
- package/dist/QueueMaker/service.js +0 -4
- package/dist/RequestContext.d.ts +0 -63
- package/dist/RequestContext.d.ts.map +0 -1
- package/dist/RequestContext.js +0 -49
- package/dist/RequestFiberSet.d.ts +0 -36
- package/dist/RequestFiberSet.d.ts.map +0 -1
- package/dist/RequestFiberSet.js +0 -78
- package/dist/Store/ContextMapContainer.d.ts +0 -14
- package/dist/Store/ContextMapContainer.d.ts.map +0 -1
- package/dist/Store/ContextMapContainer.js +0 -16
- package/dist/Store/service.d.ts +0 -108
- package/dist/Store/service.d.ts.map +0 -1
- package/dist/Store/service.js +0 -71
- package/dist/Store.d.ts +0 -2
- package/dist/Store.d.ts.map +0 -1
- package/dist/Store.js +0 -2
- package/dist/adapters/SQL/Model.d.ts.map +0 -1
- package/dist/adapters/SQL/Model.js +0 -478
- package/dist/adapters/SQL.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.d.ts +0 -58
- package/dist/adapters/ServiceBus.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.js +0 -99
- package/dist/adapters/cosmos-client.d.ts.map +0 -1
- package/dist/adapters/cosmos-client.js +0 -9
- package/dist/adapters/index.d.ts +0 -2
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -2
- package/dist/adapters/logger.d.ts +0 -9
- package/dist/adapters/logger.d.ts.map +0 -1
- package/dist/adapters/logger.js +0 -3
- package/dist/adapters/memQueue.d.ts +0 -13
- package/dist/adapters/memQueue.d.ts.map +0 -1
- package/dist/adapters/memQueue.js +0 -20
- package/dist/adapters/mongo-client.d.ts.map +0 -1
- package/dist/adapters/mongo-client.js +0 -13
- package/dist/adapters/redis-client.d.ts.map +0 -1
- package/dist/adapters/redis-client.js +0 -94
- package/dist/api/ContextProvider.d.ts +0 -31
- package/dist/api/ContextProvider.d.ts.map +0 -1
- package/dist/api/ContextProvider.js +0 -38
- package/dist/api/codec.d.ts.map +0 -1
- package/dist/api/codec.js +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
- package/dist/api/internal/RequestContextMiddleware.js +0 -35
- package/dist/api/internal/auth.d.ts +0 -15
- package/dist/api/internal/auth.d.ts.map +0 -1
- package/dist/api/internal/auth.js +0 -47
- package/dist/api/internal/events.d.ts +0 -9
- package/dist/api/internal/events.d.ts.map +0 -1
- package/dist/api/internal/events.js +0 -42
- package/dist/api/internal/health.d.ts.map +0 -1
- package/dist/api/internal/health.js +0 -5
- package/dist/api/layerUtils.d.ts.map +0 -1
- package/dist/api/layerUtils.js +0 -16
- package/dist/api/middlewares.d.ts.map +0 -1
- package/dist/api/reportError.d.ts.map +0 -1
- package/dist/api/reportError.js +0 -27
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.d.ts +0 -9
- package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.js +0 -92
- package/dist/api/routing/middleware.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.js +0 -12
- package/dist/api/routing/tsort.d.ts.map +0 -1
- package/dist/api/routing/tsort.js +0 -51
- package/dist/api/routing/utils.d.ts.map +0 -1
- package/dist/api/routing/utils.js +0 -44
- package/dist/api/routing.d.ts +0 -138
- package/dist/api/routing.d.ts.map +0 -1
- package/dist/api/routing.js +0 -166
- package/dist/api/setupRequest.d.ts +0 -12
- package/dist/api/setupRequest.d.ts.map +0 -1
- package/dist/api/setupRequest.js +0 -44
- package/dist/api/util.d.ts.map +0 -1
- package/dist/api/util.js +0 -14
- package/eslint.config.mjs +0 -24
- package/src/Emailer/service.ts +0 -52
- package/src/Emailer.ts +0 -1
- package/src/Model/Repository/ext.ts +0 -283
- package/src/Model/Repository/internal/internal.ts +0 -577
- package/src/Model/Repository/legacy.ts +0 -27
- package/src/Model/Repository/makeRepo.ts +0 -139
- package/src/Model/Repository/service.ts +0 -627
- package/src/Model/Repository/validation.ts +0 -31
- package/src/Model/Repository.ts +0 -5
- package/src/Model/dsl.ts +0 -128
- package/src/Model/filter/filterApi.ts +0 -60
- package/src/Model/filter/types/errors.ts +0 -47
- package/src/Model/filter/types/fields.ts +0 -50
- package/src/Model/filter/types/path/common.ts +0 -404
- package/src/Model/filter/types/path/eager.ts +0 -298
- package/src/Model/filter/types/path/index.ts +0 -4
- package/src/Model/filter/types/utils.ts +0 -128
- package/src/Model/filter/types/validator.ts +0 -46
- package/src/Model/filter/types.ts +0 -6
- package/src/Model/query/dsl.ts +0 -2110
- package/src/Model/query/new-kid-interpreter.ts +0 -210
- package/src/Model/query.ts +0 -13
- package/src/Model.ts +0 -3
- package/src/Operations.ts +0 -235
- package/src/OperationsRepo.ts +0 -16
- package/src/QueueMaker/SQLQueue.ts +0 -189
- package/src/QueueMaker/memQueue.ts +0 -130
- package/src/QueueMaker/sbqueue.ts +0 -137
- package/src/QueueMaker/service.ts +0 -17
- package/src/RequestContext.ts +0 -63
- package/src/RequestFiberSet.ts +0 -105
- package/src/Store/ContextMapContainer.ts +0 -20
- package/src/Store/index.test.ts.bak +0 -112
- package/src/Store/service.ts +0 -184
- package/src/Store.ts +0 -1
- package/src/adapters/SQL.ts +0 -1
- package/src/adapters/ServiceBus.ts +0 -209
- package/src/adapters/index.ts +0 -0
- package/src/adapters/logger.ts +0 -3
- package/src/adapters/memQueue.ts +0 -21
- package/src/api/internal/auth.ts +0 -68
- package/src/api/middlewares.ts +0 -10
- package/src/api/routing/middleware/middleware.ts +0 -128
- package/src/api/routing/middleware.ts +0 -6
- package/src/api/routing.ts +0 -598
- package/src/api/setupRequest.ts +0 -84
- package/tsconfig.json.bak +0 -12
- /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
- /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
- /package/dist/{api/internal → internal}/health.d.ts +0 -0
- /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
- /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
- /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
- /package/dist/{api/util.d.ts → util.d.ts} +0 -0
- /package/src/{api/codec.ts → codec.ts} +0 -0
- /package/src/{api/internal → internal}/health.ts +0 -0
- /package/src/{api/routing → routing}/tsort.ts +0 -0
- /package/src/{api/util.ts → util.ts} +0 -0
|
@@ -24,6 +24,7 @@ import * as VariantSchema from "effect/unstable/schema/VariantSchema"
|
|
|
24
24
|
import { SqlClient } from "effect/unstable/sql/SqlClient"
|
|
25
25
|
import * as SqlResolver from "effect/unstable/sql/SqlResolver"
|
|
26
26
|
import * as SqlSchema from "effect/unstable/sql/SqlSchema"
|
|
27
|
+
import { type DbSystem, withDbSpan } from "../otel.ts"
|
|
27
28
|
|
|
28
29
|
const {
|
|
29
30
|
Class,
|
|
@@ -73,7 +74,7 @@ export {
|
|
|
73
74
|
* @since 1.0.0
|
|
74
75
|
* @category constructors
|
|
75
76
|
* @example
|
|
76
|
-
* import
|
|
77
|
+
* import * as Schema from "effect/Schema"
|
|
77
78
|
* import { Model } from "effect/unstable/schema"
|
|
78
79
|
*
|
|
79
80
|
* export const GroupId = Schema.Number.pipe(Schema.brand("GroupId"))
|
|
@@ -545,9 +546,15 @@ export const DateTimeUpdateFromNumber: DateTimeUpdateFromNumber = Field({
|
|
|
545
546
|
*/
|
|
546
547
|
export interface JsonFromString<S extends Schema.Top> extends
|
|
547
548
|
VariantSchema.Field<{
|
|
548
|
-
readonly select: Schema.fromJsonString<
|
|
549
|
-
|
|
550
|
-
|
|
549
|
+
readonly select: Schema.fromJsonString<
|
|
550
|
+
Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
|
|
551
|
+
>
|
|
552
|
+
readonly insert: Schema.fromJsonString<
|
|
553
|
+
Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
|
|
554
|
+
>
|
|
555
|
+
readonly update: Schema.fromJsonString<
|
|
556
|
+
Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
|
|
557
|
+
>
|
|
551
558
|
readonly json: S
|
|
552
559
|
readonly jsonCreate: S
|
|
553
560
|
readonly jsonUpdate: S
|
|
@@ -565,7 +572,7 @@ export interface JsonFromString<S extends Schema.Top> extends
|
|
|
565
572
|
export const JsonFromString = <S extends Schema.Top>(
|
|
566
573
|
schema: S
|
|
567
574
|
): JsonFromString<S> => {
|
|
568
|
-
const parsed = Schema.fromJsonString(schema)
|
|
575
|
+
const parsed = Schema.fromJsonString(Schema.toCodecJson(schema))
|
|
569
576
|
return Field({
|
|
570
577
|
select: parsed,
|
|
571
578
|
insert: parsed,
|
|
@@ -590,6 +597,7 @@ export const makeRepository = <
|
|
|
590
597
|
readonly spanPrefix: string
|
|
591
598
|
readonly idColumn: Id
|
|
592
599
|
readonly versionColumn?: string | undefined
|
|
600
|
+
readonly dbSystem?: DbSystem | undefined
|
|
593
601
|
}): Effect.Effect<
|
|
594
602
|
{
|
|
595
603
|
readonly insert: (
|
|
@@ -623,6 +631,15 @@ export const makeRepository = <
|
|
|
623
631
|
const idSchema = Model.fields[options.idColumn] as Schema.Top
|
|
624
632
|
const idColumn = options.idColumn as string
|
|
625
633
|
const versionColumn = options.versionColumn
|
|
634
|
+
const system: DbSystem = options.dbSystem ?? "other_sql"
|
|
635
|
+
const opSpan = (operation: string, idValue?: unknown) =>
|
|
636
|
+
withDbSpan({
|
|
637
|
+
operation,
|
|
638
|
+
system,
|
|
639
|
+
collection: options.tableName,
|
|
640
|
+
entity: options.spanPrefix,
|
|
641
|
+
...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
|
|
642
|
+
})
|
|
626
643
|
|
|
627
644
|
const insertSchema = SqlSchema.findOne({
|
|
628
645
|
Request: Model.insert,
|
|
@@ -644,9 +661,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
644
661
|
): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["insert"]["EncodingServices"]> =>
|
|
645
662
|
insertSchema(insert).pipe(
|
|
646
663
|
Effect.catchTag("NoSuchElementError", Effect.die),
|
|
647
|
-
|
|
648
|
-
captureStackTrace: false
|
|
649
|
-
})
|
|
664
|
+
opSpan("insert")
|
|
650
665
|
) as any
|
|
651
666
|
|
|
652
667
|
const insertVoidSchema = SqlSchema.void({
|
|
@@ -657,9 +672,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
657
672
|
insert: S["insert"]["Type"]
|
|
658
673
|
): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
|
|
659
674
|
insertVoidSchema(insert).pipe(
|
|
660
|
-
|
|
661
|
-
captureStackTrace: false
|
|
662
|
-
})
|
|
675
|
+
opSpan("insertVoid")
|
|
663
676
|
) as any
|
|
664
677
|
|
|
665
678
|
const updateSchema = SqlSchema.findOne({
|
|
@@ -706,11 +719,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
706
719
|
): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["update"]["EncodingServices"]> =>
|
|
707
720
|
updateSchema(update).pipe(
|
|
708
721
|
Effect.catchTag("NoSuchElementError", Effect.die),
|
|
709
|
-
|
|
710
|
-
attributes: { id: (update as any)[idColumn] }
|
|
711
|
-
}, {
|
|
712
|
-
captureStackTrace: false
|
|
713
|
-
})
|
|
722
|
+
opSpan("update", (update as any)[idColumn])
|
|
714
723
|
) as any
|
|
715
724
|
|
|
716
725
|
const updateVoidSchema = SqlSchema.void({
|
|
@@ -729,11 +738,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
729
738
|
update: S["update"]["Type"]
|
|
730
739
|
): Effect.Effect<void, Schema.SchemaError, S["update"]["EncodingServices"]> =>
|
|
731
740
|
updateVoidSchema(update).pipe(
|
|
732
|
-
|
|
733
|
-
attributes: { id: (update as any)[idColumn] }
|
|
734
|
-
}, {
|
|
735
|
-
captureStackTrace: false
|
|
736
|
-
})
|
|
741
|
+
opSpan("updateVoid", (update as any)[idColumn])
|
|
737
742
|
) as any
|
|
738
743
|
|
|
739
744
|
const findByIdSchema = SqlSchema.findOneOption({
|
|
@@ -749,9 +754,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
749
754
|
S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
|
|
750
755
|
> =>
|
|
751
756
|
findByIdSchema(id).pipe(
|
|
752
|
-
|
|
753
|
-
captureStackTrace: false
|
|
754
|
-
})
|
|
757
|
+
opSpan("findById", id)
|
|
755
758
|
) as any
|
|
756
759
|
|
|
757
760
|
const deleteSchema = SqlSchema.void({
|
|
@@ -762,11 +765,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
762
765
|
id: S["fields"][Id]["Type"]
|
|
763
766
|
): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
|
|
764
767
|
deleteSchema(id).pipe(
|
|
765
|
-
|
|
766
|
-
attributes: { id }
|
|
767
|
-
}, {
|
|
768
|
-
captureStackTrace: false
|
|
769
|
-
})
|
|
768
|
+
opSpan("delete", id)
|
|
770
769
|
) as any
|
|
771
770
|
|
|
772
771
|
return { insert, insertVoid, update, updateVoid, findById, delete: delete_ } as const
|
|
@@ -789,6 +788,7 @@ export const makeDataLoaders = <
|
|
|
789
788
|
readonly idColumn: Id
|
|
790
789
|
readonly window: Input
|
|
791
790
|
readonly maxBatchSize?: number | undefined
|
|
791
|
+
readonly dbSystem?: DbSystem | undefined
|
|
792
792
|
}
|
|
793
793
|
): Effect.Effect<
|
|
794
794
|
{
|
|
@@ -821,6 +821,15 @@ export const makeDataLoaders = <
|
|
|
821
821
|
const idSchema = Model.fields[options.idColumn] as Schema.Top
|
|
822
822
|
const idColumn = options.idColumn as string
|
|
823
823
|
const setMaxBatchSize = options.maxBatchSize ? RequestResolver.batchN(options.maxBatchSize) : identity
|
|
824
|
+
const system: DbSystem = options.dbSystem ?? "other_sql"
|
|
825
|
+
const opSpan = (operation: string, idValue?: unknown) =>
|
|
826
|
+
withDbSpan({
|
|
827
|
+
operation,
|
|
828
|
+
system,
|
|
829
|
+
collection: options.tableName,
|
|
830
|
+
entity: options.spanPrefix,
|
|
831
|
+
...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
|
|
832
|
+
})
|
|
824
833
|
|
|
825
834
|
const insertResolver = SqlResolver
|
|
826
835
|
.ordered({
|
|
@@ -854,9 +863,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
854
863
|
> =>
|
|
855
864
|
insertExecute(insert).pipe(
|
|
856
865
|
Effect.catchTag("ResultLengthMismatch", Effect.die),
|
|
857
|
-
|
|
858
|
-
captureStackTrace: false
|
|
859
|
-
})
|
|
866
|
+
opSpan("insert")
|
|
860
867
|
) as any
|
|
861
868
|
|
|
862
869
|
const insertVoidResolver = SqlResolver
|
|
@@ -874,9 +881,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
874
881
|
insert: S["insert"]["Type"]
|
|
875
882
|
): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
|
|
876
883
|
insertVoidExecute(insert).pipe(
|
|
877
|
-
|
|
878
|
-
captureStackTrace: false
|
|
879
|
-
})
|
|
884
|
+
opSpan("insertVoid")
|
|
880
885
|
) as any
|
|
881
886
|
|
|
882
887
|
const findByIdResolver = SqlResolver
|
|
@@ -902,9 +907,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
902
907
|
S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
|
|
903
908
|
> =>
|
|
904
909
|
findByIdExecute(id).pipe(
|
|
905
|
-
|
|
906
|
-
captureStackTrace: false
|
|
907
|
-
})
|
|
910
|
+
opSpan("findById", id)
|
|
908
911
|
) as any
|
|
909
912
|
|
|
910
913
|
const deleteResolver = SqlResolver
|
|
@@ -922,9 +925,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
922
925
|
id: S["fields"][Id]["Type"]
|
|
923
926
|
): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
|
|
924
927
|
deleteExecute(id).pipe(
|
|
925
|
-
|
|
926
|
-
captureStackTrace: false
|
|
927
|
-
})
|
|
928
|
+
opSpan("delete", id)
|
|
928
929
|
) as any
|
|
929
930
|
|
|
930
931
|
return { insert, insertVoid, findById, delete: delete_ } as const
|
package/src/SQL.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as SQLModel from "./SQL/Model.ts"
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
|
-
import
|
|
3
|
+
import * as Array from "effect-app/Array"
|
|
4
|
+
import type { NonEmptyReadonlyArray } from "effect-app/Array"
|
|
5
|
+
import * as Effect from "effect-app/Effect"
|
|
6
|
+
import type { FilterR, FilterResult, Ops } from "effect-app/Model/filter/filterApi"
|
|
7
|
+
import type { AggregateIrExpression, ComputedProjectionIrExpression, ComputedProjectionMathIrExpression } from "effect-app/Model/query"
|
|
8
|
+
import type { SupportedValues } from "effect-app/Store"
|
|
4
9
|
import { assertUnreachable } from "effect-app/utils"
|
|
5
|
-
import { InfraLogger } from "../../logger.
|
|
6
|
-
import
|
|
7
|
-
import { isRelationCheck } from "../codeFilter.js"
|
|
8
|
-
import type { SupportedValues } from "../service.js"
|
|
10
|
+
import { InfraLogger } from "../../logger.ts"
|
|
11
|
+
import { isRelationCheck } from "../codeFilter.ts"
|
|
9
12
|
|
|
10
13
|
export function logQuery(q: {
|
|
11
14
|
query: string
|
|
@@ -40,12 +43,26 @@ export function buildWhereCosmosQuery3(
|
|
|
40
43
|
filter: readonly FilterResult[],
|
|
41
44
|
name: string,
|
|
42
45
|
defaultValues: Record<string, unknown>,
|
|
43
|
-
select?: NonEmptyReadonlyArray<
|
|
46
|
+
select?: NonEmptyReadonlyArray<
|
|
47
|
+
string | {
|
|
48
|
+
key: string
|
|
49
|
+
subKeys: readonly string[]
|
|
50
|
+
} | {
|
|
51
|
+
key: string
|
|
52
|
+
computed: ComputedProjectionIrExpression
|
|
53
|
+
} | {
|
|
54
|
+
key: string
|
|
55
|
+
path: string
|
|
56
|
+
} | {
|
|
57
|
+
key: string
|
|
58
|
+
aggregate: AggregateIrExpression
|
|
59
|
+
}
|
|
60
|
+
>,
|
|
44
61
|
order?: NonEmptyReadonlyArray<{ key: string; direction: "ASC" | "DESC" }>,
|
|
45
62
|
skip?: number,
|
|
46
63
|
limit?: number
|
|
47
64
|
) {
|
|
48
|
-
const statement = (x: FilterR, i: number
|
|
65
|
+
const statement = (x: FilterR, i: number) => {
|
|
49
66
|
if (x.path === idKey) {
|
|
50
67
|
x = { ...x, path: "id" }
|
|
51
68
|
}
|
|
@@ -60,8 +77,6 @@ export function buildWhereCosmosQuery3(
|
|
|
60
77
|
|
|
61
78
|
const v = "@v" + i
|
|
62
79
|
|
|
63
|
-
const realValue = values[i]
|
|
64
|
-
|
|
65
80
|
switch (x.op) {
|
|
66
81
|
case "in":
|
|
67
82
|
return `ARRAY_CONTAINS(${v}, ${k})`
|
|
@@ -74,14 +89,22 @@ export function buildWhereCosmosQuery3(
|
|
|
74
89
|
return `(NOT ARRAY_CONTAINS(${k}, ${v}))`
|
|
75
90
|
|
|
76
91
|
case "includes-any":
|
|
77
|
-
return `ARRAY_CONTAINS_ANY(${k}, ${
|
|
92
|
+
return `ARRAY_CONTAINS_ANY(${k}, ${
|
|
93
|
+
(x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
|
|
94
|
+
})`
|
|
78
95
|
case "notIncludes-any":
|
|
79
|
-
return `(NOT ARRAY_CONTAINS_ANY(${k}, ${
|
|
96
|
+
return `(NOT ARRAY_CONTAINS_ANY(${k}, ${
|
|
97
|
+
(x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
|
|
98
|
+
}))`
|
|
80
99
|
|
|
81
100
|
case "includes-all":
|
|
82
|
-
return `ARRAY_CONTAINS_ALL(${k}, ${
|
|
101
|
+
return `ARRAY_CONTAINS_ALL(${k}, ${
|
|
102
|
+
(x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
|
|
103
|
+
})`
|
|
83
104
|
case "notIncludes-all":
|
|
84
|
-
return `(NOT ARRAY_CONTAINS_ALL(${k}, ${
|
|
105
|
+
return `(NOT ARRAY_CONTAINS_ALL(${k}, ${
|
|
106
|
+
(x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
|
|
107
|
+
}))`
|
|
85
108
|
|
|
86
109
|
case "contains":
|
|
87
110
|
return `CONTAINS(${k}, ${v}, true)`
|
|
@@ -165,7 +188,7 @@ export function buildWhereCosmosQuery3(
|
|
|
165
188
|
: _
|
|
166
189
|
: _
|
|
167
190
|
|
|
168
|
-
const print = (state: readonly FilterResult[],
|
|
191
|
+
const print = (state: readonly FilterResult[], isRelation: string | null, every: boolean) => {
|
|
169
192
|
let s = ""
|
|
170
193
|
let l = 0
|
|
171
194
|
const printN = (n: number) => {
|
|
@@ -174,13 +197,13 @@ export function buildWhereCosmosQuery3(
|
|
|
174
197
|
for (const e of state) {
|
|
175
198
|
switch (e.t) {
|
|
176
199
|
case "where":
|
|
177
|
-
s += statement(e, i
|
|
200
|
+
s += statement(e, i++)
|
|
178
201
|
break
|
|
179
202
|
case "or":
|
|
180
|
-
s += ` OR ${statement(e, i
|
|
203
|
+
s += ` OR ${statement(e, i++)}`
|
|
181
204
|
break
|
|
182
205
|
case "and":
|
|
183
|
-
s += ` AND ${statement(e, i
|
|
206
|
+
s += ` AND ${statement(e, i++)}`
|
|
184
207
|
break
|
|
185
208
|
case "or-scope": {
|
|
186
209
|
++l
|
|
@@ -189,7 +212,7 @@ export function buildWhereCosmosQuery3(
|
|
|
189
212
|
if (rel) {
|
|
190
213
|
const rel = (e.result[0]! as { path: string }).path.split(".-1.")[0]
|
|
191
214
|
s += isRelation
|
|
192
|
-
? ` OR (\n${printN(l + 1)}${print(e.result,
|
|
215
|
+
? ` OR (\n${printN(l + 1)}${print(e.result, rel, every)}\n${printN(l)})`
|
|
193
216
|
: ` OR (\n${printN(l + 1)}${
|
|
194
217
|
every ? "NOT " : ""
|
|
195
218
|
}EXISTS(SELECT VALUE ${rel} FROM ${rel} IN f.${rel} WHERE ${
|
|
@@ -197,13 +220,12 @@ export function buildWhereCosmosQuery3(
|
|
|
197
220
|
e
|
|
198
221
|
.result
|
|
199
222
|
.map(flip(every)),
|
|
200
|
-
values,
|
|
201
223
|
rel,
|
|
202
224
|
every
|
|
203
225
|
)
|
|
204
226
|
}))`
|
|
205
227
|
} else {
|
|
206
|
-
s += ` OR (\n${printN(l + 1)}${print(e.result,
|
|
228
|
+
s += ` OR (\n${printN(l + 1)}${print(e.result, null, every)}\n${printN(l)})`
|
|
207
229
|
}
|
|
208
230
|
--l
|
|
209
231
|
break
|
|
@@ -215,14 +237,14 @@ export function buildWhereCosmosQuery3(
|
|
|
215
237
|
if (rel) {
|
|
216
238
|
const rel = (e.result[0]! as { path: string }).path.split(".-1.")[0]
|
|
217
239
|
s += isRelation
|
|
218
|
-
? ` AND (\n${printN(l + 1)}${print(e.result,
|
|
240
|
+
? ` AND (\n${printN(l + 1)}${print(e.result, rel, every)}\n${printN(l)})`
|
|
219
241
|
: ` AND (\n${printN(l + 1)}${
|
|
220
242
|
every ? "NOT " : ""
|
|
221
243
|
}EXISTS(SELECT VALUE ${rel} FROM ${rel} IN f.${rel} WHERE ${
|
|
222
|
-
print(e.result.map(flip(every)),
|
|
244
|
+
print(e.result.map(flip(every)), rel, every)
|
|
223
245
|
}))`
|
|
224
246
|
} else {
|
|
225
|
-
s += ` AND (\n${printN(l + 1)}${print(e.result,
|
|
247
|
+
s += ` AND (\n${printN(l + 1)}${print(e.result, null, every)}\n${printN(l)})`
|
|
226
248
|
}
|
|
227
249
|
--l
|
|
228
250
|
break
|
|
@@ -234,12 +256,12 @@ export function buildWhereCosmosQuery3(
|
|
|
234
256
|
if (rel) {
|
|
235
257
|
const rel = (e.result[0]! as { path: string }).path.split(".-1.")[0]
|
|
236
258
|
s += isRelation
|
|
237
|
-
? `(\n${printN(l + 1)}${print(e.result,
|
|
259
|
+
? `(\n${printN(l + 1)}${print(e.result, rel, every)}\n${printN(l)})`
|
|
238
260
|
: `(\n${printN(l + 1)}${every ? "NOT " : ""}EXISTS(SELECT VALUE ${rel} FROM ${rel} IN f.${rel} WHERE ${
|
|
239
|
-
print(e.result.map(flip(every)),
|
|
261
|
+
print(e.result.map(flip(every)), rel, every)
|
|
240
262
|
}))`
|
|
241
263
|
} else {
|
|
242
|
-
s += `(\n${printN(l + 1)}${print(e.result,
|
|
264
|
+
s += `(\n${printN(l + 1)}${print(e.result, null, every)}\n${printN(l)})`
|
|
243
265
|
}
|
|
244
266
|
// ;--l
|
|
245
267
|
break
|
|
@@ -272,40 +294,182 @@ export function buildWhereCosmosQuery3(
|
|
|
272
294
|
? getValues(_.result)
|
|
273
295
|
: [_]
|
|
274
296
|
)
|
|
275
|
-
const
|
|
297
|
+
const computedFilters = select
|
|
298
|
+
? select.flatMap((_) =>
|
|
299
|
+
typeof _ === "object" && "computed" in _ && "filter" in _.computed ? getValues(_.computed.filter) : []
|
|
300
|
+
)
|
|
301
|
+
: []
|
|
302
|
+
const aggregateFilters = select
|
|
303
|
+
? select.flatMap((_) =>
|
|
304
|
+
typeof _ === "object" && "aggregate" in _ && "filter" in _.aggregate ? getValues(_.aggregate.filter) : []
|
|
305
|
+
)
|
|
306
|
+
: []
|
|
307
|
+
const values = [...computedFilters, ...aggregateFilters, ...getValues(filter)]
|
|
308
|
+
|
|
309
|
+
const hasAggregates = select
|
|
310
|
+
? select.some((s) => typeof s === "object" && s !== null && "aggregate" in s)
|
|
311
|
+
: false
|
|
312
|
+
|
|
313
|
+
const aggregateSelectExpr = (key: string, agg: AggregateIrExpression): string => {
|
|
314
|
+
switch (agg._tag) {
|
|
315
|
+
case "agg-count":
|
|
316
|
+
return `COUNT(1) AS ${key}`
|
|
317
|
+
case "agg-count-when": {
|
|
318
|
+
if (agg.filter.length === 0) return `COUNT(1) AS ${key}`
|
|
319
|
+
const cond = print(agg.filter, null, false)
|
|
320
|
+
// Cosmos supports SUM(IIF(cond, 1, 0)) as a conditional count
|
|
321
|
+
return `SUM(IIF(${cond}, 1, 0)) AS ${key}`
|
|
322
|
+
}
|
|
323
|
+
case "agg-sum": {
|
|
324
|
+
const fieldRef = dottedToAccess(`f.${agg.field}`)
|
|
325
|
+
return `SUM(${fieldRef}) AS ${key}`
|
|
326
|
+
}
|
|
327
|
+
case "agg-min": {
|
|
328
|
+
const fieldRef = dottedToAccess(`f.${agg.field}`)
|
|
329
|
+
return `MIN(${fieldRef}) AS ${key}`
|
|
330
|
+
}
|
|
331
|
+
case "agg-max": {
|
|
332
|
+
const fieldRef = dottedToAccess(`f.${agg.field}`)
|
|
333
|
+
return `MAX(${fieldRef}) AS ${key}`
|
|
334
|
+
}
|
|
335
|
+
default:
|
|
336
|
+
return assertUnreachable(agg)
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const computedSelectExpr = (key: string, computed: ComputedProjectionIrExpression) => {
|
|
341
|
+
const relationPath = computed.path
|
|
342
|
+
const relationAlias = relationPath
|
|
343
|
+
const relationSource = dottedToAccess(`f.${relationPath}`)
|
|
344
|
+
const compileExpr = (expression: ComputedProjectionMathIrExpression): string => {
|
|
345
|
+
switch (expression._tag) {
|
|
346
|
+
case "field":
|
|
347
|
+
return dottedToAccess(`${relationAlias}.${expression.field}`)
|
|
348
|
+
case "mul":
|
|
349
|
+
return `(${compileExpr(expression.left)} * ${compileExpr(expression.right)})`
|
|
350
|
+
default:
|
|
351
|
+
return assertUnreachable(expression)
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const factorExpr = (unitExpr: string, toBase: string, factors: Readonly<Record<string, number>>) => {
|
|
355
|
+
const entries = Object.entries(factors).filter(([, factor]) => Number.isFinite(factor))
|
|
356
|
+
return entries.reduceRight<string>(
|
|
357
|
+
(acc, [unit, factor]) => `IIF(${unitExpr} = ${JSON.stringify(unit)}, ${factor}, ${acc})`,
|
|
358
|
+
`IIF(${unitExpr} = ${JSON.stringify(toBase)}, 1, 0)`
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
const filter = "filter" in computed ? computed.filter : []
|
|
362
|
+
// Print filter once — `print` mutates the outer `i` parameter counter, so
|
|
363
|
+
// re-walking the same filter would double-bump it and desync @v indices.
|
|
364
|
+
const filterSql = filter.length > 0 ? print(filter, relationPath, false) : ""
|
|
365
|
+
const where = filterSql ? ` WHERE ${filterSql}` : ""
|
|
366
|
+
switch (computed._tag) {
|
|
367
|
+
case "relation-count":
|
|
368
|
+
return `(SELECT VALUE COUNT(1) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
|
|
369
|
+
case "relation-any":
|
|
370
|
+
return `EXISTS(SELECT VALUE ${relationAlias} FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
|
|
371
|
+
case "relation-every": {
|
|
372
|
+
// ∀x.P(x) ≡ ¬∃x.¬P(x). Cosmos has no NOT(...) on EXISTS subqueries directly,
|
|
373
|
+
// but we can flip via NOT EXISTS(... WHERE NOT (filter)).
|
|
374
|
+
if (filter.length === 0) return `true AS ${key}`
|
|
375
|
+
return `NOT EXISTS(SELECT VALUE ${relationAlias} FROM ${relationAlias} IN ${relationSource} WHERE NOT (${filterSql})) AS ${key}`
|
|
376
|
+
}
|
|
377
|
+
case "relation-distinct-count": {
|
|
378
|
+
const fieldRef = dottedToAccess(`${relationAlias}.${computed.field}`)
|
|
379
|
+
return `(SELECT VALUE COUNT(1) FROM (SELECT DISTINCT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where})) AS ${key}`
|
|
380
|
+
}
|
|
381
|
+
case "relation-sum": {
|
|
382
|
+
const fieldRef = dottedToAccess(`${relationAlias}.${computed.field}`)
|
|
383
|
+
return `(SELECT VALUE SUM(${fieldRef}) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
|
|
384
|
+
}
|
|
385
|
+
case "relation-sum-expr": {
|
|
386
|
+
const expression = compileExpr(computed.expression)
|
|
387
|
+
return `(SELECT VALUE SUM(${expression}) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
|
|
388
|
+
}
|
|
389
|
+
case "relation-sum-expr-by": {
|
|
390
|
+
const unitRef = dottedToAccess(`${relationAlias}.${computed.unit}`)
|
|
391
|
+
const expression = compileExpr(computed.expression)
|
|
392
|
+
return `ARRAY(SELECT VALUE { "unit": ${unitRef}, "total": SUM(${expression}) } FROM ${relationAlias} IN ${relationSource}${where} GROUP BY ${unitRef}) AS ${key}`
|
|
393
|
+
}
|
|
394
|
+
case "relation-sum-expr-normalized": {
|
|
395
|
+
const unitRef = dottedToAccess(`${relationAlias}.${computed.unit}`)
|
|
396
|
+
const expression = compileExpr(computed.expression)
|
|
397
|
+
const factor = factorExpr(unitRef, computed.toBase, computed.factors)
|
|
398
|
+
return `(SELECT VALUE SUM((${expression}) * (${factor})) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
|
|
399
|
+
}
|
|
400
|
+
case "relation-collect": {
|
|
401
|
+
const fieldRef = dottedToAccess(`${relationAlias}.${computed.field}`)
|
|
402
|
+
if (computed.distinct) {
|
|
403
|
+
return `ARRAY(SELECT DISTINCT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
|
|
404
|
+
}
|
|
405
|
+
return `ARRAY(SELECT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
|
|
406
|
+
}
|
|
407
|
+
case "relation-length":
|
|
408
|
+
return `ARRAY_LENGTH(${relationSource}) AS ${key}`
|
|
409
|
+
case "relation-collect-fields": {
|
|
410
|
+
const subqueries = computed.fields.map((field) => {
|
|
411
|
+
const fieldRef = dottedToAccess(`${relationAlias}.${field}`)
|
|
412
|
+
return computed.distinct
|
|
413
|
+
? `ARRAY(SELECT DISTINCT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where})`
|
|
414
|
+
: `ARRAY(SELECT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where})`
|
|
415
|
+
})
|
|
416
|
+
const combined = computed.distinct
|
|
417
|
+
? subqueries.reduce((acc, sq) => `SetUnion(${acc}, ${sq})`)
|
|
418
|
+
: subqueries.reduce((acc, sq) => `ARRAY_CONCAT(${acc}, ${sq})`)
|
|
419
|
+
return `${combined} AS ${key}`
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const buildSelectList = (): string => {
|
|
425
|
+
if (!select) return "f"
|
|
426
|
+
return select
|
|
427
|
+
.map((s) => {
|
|
428
|
+
if (typeof s === "string") {
|
|
429
|
+
return dottedToAccess(s === idKey ? "f.id" : `f.${s}`)
|
|
430
|
+
}
|
|
431
|
+
if ("computed" in s) return computedSelectExpr(s.key, s.computed)
|
|
432
|
+
if ("aggregate" in s) return aggregateSelectExpr(s.key, s.aggregate)
|
|
433
|
+
if ("path" in s) return `${dottedToAccess(`f.${s.path}`)} AS ${s.key}`
|
|
434
|
+
// subKeys
|
|
435
|
+
return `ARRAY (SELECT ${s.subKeys.map((_) => dottedToAccess(`t.${_}`)).join(",")}
|
|
436
|
+
FROM t in ${dottedToAccess(`f.${s.key}`)}) AS ${s.key}`
|
|
437
|
+
})
|
|
438
|
+
.join(", ")
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
const groupByClause = hasAggregates && select
|
|
442
|
+
? (() => {
|
|
443
|
+
const groupByExprs = select
|
|
444
|
+
.filter((s): s is { key: string; path: string } =>
|
|
445
|
+
typeof s === "object" && s !== null && "path" in s && !("aggregate" in s)
|
|
446
|
+
)
|
|
447
|
+
.map((s) => dottedToAccess(`f.${s.path}`))
|
|
448
|
+
return groupByExprs.length > 0 ? `GROUP BY ${groupByExprs.join(", ")}` : ""
|
|
449
|
+
})()
|
|
450
|
+
: ""
|
|
451
|
+
|
|
452
|
+
const orderExpr = (key: string) => hasAggregates ? key : dottedToAccess(`f.${key}`)
|
|
453
|
+
|
|
276
454
|
// with joins, you should use DISTINCT
|
|
277
455
|
// or you can end up with duplicates
|
|
278
456
|
return {
|
|
279
457
|
query: `
|
|
280
|
-
SELECT ${
|
|
281
|
-
select
|
|
282
|
-
? `${
|
|
283
|
-
select
|
|
284
|
-
.map((s) =>
|
|
285
|
-
typeof s === "string"
|
|
286
|
-
? dottedToAccess(s === idKey ? "f.id" : `f.${s}`) // x["y"} vs x.y, helps with reserved keywords like "value"
|
|
287
|
-
: `ARRAY (SELECT ${s.subKeys.map((_) => dottedToAccess(`t.${_}`)).join(",")}
|
|
288
|
-
FROM t in ${dottedToAccess(`f.${s.key}`)}) AS ${s.key}`
|
|
289
|
-
)
|
|
290
|
-
.join(", ")
|
|
291
|
-
}`
|
|
292
|
-
: "f"
|
|
293
|
-
}
|
|
458
|
+
SELECT ${buildSelectList()}
|
|
294
459
|
FROM ${name} f
|
|
295
460
|
|
|
296
|
-
${filter.length ? `WHERE (${print(filter,
|
|
297
|
-
${
|
|
461
|
+
${filter.length ? `WHERE (${print(filter, null, false)})` : ""}
|
|
462
|
+
${groupByClause}
|
|
463
|
+
${order ? `ORDER BY ${order.map((_) => `${orderExpr(_.key)} ${_.direction}`).join(", ")}` : ""}
|
|
298
464
|
${skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : ""}`,
|
|
299
|
-
parameters:
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
)
|
|
309
|
-
]
|
|
465
|
+
parameters: values
|
|
466
|
+
.flatMap((x, i) =>
|
|
467
|
+
[{
|
|
468
|
+
name: `@v${i}`,
|
|
469
|
+
value: x.value as any
|
|
470
|
+
}]
|
|
471
|
+
// TODO: only for arrays that are used with _ANY or _ALL
|
|
472
|
+
.concat(Array.isArray(x.value) ? x.value.map((_, i2) => ({ name: `@v${i}__${i2}`, value: _ as any })) : [])
|
|
473
|
+
)
|
|
310
474
|
}
|
|
311
475
|
}
|