joist-core 2.3.0-next.95 → 2.3.0-next.97
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/build/EntityManager.cjs +36 -39
- package/build/EntityManager.cjs.map +1 -1
- package/build/EntityManager.d.cts +4 -4
- package/build/EntityManager.d.mts +4 -4
- package/build/EntityManager.js +29 -32
- package/build/EntityManager.js.map +1 -1
- package/build/EntityMetadata.cjs +3 -3
- package/build/EntityMetadata.js +3 -3
- package/build/IndexManager.cjs +1 -1
- package/build/IndexManager.js +1 -1
- package/build/InstanceData.cjs +1 -1
- package/build/InstanceData.js +1 -1
- package/build/JoinRows.cjs +1 -1
- package/build/JoinRows.js +1 -1
- package/build/PluginManager.cjs +0 -1
- package/build/PluginManager.cjs.map +1 -1
- package/build/PluginManager.d.cts +1 -1
- package/build/PluginManager.d.mts +1 -1
- package/build/PluginManager.js +0 -1
- package/build/PluginManager.js.map +1 -1
- package/build/ReactionsManager.cjs +2 -2
- package/build/ReactionsManager.js +2 -2
- package/build/Todo.cjs +1 -1
- package/build/Todo.js +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.cjs +1 -1
- package/build/batchloaders/enumCollectionBatchLoader.js +1 -1
- package/build/batchloaders/loadBatchLoader.cjs +6 -5
- package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
- package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
- package/build/batchloaders/loadBatchLoader.js +4 -3
- package/build/batchloaders/loadBatchLoader.js.map +1 -1
- package/build/batchloaders/manyToManyBatchLoader.cjs +1 -1
- package/build/batchloaders/manyToManyBatchLoader.js +1 -1
- package/build/batchloaders/oneToManyBatchLoader.cjs +3 -3
- package/build/batchloaders/oneToManyBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToManyBatchLoader.js +2 -2
- package/build/batchloaders/oneToOneBatchLoader.cjs +4 -4
- package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
- package/build/batchloaders/oneToOneBatchLoader.js +3 -3
- package/build/batchloaders/populateBatchLoader.cjs +11 -11
- package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
- package/build/batchloaders/populateBatchLoader.js +8 -8
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs +8 -8
- package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveChildrenBatchLoader.js +5 -5
- package/build/batchloaders/recursiveM2mBatchLoader.cjs +5 -5
- package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
- package/build/batchloaders/recursiveParentsBatchLoader.cjs +8 -8
- package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
- package/build/batchloaders/recursiveParentsBatchLoader.js +5 -5
- package/build/changes.cjs +4 -4
- package/build/changes.js +4 -4
- package/build/config.cjs +3 -3
- package/build/config.js +3 -3
- package/build/configure.cjs +6 -6
- package/build/configure.js +6 -6
- package/build/dataloaders/fastWhereFilterHash.cjs +3 -3
- package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
- package/build/dataloaders/fastWhereFilterHash.js +2 -2
- package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.cjs +5 -6
- package/build/dataloaders/findByUniqueDataLoader.cjs.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findByUniqueDataLoader.js +3 -4
- package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
- package/build/dataloaders/findCountDataLoader.cjs +10 -13
- package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
- package/build/dataloaders/findCountDataLoader.d.cts +2 -2
- package/build/dataloaders/findCountDataLoader.d.mts +2 -2
- package/build/dataloaders/findCountDataLoader.js +4 -7
- package/build/dataloaders/findCountDataLoader.js.map +1 -1
- package/build/dataloaders/findDataLoader.cjs +15 -19
- package/build/dataloaders/findDataLoader.cjs.map +1 -1
- package/build/dataloaders/findDataLoader.d.cts +2 -2
- package/build/dataloaders/findDataLoader.d.cts.map +1 -1
- package/build/dataloaders/findDataLoader.d.mts +2 -2
- package/build/dataloaders/findDataLoader.d.mts.map +1 -1
- package/build/dataloaders/findDataLoader.js +5 -9
- package/build/dataloaders/findDataLoader.js.map +1 -1
- package/build/dataloaders/findIdsDataLoader.cjs +6 -9
- package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
- package/build/dataloaders/findIdsDataLoader.d.cts +1 -1
- package/build/dataloaders/findIdsDataLoader.d.mts +1 -1
- package/build/dataloaders/findIdsDataLoader.js +3 -6
- package/build/dataloaders/findIdsDataLoader.js.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.cjs +1 -2
- package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
- package/build/dataloaders/findOrCreateDataLoader.js +1 -2
- package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.cjs +3 -6
- package/build/dataloaders/findPaginatedDataLoader.cjs.map +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -1
- package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -1
- package/build/dataloaders/findPaginatedDataLoader.js +2 -5
- package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
- package/build/dataloaders/lensDataLoader.cjs +4 -4
- package/build/dataloaders/lensDataLoader.cjs.map +1 -1
- package/build/dataloaders/lensDataLoader.js +2 -2
- package/build/dataloaders/lensDataLoader.js.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -4
- package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts +0 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts +0 -1
- package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/manyToManyFindDataLoader.js +1 -4
- package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.cjs +3 -6
- package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts +0 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts +0 -1
- package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
- package/build/dataloaders/oneToManyFindDataLoader.js +2 -5
- package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
- package/build/defaults.cjs +4 -4
- package/build/defaults.js +4 -4
- package/build/driverApi.cjs +4 -5
- package/build/driverApi.cjs.map +1 -1
- package/build/driverApi.d.cts +1 -1
- package/build/driverApi.d.mts +1 -1
- package/build/driverApi.js +2 -2
- package/build/driverApi.js.map +1 -1
- package/build/drivers/Driver.cjs +0 -1
- package/build/drivers/Driver.d.cts +1 -1
- package/build/drivers/Driver.d.mts +1 -1
- package/build/drivers/Driver.js +0 -1
- package/build/drivers/EntityWriter.cjs +2 -2
- package/build/drivers/EntityWriter.js +2 -2
- package/build/drivers/index.cjs +0 -6
- package/build/drivers/index.d.cts +1 -3
- package/build/drivers/index.d.mts +1 -3
- package/build/drivers/index.js +1 -3
- package/build/fieldSerde.cjs +2 -2
- package/build/fieldSerde.js +2 -2
- package/build/fields.cjs +2 -2
- package/build/fields.js +2 -2
- package/build/getProperties.cjs +1 -1
- package/build/getProperties.js +1 -1
- package/build/index.cjs +109 -106
- package/build/index.cjs.map +1 -1
- package/build/index.d.cts +27 -24
- package/build/index.d.cts.map +1 -1
- package/build/index.d.mts +27 -24
- package/build/index.d.mts.map +1 -1
- package/build/index.js +52 -50
- package/build/index.js.map +1 -1
- package/build/json.cjs +3 -3
- package/build/json.js +3 -3
- package/build/keys.cjs +1 -1
- package/build/keys.js +1 -1
- package/build/loadHints.cjs +1 -1
- package/build/loadHints.js +1 -1
- package/build/loadLens.cjs +1 -1
- package/build/loadLens.js +1 -1
- package/build/logging/FactoryLogger.cjs +1 -1
- package/build/logging/FactoryLogger.js +1 -1
- package/build/logging/FieldLogger.cjs +1 -1
- package/build/logging/FieldLogger.js +1 -1
- package/build/logging/ReactionLogger.cjs +1 -1
- package/build/logging/ReactionLogger.js +1 -1
- package/build/newEntity.cjs +1 -1
- package/build/newEntity.js +1 -1
- package/build/newTestInstance.cjs +3 -3
- package/build/newTestInstance.js +3 -3
- package/build/plugins/PreloadPlugin.cjs +1 -2
- package/build/plugins/PreloadPlugin.d.cts +1 -1
- package/build/plugins/PreloadPlugin.d.mts +1 -1
- package/build/plugins/PreloadPlugin.js +1 -2
- package/build/preloading/JsonAggregatePreloader.cjs +31 -31
- package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
- package/build/preloading/JsonAggregatePreloader.d.cts +1 -1
- package/build/preloading/JsonAggregatePreloader.d.mts +1 -1
- package/build/preloading/JsonAggregatePreloader.js +6 -6
- package/build/preloading/JsonAggregatePreloader.js.map +1 -1
- package/build/preloading/partitionHint.cjs +3 -3
- package/build/preloading/partitionHint.js +3 -3
- package/build/{ConditionBuilder.cjs → queries/ConditionBuilder.cjs} +7 -8
- package/build/queries/ConditionBuilder.cjs.map +1 -0
- package/build/{ConditionBuilder.d.cts → queries/ConditionBuilder.d.cts} +3 -3
- package/build/queries/ConditionBuilder.d.cts.map +1 -0
- package/build/{ConditionBuilder.d.mts → queries/ConditionBuilder.d.mts} +3 -3
- package/build/queries/ConditionBuilder.d.mts.map +1 -0
- package/build/{ConditionBuilder.js → queries/ConditionBuilder.js} +4 -5
- package/build/queries/ConditionBuilder.js.map +1 -0
- package/build/{conditions.cjs → queries/conditions.cjs} +1 -2
- package/build/queries/conditions.cjs.map +1 -0
- package/build/{conditions.d.cts → queries/conditions.d.cts} +2 -2
- package/build/queries/conditions.d.cts.map +1 -0
- package/build/{conditions.d.mts → queries/conditions.d.mts} +2 -2
- package/build/queries/conditions.d.mts.map +1 -0
- package/build/{conditions.js → queries/conditions.js} +1 -2
- package/build/queries/conditions.js.map +1 -0
- package/build/queries/entityQueryUtils.cjs +60 -0
- package/build/queries/entityQueryUtils.cjs.map +1 -0
- package/build/queries/entityQueryUtils.d.cts +19 -0
- package/build/queries/entityQueryUtils.d.cts.map +1 -0
- package/build/queries/entityQueryUtils.d.mts +19 -0
- package/build/queries/entityQueryUtils.d.mts.map +1 -0
- package/build/queries/entityQueryUtils.js +56 -0
- package/build/queries/entityQueryUtils.js.map +1 -0
- package/build/{Aliases.cjs → queries/find/Aliases.cjs} +23 -28
- package/build/queries/find/Aliases.cjs.map +1 -0
- package/build/{Aliases.d.cts → queries/find/Aliases.d.cts} +7 -7
- package/build/queries/find/Aliases.d.cts.map +1 -0
- package/build/{Aliases.d.mts → queries/find/Aliases.d.mts} +7 -7
- package/build/queries/find/Aliases.d.mts.map +1 -0
- package/build/{Aliases.js → queries/find/Aliases.js} +7 -12
- package/build/queries/find/Aliases.js.map +1 -0
- package/build/{DeferredAlias.cjs → queries/find/DeferredAlias.cjs} +3 -6
- package/build/queries/find/DeferredAlias.cjs.map +1 -0
- package/build/{DeferredAlias.d.cts → queries/find/DeferredAlias.d.cts} +4 -4
- package/build/queries/find/DeferredAlias.d.cts.map +1 -0
- package/build/{DeferredAlias.d.mts → queries/find/DeferredAlias.d.mts} +4 -4
- package/build/queries/find/DeferredAlias.d.mts.map +1 -0
- package/build/{DeferredAlias.js → queries/find/DeferredAlias.js} +2 -5
- package/build/queries/find/DeferredAlias.js.map +1 -0
- package/build/{EntityFilter.cjs → queries/find/EntityFilter.cjs} +4 -9
- package/build/queries/find/EntityFilter.cjs.map +1 -0
- package/build/{EntityFilter.d.cts → queries/find/EntityFilter.d.cts} +6 -6
- package/build/queries/find/EntityFilter.d.cts.map +1 -0
- package/build/{EntityFilter.d.mts → queries/find/EntityFilter.d.mts} +6 -6
- package/build/queries/find/EntityFilter.d.mts.map +1 -0
- package/build/{EntityFilter.js → queries/find/EntityFilter.js} +1 -6
- package/build/queries/find/EntityFilter.js.map +1 -0
- package/build/{EntityGraphQLFilter.cjs → queries/find/EntityGraphQLFilter.cjs} +1 -5
- package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -0
- package/build/{EntityGraphQLFilter.d.cts → queries/find/EntityGraphQLFilter.d.cts} +3 -3
- package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -0
- package/build/{EntityGraphQLFilter.d.mts → queries/find/EntityGraphQLFilter.d.mts} +3 -3
- package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -0
- package/build/{EntityGraphQLFilter.js → queries/find/EntityGraphQLFilter.js} +1 -5
- package/build/queries/find/EntityGraphQLFilter.js.map +1 -0
- package/build/{QueryParser.cjs → queries/find/QueryParser.cjs} +68 -356
- package/build/queries/find/QueryParser.cjs.map +1 -0
- package/build/{QueryParser.collectionJoins.cjs → queries/find/QueryParser.collectionJoins.cjs} +8 -8
- package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -0
- package/build/{QueryParser.collectionJoins.d.cts → queries/find/QueryParser.collectionJoins.d.cts} +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -0
- package/build/{QueryParser.collectionJoins.d.mts → queries/find/QueryParser.collectionJoins.d.mts} +1 -1
- package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -0
- package/build/{QueryParser.collectionJoins.js → queries/find/QueryParser.collectionJoins.js} +2 -2
- package/build/queries/find/QueryParser.collectionJoins.js.map +1 -0
- package/build/{QueryParser.d.cts → queries/find/QueryParser.d.cts} +5 -159
- package/build/queries/find/QueryParser.d.cts.map +1 -0
- package/build/{QueryParser.d.mts → queries/find/QueryParser.d.mts} +5 -159
- package/build/queries/find/QueryParser.d.mts.map +1 -0
- package/build/{QueryParser.js → queries/find/QueryParser.js} +15 -295
- package/build/queries/find/QueryParser.js.map +1 -0
- package/build/{QueryParser.pruning.cjs → queries/find/QueryParser.pruning.cjs} +6 -20
- package/build/queries/find/QueryParser.pruning.cjs.map +1 -0
- package/build/queries/find/QueryParser.pruning.d.cts +8 -0
- package/build/queries/find/QueryParser.pruning.d.cts.map +1 -0
- package/build/queries/find/QueryParser.pruning.d.mts +8 -0
- package/build/queries/find/QueryParser.pruning.d.mts.map +1 -0
- package/build/{QueryParser.pruning.js → queries/find/QueryParser.pruning.js} +4 -17
- package/build/queries/find/QueryParser.pruning.js.map +1 -0
- package/build/{QueryVisitor.cjs → queries/find/QueryVisitor.cjs} +2 -3
- package/build/queries/find/QueryVisitor.cjs.map +1 -0
- package/build/{QueryVisitor.d.cts → queries/find/QueryVisitor.d.cts} +3 -2
- package/build/queries/find/QueryVisitor.d.cts.map +1 -0
- package/build/{QueryVisitor.d.mts → queries/find/QueryVisitor.d.mts} +3 -2
- package/build/queries/find/QueryVisitor.d.mts.map +1 -0
- package/build/{QueryVisitor.js → queries/find/QueryVisitor.js} +2 -3
- package/build/queries/find/QueryVisitor.js.map +1 -0
- package/build/{drivers/buildRawQuery.cjs → queries/find/buildFindQuery.cjs} +14 -15
- package/build/queries/find/buildFindQuery.cjs.map +1 -0
- package/build/{drivers/buildRawQuery.d.cts → queries/find/buildFindQuery.d.cts} +3 -3
- package/build/queries/find/buildFindQuery.d.cts.map +1 -0
- package/build/{drivers/buildRawQuery.d.mts → queries/find/buildFindQuery.d.mts} +3 -3
- package/build/queries/find/buildFindQuery.d.mts.map +1 -0
- package/build/{drivers/buildRawQuery.js → queries/find/buildFindQuery.js} +5 -6
- package/build/queries/find/buildFindQuery.js.map +1 -0
- package/build/{scopes.cjs → queries/find/scopes.cjs} +2 -3
- package/build/queries/find/scopes.cjs.map +1 -0
- package/build/{scopes.d.cts → queries/find/scopes.d.cts} +6 -6
- package/build/queries/find/scopes.d.cts.map +1 -0
- package/build/{scopes.d.mts → queries/find/scopes.d.mts} +6 -6
- package/build/queries/find/scopes.d.mts.map +1 -0
- package/build/{scopes.js → queries/find/scopes.js} +2 -3
- package/build/queries/find/scopes.js.map +1 -0
- package/build/queries/parsedConditions.cjs +21 -0
- package/build/queries/parsedConditions.cjs.map +1 -0
- package/build/queries/parsedConditions.d.cts +127 -0
- package/build/queries/parsedConditions.d.cts.map +1 -0
- package/build/queries/parsedConditions.d.mts +127 -0
- package/build/queries/parsedConditions.d.mts.map +1 -0
- package/build/queries/parsedConditions.js +20 -0
- package/build/queries/parsedConditions.js.map +1 -0
- package/build/{drivers/buildUtils.cjs → queries/renderConditions.cjs} +7 -8
- package/build/queries/renderConditions.cjs.map +1 -0
- package/build/{drivers/buildUtils.d.mts → queries/renderConditions.d.cts} +5 -4
- package/build/queries/renderConditions.d.cts.map +1 -0
- package/build/{drivers/buildUtils.d.cts → queries/renderConditions.d.mts} +5 -4
- package/build/queries/renderConditions.d.mts.map +1 -0
- package/build/{drivers/buildUtils.js → queries/renderConditions.js} +4 -5
- package/build/queries/renderConditions.js.map +1 -0
- package/build/{skipCondition.cjs → queries/skipCondition.cjs} +1 -2
- package/build/queries/skipCondition.cjs.map +1 -0
- package/build/{skipCondition.d.cts → queries/skipCondition.d.cts} +2 -2
- package/build/{skipCondition.d.cts.map → queries/skipCondition.d.cts.map} +1 -1
- package/build/{skipCondition.d.mts → queries/skipCondition.d.mts} +2 -2
- package/build/{skipCondition.d.mts.map → queries/skipCondition.d.mts.map} +1 -1
- package/build/{skipCondition.js → queries/skipCondition.js} +1 -2
- package/build/queries/skipCondition.js.map +1 -0
- package/build/{AliasAssigner.cjs → queries/sql/AliasAssigner.cjs} +2 -3
- package/build/queries/sql/AliasAssigner.cjs.map +1 -0
- package/build/{AliasAssigner.d.cts → queries/sql/AliasAssigner.d.cts} +2 -2
- package/build/queries/sql/AliasAssigner.d.cts.map +1 -0
- package/build/{AliasAssigner.d.mts → queries/sql/AliasAssigner.d.mts} +2 -2
- package/build/queries/sql/AliasAssigner.d.mts.map +1 -0
- package/build/{AliasAssigner.js → queries/sql/AliasAssigner.js} +2 -3
- package/build/queries/sql/AliasAssigner.js.map +1 -0
- package/build/{Expr.cjs → queries/sql/Expr.cjs} +9 -9
- package/build/queries/sql/Expr.cjs.map +1 -0
- package/build/{Expr.d.cts → queries/sql/Expr.d.cts} +4 -4
- package/build/queries/sql/Expr.d.cts.map +1 -0
- package/build/{Expr.d.mts → queries/sql/Expr.d.mts} +4 -4
- package/build/queries/sql/Expr.d.mts.map +1 -0
- package/build/{Expr.js → queries/sql/Expr.js} +4 -4
- package/build/queries/sql/Expr.js.map +1 -0
- package/build/{Tables.cjs → queries/sql/Tables.cjs} +63 -67
- package/build/queries/sql/Tables.cjs.map +1 -0
- package/build/{Tables.d.cts → queries/sql/Tables.d.cts} +6 -7
- package/build/queries/sql/Tables.d.cts.map +1 -0
- package/build/{Tables.d.mts → queries/sql/Tables.d.mts} +6 -7
- package/build/queries/sql/Tables.d.mts.map +1 -0
- package/build/{Tables.js → queries/sql/Tables.js} +9 -13
- package/build/queries/sql/Tables.js.map +1 -0
- package/build/{execute.cjs → queries/sql/execute.cjs} +32 -37
- package/build/queries/sql/execute.cjs.map +1 -0
- package/build/{execute.d.cts → queries/sql/execute.d.cts} +6 -6
- package/build/queries/sql/execute.d.cts.map +1 -0
- package/build/{execute.d.mts → queries/sql/execute.d.mts} +6 -6
- package/build/queries/sql/execute.d.mts.map +1 -0
- package/build/{execute.js → queries/sql/execute.js} +5 -10
- package/build/queries/sql/execute.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.cjs +12 -12
- package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.d.cts +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.d.mts +1 -1
- package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/arrayAgg.js +1 -1
- package/build/queries/sql/expressions/arrayAgg.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.cjs +14 -14
- package/build/queries/sql/expressions/case.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.d.cts +1 -1
- package/build/queries/sql/expressions/case.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.d.mts +1 -1
- package/build/queries/sql/expressions/case.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/case.js +1 -1
- package/build/queries/sql/expressions/case.js.map +1 -0
- package/build/queries/sql/expressions/coalesce.cjs +25 -0
- package/build/queries/sql/expressions/coalesce.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/coalesce.d.cts +1 -1
- package/build/queries/sql/expressions/coalesce.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/coalesce.d.mts +1 -1
- package/build/queries/sql/expressions/coalesce.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/coalesce.js +1 -1
- package/build/queries/sql/expressions/coalesce.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.cjs +5 -5
- package/build/queries/sql/expressions/codecs.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.d.cts +1 -1
- package/build/queries/sql/expressions/codecs.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.d.mts +1 -1
- package/build/queries/sql/expressions/codecs.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/codecs.js +3 -3
- package/build/queries/sql/expressions/codecs.js.map +1 -0
- package/build/queries/sql/expressions/expression.cjs +102 -0
- package/build/queries/sql/expressions/expression.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/expression.d.cts +1 -1
- package/build/queries/sql/expressions/expression.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/expression.d.mts +1 -1
- package/build/queries/sql/expressions/expression.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/expression.js +2 -2
- package/build/queries/sql/expressions/expression.js.map +1 -0
- package/build/queries/sql/expressions/greatest.cjs +25 -0
- package/build/queries/sql/expressions/greatest.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/greatest.d.cts +1 -1
- package/build/queries/sql/expressions/greatest.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/greatest.d.mts +1 -1
- package/build/queries/sql/expressions/greatest.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/greatest.js +1 -1
- package/build/queries/sql/expressions/greatest.js.map +1 -0
- package/build/queries/sql/expressions/least.cjs +25 -0
- package/build/queries/sql/expressions/least.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/least.d.cts +1 -1
- package/build/queries/sql/expressions/least.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/least.d.mts +1 -1
- package/build/queries/sql/expressions/least.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/least.js +1 -1
- package/build/queries/sql/expressions/least.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.cjs +6 -6
- package/build/queries/sql/expressions/nullIf.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.d.cts +1 -1
- package/build/queries/sql/expressions/nullIf.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.d.mts +1 -1
- package/build/queries/sql/expressions/nullIf.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/nullIf.js +1 -1
- package/build/queries/sql/expressions/nullIf.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.cjs +16 -16
- package/build/queries/sql/expressions/parseExpression.cjs.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.d.cts +1 -1
- package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.d.mts +1 -1
- package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/parseExpression.js +2 -2
- package/build/queries/sql/expressions/parseExpression.js.map +1 -0
- package/build/{expressions → queries/sql/expressions}/types.d.cts +1 -1
- package/build/queries/sql/expressions/types.d.cts.map +1 -0
- package/build/{expressions → queries/sql/expressions}/types.d.mts +1 -1
- package/build/queries/sql/expressions/types.d.mts.map +1 -0
- package/build/{keywords.cjs → queries/sql/keywords.cjs} +1 -1
- package/build/queries/sql/keywords.cjs.map +1 -0
- package/build/{keywords.d.cts → queries/sql/keywords.d.cts} +1 -1
- package/build/queries/sql/keywords.d.cts.map +1 -0
- package/build/{keywords.d.mts → queries/sql/keywords.d.mts} +1 -1
- package/build/queries/sql/keywords.d.mts.map +1 -0
- package/build/{keywords.js → queries/sql/keywords.js} +1 -1
- package/build/queries/sql/keywords.js.map +1 -0
- package/build/{query.cjs → queries/sql/query.cjs} +112 -83
- package/build/queries/sql/query.cjs.map +1 -0
- package/build/{query.d.cts → queries/sql/query.d.cts} +18 -8
- package/build/queries/sql/query.d.cts.map +1 -0
- package/build/{query.d.mts → queries/sql/query.d.mts} +18 -8
- package/build/queries/sql/query.d.mts.map +1 -0
- package/build/{query.js → queries/sql/query.js} +41 -13
- package/build/queries/sql/query.js.map +1 -0
- package/build/queries/valueFilters.cjs +248 -0
- package/build/queries/valueFilters.cjs.map +1 -0
- package/build/queries/valueFilters.d.cts +28 -0
- package/build/queries/valueFilters.d.cts.map +1 -0
- package/build/queries/valueFilters.d.mts +28 -0
- package/build/queries/valueFilters.d.mts.map +1 -0
- package/build/queries/valueFilters.js +243 -0
- package/build/queries/valueFilters.js.map +1 -0
- package/build/reactiveHints.cjs +5 -5
- package/build/reactiveHints.js +5 -5
- package/build/relations/AbstractRelationImpl.cjs +0 -5
- package/build/relations/AbstractRelationImpl.cjs.map +1 -1
- package/build/relations/AbstractRelationImpl.d.cts +1 -2
- package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
- package/build/relations/AbstractRelationImpl.d.mts +1 -2
- package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
- package/build/relations/AbstractRelationImpl.js +1 -5
- package/build/relations/AbstractRelationImpl.js.map +1 -1
- package/build/relations/AsyncProperty.cjs +1 -1
- package/build/relations/AsyncProperty.js +1 -1
- package/build/relations/AsyncReactiveField.cjs +3 -3
- package/build/relations/AsyncReactiveField.js +3 -3
- package/build/relations/Collection.cjs +1 -1
- package/build/relations/Collection.js +1 -1
- package/build/relations/CustomCollection.cjs +1 -1
- package/build/relations/CustomCollection.js +1 -1
- package/build/relations/CustomReference.cjs +3 -3
- package/build/relations/CustomReference.js +3 -3
- package/build/relations/EnumCollection.cjs +2 -2
- package/build/relations/EnumCollection.js +2 -2
- package/build/relations/LazyField.cjs +6 -7
- package/build/relations/LazyField.cjs.map +1 -1
- package/build/relations/LazyField.js +5 -6
- package/build/relations/LazyField.js.map +1 -1
- package/build/relations/ManyToManyCollection.cjs +4 -3
- package/build/relations/ManyToManyCollection.cjs.map +1 -1
- package/build/relations/ManyToManyCollection.d.cts.map +1 -1
- package/build/relations/ManyToManyCollection.d.mts.map +1 -1
- package/build/relations/ManyToManyCollection.js +4 -3
- package/build/relations/ManyToManyCollection.js.map +1 -1
- package/build/relations/ManyToManyLargeCollection.cjs +2 -2
- package/build/relations/ManyToManyLargeCollection.js +2 -2
- package/build/relations/ManyToOneReference.cjs +7 -6
- package/build/relations/ManyToOneReference.cjs.map +1 -1
- package/build/relations/ManyToOneReference.d.cts.map +1 -1
- package/build/relations/ManyToOneReference.d.mts.map +1 -1
- package/build/relations/ManyToOneReference.js +7 -6
- package/build/relations/ManyToOneReference.js.map +1 -1
- package/build/relations/OneToManyCollection.cjs +6 -5
- package/build/relations/OneToManyCollection.cjs.map +1 -1
- package/build/relations/OneToManyCollection.d.cts.map +1 -1
- package/build/relations/OneToManyCollection.d.mts.map +1 -1
- package/build/relations/OneToManyCollection.js +4 -3
- package/build/relations/OneToManyCollection.js.map +1 -1
- package/build/relations/OneToManyLargeCollection.cjs +3 -3
- package/build/relations/OneToManyLargeCollection.js +3 -3
- package/build/relations/OneToOneReference.cjs +6 -5
- package/build/relations/OneToOneReference.cjs.map +1 -1
- package/build/relations/OneToOneReference.d.cts.map +1 -1
- package/build/relations/OneToOneReference.d.mts.map +1 -1
- package/build/relations/OneToOneReference.js +6 -5
- package/build/relations/OneToOneReference.js.map +1 -1
- package/build/relations/PolymorphicReference.cjs +7 -6
- package/build/relations/PolymorphicReference.cjs.map +1 -1
- package/build/relations/PolymorphicReference.d.cts.map +1 -1
- package/build/relations/PolymorphicReference.d.mts.map +1 -1
- package/build/relations/PolymorphicReference.js +7 -6
- package/build/relations/PolymorphicReference.js.map +1 -1
- package/build/relations/ReactiveField.cjs +3 -3
- package/build/relations/ReactiveField.js +3 -3
- package/build/relations/ReactiveGetter.cjs +1 -1
- package/build/relations/ReactiveGetter.js +1 -1
- package/build/relations/ReactiveManyToMany.cjs +5 -4
- package/build/relations/ReactiveManyToMany.cjs.map +1 -1
- package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
- package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
- package/build/relations/ReactiveManyToMany.js +5 -4
- package/build/relations/ReactiveManyToMany.js.map +1 -1
- package/build/relations/ReactiveManyToManyOtherSide.cjs +3 -3
- package/build/relations/ReactiveManyToManyOtherSide.js +3 -3
- package/build/relations/ReactiveReference.cjs +8 -7
- package/build/relations/ReactiveReference.cjs.map +1 -1
- package/build/relations/ReactiveReference.d.cts.map +1 -1
- package/build/relations/ReactiveReference.d.mts.map +1 -1
- package/build/relations/ReactiveReference.js +8 -7
- package/build/relations/ReactiveReference.js.map +1 -1
- package/build/relations/RecursiveCollection.cjs +3 -3
- package/build/relations/RecursiveCollection.js +3 -3
- package/build/relations/Reference.cjs +1 -1
- package/build/relations/Reference.js +1 -1
- package/build/relations/hasAsyncMethod.cjs +1 -1
- package/build/relations/hasAsyncMethod.js +1 -1
- package/build/relations/hasManyDerived.cjs +1 -1
- package/build/relations/hasManyDerived.js +1 -1
- package/build/relations/hasOneDerived.cjs +2 -2
- package/build/relations/hasOneDerived.js +2 -2
- package/build/relations/hasProperty.cjs +2 -2
- package/build/relations/hasProperty.js +2 -2
- package/build/relations/index.cjs +13 -13
- package/build/relations/index.js +13 -13
- package/build/relations/isCascadeDelete.cjs +11 -0
- package/build/relations/isCascadeDelete.cjs.map +1 -0
- package/build/relations/isCascadeDelete.d.cts +7 -0
- package/build/relations/isCascadeDelete.d.cts.map +1 -0
- package/build/relations/isCascadeDelete.d.mts +7 -0
- package/build/relations/isCascadeDelete.d.mts.map +1 -0
- package/build/relations/isCascadeDelete.js +10 -0
- package/build/relations/isCascadeDelete.js.map +1 -0
- package/build/resurrection.cjs +1 -1
- package/build/resurrection.js +1 -1
- package/build/rules.cjs +4 -4
- package/build/rules.js +4 -4
- package/build/serde.cjs +1 -1
- package/build/serde.js +1 -1
- package/build/unnest.cjs +0 -1
- package/build/unnest.cjs.map +1 -1
- package/build/unnest.d.cts +1 -1
- package/build/unnest.d.mts +1 -1
- package/build/unnest.js +0 -1
- package/build/unnest.js.map +1 -1
- package/build/upsert.cjs +3 -3
- package/build/upsert.js +3 -3
- package/build/utils.cjs +1 -2
- package/build/utils.cjs.map +1 -1
- package/build/utils.d.cts +1 -1
- package/build/utils.d.mts +1 -1
- package/build/utils.js +1 -2
- package/build/utils.js.map +1 -1
- package/build/withLoaded.cjs +3 -3
- package/build/withLoaded.js +3 -3
- package/package.json +2 -2
- package/build/AliasAssigner.cjs.map +0 -1
- package/build/AliasAssigner.d.cts.map +0 -1
- package/build/AliasAssigner.d.mts.map +0 -1
- package/build/AliasAssigner.js.map +0 -1
- package/build/Aliases.cjs.map +0 -1
- package/build/Aliases.d.cts.map +0 -1
- package/build/Aliases.d.mts.map +0 -1
- package/build/Aliases.js.map +0 -1
- package/build/ConditionBuilder.cjs.map +0 -1
- package/build/ConditionBuilder.d.cts.map +0 -1
- package/build/ConditionBuilder.d.mts.map +0 -1
- package/build/ConditionBuilder.js.map +0 -1
- package/build/DeferredAlias.cjs.map +0 -1
- package/build/DeferredAlias.d.cts.map +0 -1
- package/build/DeferredAlias.d.mts.map +0 -1
- package/build/DeferredAlias.js.map +0 -1
- package/build/EntityFilter.cjs.map +0 -1
- package/build/EntityFilter.d.cts.map +0 -1
- package/build/EntityFilter.d.mts.map +0 -1
- package/build/EntityFilter.js.map +0 -1
- package/build/EntityGraphQLFilter.cjs.map +0 -1
- package/build/EntityGraphQLFilter.d.cts.map +0 -1
- package/build/EntityGraphQLFilter.d.mts.map +0 -1
- package/build/EntityGraphQLFilter.js.map +0 -1
- package/build/Expr.cjs.map +0 -1
- package/build/Expr.d.cts.map +0 -1
- package/build/Expr.d.mts.map +0 -1
- package/build/Expr.js.map +0 -1
- package/build/QueryParser.cjs.map +0 -1
- package/build/QueryParser.collectionJoins.cjs.map +0 -1
- package/build/QueryParser.collectionJoins.d.cts.map +0 -1
- package/build/QueryParser.collectionJoins.d.mts.map +0 -1
- package/build/QueryParser.collectionJoins.js.map +0 -1
- package/build/QueryParser.d.cts.map +0 -1
- package/build/QueryParser.d.mts.map +0 -1
- package/build/QueryParser.js.map +0 -1
- package/build/QueryParser.pruning.cjs.map +0 -1
- package/build/QueryParser.pruning.d.cts +0 -10
- package/build/QueryParser.pruning.d.cts.map +0 -1
- package/build/QueryParser.pruning.d.mts +0 -10
- package/build/QueryParser.pruning.d.mts.map +0 -1
- package/build/QueryParser.pruning.js.map +0 -1
- package/build/QueryVisitor.cjs.map +0 -1
- package/build/QueryVisitor.d.cts.map +0 -1
- package/build/QueryVisitor.d.mts.map +0 -1
- package/build/QueryVisitor.js.map +0 -1
- package/build/Tables.cjs.map +0 -1
- package/build/Tables.d.cts.map +0 -1
- package/build/Tables.d.mts.map +0 -1
- package/build/Tables.js.map +0 -1
- package/build/conditions.cjs.map +0 -1
- package/build/conditions.d.cts.map +0 -1
- package/build/conditions.d.mts.map +0 -1
- package/build/conditions.js.map +0 -1
- package/build/drivers/buildRawQuery.cjs.map +0 -1
- package/build/drivers/buildRawQuery.d.cts.map +0 -1
- package/build/drivers/buildRawQuery.d.mts.map +0 -1
- package/build/drivers/buildRawQuery.js.map +0 -1
- package/build/drivers/buildUtils.cjs.map +0 -1
- package/build/drivers/buildUtils.d.cts.map +0 -1
- package/build/drivers/buildUtils.d.mts.map +0 -1
- package/build/drivers/buildUtils.js.map +0 -1
- package/build/execute.cjs.map +0 -1
- package/build/execute.d.cts.map +0 -1
- package/build/execute.d.mts.map +0 -1
- package/build/execute.js.map +0 -1
- package/build/expressions/arrayAgg.cjs.map +0 -1
- package/build/expressions/arrayAgg.d.cts.map +0 -1
- package/build/expressions/arrayAgg.d.mts.map +0 -1
- package/build/expressions/arrayAgg.js.map +0 -1
- package/build/expressions/case.cjs.map +0 -1
- package/build/expressions/case.d.cts.map +0 -1
- package/build/expressions/case.d.mts.map +0 -1
- package/build/expressions/case.js.map +0 -1
- package/build/expressions/coalesce.cjs +0 -25
- package/build/expressions/coalesce.cjs.map +0 -1
- package/build/expressions/coalesce.d.cts.map +0 -1
- package/build/expressions/coalesce.d.mts.map +0 -1
- package/build/expressions/coalesce.js.map +0 -1
- package/build/expressions/codecs.cjs.map +0 -1
- package/build/expressions/codecs.d.cts.map +0 -1
- package/build/expressions/codecs.d.mts.map +0 -1
- package/build/expressions/codecs.js.map +0 -1
- package/build/expressions/expression.cjs +0 -102
- package/build/expressions/expression.cjs.map +0 -1
- package/build/expressions/expression.d.cts.map +0 -1
- package/build/expressions/expression.d.mts.map +0 -1
- package/build/expressions/expression.js.map +0 -1
- package/build/expressions/greatest.cjs +0 -25
- package/build/expressions/greatest.cjs.map +0 -1
- package/build/expressions/greatest.d.cts.map +0 -1
- package/build/expressions/greatest.d.mts.map +0 -1
- package/build/expressions/greatest.js.map +0 -1
- package/build/expressions/least.cjs +0 -25
- package/build/expressions/least.cjs.map +0 -1
- package/build/expressions/least.d.cts.map +0 -1
- package/build/expressions/least.d.mts.map +0 -1
- package/build/expressions/least.js.map +0 -1
- package/build/expressions/nullIf.cjs.map +0 -1
- package/build/expressions/nullIf.d.cts.map +0 -1
- package/build/expressions/nullIf.d.mts.map +0 -1
- package/build/expressions/nullIf.js.map +0 -1
- package/build/expressions/parseExpression.cjs.map +0 -1
- package/build/expressions/parseExpression.d.cts.map +0 -1
- package/build/expressions/parseExpression.d.mts.map +0 -1
- package/build/expressions/parseExpression.js.map +0 -1
- package/build/expressions/types.d.cts.map +0 -1
- package/build/expressions/types.d.mts.map +0 -1
- package/build/keywords.cjs.map +0 -1
- package/build/keywords.d.cts.map +0 -1
- package/build/keywords.d.mts.map +0 -1
- package/build/keywords.js.map +0 -1
- package/build/query.cjs.map +0 -1
- package/build/query.d.cts.map +0 -1
- package/build/query.d.mts.map +0 -1
- package/build/query.js.map +0 -1
- package/build/scopes.cjs.map +0 -1
- package/build/scopes.d.cts.map +0 -1
- package/build/scopes.d.mts.map +0 -1
- package/build/scopes.js.map +0 -1
- package/build/skipCondition.cjs.map +0 -1
- package/build/skipCondition.js.map +0 -1
- /package/build/{expressions → queries/sql/expressions}/types.cjs +0 -0
- /package/build/{expressions → queries/sql/expressions}/types.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastWhereFilterHash.cjs","names":["maybeRequireTemporal","isAlias","isEntity","isReference","zonedDateTimeMapper","plainDateTimeMapper","plainDateMapper","plainTimeMapper"],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isAlias } from \"../Aliases.ts\";\nimport { isEntity } from \"../Entity.ts\";\nimport { isReference } from \"../relations/index.ts\";\nimport { maybeRequireTemporal } from \"../temporal.ts\";\nimport { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from \"../temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fastWhereFilterHash.cjs","names":["maybeRequireTemporal","isAlias","isEntity","isReference","zonedDateTimeMapper","plainDateTimeMapper","plainDateMapper","plainTimeMapper"],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isEntity } from \"../Entity.ts\";\nimport { isAlias } from \"../queries/find/Aliases.ts\";\nimport { isReference } from \"../relations/index.ts\";\nimport { maybeRequireTemporal } from \"../temporal.ts\";\nimport { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from \"../temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { maybeRequireTemporal } from "../temporal.js";
|
|
2
|
+
import { isAlias } from "../queries/find/Aliases.js";
|
|
1
3
|
import { isReference } from "../relations/Reference.js";
|
|
2
4
|
import "../relations/index.js";
|
|
3
|
-
import { maybeRequireTemporal } from "../temporal.js";
|
|
4
5
|
import { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from "../temporalMappers.js";
|
|
5
6
|
import { isEntity } from "../Entity.js";
|
|
6
|
-
import { isAlias } from "../Aliases.js";
|
|
7
7
|
//#region src/dataloaders/fastWhereFilterHash.ts
|
|
8
8
|
const Temporal = maybeRequireTemporal()?.Temporal;
|
|
9
9
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastWhereFilterHash.js","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isAlias } from \"../Aliases.ts\";\nimport { isEntity } from \"../Entity.ts\";\nimport { isReference } from \"../relations/index.ts\";\nimport { maybeRequireTemporal } from \"../temporal.ts\";\nimport { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from \"../temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fastWhereFilterHash.js","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isEntity } from \"../Entity.ts\";\nimport { isAlias } from \"../queries/find/Aliases.ts\";\nimport { isReference } from \"../relations/index.ts\";\nimport { maybeRequireTemporal } from \"../temporal.ts\";\nimport { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from \"../temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
2
|
+
const require_queries_entityQueryUtils = require("../queries/entityQueryUtils.cjs");
|
|
3
|
+
const require_queries_find_QueryParser = require("../queries/find/QueryParser.cjs");
|
|
3
4
|
const require_utils = require("../utils.cjs");
|
|
4
|
-
require("../
|
|
5
|
-
require("../Entity.cjs");
|
|
6
|
-
const require_QueryParser = require("../QueryParser.cjs");
|
|
5
|
+
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
7
6
|
//#region src/dataloaders/findByUniqueDataLoader.ts
|
|
8
7
|
const findByUniqueOperation = "find-by-unique";
|
|
9
8
|
function findByUniqueDataLoader(em, type, field, softDeletes) {
|
|
@@ -26,8 +25,8 @@ function findByUniqueDataLoader(em, type, field, softDeletes) {
|
|
|
26
25
|
},
|
|
27
26
|
orderBys: []
|
|
28
27
|
};
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
require_queries_find_QueryParser.addTablePerClassJoinsAndClassTag(query, meta, alias, true);
|
|
29
|
+
require_queries_entityQueryUtils.maybeAddNotSoftDeleted(conditions, meta, alias, softDeletes);
|
|
31
30
|
let column;
|
|
32
31
|
switch (field.kind) {
|
|
33
32
|
case "primitive":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findByUniqueDataLoader.cjs","names":["getMetadata","abbreviation","groupBy"],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\n\nimport {
|
|
1
|
+
{"version":3,"file":"findByUniqueDataLoader.cjs","names":["getMetadata","abbreviation","groupBy"],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\n\nimport type { Column } from \"../columns.ts\";\nimport type { Entity } from \"../Entity.ts\";\nimport type { EntityManager, MaybeAbstractEntityConstructor } from \"../EntityManager.ts\";\nimport { type Field, getMetadata } from \"../EntityMetadata.ts\";\nimport { maybeAddNotSoftDeleted } from \"../queries/entityQueryUtils.ts\";\nimport { type ParsedFindQuery, addTablePerClassJoinsAndClassTag } from \"../queries/find/QueryParser.ts\";\nimport type { ColumnCondition } from \"../queries/parsedConditions.ts\";\nimport { abbreviation, groupBy } from \"../utils.ts\";\n\nexport const findByUniqueOperation = \"find-by-unique\";\n\nexport function findByUniqueDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n field: Field,\n softDeletes: \"include\" | \"exclude\",\n): DataLoader<any, unknown | undefined> {\n const batchKey = `${type.name}-${field.fieldName}-${softDeletes}`;\n return em.getLoader(findByUniqueOperation, batchKey, async (values) => {\n const meta = getMetadata(type);\n const alias = abbreviation(meta.tableName);\n\n const conditions: ColumnCondition[] = [];\n const query: ParsedFindQuery = {\n selects: [`${alias}.*`],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: { kind: \"exp\", op: \"and\", conditions },\n orderBys: [],\n };\n\n addTablePerClassJoinsAndClassTag(query, meta, alias, true);\n maybeAddNotSoftDeleted(conditions, meta, alias, softDeletes);\n\n let column: Column;\n switch (field.kind) {\n case \"primitive\":\n column = field.serde.columns[0];\n conditions.push({\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"in\", value: values.map((v) => column.mapToDb(v)) },\n });\n break;\n default:\n throw new Error(`Unsupported field ${field.fieldName}`);\n }\n\n const rows = await em[\"executeFind\"](meta, findByUniqueOperation, query, {});\n\n const rowsByValue = groupBy(rows, (row) => row[column.columnName]);\n\n // Re-order the output by the batched input\n return values.map((value) => {\n const result = rowsByValue.get(value) ?? [];\n return result[0];\n });\n });\n}\n"],"mappings":";;;;;;AAWA,MAAa,wBAAwB;AAErC,SAAgB,uBACd,IACA,MACA,OACA,aACsC;CACtC,MAAM,WAAW,GAAG,KAAK,KAAK,GAAG,MAAM,UAAU,GAAG;CACpD,OAAO,GAAG,UAAU,uBAAuB,UAAU,OAAO,WAAW;EACrE,MAAM,OAAOA,uBAAAA,YAAY,IAAI;EAC7B,MAAM,QAAQC,cAAAA,aAAa,KAAK,SAAS;EAEzC,MAAM,aAAgC,CAAC;EACvC,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAG,MAAM,GAAG;GACtB,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IAAE,MAAM;IAAO,IAAI;IAAO;GAAW;GAChD,UAAU,CAAC;EACb;EAEA,iCAAA,iCAAiC,OAAO,MAAM,OAAO,IAAI;EACzD,iCAAA,uBAAuB,YAAY,MAAM,OAAO,WAAW;EAE3D,IAAI;EACJ,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,SAAS,MAAM,MAAM,QAAQ;IAC7B,WAAW,KAAK;KACd,MAAM;KACN;KACA,QAAQ,OAAO;KACf,QAAQ,OAAO;KACf,MAAM;MAAE,MAAM;MAAM,OAAO,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;KAAE;IAClE,CAAC;IACD;GACF,SACE,MAAM,IAAI,MAAM,qBAAqB,MAAM,WAAW;EAC1D;EAEA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,uBAAuB,OAAO,CAAC,CAAC;EAE3E,MAAM,cAAcC,cAAAA,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW;EAGjE,OAAO,OAAO,KAAK,UAAU;GAE3B,QADe,YAAY,IAAI,KAAK,KAAK,CAAC,EAAA,CAC5B;EAChB,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findByUniqueDataLoader.d.cts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"findByUniqueDataLoader.d.cts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;cAWa;iBAEG,uBAAuB,UAAU,QAC/C,IAAI,eACJ,MAAM,+BAA+B,IACrC,OAAO,OACP,qCACC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findByUniqueDataLoader.d.mts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"findByUniqueDataLoader.d.mts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;cAWa;iBAEG,uBAAuB,UAAU,QAC/C,IAAI,eACJ,MAAM,+BAA+B,IACrC,OAAO,OACP,qCACC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { maybeAddNotSoftDeleted } from "../queries/entityQueryUtils.js";
|
|
2
|
+
import { addTablePerClassJoinsAndClassTag } from "../queries/find/QueryParser.js";
|
|
2
3
|
import { abbreviation, groupBy } from "../utils.js";
|
|
3
|
-
import "../
|
|
4
|
-
import "../Entity.js";
|
|
5
|
-
import { addTablePerClassJoinsAndClassTag, maybeAddNotSoftDeleted } from "../QueryParser.js";
|
|
4
|
+
import { getMetadata } from "../EntityMetadata.js";
|
|
6
5
|
//#region src/dataloaders/findByUniqueDataLoader.ts
|
|
7
6
|
const findByUniqueOperation = "find-by-unique";
|
|
8
7
|
function findByUniqueDataLoader(em, type, field, softDeletes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findByUniqueDataLoader.js","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\n\nimport {
|
|
1
|
+
{"version":3,"file":"findByUniqueDataLoader.js","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\n\nimport type { Column } from \"../columns.ts\";\nimport type { Entity } from \"../Entity.ts\";\nimport type { EntityManager, MaybeAbstractEntityConstructor } from \"../EntityManager.ts\";\nimport { type Field, getMetadata } from \"../EntityMetadata.ts\";\nimport { maybeAddNotSoftDeleted } from \"../queries/entityQueryUtils.ts\";\nimport { type ParsedFindQuery, addTablePerClassJoinsAndClassTag } from \"../queries/find/QueryParser.ts\";\nimport type { ColumnCondition } from \"../queries/parsedConditions.ts\";\nimport { abbreviation, groupBy } from \"../utils.ts\";\n\nexport const findByUniqueOperation = \"find-by-unique\";\n\nexport function findByUniqueDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n field: Field,\n softDeletes: \"include\" | \"exclude\",\n): DataLoader<any, unknown | undefined> {\n const batchKey = `${type.name}-${field.fieldName}-${softDeletes}`;\n return em.getLoader(findByUniqueOperation, batchKey, async (values) => {\n const meta = getMetadata(type);\n const alias = abbreviation(meta.tableName);\n\n const conditions: ColumnCondition[] = [];\n const query: ParsedFindQuery = {\n selects: [`${alias}.*`],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: { kind: \"exp\", op: \"and\", conditions },\n orderBys: [],\n };\n\n addTablePerClassJoinsAndClassTag(query, meta, alias, true);\n maybeAddNotSoftDeleted(conditions, meta, alias, softDeletes);\n\n let column: Column;\n switch (field.kind) {\n case \"primitive\":\n column = field.serde.columns[0];\n conditions.push({\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"in\", value: values.map((v) => column.mapToDb(v)) },\n });\n break;\n default:\n throw new Error(`Unsupported field ${field.fieldName}`);\n }\n\n const rows = await em[\"executeFind\"](meta, findByUniqueOperation, query, {});\n\n const rowsByValue = groupBy(rows, (row) => row[column.columnName]);\n\n // Re-order the output by the batched input\n return values.map((value) => {\n const result = rowsByValue.get(value) ?? [];\n return result[0];\n });\n });\n}\n"],"mappings":";;;;;AAWA,MAAa,wBAAwB;AAErC,SAAgB,uBACd,IACA,MACA,OACA,aACsC;CACtC,MAAM,WAAW,GAAG,KAAK,KAAK,GAAG,MAAM,UAAU,GAAG;CACpD,OAAO,GAAG,UAAU,uBAAuB,UAAU,OAAO,WAAW;EACrE,MAAM,OAAO,YAAY,IAAI;EAC7B,MAAM,QAAQ,aAAa,KAAK,SAAS;EAEzC,MAAM,aAAgC,CAAC;EACvC,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAG,MAAM,GAAG;GACtB,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IAAE,MAAM;IAAO,IAAI;IAAO;GAAW;GAChD,UAAU,CAAC;EACb;EAEA,iCAAiC,OAAO,MAAM,OAAO,IAAI;EACzD,uBAAuB,YAAY,MAAM,OAAO,WAAW;EAE3D,IAAI;EACJ,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,SAAS,MAAM,MAAM,QAAQ;IAC7B,WAAW,KAAK;KACd,MAAM;KACN;KACA,QAAQ,OAAO;KACf,QAAQ,OAAO;KACf,MAAM;MAAE,MAAM;MAAM,OAAO,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;KAAE;IAClE,CAAC;IACD;GACF,SACE,MAAM,IAAI,MAAM,qBAAqB,MAAM,WAAW;EAC1D;EAEA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,uBAAuB,OAAO,CAAC,CAAC;EAE3E,MAAM,cAAc,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW;EAGjE,OAAO,OAAO,KAAK,UAAU;GAE3B,QADe,YAAY,IAAI,KAAK,KAAK,CAAC,EAAA,CAC5B;EAChB,CAAC;CACH,CAAC;AACH"}
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
require("../
|
|
4
|
-
require("../
|
|
5
|
-
const require_keywords = require("../keywords.cjs");
|
|
6
|
-
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
2
|
+
const require_queries_sql_keywords = require("../queries/sql/keywords.cjs");
|
|
3
|
+
const require_queries_find_scopes = require("../queries/find/scopes.cjs");
|
|
4
|
+
const require_queries_find_QueryParser = require("../queries/find/QueryParser.cjs");
|
|
7
5
|
const require_utils = require("../utils.cjs");
|
|
6
|
+
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
8
7
|
const require_unnest = require("../unnest.cjs");
|
|
9
8
|
const require_dataloaders_findDataLoader = require("./findDataLoader.cjs");
|
|
10
9
|
const require_EntityManager = require("../EntityManager.cjs");
|
|
11
|
-
require("../Entity.cjs");
|
|
12
|
-
const require_QueryParser = require("../QueryParser.cjs");
|
|
13
10
|
//#region src/dataloaders/findCountDataLoader.ts
|
|
14
11
|
const findCountOperation = "find-count";
|
|
15
12
|
function findCountDataLoader(em, type, filter) {
|
|
16
13
|
const { where, ...opts } = filter;
|
|
17
14
|
if (opts.limit || opts.offset) throw new Error("Cannot use limit/offset with findCountDataLoader");
|
|
18
15
|
const meta = require_EntityMetadata.getMetadata(type);
|
|
19
|
-
const query =
|
|
16
|
+
const query = require_queries_find_QueryParser.parseFindQuery(meta, where, opts);
|
|
20
17
|
const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);
|
|
21
18
|
const { findSettings } = em["prepareFind"](meta, findCountOperation, query, {
|
|
22
19
|
...opts,
|
|
@@ -36,7 +33,7 @@ function findCountDataLoader(em, type, filter) {
|
|
|
36
33
|
if (entries.length === 1) {
|
|
37
34
|
const { query, findSettings } = entries[0];
|
|
38
35
|
const primary = query.tables.find((t) => t.join === "primary") ?? require_utils.fail("No primary");
|
|
39
|
-
query.selects = [`count(distinct ${
|
|
36
|
+
query.selects = [`count(distinct ${require_queries_sql_keywords.kq(primary.alias)}.id) as count`];
|
|
40
37
|
query.orderBys = [];
|
|
41
38
|
const rows = await em["executePreparedFind"](meta, findCountOperation, query, findSettings, false);
|
|
42
39
|
return [Number(rows[0].count)];
|
|
@@ -48,7 +45,7 @@ function findCountDataLoader(em, type, filter) {
|
|
|
48
45
|
dbType: "int"
|
|
49
46
|
}, ...args.map((a) => a.column)];
|
|
50
47
|
const primary = query.tables.find((t) => t.join === "primary") ?? require_utils.fail("No primary");
|
|
51
|
-
query.selects = [`count(distinct ${
|
|
48
|
+
query.selects = [`count(distinct ${require_queries_sql_keywords.kq(primary.alias)}.id) as count`];
|
|
52
49
|
query.orderBys = [];
|
|
53
50
|
const query2 = {
|
|
54
51
|
selects: ["_find.tag as tag", "_data.count as count"],
|
|
@@ -73,11 +70,11 @@ function findCountDataLoader(em, type, filter) {
|
|
|
73
70
|
}, { cacheKeyFn: (entry) => require_dataloaders_findDataLoader.queryFilterHash(entry) }).load(prepared);
|
|
74
71
|
}
|
|
75
72
|
function mergeCountOptions(where, options) {
|
|
76
|
-
if (!
|
|
73
|
+
if (!require_queries_find_scopes.isScope(where)) return {
|
|
77
74
|
where,
|
|
78
75
|
options
|
|
79
76
|
};
|
|
80
|
-
const resolved =
|
|
77
|
+
const resolved = require_queries_find_scopes.resolveScope(where);
|
|
81
78
|
const scopeOptions = {};
|
|
82
79
|
if (resolved.softDeletes !== void 0) scopeOptions.softDeletes = resolved.softDeletes;
|
|
83
80
|
return {
|
|
@@ -90,7 +87,7 @@ function mergeCountOptions(where, options) {
|
|
|
90
87
|
}
|
|
91
88
|
/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */
|
|
92
89
|
function appendPendingDeletedIds(em, type, query, idDbType, where, opts) {
|
|
93
|
-
const pendingDeletedIds =
|
|
90
|
+
const pendingDeletedIds = require_queries_find_scopes.isSelectAllFilter(where, opts.conditions) ? [] : require_EntityManager.getEmInternalApi(em).pendingDeleteIds(type);
|
|
94
91
|
if (pendingDeletedIds.length === 0) return pendingDeletedIds;
|
|
95
92
|
const condition = {
|
|
96
93
|
kind: "column",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findCountDataLoader.cjs","names":["getMetadata","parseFindQuery","getBatchKeyFromGenericStructure","fail","kq","collectAndReplaceArgs","buildUnnestCte","createColumnValuesFromPrepared","queryFilterHash","isScope","resolveScope","isSelectAllFilter","getEmInternalApi"],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import { type Entity, type IdType } from \"../Entity.ts\";\nimport { type FilterAndSettings, type FindFilter } from \"../EntityFilter.ts\";\nimport { type GraphQLFilterWithAlias } from \"../EntityGraphQLFilter.ts\";\nimport {\n type EntityManager,\n type FindCountFilterOptions,\n type MaybeAbstractEntityConstructor,\n getEmInternalApi,\n} from \"../EntityManager.ts\";\nimport { getMetadata } from \"../EntityMetadata.ts\";\nimport { kq } from \"../keywords.ts\";\nimport { type ParsedFindQuery, parseFindQuery } from \"../QueryParser.ts\";\nimport { isScope, isSelectAllFilter, resolveScope } from \"../scopes.ts\";\nimport { buildUnnestCte } from \"../unnest.ts\";\nimport { fail } from \"../utils.ts\";\nimport {\n collectAndReplaceArgs,\n collectValues,\n createColumnValuesFromPrepared,\n getBatchKeyFromGenericStructure,\n queryFilterHash,\n} from \"./findDataLoader.ts\";\n\nexport const findCountOperation = \"find-count\";\n\nexport function findCountDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n): Promise<number> {\n const { where, ...opts } = filter;\n if (opts.limit || opts.offset) {\n throw new Error(\"Cannot use limit/offset with findCountDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);\n const { findSettings } = em[\"prepareFind\"](meta, findCountOperation, query, { ...opts, checkLimit: false });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, pendingDeletedIds, query, bindings, findSettings };\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<typeof prepared, number>(\n findCountOperation,\n batchKey,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings } = entries[0];\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query, findSettings, false);\n return [Number(rows[0].count)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT _find.tag, _data.count\n // FROM _find\n // CROSS JOIN LATERAL (\n // SELECT count(*) as count\n // FROM author a WHERE a.first_name = _find.arg1 OR a.last_name = _find.arg2\n // ) _data\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings } = entries[0];\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n\n // We're not returning the entities, just counting them...\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n\n const query2: ParsedFindQuery = {\n selects: [\"_find.tag as tag\", \"_data.count as count\"],\n tables: [\n { join: \"primary\", table: \"_find\", alias: \"_find\" },\n // Not sure what fromAlias is for/that it matters...\n { join: \"lateral\", query: query, table: meta.tableName, alias: \"_data\", fromAlias: \"_f\" },\n ],\n // For each unique query, capture its filter values in `bindings` to populate the CTE _find table\n ctes: [buildUnnestCte(\"_find\", argsColumns, createColumnValuesFromPrepared(args, entries))],\n orderBys: [],\n };\n\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query2, findSettings, false);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => 0);\n // Then put each row into the tagged query it matched\n for (const row of rows) {\n results[row.tag] = Number(row.count);\n }\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: (entry) => queryFilterHash(entry) },\n )\n .load(prepared);\n}\n\n/** Merges root-scope count/id settings with caller options, dropping pagination-only settings. */\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindCountFilterOptions<T> = {};\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n\n/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */\nfunction appendPendingDeletedIds<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n query: ParsedFindQuery,\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n where: FilterAndSettings<T>[\"where\"],\n opts: Omit<FilterAndSettings<T>, \"where\">,\n): readonly IdType[] {\n const pendingDeletedIds = isSelectAllFilter(where, opts.conditions)\n ? []\n : getEmInternalApi(em).pendingDeleteIds(type);\n if (pendingDeletedIds.length === 0) return pendingDeletedIds;\n\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n const condition = {\n kind: \"column\" as const,\n alias: primary.alias,\n column: \"id\",\n dbType: idDbType,\n cond: { kind: \"nin\" as const, value: pendingDeletedIds },\n pruneable: true,\n };\n\n if (!query.condition) {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [condition] };\n } else if (query.condition.op === \"and\") {\n query.condition.conditions.push(condition);\n } else {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [query.condition, condition] };\n }\n return pendingDeletedIds;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"findCountDataLoader.cjs","names":["getMetadata","parseFindQuery","getBatchKeyFromGenericStructure","fail","kq","collectAndReplaceArgs","buildUnnestCte","createColumnValuesFromPrepared","queryFilterHash","isScope","resolveScope","isSelectAllFilter","getEmInternalApi"],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import type { Entity, IdType } from \"../Entity.ts\";\nimport {\n type EntityManager,\n type FindCountFilterOptions,\n type MaybeAbstractEntityConstructor,\n getEmInternalApi,\n} from \"../EntityManager.ts\";\nimport { getMetadata } from \"../EntityMetadata.ts\";\nimport type { FilterAndSettings, FindFilter } from \"../queries/find/EntityFilter.ts\";\nimport type { GraphQLFilterWithAlias } from \"../queries/find/EntityGraphQLFilter.ts\";\nimport { type ParsedFindQuery, parseFindQuery } from \"../queries/find/QueryParser.ts\";\nimport { isScope, isSelectAllFilter, resolveScope } from \"../queries/find/scopes.ts\";\nimport { kq } from \"../queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"../unnest.ts\";\nimport { fail } from \"../utils.ts\";\nimport {\n collectAndReplaceArgs,\n collectValues,\n createColumnValuesFromPrepared,\n getBatchKeyFromGenericStructure,\n queryFilterHash,\n} from \"./findDataLoader.ts\";\n\nexport const findCountOperation = \"find-count\";\n\nexport function findCountDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n): Promise<number> {\n const { where, ...opts } = filter;\n if (opts.limit || opts.offset) {\n throw new Error(\"Cannot use limit/offset with findCountDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);\n const { findSettings } = em[\"prepareFind\"](meta, findCountOperation, query, { ...opts, checkLimit: false });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, pendingDeletedIds, query, bindings, findSettings };\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<typeof prepared, number>(\n findCountOperation,\n batchKey,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings } = entries[0];\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query, findSettings, false);\n return [Number(rows[0].count)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT _find.tag, _data.count\n // FROM _find\n // CROSS JOIN LATERAL (\n // SELECT count(*) as count\n // FROM author a WHERE a.first_name = _find.arg1 OR a.last_name = _find.arg2\n // ) _data\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings } = entries[0];\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n\n // We're not returning the entities, just counting them...\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n\n const query2: ParsedFindQuery = {\n selects: [\"_find.tag as tag\", \"_data.count as count\"],\n tables: [\n { join: \"primary\", table: \"_find\", alias: \"_find\" },\n // Not sure what fromAlias is for/that it matters...\n { join: \"lateral\", query: query, table: meta.tableName, alias: \"_data\", fromAlias: \"_f\" },\n ],\n // For each unique query, capture its filter values in `bindings` to populate the CTE _find table\n ctes: [buildUnnestCte(\"_find\", argsColumns, createColumnValuesFromPrepared(args, entries))],\n orderBys: [],\n };\n\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query2, findSettings, false);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => 0);\n // Then put each row into the tagged query it matched\n for (const row of rows) {\n results[row.tag] = Number(row.count);\n }\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: (entry) => queryFilterHash(entry) },\n )\n .load(prepared);\n}\n\n/** Merges root-scope count/id settings with caller options, dropping pagination-only settings. */\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindCountFilterOptions<T> = {};\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n\n/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */\nfunction appendPendingDeletedIds<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n query: ParsedFindQuery,\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n where: FilterAndSettings<T>[\"where\"],\n opts: Omit<FilterAndSettings<T>, \"where\">,\n): readonly IdType[] {\n const pendingDeletedIds = isSelectAllFilter(where, opts.conditions)\n ? []\n : getEmInternalApi(em).pendingDeleteIds(type);\n if (pendingDeletedIds.length === 0) return pendingDeletedIds;\n\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n const condition = {\n kind: \"column\" as const,\n alias: primary.alias,\n column: \"id\",\n dbType: idDbType,\n cond: { kind: \"nin\" as const, value: pendingDeletedIds },\n pruneable: true,\n };\n\n if (!query.condition) {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [condition] };\n } else if (query.condition.op === \"and\") {\n query.condition.conditions.push(condition);\n } else {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [query.condition, condition] };\n }\n return pendingDeletedIds;\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { GraphQLFilterWithAlias } from "../EntityGraphQLFilter.cjs";
|
|
1
|
+
import { GraphQLFilterWithAlias } from "../queries/find/EntityGraphQLFilter.cjs";
|
|
2
|
+
import { FilterAndSettings, FindFilter } from "../queries/find/EntityFilter.cjs";
|
|
2
3
|
import { EntityManager, FindCountFilterOptions, MaybeAbstractEntityConstructor } from "../EntityManager.cjs";
|
|
3
4
|
import { Entity } from "../Entity.cjs";
|
|
4
|
-
import { FilterAndSettings, FindFilter } from "../EntityFilter.cjs";
|
|
5
5
|
//#region src/dataloaders/findCountDataLoader.d.ts
|
|
6
6
|
declare const findCountOperation = "find-count";
|
|
7
7
|
declare function findCountDataLoader<T extends Entity>(em: EntityManager, type: MaybeAbstractEntityConstructor<T>, filter: FilterAndSettings<T>): Promise<number>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { GraphQLFilterWithAlias } from "../EntityGraphQLFilter.mjs";
|
|
1
|
+
import { GraphQLFilterWithAlias } from "../queries/find/EntityGraphQLFilter.mjs";
|
|
2
|
+
import { FilterAndSettings, FindFilter } from "../queries/find/EntityFilter.mjs";
|
|
2
3
|
import { EntityManager, FindCountFilterOptions, MaybeAbstractEntityConstructor } from "../EntityManager.mjs";
|
|
3
4
|
import { Entity } from "../Entity.mjs";
|
|
4
|
-
import { FilterAndSettings, FindFilter } from "../EntityFilter.mjs";
|
|
5
5
|
//#region src/dataloaders/findCountDataLoader.d.ts
|
|
6
6
|
declare const findCountOperation = "find-count";
|
|
7
7
|
declare function findCountDataLoader<T extends Entity>(em: EntityManager, type: MaybeAbstractEntityConstructor<T>, filter: FilterAndSettings<T>): Promise<number>;
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../
|
|
3
|
-
import "../
|
|
4
|
-
import { kq } from "../keywords.js";
|
|
5
|
-
import { getMetadata } from "../EntityMetadata.js";
|
|
1
|
+
import { kq } from "../queries/sql/keywords.js";
|
|
2
|
+
import { isScope, isSelectAllFilter, resolveScope } from "../queries/find/scopes.js";
|
|
3
|
+
import { parseFindQuery } from "../queries/find/QueryParser.js";
|
|
6
4
|
import { fail } from "../utils.js";
|
|
5
|
+
import { getMetadata } from "../EntityMetadata.js";
|
|
7
6
|
import { buildUnnestCte } from "../unnest.js";
|
|
8
7
|
import { collectAndReplaceArgs, collectValues, createColumnValuesFromPrepared, getBatchKeyFromGenericStructure, queryFilterHash } from "./findDataLoader.js";
|
|
9
8
|
import { getEmInternalApi } from "../EntityManager.js";
|
|
10
|
-
import "../Entity.js";
|
|
11
|
-
import { parseFindQuery } from "../QueryParser.js";
|
|
12
9
|
//#region src/dataloaders/findCountDataLoader.ts
|
|
13
10
|
const findCountOperation = "find-count";
|
|
14
11
|
function findCountDataLoader(em, type, filter) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findCountDataLoader.js","names":[],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"findCountDataLoader.js","names":[],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import type { Entity, IdType } from \"../Entity.ts\";\nimport {\n type EntityManager,\n type FindCountFilterOptions,\n type MaybeAbstractEntityConstructor,\n getEmInternalApi,\n} from \"../EntityManager.ts\";\nimport { getMetadata } from \"../EntityMetadata.ts\";\nimport type { FilterAndSettings, FindFilter } from \"../queries/find/EntityFilter.ts\";\nimport type { GraphQLFilterWithAlias } from \"../queries/find/EntityGraphQLFilter.ts\";\nimport { type ParsedFindQuery, parseFindQuery } from \"../queries/find/QueryParser.ts\";\nimport { isScope, isSelectAllFilter, resolveScope } from \"../queries/find/scopes.ts\";\nimport { kq } from \"../queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"../unnest.ts\";\nimport { fail } from \"../utils.ts\";\nimport {\n collectAndReplaceArgs,\n collectValues,\n createColumnValuesFromPrepared,\n getBatchKeyFromGenericStructure,\n queryFilterHash,\n} from \"./findDataLoader.ts\";\n\nexport const findCountOperation = \"find-count\";\n\nexport function findCountDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n): Promise<number> {\n const { where, ...opts } = filter;\n if (opts.limit || opts.offset) {\n throw new Error(\"Cannot use limit/offset with findCountDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);\n const { findSettings } = em[\"prepareFind\"](meta, findCountOperation, query, { ...opts, checkLimit: false });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, pendingDeletedIds, query, bindings, findSettings };\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<typeof prepared, number>(\n findCountOperation,\n batchKey,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings } = entries[0];\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query, findSettings, false);\n return [Number(rows[0].count)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT _find.tag, _data.count\n // FROM _find\n // CROSS JOIN LATERAL (\n // SELECT count(*) as count\n // FROM author a WHERE a.first_name = _find.arg1 OR a.last_name = _find.arg2\n // ) _data\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings } = entries[0];\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n\n // We're not returning the entities, just counting them...\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n\n const query2: ParsedFindQuery = {\n selects: [\"_find.tag as tag\", \"_data.count as count\"],\n tables: [\n { join: \"primary\", table: \"_find\", alias: \"_find\" },\n // Not sure what fromAlias is for/that it matters...\n { join: \"lateral\", query: query, table: meta.tableName, alias: \"_data\", fromAlias: \"_f\" },\n ],\n // For each unique query, capture its filter values in `bindings` to populate the CTE _find table\n ctes: [buildUnnestCte(\"_find\", argsColumns, createColumnValuesFromPrepared(args, entries))],\n orderBys: [],\n };\n\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query2, findSettings, false);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => 0);\n // Then put each row into the tagged query it matched\n for (const row of rows) {\n results[row.tag] = Number(row.count);\n }\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: (entry) => queryFilterHash(entry) },\n )\n .load(prepared);\n}\n\n/** Merges root-scope count/id settings with caller options, dropping pagination-only settings. */\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindCountFilterOptions<T> = {};\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n\n/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */\nfunction appendPendingDeletedIds<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n query: ParsedFindQuery,\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n where: FilterAndSettings<T>[\"where\"],\n opts: Omit<FilterAndSettings<T>, \"where\">,\n): readonly IdType[] {\n const pendingDeletedIds = isSelectAllFilter(where, opts.conditions)\n ? []\n : getEmInternalApi(em).pendingDeleteIds(type);\n if (pendingDeletedIds.length === 0) return pendingDeletedIds;\n\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n const condition = {\n kind: \"column\" as const,\n alias: primary.alias,\n column: \"id\",\n dbType: idDbType,\n cond: { kind: \"nin\" as const, value: pendingDeletedIds },\n pruneable: true,\n };\n\n if (!query.condition) {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [condition] };\n } else if (query.condition.op === \"and\") {\n query.condition.conditions.push(condition);\n } else {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [query.condition, condition] };\n }\n return pendingDeletedIds;\n}\n"],"mappings":"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"}
|
|
@@ -1,27 +1,23 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
require("../EntityFilter.cjs");
|
|
3
|
-
const require_EntityGraphQLFilter = require("../EntityGraphQLFilter.cjs");
|
|
4
|
-
const require_keywords = require("../keywords.cjs");
|
|
5
|
-
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
6
2
|
const require_fields = require("../fields.cjs");
|
|
3
|
+
const require_queries_sql_keywords = require("../queries/sql/keywords.cjs");
|
|
4
|
+
const require_queries_find_QueryVisitor = require("../queries/find/QueryVisitor.cjs");
|
|
5
|
+
const require_queries_find_QueryParser = require("../queries/find/QueryParser.cjs");
|
|
7
6
|
const require_normalizeHints = require("../normalizeHints.cjs");
|
|
8
|
-
require("../loadHints.cjs");
|
|
9
7
|
const require_utils = require("../utils.cjs");
|
|
10
|
-
const
|
|
11
|
-
require("../
|
|
8
|
+
const require_EntityMetadata = require("../EntityMetadata.cjs");
|
|
9
|
+
const require_queries_find_EntityGraphQLFilter = require("../queries/find/EntityGraphQLFilter.cjs");
|
|
12
10
|
const require_HintTree = require("../HintTree.cjs");
|
|
13
11
|
const require_unnest = require("../unnest.cjs");
|
|
14
12
|
const require_dataloaders_fastWhereFilterHash = require("./fastWhereFilterHash.cjs");
|
|
15
13
|
const require_EntityManager = require("../EntityManager.cjs");
|
|
16
|
-
require("../Entity.cjs");
|
|
17
|
-
const require_QueryParser = require("../QueryParser.cjs");
|
|
18
14
|
//#region src/dataloaders/findDataLoader.ts
|
|
19
15
|
const findOperation = "find";
|
|
20
16
|
function findDataLoader(em, type, filter, hint) {
|
|
21
17
|
const { where, ...opts } = filter;
|
|
22
18
|
if ("limit" in opts || "offset" in opts) throw new Error("Cannot use limit/offset with findDataLoader");
|
|
23
19
|
const meta = require_EntityMetadata.getMetadata(type);
|
|
24
|
-
const query =
|
|
20
|
+
const query = require_queries_find_QueryParser.parseFindQuery(meta, where, opts);
|
|
25
21
|
const { checkLimit, findSettings } = em["prepareFind"](meta, findOperation, query, {
|
|
26
22
|
...opts,
|
|
27
23
|
limit: em.entityLimit
|
|
@@ -68,7 +64,7 @@ function findDataLoader(em, type, filter, hint) {
|
|
|
68
64
|
query2.tables.push(...preloadJoins.map((j) => j.join));
|
|
69
65
|
}
|
|
70
66
|
query2.groupBys = buildGroupBys(query2.selects);
|
|
71
|
-
const [primary] =
|
|
67
|
+
const [primary] = require_queries_find_QueryParser.getTables(query2);
|
|
72
68
|
for (const { alias, column } of query2.orderBys) if (alias !== primary.alias) query2.groupBys.push({
|
|
73
69
|
alias,
|
|
74
70
|
column
|
|
@@ -141,7 +137,7 @@ function collectAndReplaceArgs(query, entries) {
|
|
|
141
137
|
const argsIndex = new ArgCounter();
|
|
142
138
|
const constant = computeConstantBindings(entries);
|
|
143
139
|
let bindingIndex = 0;
|
|
144
|
-
|
|
140
|
+
require_queries_find_QueryVisitor.visitConditions(query, { visitCond(c) {
|
|
145
141
|
if ("value" in c.cond) {
|
|
146
142
|
const { kind } = c.cond;
|
|
147
143
|
const consumed = kind === "between" ? 2 : 1;
|
|
@@ -188,7 +184,7 @@ function rewriteToRawCondition(c, argsIndex) {
|
|
|
188
184
|
return {
|
|
189
185
|
kind: "raw",
|
|
190
186
|
aliases: [c.alias],
|
|
191
|
-
condition: `${negate ? "NOT " : ""}${
|
|
187
|
+
condition: `${negate ? "NOT " : ""}${require_queries_sql_keywords.kqDot(c.alias, c.column)} ${op}`,
|
|
192
188
|
pruneable: c.pruneable ?? false,
|
|
193
189
|
bindings: []
|
|
194
190
|
};
|
|
@@ -210,7 +206,7 @@ function createColumnValuesFromPrepared(args, entries) {
|
|
|
210
206
|
}
|
|
211
207
|
/** Pushes the arg values of a given query in the cross-query `bindings` array. */
|
|
212
208
|
function collectValues(bindings, query) {
|
|
213
|
-
|
|
209
|
+
require_queries_find_QueryVisitor.visitConditions(query, { visitCond(c) {
|
|
214
210
|
if ("value" in c.cond) {
|
|
215
211
|
if (c.cond.kind === "between") {
|
|
216
212
|
bindings.push(c.cond.value[0]);
|
|
@@ -226,7 +222,7 @@ function isAggregateSelect(select) {
|
|
|
226
222
|
/** Builds GROUP BYs for selected values, accounting for whole-row selects that are grouped by primary key. */
|
|
227
223
|
function buildGroupBys(selects) {
|
|
228
224
|
const sqlSelects = selects.map(selectSqlForGroupBy);
|
|
229
|
-
const wholeRowAliases = new Set(sqlSelects.filter((select) => !isAggregateSelect(select) && stripSelectAlias(select).endsWith(".*")).map(
|
|
225
|
+
const wholeRowAliases = new Set(sqlSelects.filter((select) => !isAggregateSelect(select) && stripSelectAlias(select).endsWith(".*")).map(require_queries_find_QueryParser.parseAlias));
|
|
230
226
|
return sqlSelects.filter((select) => !isAggregateSelect(select)).filter((select) => !isCoveredByWholeRowGroupBy(select, wholeRowAliases)).map((select) => groupBySelect(select));
|
|
231
227
|
}
|
|
232
228
|
/** Returns a SQL string for group-by analysis, until we support bindings in ParsedGroupBy. */
|
|
@@ -238,7 +234,7 @@ function selectSqlForGroupBy(select) {
|
|
|
238
234
|
function groupBySelect(select) {
|
|
239
235
|
const expression = stripSelectAlias(select);
|
|
240
236
|
if (expression.endsWith(".*")) return {
|
|
241
|
-
alias:
|
|
237
|
+
alias: require_queries_find_QueryParser.parseAlias(expression),
|
|
242
238
|
column: "id"
|
|
243
239
|
};
|
|
244
240
|
return { expression };
|
|
@@ -281,9 +277,9 @@ function makeOp(cond, argsIndex) {
|
|
|
281
277
|
case "jsonPathPredicate":
|
|
282
278
|
case "contains":
|
|
283
279
|
case "overlaps":
|
|
284
|
-
case "containedBy": return [`${
|
|
280
|
+
case "containedBy": return [`${require_queries_find_EntityGraphQLFilter.opToFn[cond.kind] ?? require_utils.fail(`Invalid operator ${cond.kind}`)} _find.arg${argsIndex.next()}`, false];
|
|
285
281
|
case "noverlaps":
|
|
286
|
-
case "ncontains": return [`${
|
|
282
|
+
case "ncontains": return [`${require_queries_find_EntityGraphQLFilter.opToFn[cond.kind.substring(1)] ?? require_utils.fail(`Invalid operator ${cond.kind}`)} _find.arg${argsIndex.next()}`, true];
|
|
287
283
|
case "is-null": return [`IS NULL`, false];
|
|
288
284
|
case "not-null": return [`IS NOT NULL`, false];
|
|
289
285
|
case "in": return [`= ANY(_find.arg${argsIndex.next()})`, false];
|
|
@@ -342,7 +338,7 @@ function argsEqual(a, b) {
|
|
|
342
338
|
}
|
|
343
339
|
function getBatchKeyFromGenericStructure(meta, query) {
|
|
344
340
|
const saved = /* @__PURE__ */ new Map();
|
|
345
|
-
|
|
341
|
+
require_queries_find_QueryVisitor.visitConditions(query, { visitCond(c) {
|
|
346
342
|
const { cond } = c;
|
|
347
343
|
if ("value" in cond && !saved.has(cond)) {
|
|
348
344
|
saved.set(cond, cond.value);
|