@contember/engine-content-api 2.0.0-alpha.9 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +3 -2
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +3 -2
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ExecutionContainer.cjs +2 -2
- package/dist/development/src/ExecutionContainer.cjs.map +1 -1
- package/dist/development/src/ExecutionContainer.js +2 -2
- package/dist/development/src/ExecutionContainer.js.map +1 -1
- package/dist/development/src/acl/Authorizator.cjs.map +1 -1
- package/dist/development/src/acl/Authorizator.js.map +1 -1
- package/dist/development/src/acl/EvaluatedPredicateReplacer.cjs.map +1 -1
- package/dist/development/src/acl/EvaluatedPredicateReplacer.js.map +1 -1
- package/dist/development/src/acl/PermissionFactory.cjs.map +1 -1
- package/dist/development/src/acl/PermissionFactory.js.map +1 -1
- package/dist/development/src/acl/PredicateFactory.cjs.map +1 -1
- package/dist/development/src/acl/PredicateFactory.js.map +1 -1
- package/dist/development/src/acl/PredicatesInjector.cjs.map +1 -1
- package/dist/development/src/acl/PredicatesInjector.js.map +1 -1
- package/dist/development/src/acl/VariableInjector.cjs.map +1 -1
- package/dist/development/src/acl/VariableInjector.js.map +1 -1
- package/dist/development/src/acl/VariableUtils.cjs.map +1 -1
- package/dist/development/src/acl/VariableUtils.js.map +1 -1
- package/dist/development/src/exception.cjs.map +1 -1
- package/dist/development/src/exception.js.map +1 -1
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducer.cjs.map +1 -1
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducer.js.map +1 -1
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.cjs.map +1 -1
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.cjs +31 -6
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.cjs.map +1 -1
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +31 -6
- package/dist/development/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.cjs.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.cjs.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyFieldProvider.cjs.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyFieldProvider.js.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.cjs.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.cjs.map +1 -1
- package/dist/development/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.cjs.map +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.js.map +1 -1
- package/dist/development/src/input-validation/EntityRulesResolver.cjs.map +1 -1
- package/dist/development/src/input-validation/EntityRulesResolver.js.map +1 -1
- package/dist/development/src/input-validation/QueryAstFactory.cjs.map +1 -1
- package/dist/development/src/input-validation/QueryAstFactory.js.map +1 -1
- package/dist/development/src/input-validation/ValidationContext.cjs.map +1 -1
- package/dist/development/src/input-validation/ValidationContext.js.map +1 -1
- package/dist/development/src/input-validation/ValidationDataSelector.cjs.map +1 -1
- package/dist/development/src/input-validation/ValidationDataSelector.js.map +1 -1
- package/dist/development/src/input-validation/ValidationEvaluation.cjs.map +1 -1
- package/dist/development/src/input-validation/ValidationEvaluation.js.map +1 -1
- package/dist/development/src/input-validation/ValidationPath.cjs.map +1 -1
- package/dist/development/src/input-validation/ValidationPath.js.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyMerger.cjs.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyMerger.js.map +1 -1
- package/dist/development/src/input-validation/preValidation/CreateInputPreValidationProcessor.cjs.map +1 -1
- package/dist/development/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
- package/dist/development/src/input-validation/preValidation/InputPreValidator.cjs +1 -1
- package/dist/development/src/input-validation/preValidation/InputPreValidator.cjs.map +1 -1
- package/dist/development/src/input-validation/preValidation/InputPreValidator.js +1 -1
- package/dist/development/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
- package/dist/development/src/input-validation/preValidation/UpdateInputPreValidationProcessor.cjs.map +1 -1
- package/dist/development/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
- package/dist/development/src/inputProcessing/CreateInputVisitor.cjs +16 -17
- package/dist/development/src/inputProcessing/CreateInputVisitor.cjs.map +1 -1
- package/dist/development/src/inputProcessing/CreateInputVisitor.js +16 -17
- package/dist/development/src/inputProcessing/CreateInputVisitor.js.map +1 -1
- package/dist/development/src/inputProcessing/FieldNode.cjs.map +1 -1
- package/dist/development/src/inputProcessing/FieldNode.js.map +1 -1
- package/dist/development/src/inputProcessing/ObjectNode.cjs.map +1 -1
- package/dist/development/src/inputProcessing/ObjectNode.js.map +1 -1
- package/dist/development/src/inputProcessing/UniqueWhereExpander.cjs.map +1 -1
- package/dist/development/src/inputProcessing/UniqueWhereExpander.js.map +1 -1
- package/dist/development/src/inputProcessing/UpdateInputVisitor.cjs +29 -27
- package/dist/development/src/inputProcessing/UpdateInputVisitor.cjs.map +1 -1
- package/dist/development/src/inputProcessing/UpdateInputVisitor.js +29 -27
- package/dist/development/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
- package/dist/development/src/introspection/IntrospectionSchemaDefinitionFactory.cjs +6 -163
- package/dist/development/src/introspection/IntrospectionSchemaDefinitionFactory.cjs.map +1 -1
- package/dist/development/src/introspection/IntrospectionSchemaDefinitionFactory.js +5 -162
- package/dist/development/src/introspection/IntrospectionSchemaDefinitionFactory.js.map +1 -1
- package/dist/development/src/introspection/IntrospectionSchemaFactory.cjs.map +1 -1
- package/dist/development/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
- package/dist/development/src/introspection/introspection.schema.cjs +163 -0
- package/dist/development/src/introspection/introspection.schema.cjs.map +1 -0
- package/dist/development/src/introspection/introspection.schema.js +163 -0
- package/dist/development/src/introspection/introspection.schema.js.map +1 -0
- package/dist/development/src/mapper/CheckedPrimary.cjs.map +1 -1
- package/dist/development/src/mapper/CheckedPrimary.js.map +1 -1
- package/dist/development/src/mapper/ColumnValue.cjs +8 -18
- package/dist/development/src/mapper/ColumnValue.cjs.map +1 -1
- package/dist/development/src/mapper/ColumnValue.js +8 -18
- package/dist/development/src/mapper/ColumnValue.js.map +1 -1
- package/dist/development/src/mapper/ErrorUtils.cjs +1 -1
- package/dist/development/src/mapper/ErrorUtils.cjs.map +1 -1
- package/dist/development/src/mapper/ErrorUtils.js +1 -1
- package/dist/development/src/mapper/ErrorUtils.js.map +1 -1
- package/dist/development/src/mapper/EventManager.cjs +4 -7
- package/dist/development/src/mapper/EventManager.cjs.map +1 -1
- package/dist/development/src/mapper/EventManager.js +4 -7
- package/dist/development/src/mapper/EventManager.js.map +1 -1
- package/dist/development/src/mapper/JunctionTableManager.cjs.map +1 -1
- package/dist/development/src/mapper/JunctionTableManager.js.map +1 -1
- package/dist/development/src/mapper/Mapper.cjs +8 -28
- package/dist/development/src/mapper/Mapper.cjs.map +1 -1
- package/dist/development/src/mapper/Mapper.js +8 -28
- package/dist/development/src/mapper/Mapper.js.map +1 -1
- package/dist/development/src/mapper/MapperFactory.cjs.map +1 -1
- package/dist/development/src/mapper/MapperFactory.js.map +1 -1
- package/dist/development/src/mapper/MutationProcessorHelper.cjs +10 -2
- package/dist/development/src/mapper/MutationProcessorHelper.cjs.map +1 -1
- package/dist/development/src/mapper/MutationProcessorHelper.js +10 -2
- package/dist/development/src/mapper/MutationProcessorHelper.js.map +1 -1
- package/dist/development/src/mapper/Result.cjs +10 -27
- package/dist/development/src/mapper/Result.cjs.map +1 -1
- package/dist/development/src/mapper/Result.js +10 -27
- package/dist/development/src/mapper/Result.js.map +1 -1
- package/dist/development/src/mapper/delete/DeleteExecutor.cjs +4 -8
- package/dist/development/src/mapper/delete/DeleteExecutor.cjs.map +1 -1
- package/dist/development/src/mapper/delete/DeleteExecutor.js +5 -9
- package/dist/development/src/mapper/delete/DeleteExecutor.js.map +1 -1
- package/dist/development/src/mapper/delete/DeleteState.cjs.map +1 -1
- package/dist/development/src/mapper/delete/DeleteState.js.map +1 -1
- package/dist/development/src/mapper/delete/DeletedEntitiesStorage.cjs.map +1 -1
- package/dist/development/src/mapper/delete/DeletedEntitiesStorage.js.map +1 -1
- package/dist/development/src/mapper/delete/helpers.cjs.map +1 -1
- package/dist/development/src/mapper/delete/helpers.js.map +1 -1
- package/dist/development/src/mapper/insert/InsertBuilder.cjs +13 -21
- package/dist/development/src/mapper/insert/InsertBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/insert/InsertBuilder.js +14 -22
- package/dist/development/src/mapper/insert/InsertBuilder.js.map +1 -1
- package/dist/development/src/mapper/insert/InsertBuilderFactory.cjs.map +1 -1
- package/dist/development/src/mapper/insert/InsertBuilderFactory.js.map +1 -1
- package/dist/development/src/mapper/insert/Inserter.cjs +43 -21
- package/dist/development/src/mapper/insert/Inserter.cjs.map +1 -1
- package/dist/development/src/mapper/insert/Inserter.js +45 -23
- package/dist/development/src/mapper/insert/Inserter.js.map +1 -1
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs +23 -79
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js +23 -79
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/development/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.cjs +43 -0
- package/dist/development/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.js +43 -0
- package/dist/development/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.cjs +40 -0
- package/dist/development/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.js +40 -0
- package/dist/development/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/insert/relations/OneHasManyCreateInputProcessor.cjs +38 -0
- package/dist/development/src/mapper/insert/relations/OneHasManyCreateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/insert/relations/OneHasManyCreateInputProcessor.js +38 -0
- package/dist/development/src/mapper/insert/relations/OneHasManyCreateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/{relations → insert/relations}/OneHasOneInverseCreateInputProcessor.cjs +23 -32
- package/dist/development/src/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/{relations → insert/relations}/OneHasOneInverseCreateInputProcessor.js +23 -32
- package/dist/development/src/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.cjs +65 -0
- package/dist/development/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.js +65 -0
- package/dist/development/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/JoinBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/JoinBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/JoinVisitor.cjs.map +1 -1
- package/dist/development/src/mapper/select/JoinVisitor.js.map +1 -1
- package/dist/development/src/mapper/select/OrderByBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/OrderByBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/OrderByHelper.cjs.map +1 -1
- package/dist/development/src/mapper/select/OrderByHelper.js.map +1 -1
- package/dist/development/src/mapper/select/Path.cjs.map +1 -1
- package/dist/development/src/mapper/select/Path.js.map +1 -1
- package/dist/development/src/mapper/select/RelationFetcher.cjs.map +1 -1
- package/dist/development/src/mapper/select/RelationFetcher.js.map +1 -1
- package/dist/development/src/mapper/select/SelectBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/SelectBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/SelectHydrator.cjs.map +1 -1
- package/dist/development/src/mapper/select/SelectHydrator.js.map +1 -1
- package/dist/development/src/mapper/select/WhereBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs +3 -0
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.js +3 -0
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/MetaHandler.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/MetaHandler.js.map +1 -1
- package/dist/development/src/mapper/select/optimizer/ConditionOptimizer.cjs.map +1 -1
- package/dist/development/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -1
- package/dist/development/src/mapper/select/optimizer/WhereOptimizer.cjs.map +1 -1
- package/dist/development/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
- package/dist/development/src/mapper/select/optimizer/WhereReplacer.cjs.map +1 -1
- package/dist/development/src/mapper/select/optimizer/WhereReplacer.js.map +1 -1
- package/dist/development/src/mapper/select/optimizer/helpers.cjs.map +1 -1
- package/dist/development/src/mapper/select/optimizer/helpers.js.map +1 -1
- package/dist/development/src/mapper/update/SqlUpdateInputProcessor.cjs +36 -36
- package/dist/development/src/mapper/update/SqlUpdateInputProcessor.cjs.map +1 -1
- package/dist/development/src/mapper/update/SqlUpdateInputProcessor.js +36 -36
- package/dist/development/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
- package/dist/development/src/mapper/update/UpdateBuilder.cjs +14 -19
- package/dist/development/src/mapper/update/UpdateBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/update/UpdateBuilder.js +15 -20
- package/dist/development/src/mapper/update/UpdateBuilder.js.map +1 -1
- package/dist/development/src/mapper/update/UpdateBuilderFactory.cjs.map +1 -1
- package/dist/development/src/mapper/update/UpdateBuilderFactory.js.map +1 -1
- package/dist/development/src/mapper/update/Updater.cjs +45 -17
- package/dist/development/src/mapper/update/Updater.cjs.map +1 -1
- package/dist/development/src/mapper/update/Updater.js +47 -19
- package/dist/development/src/mapper/update/Updater.js.map +1 -1
- package/dist/development/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.cjs +84 -0
- package/dist/development/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.js +84 -0
- package/dist/development/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.cjs +88 -0
- package/dist/development/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.js +88 -0
- package/dist/development/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/update/relations/OneHasManyUpdateInputProcessor.cjs +87 -0
- package/dist/development/src/mapper/update/relations/OneHasManyUpdateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/update/relations/OneHasManyUpdateInputProcessor.js +87 -0
- package/dist/development/src/mapper/update/relations/OneHasManyUpdateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.cjs +147 -0
- package/dist/development/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.js +147 -0
- package/dist/development/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.js.map +1 -0
- package/dist/development/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.cjs +183 -0
- package/dist/development/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.cjs.map +1 -0
- package/dist/development/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.js +183 -0
- package/dist/development/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.js.map +1 -0
- package/dist/development/src/resolvers/GraphQlQueryAstFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
- package/dist/development/src/resolvers/MutationResolver.cjs +8 -4
- package/dist/development/src/resolvers/MutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/MutationResolver.js +8 -4
- package/dist/development/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/ReadHelpers.cjs.map +1 -1
- package/dist/development/src/resolvers/ReadHelpers.js.map +1 -1
- package/dist/development/src/resolvers/ReadResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/ReadResolver.js.map +1 -1
- package/dist/development/src/resolvers/ValidationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/ValidationResolver.js.map +1 -1
- package/dist/development/src/schema/ColumnTypeResolver.cjs.map +1 -1
- package/dist/development/src/schema/ColumnTypeResolver.js.map +1 -1
- package/dist/development/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/ConditionTypeProvider.js.map +1 -1
- package/dist/development/src/schema/CustomTypesProvider.cjs.map +1 -1
- package/dist/development/src/schema/CustomTypesProvider.js.map +1 -1
- package/dist/development/src/schema/EntityTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/EntityTypeProvider.js.map +1 -1
- package/dist/development/src/schema/EnumsProvider.cjs.map +1 -1
- package/dist/development/src/schema/EnumsProvider.js.map +1 -1
- package/dist/development/src/schema/FieldAccessVisitor.cjs.map +1 -1
- package/dist/development/src/schema/FieldAccessVisitor.js.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.js.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
- package/dist/development/src/schema/MutationProvider.cjs.map +1 -1
- package/dist/development/src/schema/MutationProvider.js.map +1 -1
- package/dist/development/src/schema/OperationExtension.cjs.map +1 -1
- package/dist/development/src/schema/OperationExtension.js.map +1 -1
- package/dist/development/src/schema/OrderByTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/development/src/schema/PaginatedFieldConfigFactory.cjs.map +1 -1
- package/dist/development/src/schema/PaginatedFieldConfigFactory.js.map +1 -1
- package/dist/development/src/schema/QueryProvider.cjs.map +1 -1
- package/dist/development/src/schema/QueryProvider.js.map +1 -1
- package/dist/development/src/schema/ResultSchemaTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/ResultSchemaTypeProvider.js.map +1 -1
- package/dist/development/src/schema/ValidationQueriesProvider.cjs.map +1 -1
- package/dist/development/src/schema/ValidationQueriesProvider.js.map +1 -1
- package/dist/development/src/schema/WhereTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/development/src/schema/entities/FieldArgsVisitor.cjs.map +1 -1
- package/dist/development/src/schema/entities/FieldArgsVisitor.js.map +1 -1
- package/dist/development/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
- package/dist/development/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/ConnectOrCreateRelationInputProvider.cjs.map +1 -1
- package/dist/development/src/schema/mutations/ConnectOrCreateRelationInputProvider.js.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityRelationInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityRelationInputProvider.cjs.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityRelationInputProvider.js.map +1 -1
- package/dist/development/src/schema/mutations/EntityInputProvider.cjs.map +1 -1
- package/dist/development/src/schema/mutations/EntityInputProvider.js.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.cjs +2 -0
- package/dist/development/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -0
- package/dist/development/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityRelationInputProvider.cjs.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityRelationInputProvider.js.map +1 -1
- package/dist/development/src/schema/utils.cjs.map +1 -1
- package/dist/development/src/schema/utils.js.map +1 -1
- package/dist/development/src/utils/Mutex.cjs.map +1 -1
- package/dist/development/src/utils/Mutex.js.map +1 -1
- package/dist/development/src/utils/ResolveInfoUtils.cjs.map +1 -1
- package/dist/development/src/utils/ResolveInfoUtils.js.map +1 -1
- package/dist/development/src/utils/accessor.cjs.map +1 -1
- package/dist/development/src/utils/accessor.js.map +1 -1
- package/dist/development/src/utils/isIt.cjs.map +1 -1
- package/dist/development/src/utils/isIt.js.map +1 -1
- package/dist/development/src/utils/object.cjs.map +1 -1
- package/dist/development/src/utils/object.js.map +1 -1
- package/dist/development/src/utils/paginationUtils.cjs.map +1 -1
- package/dist/development/src/utils/paginationUtils.js.map +1 -1
- package/dist/development/src/utils/singletonFactory.cjs.map +1 -1
- package/dist/development/src/utils/singletonFactory.js.map +1 -1
- package/dist/development/src/utils/uniqueWhereFields.cjs.map +1 -1
- package/dist/development/src/utils/uniqueWhereFields.js.map +1 -1
- package/dist/production/index.cjs +3 -2
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +3 -2
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ExecutionContainer.cjs +2 -2
- package/dist/production/src/ExecutionContainer.cjs.map +1 -1
- package/dist/production/src/ExecutionContainer.js +2 -2
- package/dist/production/src/ExecutionContainer.js.map +1 -1
- package/dist/production/src/acl/Authorizator.cjs.map +1 -1
- package/dist/production/src/acl/Authorizator.js.map +1 -1
- package/dist/production/src/acl/EvaluatedPredicateReplacer.cjs.map +1 -1
- package/dist/production/src/acl/EvaluatedPredicateReplacer.js.map +1 -1
- package/dist/production/src/acl/PermissionFactory.cjs.map +1 -1
- package/dist/production/src/acl/PermissionFactory.js.map +1 -1
- package/dist/production/src/acl/PredicateFactory.cjs.map +1 -1
- package/dist/production/src/acl/PredicateFactory.js.map +1 -1
- package/dist/production/src/acl/PredicatesInjector.cjs.map +1 -1
- package/dist/production/src/acl/PredicatesInjector.js.map +1 -1
- package/dist/production/src/acl/VariableInjector.cjs.map +1 -1
- package/dist/production/src/acl/VariableInjector.js.map +1 -1
- package/dist/production/src/acl/VariableUtils.cjs.map +1 -1
- package/dist/production/src/acl/VariableUtils.js.map +1 -1
- package/dist/production/src/exception.cjs.map +1 -1
- package/dist/production/src/exception.js.map +1 -1
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducer.cjs.map +1 -1
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducer.js.map +1 -1
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.cjs.map +1 -1
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.cjs +31 -6
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.cjs.map +1 -1
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +31 -6
- package/dist/production/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.cjs.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.cjs.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyFieldProvider.cjs.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyFieldProvider.js.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.cjs.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.cjs.map +1 -1
- package/dist/production/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.cjs.map +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.js.map +1 -1
- package/dist/production/src/input-validation/EntityRulesResolver.cjs.map +1 -1
- package/dist/production/src/input-validation/EntityRulesResolver.js.map +1 -1
- package/dist/production/src/input-validation/QueryAstFactory.cjs.map +1 -1
- package/dist/production/src/input-validation/QueryAstFactory.js.map +1 -1
- package/dist/production/src/input-validation/ValidationContext.cjs.map +1 -1
- package/dist/production/src/input-validation/ValidationContext.js.map +1 -1
- package/dist/production/src/input-validation/ValidationDataSelector.cjs.map +1 -1
- package/dist/production/src/input-validation/ValidationDataSelector.js.map +1 -1
- package/dist/production/src/input-validation/ValidationEvaluation.cjs.map +1 -1
- package/dist/production/src/input-validation/ValidationEvaluation.js.map +1 -1
- package/dist/production/src/input-validation/ValidationPath.cjs.map +1 -1
- package/dist/production/src/input-validation/ValidationPath.js.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyMerger.cjs.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyMerger.js.map +1 -1
- package/dist/production/src/input-validation/preValidation/CreateInputPreValidationProcessor.cjs.map +1 -1
- package/dist/production/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
- package/dist/production/src/input-validation/preValidation/InputPreValidator.cjs +1 -1
- package/dist/production/src/input-validation/preValidation/InputPreValidator.cjs.map +1 -1
- package/dist/production/src/input-validation/preValidation/InputPreValidator.js +1 -1
- package/dist/production/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
- package/dist/production/src/input-validation/preValidation/UpdateInputPreValidationProcessor.cjs.map +1 -1
- package/dist/production/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
- package/dist/production/src/inputProcessing/CreateInputVisitor.cjs +16 -17
- package/dist/production/src/inputProcessing/CreateInputVisitor.cjs.map +1 -1
- package/dist/production/src/inputProcessing/CreateInputVisitor.js +16 -17
- package/dist/production/src/inputProcessing/CreateInputVisitor.js.map +1 -1
- package/dist/production/src/inputProcessing/FieldNode.cjs.map +1 -1
- package/dist/production/src/inputProcessing/FieldNode.js.map +1 -1
- package/dist/production/src/inputProcessing/ObjectNode.cjs.map +1 -1
- package/dist/production/src/inputProcessing/ObjectNode.js.map +1 -1
- package/dist/production/src/inputProcessing/UniqueWhereExpander.cjs.map +1 -1
- package/dist/production/src/inputProcessing/UniqueWhereExpander.js.map +1 -1
- package/dist/production/src/inputProcessing/UpdateInputVisitor.cjs +29 -27
- package/dist/production/src/inputProcessing/UpdateInputVisitor.cjs.map +1 -1
- package/dist/production/src/inputProcessing/UpdateInputVisitor.js +29 -27
- package/dist/production/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
- package/dist/production/src/introspection/IntrospectionSchemaDefinitionFactory.cjs +6 -163
- package/dist/production/src/introspection/IntrospectionSchemaDefinitionFactory.cjs.map +1 -1
- package/dist/production/src/introspection/IntrospectionSchemaDefinitionFactory.js +5 -162
- package/dist/production/src/introspection/IntrospectionSchemaDefinitionFactory.js.map +1 -1
- package/dist/production/src/introspection/IntrospectionSchemaFactory.cjs.map +1 -1
- package/dist/production/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
- package/dist/production/src/introspection/introspection.schema.cjs +163 -0
- package/dist/production/src/introspection/introspection.schema.cjs.map +1 -0
- package/dist/production/src/introspection/introspection.schema.js +163 -0
- package/dist/production/src/introspection/introspection.schema.js.map +1 -0
- package/dist/production/src/mapper/CheckedPrimary.cjs.map +1 -1
- package/dist/production/src/mapper/CheckedPrimary.js.map +1 -1
- package/dist/production/src/mapper/ColumnValue.cjs +8 -18
- package/dist/production/src/mapper/ColumnValue.cjs.map +1 -1
- package/dist/production/src/mapper/ColumnValue.js +8 -18
- package/dist/production/src/mapper/ColumnValue.js.map +1 -1
- package/dist/production/src/mapper/ErrorUtils.cjs +1 -1
- package/dist/production/src/mapper/ErrorUtils.cjs.map +1 -1
- package/dist/production/src/mapper/ErrorUtils.js +1 -1
- package/dist/production/src/mapper/ErrorUtils.js.map +1 -1
- package/dist/production/src/mapper/EventManager.cjs +4 -7
- package/dist/production/src/mapper/EventManager.cjs.map +1 -1
- package/dist/production/src/mapper/EventManager.js +4 -7
- package/dist/production/src/mapper/EventManager.js.map +1 -1
- package/dist/production/src/mapper/JunctionTableManager.cjs.map +1 -1
- package/dist/production/src/mapper/JunctionTableManager.js.map +1 -1
- package/dist/production/src/mapper/Mapper.cjs +8 -28
- package/dist/production/src/mapper/Mapper.cjs.map +1 -1
- package/dist/production/src/mapper/Mapper.js +8 -28
- package/dist/production/src/mapper/Mapper.js.map +1 -1
- package/dist/production/src/mapper/MapperFactory.cjs.map +1 -1
- package/dist/production/src/mapper/MapperFactory.js.map +1 -1
- package/dist/production/src/mapper/MutationProcessorHelper.cjs +10 -2
- package/dist/production/src/mapper/MutationProcessorHelper.cjs.map +1 -1
- package/dist/production/src/mapper/MutationProcessorHelper.js +10 -2
- package/dist/production/src/mapper/MutationProcessorHelper.js.map +1 -1
- package/dist/production/src/mapper/Result.cjs +10 -27
- package/dist/production/src/mapper/Result.cjs.map +1 -1
- package/dist/production/src/mapper/Result.js +10 -27
- package/dist/production/src/mapper/Result.js.map +1 -1
- package/dist/production/src/mapper/delete/DeleteExecutor.cjs +4 -8
- package/dist/production/src/mapper/delete/DeleteExecutor.cjs.map +1 -1
- package/dist/production/src/mapper/delete/DeleteExecutor.js +5 -9
- package/dist/production/src/mapper/delete/DeleteExecutor.js.map +1 -1
- package/dist/production/src/mapper/delete/DeleteState.cjs.map +1 -1
- package/dist/production/src/mapper/delete/DeleteState.js.map +1 -1
- package/dist/production/src/mapper/delete/DeletedEntitiesStorage.cjs.map +1 -1
- package/dist/production/src/mapper/delete/DeletedEntitiesStorage.js.map +1 -1
- package/dist/production/src/mapper/delete/helpers.cjs.map +1 -1
- package/dist/production/src/mapper/delete/helpers.js.map +1 -1
- package/dist/production/src/mapper/insert/InsertBuilder.cjs +13 -21
- package/dist/production/src/mapper/insert/InsertBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/insert/InsertBuilder.js +14 -22
- package/dist/production/src/mapper/insert/InsertBuilder.js.map +1 -1
- package/dist/production/src/mapper/insert/InsertBuilderFactory.cjs.map +1 -1
- package/dist/production/src/mapper/insert/InsertBuilderFactory.js.map +1 -1
- package/dist/production/src/mapper/insert/Inserter.cjs +43 -21
- package/dist/production/src/mapper/insert/Inserter.cjs.map +1 -1
- package/dist/production/src/mapper/insert/Inserter.js +45 -23
- package/dist/production/src/mapper/insert/Inserter.js.map +1 -1
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs +23 -79
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js +23 -79
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/production/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.cjs +43 -0
- package/dist/production/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.js +43 -0
- package/dist/production/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.cjs +40 -0
- package/dist/production/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.js +40 -0
- package/dist/production/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/insert/relations/OneHasManyCreateInputProcessor.cjs +38 -0
- package/dist/production/src/mapper/insert/relations/OneHasManyCreateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/insert/relations/OneHasManyCreateInputProcessor.js +38 -0
- package/dist/production/src/mapper/insert/relations/OneHasManyCreateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/{relations → insert/relations}/OneHasOneInverseCreateInputProcessor.cjs +23 -32
- package/dist/production/src/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/{relations → insert/relations}/OneHasOneInverseCreateInputProcessor.js +23 -32
- package/dist/production/src/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.cjs +65 -0
- package/dist/production/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.js +65 -0
- package/dist/production/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/JoinBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/JoinBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/JoinVisitor.cjs.map +1 -1
- package/dist/production/src/mapper/select/JoinVisitor.js.map +1 -1
- package/dist/production/src/mapper/select/OrderByBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/OrderByBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/OrderByHelper.cjs.map +1 -1
- package/dist/production/src/mapper/select/OrderByHelper.js.map +1 -1
- package/dist/production/src/mapper/select/Path.cjs.map +1 -1
- package/dist/production/src/mapper/select/Path.js.map +1 -1
- package/dist/production/src/mapper/select/RelationFetcher.cjs.map +1 -1
- package/dist/production/src/mapper/select/RelationFetcher.js.map +1 -1
- package/dist/production/src/mapper/select/SelectBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/SelectBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/SelectHydrator.cjs.map +1 -1
- package/dist/production/src/mapper/select/SelectHydrator.js.map +1 -1
- package/dist/production/src/mapper/select/WhereBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs +3 -0
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.js +3 -0
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/MetaHandler.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/MetaHandler.js.map +1 -1
- package/dist/production/src/mapper/select/optimizer/ConditionOptimizer.cjs.map +1 -1
- package/dist/production/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -1
- package/dist/production/src/mapper/select/optimizer/WhereOptimizer.cjs.map +1 -1
- package/dist/production/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
- package/dist/production/src/mapper/select/optimizer/WhereReplacer.cjs.map +1 -1
- package/dist/production/src/mapper/select/optimizer/WhereReplacer.js.map +1 -1
- package/dist/production/src/mapper/select/optimizer/helpers.cjs.map +1 -1
- package/dist/production/src/mapper/select/optimizer/helpers.js.map +1 -1
- package/dist/production/src/mapper/update/SqlUpdateInputProcessor.cjs +36 -36
- package/dist/production/src/mapper/update/SqlUpdateInputProcessor.cjs.map +1 -1
- package/dist/production/src/mapper/update/SqlUpdateInputProcessor.js +36 -36
- package/dist/production/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
- package/dist/production/src/mapper/update/UpdateBuilder.cjs +14 -19
- package/dist/production/src/mapper/update/UpdateBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/update/UpdateBuilder.js +15 -20
- package/dist/production/src/mapper/update/UpdateBuilder.js.map +1 -1
- package/dist/production/src/mapper/update/UpdateBuilderFactory.cjs.map +1 -1
- package/dist/production/src/mapper/update/UpdateBuilderFactory.js.map +1 -1
- package/dist/production/src/mapper/update/Updater.cjs +45 -17
- package/dist/production/src/mapper/update/Updater.cjs.map +1 -1
- package/dist/production/src/mapper/update/Updater.js +47 -19
- package/dist/production/src/mapper/update/Updater.js.map +1 -1
- package/dist/production/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.cjs +84 -0
- package/dist/production/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.js +84 -0
- package/dist/production/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.cjs +88 -0
- package/dist/production/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.js +88 -0
- package/dist/production/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/update/relations/OneHasManyUpdateInputProcessor.cjs +87 -0
- package/dist/production/src/mapper/update/relations/OneHasManyUpdateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/update/relations/OneHasManyUpdateInputProcessor.js +87 -0
- package/dist/production/src/mapper/update/relations/OneHasManyUpdateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.cjs +147 -0
- package/dist/production/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.js +147 -0
- package/dist/production/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.js.map +1 -0
- package/dist/production/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.cjs +183 -0
- package/dist/production/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.cjs.map +1 -0
- package/dist/production/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.js +183 -0
- package/dist/production/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.js.map +1 -0
- package/dist/production/src/resolvers/GraphQlQueryAstFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
- package/dist/production/src/resolvers/MutationResolver.cjs +8 -4
- package/dist/production/src/resolvers/MutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/MutationResolver.js +8 -4
- package/dist/production/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/ReadHelpers.cjs.map +1 -1
- package/dist/production/src/resolvers/ReadHelpers.js.map +1 -1
- package/dist/production/src/resolvers/ReadResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/ReadResolver.js.map +1 -1
- package/dist/production/src/resolvers/ValidationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/ValidationResolver.js.map +1 -1
- package/dist/production/src/schema/ColumnTypeResolver.cjs.map +1 -1
- package/dist/production/src/schema/ColumnTypeResolver.js.map +1 -1
- package/dist/production/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/ConditionTypeProvider.js.map +1 -1
- package/dist/production/src/schema/CustomTypesProvider.cjs.map +1 -1
- package/dist/production/src/schema/CustomTypesProvider.js.map +1 -1
- package/dist/production/src/schema/EntityTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/EntityTypeProvider.js.map +1 -1
- package/dist/production/src/schema/EnumsProvider.cjs.map +1 -1
- package/dist/production/src/schema/EnumsProvider.js.map +1 -1
- package/dist/production/src/schema/FieldAccessVisitor.cjs.map +1 -1
- package/dist/production/src/schema/FieldAccessVisitor.js.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.js.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
- package/dist/production/src/schema/MutationProvider.cjs.map +1 -1
- package/dist/production/src/schema/MutationProvider.js.map +1 -1
- package/dist/production/src/schema/OperationExtension.cjs.map +1 -1
- package/dist/production/src/schema/OperationExtension.js.map +1 -1
- package/dist/production/src/schema/OrderByTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/production/src/schema/PaginatedFieldConfigFactory.cjs.map +1 -1
- package/dist/production/src/schema/PaginatedFieldConfigFactory.js.map +1 -1
- package/dist/production/src/schema/QueryProvider.cjs.map +1 -1
- package/dist/production/src/schema/QueryProvider.js.map +1 -1
- package/dist/production/src/schema/ResultSchemaTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/ResultSchemaTypeProvider.js.map +1 -1
- package/dist/production/src/schema/ValidationQueriesProvider.cjs.map +1 -1
- package/dist/production/src/schema/ValidationQueriesProvider.js.map +1 -1
- package/dist/production/src/schema/WhereTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/production/src/schema/entities/FieldArgsVisitor.cjs.map +1 -1
- package/dist/production/src/schema/entities/FieldArgsVisitor.js.map +1 -1
- package/dist/production/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
- package/dist/production/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/ConnectOrCreateRelationInputProvider.cjs.map +1 -1
- package/dist/production/src/schema/mutations/ConnectOrCreateRelationInputProvider.js.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityRelationInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityRelationInputProvider.cjs.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityRelationInputProvider.js.map +1 -1
- package/dist/production/src/schema/mutations/EntityInputProvider.cjs.map +1 -1
- package/dist/production/src/schema/mutations/EntityInputProvider.js.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.cjs +2 -0
- package/dist/production/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -0
- package/dist/production/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityRelationInputProvider.cjs.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityRelationInputProvider.js.map +1 -1
- package/dist/production/src/schema/utils.cjs.map +1 -1
- package/dist/production/src/schema/utils.js.map +1 -1
- package/dist/production/src/utils/Mutex.cjs.map +1 -1
- package/dist/production/src/utils/Mutex.js.map +1 -1
- package/dist/production/src/utils/ResolveInfoUtils.cjs.map +1 -1
- package/dist/production/src/utils/ResolveInfoUtils.js.map +1 -1
- package/dist/production/src/utils/accessor.cjs.map +1 -1
- package/dist/production/src/utils/accessor.js.map +1 -1
- package/dist/production/src/utils/isIt.cjs.map +1 -1
- package/dist/production/src/utils/isIt.js.map +1 -1
- package/dist/production/src/utils/object.cjs.map +1 -1
- package/dist/production/src/utils/object.js.map +1 -1
- package/dist/production/src/utils/paginationUtils.cjs.map +1 -1
- package/dist/production/src/utils/paginationUtils.js.map +1 -1
- package/dist/production/src/utils/singletonFactory.cjs.map +1 -1
- package/dist/production/src/utils/singletonFactory.js.map +1 -1
- package/dist/production/src/utils/uniqueWhereFields.cjs.map +1 -1
- package/dist/production/src/utils/uniqueWhereFields.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/jsonInsert.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/jsonInsert.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/connectOrCreate.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/connectOrCreate.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connectOrCreate.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connectOrCreate.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/validation/conditions.test.d.ts +2 -2
- package/dist/tests/cases/integration/graphQlRequests/validation/conditions.test.d.ts.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/validation/requiredWhen.test.d.ts +1 -1
- package/dist/tests/cases/integration/graphQlRequests/validation/requiredWhen.test.d.ts.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/model.d.ts +4 -4
- package/dist/tests/cases/integration/graphQlSchema/model.d.ts.map +1 -1
- package/dist/tests/src/assert.d.ts +5 -0
- package/dist/tests/src/assert.d.ts.map +1 -0
- package/dist/tests/src/test.d.ts.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ExecutionContainer.d.ts +8 -5
- package/dist/types/ExecutionContainer.d.ts.map +1 -1
- package/dist/types/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
- package/dist/types/input-validation/ColumnValueResolver.d.ts +1 -1
- package/dist/types/input-validation/ColumnValueResolver.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationDataSelector.d.ts +1 -1
- package/dist/types/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +3 -3
- package/dist/types/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/types/input-validation/preValidation/InputPreValidator.d.ts +3 -3
- package/dist/types/input-validation/preValidation/InputPreValidator.d.ts.map +1 -1
- package/dist/types/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +4 -4
- package/dist/types/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/types/inputProcessing/CreateInputProcessor.d.ts +8 -6
- package/dist/types/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
- package/dist/types/inputProcessing/CreateInputVisitor.d.ts +11 -10
- package/dist/types/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
- package/dist/types/inputProcessing/UpdateInputProcessor.d.ts +14 -12
- package/dist/types/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/inputProcessing/UpdateInputVisitor.d.ts +11 -10
- package/dist/types/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
- package/dist/types/introspection/IntrospectionSchemaDefinitionFactory.d.ts +1 -3
- package/dist/types/introspection/IntrospectionSchemaDefinitionFactory.d.ts.map +1 -1
- package/dist/types/introspection/index.d.ts +2 -1
- package/dist/types/introspection/index.d.ts.map +1 -1
- package/dist/types/introspection/introspection.schema.d.ts +5 -0
- package/dist/types/introspection/introspection.schema.d.ts.map +1 -0
- package/dist/types/mapper/ColumnValue.d.ts +4 -8
- package/dist/types/mapper/ColumnValue.d.ts.map +1 -1
- package/dist/types/mapper/EventManager.d.ts +9 -9
- package/dist/types/mapper/EventManager.d.ts.map +1 -1
- package/dist/types/mapper/Mapper.d.ts +6 -7
- package/dist/types/mapper/Mapper.d.ts.map +1 -1
- package/dist/types/mapper/MutationProcessorHelper.d.ts +2 -2
- package/dist/types/mapper/MutationProcessorHelper.d.ts.map +1 -1
- package/dist/types/mapper/Result.d.ts +16 -9
- package/dist/types/mapper/Result.d.ts.map +1 -1
- package/dist/types/mapper/delete/DeleteExecutor.d.ts.map +1 -1
- package/dist/types/mapper/insert/InsertBuilder.d.ts +4 -9
- package/dist/types/mapper/insert/InsertBuilder.d.ts.map +1 -1
- package/dist/types/mapper/insert/Inserter.d.ts +3 -3
- package/dist/types/mapper/insert/Inserter.d.ts.map +1 -1
- package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts +11 -8
- package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/insert/relations/ManyHasManyCreateInputProcessor.d.ts +26 -0
- package/dist/types/mapper/insert/relations/ManyHasManyCreateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/insert/relations/ManyHasOneCreateInputProcessor.d.ts +25 -0
- package/dist/types/mapper/insert/relations/ManyHasOneCreateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/insert/relations/OneHasManyCreateInputProcessor.d.ts +28 -0
- package/dist/types/mapper/insert/relations/OneHasManyCreateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.d.ts +31 -0
- package/dist/types/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.d.ts +26 -0
- package/dist/types/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/types/mapper/types.d.ts +84 -1
- package/dist/types/mapper/types.d.ts.map +1 -1
- package/dist/types/mapper/update/SqlUpdateInputProcessor.d.ts +12 -8
- package/dist/types/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/update/UpdateBuilder.d.ts +4 -8
- package/dist/types/mapper/update/UpdateBuilder.d.ts.map +1 -1
- package/dist/types/mapper/update/Updater.d.ts +2 -2
- package/dist/types/mapper/update/Updater.d.ts.map +1 -1
- package/dist/types/mapper/update/relations/ManyHasManyUpdateInputProcessor.d.ts +48 -0
- package/dist/types/mapper/update/relations/ManyHasManyUpdateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/update/relations/ManyHasOneUpdateInputProcessor.d.ts +42 -0
- package/dist/types/mapper/update/relations/ManyHasOneUpdateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/update/relations/OneHasManyUpdateInputProcessor.d.ts +48 -0
- package/dist/types/mapper/update/relations/OneHasManyUpdateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.d.ts +38 -0
- package/dist/types/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.d.ts.map +1 -0
- package/dist/types/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.d.ts +42 -0
- package/dist/types/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.d.ts.map +1 -0
- package/dist/types/resolvers/MutationResolver.d.ts.map +1 -1
- package/dist/types/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/graphql.codegen.yml +2 -2
- package/package.json +14 -18
- package/src/ExecutionContainer.ts +5 -2
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +35 -2
- package/src/input-validation/ColumnValueResolver.ts +1 -1
- package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +2 -2
- package/src/input-validation/preValidation/InputPreValidator.ts +10 -12
- package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +3 -3
- package/src/inputProcessing/CreateInputProcessor.ts +8 -6
- package/src/inputProcessing/CreateInputVisitor.ts +32 -33
- package/src/inputProcessing/UpdateInputProcessor.ts +13 -11
- package/src/inputProcessing/UpdateInputVisitor.ts +44 -40
- package/src/introspection/IntrospectionSchemaDefinitionFactory.ts +2 -194
- package/src/introspection/index.ts +2 -1
- package/src/introspection/introspection.schema.ts +194 -0
- package/src/mapper/ColumnValue.ts +11 -25
- package/src/mapper/ErrorUtils.ts +1 -1
- package/src/mapper/EventManager.ts +9 -13
- package/src/mapper/Mapper.ts +19 -37
- package/src/mapper/MutationProcessorHelper.ts +16 -8
- package/src/mapper/Result.ts +14 -49
- package/src/mapper/delete/DeleteExecutor.ts +4 -8
- package/src/mapper/insert/InsertBuilder.ts +23 -34
- package/src/mapper/insert/Inserter.ts +55 -41
- package/src/mapper/insert/SqlCreateInputProcessor.ts +36 -91
- package/src/mapper/insert/relations/ManyHasManyCreateInputProcessor.ts +59 -0
- package/src/mapper/insert/relations/ManyHasOneCreateInputProcessor.ts +57 -0
- package/src/mapper/insert/relations/OneHasManyCreateInputProcessor.ts +52 -0
- package/src/mapper/insert/relations/OneHasOneInverseCreateInputProcessor.ts +90 -0
- package/src/mapper/insert/relations/OneHasOneOwningCreateInputProcessor.ts +87 -0
- package/src/mapper/select/handlers/FieldsVisitor.ts +3 -0
- package/src/mapper/types.ts +115 -1
- package/src/mapper/update/SqlUpdateInputProcessor.ts +50 -47
- package/src/mapper/update/UpdateBuilder.ts +25 -31
- package/src/mapper/update/Updater.ts +55 -35
- package/src/mapper/update/relations/ManyHasManyUpdateInputProcessor.ts +112 -0
- package/src/mapper/update/relations/ManyHasOneUpdateInputProcessor.ts +125 -0
- package/src/mapper/update/relations/OneHasManyUpdateInputProcessor.ts +113 -0
- package/src/mapper/update/relations/OneHasOneInverseUpdateInputProcessor.ts +184 -0
- package/src/mapper/update/relations/OneHasOneOwningUpdateInputProcessor.ts +240 -0
- package/src/resolvers/MutationResolver.ts +6 -4
- package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +5 -0
- package/tests/cases/bugs/bug-filter-or.test.ts +1 -1
- package/tests/cases/bugs/bug-update-by-nested-unique.test.ts +1 -1
- package/tests/cases/bugs/bug102.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/acl/setField.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/aclInsert.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/basicInsert.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/insertCustomId.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/jsonInsert.test.ts +37 -0
- package/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.ts +9 -9
- package/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/insert/validation/toBeFixed.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/isNullAcl.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/orPredicate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/relationAcl.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/sameRowAndFieldPredicate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/backReferencedFilter.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/containsQuery.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/manyHasOneRelation.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/formatting/dateFormat.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/graphqlFeatures/fragments.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/misc/aliasedType.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/misc/longAliasHash.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/misc/reducedHasMany.test.ts +70 -1
- package/tests/cases/integration/graphQlRequests/query/misc/transaction.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/pagination/hasManyLimit.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/pagination/paginate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/pagination/paginateAliased.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/pagination/simpleLimit.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/relations/advanced.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.ts +2 -2
- package/tests/cases/integration/graphQlRequests/query/relations/manyHasOne.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/relations/oneHasMany.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/relations/oneHasOneInverse.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/relations/oneHasOneOwner.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/sorting/byRelations.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/sorting/defaultOrdering.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/sorting/randomSort.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/sorting/sortNulls.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/sorting/sortedHasMany.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/unique/basicQueryById.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/unique/composedUnique.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/unique/uniqueWithFilter.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/view/view.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/additionalFilter.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/connect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/disconnect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/connect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/connectOrCreate.test.ts +100 -0
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/disconnect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.ts +1 -6
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.ts +1 -6
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/connectOrCreate.test.ts +90 -0
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.ts +10 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/disconnect.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.ts +1 -6
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.ts +1 -6
- package/tests/cases/integration/graphQlRequests/update/queryPortal.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/transaction.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/update/validation/toBeFixed.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/conditions.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/nestedValidation.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/optionalAssert.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/required.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/requiredWhen.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/andRule.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/lengthRangeRule.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/maxLengthRule.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/minLength.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/notEmptyRule.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/notRule.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/orRule.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/validation/rules/patternRule.test.ts +1 -2
- package/tests/cases/integration/graphQlRequests/validation/rules/rangeRule.test.ts +1 -1
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +4 -4
- package/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +6 -0
- package/tests/cases/integration/graphQlSchema/schema-acl-create-only.gql +28 -28
- package/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -0
- package/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +6 -0
- package/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +5 -0
- package/tests/cases/integration/graphQlSchema/schema-basic.gql +15 -0
- package/tests/cases/integration/graphQlSchema/schema-bug-66.gql +7 -0
- package/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +15 -0
- package/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +7 -0
- package/tests/cases/integration/graphQlSchema/schema-new-builder.gql +123 -107
- package/tests/cases/unit/aclVariablesFactory.test.ts +5 -5
- package/tests/cases/unit/conditionOptimizer.test.ts +7 -1
- package/tests/cases/unit/inputPreValidator.test.ts +3 -2
- package/tests/cases/unit/inputValidation.test.ts +7 -6
- package/tests/cases/unit/orderbyHelper.test.ts +3 -2
- package/tests/cases/unit/permissionMerger.test.ts +2 -1
- package/tests/cases/unit/predicatesFactory.test.ts +2 -1
- package/tests/cases/unit/predicatesInjector.test.ts +2 -1
- package/tests/cases/unit/uuidType.test.ts +5 -5
- package/tests/cases/unit/variableInjector.test.ts +2 -1
- package/tests/cases/unit/whereBuilder.test.ts +2 -1
- package/tests/cases/unit/whereOptimizer.test.ts +2 -1
- package/tests/src/assert.ts +10 -0
- package/tests/src/test.ts +4 -1
- package/tests/src/testGraphql.ts +3 -3
- package/dist/development/src/mapper/DataManipulationBuilder.cjs +0 -5
- package/dist/development/src/mapper/DataManipulationBuilder.cjs.map +0 -1
- package/dist/development/src/mapper/DataManipulationBuilder.js +0 -5
- package/dist/development/src/mapper/DataManipulationBuilder.js.map +0 -1
- package/dist/development/src/mapper/relations/ManyHasManyInputProcessor.cjs +0 -75
- package/dist/development/src/mapper/relations/ManyHasManyInputProcessor.cjs.map +0 -1
- package/dist/development/src/mapper/relations/ManyHasManyInputProcessor.js +0 -75
- package/dist/development/src/mapper/relations/ManyHasManyInputProcessor.js.map +0 -1
- package/dist/development/src/mapper/relations/ManyHasOneInputProcessor.cjs +0 -114
- package/dist/development/src/mapper/relations/ManyHasOneInputProcessor.cjs.map +0 -1
- package/dist/development/src/mapper/relations/ManyHasOneInputProcessor.js +0 -114
- package/dist/development/src/mapper/relations/ManyHasOneInputProcessor.js.map +0 -1
- package/dist/development/src/mapper/relations/OneHasManyInputProcessor.cjs +0 -72
- package/dist/development/src/mapper/relations/OneHasManyInputProcessor.cjs.map +0 -1
- package/dist/development/src/mapper/relations/OneHasManyInputProcessor.js +0 -72
- package/dist/development/src/mapper/relations/OneHasManyInputProcessor.js.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneInverseCreateInputProcessor.cjs.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.cjs +0 -131
- package/dist/development/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.cjs.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js +0 -131
- package/dist/development/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneOwningCreateInputProcessor.cjs +0 -71
- package/dist/development/src/mapper/relations/OneHasOneOwningCreateInputProcessor.cjs.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js +0 -71
- package/dist/development/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.cjs +0 -200
- package/dist/development/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.cjs.map +0 -1
- package/dist/development/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js +0 -200
- package/dist/development/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js.map +0 -1
- package/dist/production/src/mapper/DataManipulationBuilder.cjs +0 -5
- package/dist/production/src/mapper/DataManipulationBuilder.cjs.map +0 -1
- package/dist/production/src/mapper/DataManipulationBuilder.js +0 -5
- package/dist/production/src/mapper/DataManipulationBuilder.js.map +0 -1
- package/dist/production/src/mapper/relations/ManyHasManyInputProcessor.cjs +0 -75
- package/dist/production/src/mapper/relations/ManyHasManyInputProcessor.cjs.map +0 -1
- package/dist/production/src/mapper/relations/ManyHasManyInputProcessor.js +0 -75
- package/dist/production/src/mapper/relations/ManyHasManyInputProcessor.js.map +0 -1
- package/dist/production/src/mapper/relations/ManyHasOneInputProcessor.cjs +0 -114
- package/dist/production/src/mapper/relations/ManyHasOneInputProcessor.cjs.map +0 -1
- package/dist/production/src/mapper/relations/ManyHasOneInputProcessor.js +0 -114
- package/dist/production/src/mapper/relations/ManyHasOneInputProcessor.js.map +0 -1
- package/dist/production/src/mapper/relations/OneHasManyInputProcessor.cjs +0 -72
- package/dist/production/src/mapper/relations/OneHasManyInputProcessor.cjs.map +0 -1
- package/dist/production/src/mapper/relations/OneHasManyInputProcessor.js +0 -72
- package/dist/production/src/mapper/relations/OneHasManyInputProcessor.js.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneInverseCreateInputProcessor.cjs.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.cjs +0 -131
- package/dist/production/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.cjs.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js +0 -131
- package/dist/production/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneOwningCreateInputProcessor.cjs +0 -71
- package/dist/production/src/mapper/relations/OneHasOneOwningCreateInputProcessor.cjs.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js +0 -71
- package/dist/production/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.cjs +0 -200
- package/dist/production/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.cjs.map +0 -1
- package/dist/production/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js +0 -200
- package/dist/production/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js.map +0 -1
- package/dist/types/mapper/DataManipulationBuilder.d.ts +0 -7
- package/dist/types/mapper/DataManipulationBuilder.d.ts.map +0 -1
- package/dist/types/mapper/relations/ManyHasManyInputProcessor.d.ts +0 -32
- package/dist/types/mapper/relations/ManyHasManyInputProcessor.d.ts.map +0 -1
- package/dist/types/mapper/relations/ManyHasOneInputProcessor.d.ts +0 -32
- package/dist/types/mapper/relations/ManyHasOneInputProcessor.d.ts.map +0 -1
- package/dist/types/mapper/relations/OneHasManyInputProcessor.d.ts +0 -29
- package/dist/types/mapper/relations/OneHasManyInputProcessor.d.ts.map +0 -1
- package/dist/types/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts +0 -21
- package/dist/types/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts.map +0 -1
- package/dist/types/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts +0 -32
- package/dist/types/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts.map +0 -1
- package/dist/types/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts +0 -21
- package/dist/types/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts.map +0 -1
- package/dist/types/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts +0 -37
- package/dist/types/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts.map +0 -1
- package/src/mapper/DataManipulationBuilder.ts +0 -12
- package/src/mapper/relations/ManyHasManyInputProcessor.ts +0 -108
- package/src/mapper/relations/ManyHasOneInputProcessor.ts +0 -158
- package/src/mapper/relations/OneHasManyInputProcessor.ts +0 -101
- package/src/mapper/relations/OneHasOneInverseCreateInputProcessor.ts +0 -99
- package/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.ts +0 -164
- package/src/mapper/relations/OneHasOneOwningCreateInputProcessor.ts +0 -92
- package/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.ts +0 -253
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JoinVisitor.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/JoinVisitor.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { Path } from './Path'\n\nexport class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]> {\n\tconstructor(private readonly path: Path) {}\n\n\tvisitOneHasOneOwning({ targetEntity, relation }: Model.OneHasOneOwningContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasOneInverse({ targetEntity, entity, targetRelation }: Model.OneHasOneInverseContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasOne({ targetEntity, relation }: Model.ManyHasOneContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasMany({ targetEntity, targetRelation, entity }: Model.OneHasManyContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyOwning({ relation, entity, targetEntity }: Model.ManyHasManyOwningContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: relation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyInverse({ targetRelation, entity, targetEntity }: Model.ManyHasManyInverseContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetRelation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: targetRelation.joiningTable.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n}\n\nexport interface JoinDefinition {\n\tsourceAlias?: string\n\ttargetAlias?: string\n\ttableName: string\n\tsourceColumn: string\n\ttargetColumn: string\n\tmany?: true\n}\n"],"names":[],"mappings":";;AAGO,MAAM,YAAqE;AAAA,EACjF,YAA6B,MAAY;AAAZ,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"JoinVisitor.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/JoinVisitor.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { Path } from './Path'\n\nexport class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]> {\n\tconstructor(private readonly path: Path) {}\n\n\tvisitOneHasOneOwning({ targetEntity, relation }: Model.OneHasOneOwningContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasOneInverse({ targetEntity, entity, targetRelation }: Model.OneHasOneInverseContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasOne({ targetEntity, relation }: Model.ManyHasOneContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasMany({ targetEntity, targetRelation, entity }: Model.OneHasManyContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyOwning({ relation, entity, targetEntity }: Model.ManyHasManyOwningContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: relation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyInverse({ targetRelation, entity, targetEntity }: Model.ManyHasManyInverseContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetRelation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: targetRelation.joiningTable.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n}\n\nexport interface JoinDefinition {\n\tsourceAlias?: string\n\ttargetAlias?: string\n\ttableName: string\n\tsourceColumn: string\n\ttargetColumn: string\n\tmany?: true\n}\n"],"names":[],"mappings":";;AAGO,MAAM,YAAqE;AAAA,EACjF,YAA6B,MAAY;AAAZ,SAAA,OAAA;AAAA,EAAA;AAAA,EAE7B,qBAAqB,EAAE,cAAc,YAA4D;AACzF,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,SAAS,cAAc;AAAA,QACrC,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAAA,EAGD,sBAAsB,EAAE,cAAc,QAAQ,kBAAmE;AACzG,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,OAAO;AAAA,QACrB,cAAc,eAAe,cAAc;AAAA,MAAA;AAAA,IAE7C;AAAA,EAAA;AAAA,EAGD,gBAAgB,EAAE,cAAc,YAAuD;AAC/E,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,SAAS,cAAc;AAAA,QACrC,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAAA,EAGD,gBAAgB,EAAE,cAAc,gBAAgB,UAAqD;AAC7F,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,OAAO;AAAA,QACrB,cAAc,eAAe,cAAc;AAAA,QAC3C,MAAM;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAAA,EAGD,uBAAuB,EAAE,UAAU,QAAQ,gBAAkE;AAC5G,UAAM,cAAc,KAAK,KAAK,KAAO,EAAA;AAC/B,UAAA,cAAc,KAAK,KAAK;AACxB,UAAA,eAAe,KAAK,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,KAAK,KAAK,EAAE;AAC3D,WAAA;AAAA,MACN;AAAA,QACC,WAAW,SAAS,aAAa;AAAA,QACjC;AAAA,QACA,aAAa;AAAA,QACb,cAAc,OAAO;AAAA,QACrB,cAAc,SAAS,aAAa,cAAc;AAAA,QAClD,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,aAAa;AAAA,QACb;AAAA,QACA,cAAc,SAAS,aAAa,qBAAqB;AAAA,QACzD,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAAA,EAGD,wBAAwB,EAAE,gBAAgB,QAAQ,gBAAmE;AACpH,UAAM,cAAc,KAAK,KAAK,KAAO,EAAA;AAC/B,UAAA,cAAc,KAAK,KAAK;AACxB,UAAA,eAAe,KAAK,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,KAAK,KAAK,EAAE;AAC3D,WAAA;AAAA,MACN;AAAA,QACC,WAAW,eAAe,aAAa;AAAA,QACvC;AAAA,QACA,aAAa;AAAA,QACb,cAAc,OAAO;AAAA,QACrB,cAAc,eAAe,aAAa,qBAAqB;AAAA,QAC/D,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,aAAa;AAAA,QACb;AAAA,QACA,cAAc,eAAe,aAAa,cAAc;AAAA,QACxD,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAEF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JoinVisitor.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/JoinVisitor.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { Path } from './Path'\n\nexport class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]> {\n\tconstructor(private readonly path: Path) {}\n\n\tvisitOneHasOneOwning({ targetEntity, relation }: Model.OneHasOneOwningContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasOneInverse({ targetEntity, entity, targetRelation }: Model.OneHasOneInverseContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasOne({ targetEntity, relation }: Model.ManyHasOneContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasMany({ targetEntity, targetRelation, entity }: Model.OneHasManyContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyOwning({ relation, entity, targetEntity }: Model.ManyHasManyOwningContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: relation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyInverse({ targetRelation, entity, targetEntity }: Model.ManyHasManyInverseContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetRelation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: targetRelation.joiningTable.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n}\n\nexport interface JoinDefinition {\n\tsourceAlias?: string\n\ttargetAlias?: string\n\ttableName: string\n\tsourceColumn: string\n\ttargetColumn: string\n\tmany?: true\n}\n"],"names":[],"mappings":"AAGO,MAAM,YAAqE;AAAA,EACjF,YAA6B,MAAY;AAAZ,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"JoinVisitor.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/JoinVisitor.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { Path } from './Path'\n\nexport class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]> {\n\tconstructor(private readonly path: Path) {}\n\n\tvisitOneHasOneOwning({ targetEntity, relation }: Model.OneHasOneOwningContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasOneInverse({ targetEntity, entity, targetRelation }: Model.OneHasOneInverseContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasOne({ targetEntity, relation }: Model.ManyHasOneContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: relation.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitOneHasMany({ targetEntity, targetRelation, entity }: Model.OneHasManyContext): JoinDefinition[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyOwning({ relation, entity, targetEntity }: Model.ManyHasManyOwningContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: relation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: relation.joiningTable.joiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: relation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n\n\tvisitManyHasManyInverse({ targetRelation, entity, targetEntity }: Model.ManyHasManyInverseContext): JoinDefinition[] {\n\t\tconst sourceAlias = this.path.back().alias\n\t\tconst targetAlias = this.path.alias\n\t\tconst joiningAlias = this.path.back().for('x_' + this.path.alias).alias\n\t\treturn [\n\t\t\t{\n\t\t\t\ttableName: targetRelation.joiningTable.tableName,\n\t\t\t\tsourceAlias: sourceAlias,\n\t\t\t\ttargetAlias: joiningAlias,\n\t\t\t\tsourceColumn: entity.primaryColumn,\n\t\t\t\ttargetColumn: targetRelation.joiningTable.inverseJoiningColumn.columnName,\n\t\t\t\tmany: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttableName: targetEntity.tableName,\n\t\t\t\tsourceAlias: joiningAlias,\n\t\t\t\ttargetAlias: targetAlias,\n\t\t\t\tsourceColumn: targetRelation.joiningTable.joiningColumn.columnName,\n\t\t\t\ttargetColumn: targetEntity.primaryColumn,\n\t\t\t},\n\t\t]\n\t}\n}\n\nexport interface JoinDefinition {\n\tsourceAlias?: string\n\ttargetAlias?: string\n\ttableName: string\n\tsourceColumn: string\n\ttargetColumn: string\n\tmany?: true\n}\n"],"names":[],"mappings":"AAGO,MAAM,YAAqE;AAAA,EACjF,YAA6B,MAAY;AAAZ,SAAA,OAAA;AAAA,EAAA;AAAA,EAE7B,qBAAqB,EAAE,cAAc,YAA4D;AACzF,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,SAAS,cAAc;AAAA,QACrC,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAAA,EAGD,sBAAsB,EAAE,cAAc,QAAQ,kBAAmE;AACzG,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,OAAO;AAAA,QACrB,cAAc,eAAe,cAAc;AAAA,MAAA;AAAA,IAE7C;AAAA,EAAA;AAAA,EAGD,gBAAgB,EAAE,cAAc,YAAuD;AAC/E,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,SAAS,cAAc;AAAA,QACrC,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAAA,EAGD,gBAAgB,EAAE,cAAc,gBAAgB,UAAqD;AAC7F,WAAA;AAAA,MACN;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,cAAc,OAAO;AAAA,QACrB,cAAc,eAAe,cAAc;AAAA,QAC3C,MAAM;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAAA,EAGD,uBAAuB,EAAE,UAAU,QAAQ,gBAAkE;AAC5G,UAAM,cAAc,KAAK,KAAK,KAAO,EAAA;AAC/B,UAAA,cAAc,KAAK,KAAK;AACxB,UAAA,eAAe,KAAK,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,KAAK,KAAK,EAAE;AAC3D,WAAA;AAAA,MACN;AAAA,QACC,WAAW,SAAS,aAAa;AAAA,QACjC;AAAA,QACA,aAAa;AAAA,QACb,cAAc,OAAO;AAAA,QACrB,cAAc,SAAS,aAAa,cAAc;AAAA,QAClD,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,aAAa;AAAA,QACb;AAAA,QACA,cAAc,SAAS,aAAa,qBAAqB;AAAA,QACzD,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAAA,EAGD,wBAAwB,EAAE,gBAAgB,QAAQ,gBAAmE;AACpH,UAAM,cAAc,KAAK,KAAK,KAAO,EAAA;AAC/B,UAAA,cAAc,KAAK,KAAK;AACxB,UAAA,eAAe,KAAK,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,KAAK,KAAK,EAAE;AAC3D,WAAA;AAAA,MACN;AAAA,QACC,WAAW,eAAe,aAAa;AAAA,QACvC;AAAA,QACA,aAAa;AAAA,QACb,cAAc,OAAO;AAAA,QACrB,cAAc,eAAe,aAAa,qBAAqB;AAAA,QAC/D,MAAM;AAAA,MACP;AAAA,MACA;AAAA,QACC,WAAW,aAAa;AAAA,QACxB,aAAa;AAAA,QACb;AAAA,QACA,cAAc,eAAe,aAAa,cAAc;AAAA,QACxD,cAAc,aAAa;AAAA,MAAA;AAAA,IAE7B;AAAA,EAAA;AAEF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderByBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Path } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { Literal, QueryBuilder, SelectBuilder } from '@contember/database'\nimport { getColumnName, getTargetEntity } from '@contember/schema-utils'\nimport { UserError } from '../../exception'\n\nconst orderByMapping = {\n\tasc: 'asc',\n\tdesc: 'desc',\n\tascNullsFirst: 'asc nulls first',\n\tdescNullsLast: 'desc nulls last',\n} as const\n\nexport class OrderByBuilder {\n\tconstructor(private readonly schema: Model.Schema, private readonly joinBuilder: JoinBuilder) {}\n\n\tpublic build<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy[],\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\treturn orderBy.reduce<[SelectBuilder<SelectBuilder.Result>, Orderable]>(\n\t\t\t([qb, orderable], fieldOrderBy) => this.buildOne(qb, orderable, entity, path, fieldOrderBy),\n\t\t\t[qb, orderable],\n\t\t)\n\t}\n\n\tprivate buildOne<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy,\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\tconst entries = Object.entries(orderBy)\n\t\tif (entries.length !== 1) {\n\t\t\tconst fields = entries.map(it => it[0]).join(', ')\n\t\t\tthrow new UserError('Order by: only one field is expected in each item of order by clause, got: ' + fields)\n\t\t}\n\t\tif (orderBy._random || orderBy._randomSeeded) {\n\t\t\tif (orderBy._randomSeeded) {\n\t\t\t\tconst seed = orderBy._randomSeeded / Math.pow(2, 31)\n\t\t\t\tif (seed < -1 || seed > 1) {\n\t\t\t\t\tthrow new UserError(`Order by: random seed must be in range of 32bit signed integer`)\n\t\t\t\t}\n\t\t\t\tqb = qb\n\t\t\t\t\t.with('rand_seed', qb => qb.select(expr => expr.raw('setseed(?)', seed)))\n\t\t\t\t\t.join('rand_seed', undefined, expr => expr.raw('true'))\n\t\t\t}\n\n\t\t\tqb = qb.orderBy(new Literal('random()'))\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = orderable.orderBy(new Literal('random()'))\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t}\n\n\t\tconst [fieldName, value]: [string, Input.FieldOrderBy] = entries[0]\n\n\t\tif (typeof value === 'string') {\n\t\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\t\t\tconst applyOrder = <Orderable extends QueryBuilder.Orderable<any>>(orderable: Orderable) =>\n\t\t\t\torderable.orderBy([path.alias, columnName], orderByMapping[value])\n\n\t\t\tqb = applyOrder(qb)\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = applyOrder(orderable as QueryBuilder.Orderable<any>)\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t} else {\n\t\t\tconst targetEntity = getTargetEntity(this.schema, entity, fieldName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`OrderByBuilder: target entity for relation ${entity.name}::${fieldName} not found`)\n\t\t\t}\n\t\t\tconst newPath = path.for(fieldName)\n\t\t\tconst joined = this.joinBuilder.join(qb, newPath, entity, fieldName)\n\n\t\t\treturn this.buildOne(joined, orderable, targetEntity, newPath, value)\n\t\t}\n\t}\n}\n"],"names":["qb","orderable","UserError","Literal","getColumnName","getTargetEntity"],"mappings":";;;;;AAOA,MAAM,iBAAiB;AAAA,EACtB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,MAAM,eAAe;AAAA,EAC3B,YAA6B,QAAuC,aAA0B;AAAjE,SAAA,SAAA;AAAuC,SAAA,cAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"OrderByBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Path } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { Literal, QueryBuilder, SelectBuilder } from '@contember/database'\nimport { getColumnName, getTargetEntity } from '@contember/schema-utils'\nimport { UserError } from '../../exception'\n\nconst orderByMapping = {\n\tasc: 'asc',\n\tdesc: 'desc',\n\tascNullsFirst: 'asc nulls first',\n\tdescNullsLast: 'desc nulls last',\n} as const\n\nexport class OrderByBuilder {\n\tconstructor(private readonly schema: Model.Schema, private readonly joinBuilder: JoinBuilder) {}\n\n\tpublic build<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy[],\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\treturn orderBy.reduce<[SelectBuilder<SelectBuilder.Result>, Orderable]>(\n\t\t\t([qb, orderable], fieldOrderBy) => this.buildOne(qb, orderable, entity, path, fieldOrderBy),\n\t\t\t[qb, orderable],\n\t\t)\n\t}\n\n\tprivate buildOne<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy,\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\tconst entries = Object.entries(orderBy)\n\t\tif (entries.length !== 1) {\n\t\t\tconst fields = entries.map(it => it[0]).join(', ')\n\t\t\tthrow new UserError('Order by: only one field is expected in each item of order by clause, got: ' + fields)\n\t\t}\n\t\tif (orderBy._random || orderBy._randomSeeded) {\n\t\t\tif (orderBy._randomSeeded) {\n\t\t\t\tconst seed = orderBy._randomSeeded / Math.pow(2, 31)\n\t\t\t\tif (seed < -1 || seed > 1) {\n\t\t\t\t\tthrow new UserError(`Order by: random seed must be in range of 32bit signed integer`)\n\t\t\t\t}\n\t\t\t\tqb = qb\n\t\t\t\t\t.with('rand_seed', qb => qb.select(expr => expr.raw('setseed(?)', seed)))\n\t\t\t\t\t.join('rand_seed', undefined, expr => expr.raw('true'))\n\t\t\t}\n\n\t\t\tqb = qb.orderBy(new Literal('random()'))\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = orderable.orderBy(new Literal('random()'))\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t}\n\n\t\tconst [fieldName, value]: [string, Input.FieldOrderBy] = entries[0]\n\n\t\tif (typeof value === 'string') {\n\t\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\t\t\tconst applyOrder = <Orderable extends QueryBuilder.Orderable<any>>(orderable: Orderable) =>\n\t\t\t\torderable.orderBy([path.alias, columnName], orderByMapping[value])\n\n\t\t\tqb = applyOrder(qb)\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = applyOrder(orderable as QueryBuilder.Orderable<any>)\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t} else {\n\t\t\tconst targetEntity = getTargetEntity(this.schema, entity, fieldName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`OrderByBuilder: target entity for relation ${entity.name}::${fieldName} not found`)\n\t\t\t}\n\t\t\tconst newPath = path.for(fieldName)\n\t\t\tconst joined = this.joinBuilder.join(qb, newPath, entity, fieldName)\n\n\t\t\treturn this.buildOne(joined, orderable, targetEntity, newPath, value)\n\t\t}\n\t}\n}\n"],"names":["qb","orderable","UserError","Literal","getColumnName","getTargetEntity"],"mappings":";;;;;AAOA,MAAM,iBAAiB;AAAA,EACtB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,MAAM,eAAe;AAAA,EAC3B,YAA6B,QAAuC,aAA0B;AAAjE,SAAA,SAAA;AAAuC,SAAA,cAAA;AAAA,EAAA;AAAA,EAE7D,MACN,IACA,WACA,QACA,MACA,SACmD;AACnD,WAAO,QAAQ;AAAA,MACd,CAAC,CAACA,KAAIC,UAAS,GAAG,iBAAiB,KAAK,SAASD,KAAIC,YAAW,QAAQ,MAAM,YAAY;AAAA,MAC1F,CAAC,IAAI,SAAS;AAAA,IACf;AAAA,EAAA;AAAA,EAGO,SACP,IACA,WACA,QACA,MACA,SACmD;AAC7C,UAAA,UAAU,OAAO,QAAQ,OAAO;AAClC,QAAA,QAAQ,WAAW,GAAG;AACnB,YAAA,SAAS,QAAQ,IAAI,CAAA,OAAM,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI;AAC3C,YAAA,IAAIC,UAAAA,UAAU,gFAAgF,MAAM;AAAA,IAAA;AAEvG,QAAA,QAAQ,WAAW,QAAQ,eAAe;AAC7C,UAAI,QAAQ,eAAe;AAC1B,cAAM,OAAO,QAAQ,gBAAgB,KAAK,IAAI,GAAG,EAAE;AAC/C,YAAA,OAAO,MAAM,OAAO,GAAG;AACpB,gBAAA,IAAIA,UAAAA,UAAU,gEAAgE;AAAA,QAAA;AAEhF,aAAA,GACH,KAAK,aAAa,CAAAF,QAAMA,IAAG,OAAO,CAAQ,SAAA,KAAK,IAAI,cAAc,IAAI,CAAC,CAAC,EACvE,KAAK,aAAa,QAAW,CAAQ,SAAA,KAAK,IAAI,MAAM,CAAC;AAAA,MAAA;AAGxD,WAAK,GAAG,QAAQ,IAAIG,SAAA,QAAQ,UAAU,CAAC;AACvC,UAAI,cAAc,MAAM;AACvB,oBAAY,UAAU,QAAQ,IAAIA,SAAA,QAAQ,UAAU,CAAC;AAAA,MAAA;AAE/C,aAAA,CAAC,IAAI,SAAS;AAAA,IAAA;AAGtB,UAAM,CAAC,WAAW,KAAK,IAAkC,QAAQ,CAAC;AAE9D,QAAA,OAAO,UAAU,UAAU;AAC9B,YAAM,aAAaC,YAAAA,cAAc,KAAK,QAAQ,QAAQ,SAAS;AAC/D,YAAM,aAAa,CAAgDH,eAClEA,WAAU,QAAQ,CAAC,KAAK,OAAO,UAAU,GAAG,eAAe,KAAK,CAAC;AAElE,WAAK,WAAW,EAAE;AAClB,UAAI,cAAc,MAAM;AACvB,oBAAY,WAAW,SAAwC;AAAA,MAAA;AAEzD,aAAA,CAAC,IAAI,SAAS;AAAA,IAAA,OACf;AACN,YAAM,eAAeI,YAAAA,gBAAgB,KAAK,QAAQ,QAAQ,SAAS;AACnE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8CAA8C,OAAO,IAAI,KAAK,SAAS,YAAY;AAAA,MAAA;AAE9F,YAAA,UAAU,KAAK,IAAI,SAAS;AAClC,YAAM,SAAS,KAAK,YAAY,KAAK,IAAI,SAAS,QAAQ,SAAS;AAEnE,aAAO,KAAK,SAAS,QAAQ,WAAW,cAAc,SAAS,KAAK;AAAA,IAAA;AAAA,EACrE;AAEF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderByBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Path } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { Literal, QueryBuilder, SelectBuilder } from '@contember/database'\nimport { getColumnName, getTargetEntity } from '@contember/schema-utils'\nimport { UserError } from '../../exception'\n\nconst orderByMapping = {\n\tasc: 'asc',\n\tdesc: 'desc',\n\tascNullsFirst: 'asc nulls first',\n\tdescNullsLast: 'desc nulls last',\n} as const\n\nexport class OrderByBuilder {\n\tconstructor(private readonly schema: Model.Schema, private readonly joinBuilder: JoinBuilder) {}\n\n\tpublic build<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy[],\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\treturn orderBy.reduce<[SelectBuilder<SelectBuilder.Result>, Orderable]>(\n\t\t\t([qb, orderable], fieldOrderBy) => this.buildOne(qb, orderable, entity, path, fieldOrderBy),\n\t\t\t[qb, orderable],\n\t\t)\n\t}\n\n\tprivate buildOne<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy,\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\tconst entries = Object.entries(orderBy)\n\t\tif (entries.length !== 1) {\n\t\t\tconst fields = entries.map(it => it[0]).join(', ')\n\t\t\tthrow new UserError('Order by: only one field is expected in each item of order by clause, got: ' + fields)\n\t\t}\n\t\tif (orderBy._random || orderBy._randomSeeded) {\n\t\t\tif (orderBy._randomSeeded) {\n\t\t\t\tconst seed = orderBy._randomSeeded / Math.pow(2, 31)\n\t\t\t\tif (seed < -1 || seed > 1) {\n\t\t\t\t\tthrow new UserError(`Order by: random seed must be in range of 32bit signed integer`)\n\t\t\t\t}\n\t\t\t\tqb = qb\n\t\t\t\t\t.with('rand_seed', qb => qb.select(expr => expr.raw('setseed(?)', seed)))\n\t\t\t\t\t.join('rand_seed', undefined, expr => expr.raw('true'))\n\t\t\t}\n\n\t\t\tqb = qb.orderBy(new Literal('random()'))\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = orderable.orderBy(new Literal('random()'))\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t}\n\n\t\tconst [fieldName, value]: [string, Input.FieldOrderBy] = entries[0]\n\n\t\tif (typeof value === 'string') {\n\t\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\t\t\tconst applyOrder = <Orderable extends QueryBuilder.Orderable<any>>(orderable: Orderable) =>\n\t\t\t\torderable.orderBy([path.alias, columnName], orderByMapping[value])\n\n\t\t\tqb = applyOrder(qb)\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = applyOrder(orderable as QueryBuilder.Orderable<any>)\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t} else {\n\t\t\tconst targetEntity = getTargetEntity(this.schema, entity, fieldName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`OrderByBuilder: target entity for relation ${entity.name}::${fieldName} not found`)\n\t\t\t}\n\t\t\tconst newPath = path.for(fieldName)\n\t\t\tconst joined = this.joinBuilder.join(qb, newPath, entity, fieldName)\n\n\t\t\treturn this.buildOne(joined, orderable, targetEntity, newPath, value)\n\t\t}\n\t}\n}\n"],"names":["qb","orderable"],"mappings":";;;AAOA,MAAM,iBAAiB;AAAA,EACtB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,MAAM,eAAe;AAAA,EAC3B,YAA6B,QAAuC,aAA0B;AAAjE,SAAA,SAAA;AAAuC,SAAA,cAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"OrderByBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByBuilder.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { Path } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { Literal, QueryBuilder, SelectBuilder } from '@contember/database'\nimport { getColumnName, getTargetEntity } from '@contember/schema-utils'\nimport { UserError } from '../../exception'\n\nconst orderByMapping = {\n\tasc: 'asc',\n\tdesc: 'desc',\n\tascNullsFirst: 'asc nulls first',\n\tdescNullsLast: 'desc nulls last',\n} as const\n\nexport class OrderByBuilder {\n\tconstructor(private readonly schema: Model.Schema, private readonly joinBuilder: JoinBuilder) {}\n\n\tpublic build<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy[],\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\treturn orderBy.reduce<[SelectBuilder<SelectBuilder.Result>, Orderable]>(\n\t\t\t([qb, orderable], fieldOrderBy) => this.buildOne(qb, orderable, entity, path, fieldOrderBy),\n\t\t\t[qb, orderable],\n\t\t)\n\t}\n\n\tprivate buildOne<Orderable extends QueryBuilder.Orderable<any> | null>(\n\t\tqb: SelectBuilder<SelectBuilder.Result>,\n\t\torderable: Orderable,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\torderBy: Input.OrderBy,\n\t): [SelectBuilder<SelectBuilder.Result>, Orderable] {\n\t\tconst entries = Object.entries(orderBy)\n\t\tif (entries.length !== 1) {\n\t\t\tconst fields = entries.map(it => it[0]).join(', ')\n\t\t\tthrow new UserError('Order by: only one field is expected in each item of order by clause, got: ' + fields)\n\t\t}\n\t\tif (orderBy._random || orderBy._randomSeeded) {\n\t\t\tif (orderBy._randomSeeded) {\n\t\t\t\tconst seed = orderBy._randomSeeded / Math.pow(2, 31)\n\t\t\t\tif (seed < -1 || seed > 1) {\n\t\t\t\t\tthrow new UserError(`Order by: random seed must be in range of 32bit signed integer`)\n\t\t\t\t}\n\t\t\t\tqb = qb\n\t\t\t\t\t.with('rand_seed', qb => qb.select(expr => expr.raw('setseed(?)', seed)))\n\t\t\t\t\t.join('rand_seed', undefined, expr => expr.raw('true'))\n\t\t\t}\n\n\t\t\tqb = qb.orderBy(new Literal('random()'))\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = orderable.orderBy(new Literal('random()'))\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t}\n\n\t\tconst [fieldName, value]: [string, Input.FieldOrderBy] = entries[0]\n\n\t\tif (typeof value === 'string') {\n\t\t\tconst columnName = getColumnName(this.schema, entity, fieldName)\n\t\t\tconst applyOrder = <Orderable extends QueryBuilder.Orderable<any>>(orderable: Orderable) =>\n\t\t\t\torderable.orderBy([path.alias, columnName], orderByMapping[value])\n\n\t\t\tqb = applyOrder(qb)\n\t\t\tif (orderable !== null) {\n\t\t\t\torderable = applyOrder(orderable as QueryBuilder.Orderable<any>)\n\t\t\t}\n\t\t\treturn [qb, orderable]\n\t\t} else {\n\t\t\tconst targetEntity = getTargetEntity(this.schema, entity, fieldName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`OrderByBuilder: target entity for relation ${entity.name}::${fieldName} not found`)\n\t\t\t}\n\t\t\tconst newPath = path.for(fieldName)\n\t\t\tconst joined = this.joinBuilder.join(qb, newPath, entity, fieldName)\n\n\t\t\treturn this.buildOne(joined, orderable, targetEntity, newPath, value)\n\t\t}\n\t}\n}\n"],"names":["qb","orderable"],"mappings":";;;AAOA,MAAM,iBAAiB;AAAA,EACtB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,MAAM,eAAe;AAAA,EAC3B,YAA6B,QAAuC,aAA0B;AAAjE,SAAA,SAAA;AAAuC,SAAA,cAAA;AAAA,EAAA;AAAA,EAE7D,MACN,IACA,WACA,QACA,MACA,SACmD;AACnD,WAAO,QAAQ;AAAA,MACd,CAAC,CAACA,KAAIC,UAAS,GAAG,iBAAiB,KAAK,SAASD,KAAIC,YAAW,QAAQ,MAAM,YAAY;AAAA,MAC1F,CAAC,IAAI,SAAS;AAAA,IACf;AAAA,EAAA;AAAA,EAGO,SACP,IACA,WACA,QACA,MACA,SACmD;AAC7C,UAAA,UAAU,OAAO,QAAQ,OAAO;AAClC,QAAA,QAAQ,WAAW,GAAG;AACnB,YAAA,SAAS,QAAQ,IAAI,CAAA,OAAM,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI;AAC3C,YAAA,IAAI,UAAU,gFAAgF,MAAM;AAAA,IAAA;AAEvG,QAAA,QAAQ,WAAW,QAAQ,eAAe;AAC7C,UAAI,QAAQ,eAAe;AAC1B,cAAM,OAAO,QAAQ,gBAAgB,KAAK,IAAI,GAAG,EAAE;AAC/C,YAAA,OAAO,MAAM,OAAO,GAAG;AACpB,gBAAA,IAAI,UAAU,gEAAgE;AAAA,QAAA;AAEhF,aAAA,GACH,KAAK,aAAa,CAAAD,QAAMA,IAAG,OAAO,CAAQ,SAAA,KAAK,IAAI,cAAc,IAAI,CAAC,CAAC,EACvE,KAAK,aAAa,QAAW,CAAQ,SAAA,KAAK,IAAI,MAAM,CAAC;AAAA,MAAA;AAGxD,WAAK,GAAG,QAAQ,IAAI,QAAQ,UAAU,CAAC;AACvC,UAAI,cAAc,MAAM;AACvB,oBAAY,UAAU,QAAQ,IAAI,QAAQ,UAAU,CAAC;AAAA,MAAA;AAE/C,aAAA,CAAC,IAAI,SAAS;AAAA,IAAA;AAGtB,UAAM,CAAC,WAAW,KAAK,IAAkC,QAAQ,CAAC;AAE9D,QAAA,OAAO,UAAU,UAAU;AAC9B,YAAM,aAAa,cAAc,KAAK,QAAQ,QAAQ,SAAS;AAC/D,YAAM,aAAa,CAAgDC,eAClEA,WAAU,QAAQ,CAAC,KAAK,OAAO,UAAU,GAAG,eAAe,KAAK,CAAC;AAElE,WAAK,WAAW,EAAE;AAClB,UAAI,cAAc,MAAM;AACvB,oBAAY,WAAW,SAAwC;AAAA,MAAA;AAEzD,aAAA,CAAC,IAAI,SAAS;AAAA,IAAA,OACf;AACN,YAAM,eAAe,gBAAgB,KAAK,QAAQ,QAAQ,SAAS;AACnE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8CAA8C,OAAO,IAAI,KAAK,SAAS,YAAY;AAAA,MAAA;AAE9F,YAAA,UAAU,KAAK,IAAI,SAAS;AAClC,YAAM,SAAS,KAAK,YAAY,KAAK,IAAI,SAAS,QAAQ,SAAS;AAEnE,aAAO,KAAK,SAAS,QAAQ,WAAW,cAAc,SAAS,KAAK;AAAA,IAAA;AAAA,EACrE;AAEF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderByHelper.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByHelper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ObjectNode } from '../../inputProcessing'\n\nexport class OrderByHelper {\n\tpublic static appendDefaultOrderBy(\n\t\tentity: Model.Entity,\n\t\tobjectNode: ObjectNode<Input.ListQueryInput>,\n\t\trelationOrderBy: readonly Model.OrderBy[] | undefined,\n\t): ObjectNode<Input.ListQueryInput> {\n\t\tconst inputOrder = objectNode.args.orderBy || []\n\t\tconst hasOrderBy = inputOrder.length > 0\n\t\tconst defaultOrderBy = relationOrderBy ?? entity.orderBy ?? []\n\t\tif (!hasOrderBy && defaultOrderBy.length > 0) {\n\t\t\tconst defaultOrderByWithPrimary = [...defaultOrderBy, ...this.getPrimaryOrderBy(inputOrder, entity)]\n\t\t\treturn objectNode.withArg('orderBy', this.buildOrderBy(defaultOrderByWithPrimary))\n\t\t}\n\t\tconst hasLimit = typeof objectNode.args.limit === 'number'\n\t\tconst hasOffset = typeof objectNode.args.offset === 'number'\n\t\tif (\n\t\t\t(!hasLimit && !hasOffset && !hasOrderBy) ||\n\t\t\t(hasOrderBy && (inputOrder[0]._random || inputOrder[0]._randomSeeded !== undefined))\n\t\t) {\n\t\t\treturn objectNode\n\t\t}\n\n\t\tconst orderBy = this.buildOrderBy(this.getPrimaryOrderBy(inputOrder, entity))\n\t\treturn objectNode.withArg('orderBy', [...(inputOrder || []), ...orderBy])\n\t}\n\n\tprivate static buildOrderBy(defaultOrderBy: readonly Model.OrderBy[]): Input.OrderByFields[] {\n\t\treturn defaultOrderBy\n\t\t\t.map(({ path, direction }): Input.OrderByFields | null => {\n\t\t\t\tconst mutablePath = [...path]\n\t\t\t\tconst lastItem = mutablePath.pop()\n\t\t\t\tif (!lastItem) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst columnOrderBy = { [lastItem]: direction }\n\t\t\t\treturn mutablePath.reverse().reduce<Input.OrderByFields>((value, field) => ({ [field]: value }), columnOrderBy)\n\t\t\t})\n\t\t\t.filter((it): it is Input.OrderByFields => !!it)\n\t}\n\n\tprivate static getPrimaryOrderBy(inputOrder: Input.OrderBy[], entity: Model.Entity): Model.OrderBy[] {\n\t\treturn inputOrder.find(it => !!it[entity.primary])\n\t\t\t? []\n\t\t\t: [{ path: [entity.primary], direction: Model.OrderDirection.asc }]\n\t}\n}\n"],"names":["Model"],"mappings":";;;AAGO,MAAM,cAAc;AAAA,EAC1B,OAAc,qBACb,QACA,YACA,iBACmC;AACnC,UAAM,aAAa,WAAW,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"OrderByHelper.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByHelper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ObjectNode } from '../../inputProcessing'\n\nexport class OrderByHelper {\n\tpublic static appendDefaultOrderBy(\n\t\tentity: Model.Entity,\n\t\tobjectNode: ObjectNode<Input.ListQueryInput>,\n\t\trelationOrderBy: readonly Model.OrderBy[] | undefined,\n\t): ObjectNode<Input.ListQueryInput> {\n\t\tconst inputOrder = objectNode.args.orderBy || []\n\t\tconst hasOrderBy = inputOrder.length > 0\n\t\tconst defaultOrderBy = relationOrderBy ?? entity.orderBy ?? []\n\t\tif (!hasOrderBy && defaultOrderBy.length > 0) {\n\t\t\tconst defaultOrderByWithPrimary = [...defaultOrderBy, ...this.getPrimaryOrderBy(inputOrder, entity)]\n\t\t\treturn objectNode.withArg('orderBy', this.buildOrderBy(defaultOrderByWithPrimary))\n\t\t}\n\t\tconst hasLimit = typeof objectNode.args.limit === 'number'\n\t\tconst hasOffset = typeof objectNode.args.offset === 'number'\n\t\tif (\n\t\t\t(!hasLimit && !hasOffset && !hasOrderBy) ||\n\t\t\t(hasOrderBy && (inputOrder[0]._random || inputOrder[0]._randomSeeded !== undefined))\n\t\t) {\n\t\t\treturn objectNode\n\t\t}\n\n\t\tconst orderBy = this.buildOrderBy(this.getPrimaryOrderBy(inputOrder, entity))\n\t\treturn objectNode.withArg('orderBy', [...(inputOrder || []), ...orderBy])\n\t}\n\n\tprivate static buildOrderBy(defaultOrderBy: readonly Model.OrderBy[]): Input.OrderByFields[] {\n\t\treturn defaultOrderBy\n\t\t\t.map(({ path, direction }): Input.OrderByFields | null => {\n\t\t\t\tconst mutablePath = [...path]\n\t\t\t\tconst lastItem = mutablePath.pop()\n\t\t\t\tif (!lastItem) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst columnOrderBy = { [lastItem]: direction }\n\t\t\t\treturn mutablePath.reverse().reduce<Input.OrderByFields>((value, field) => ({ [field]: value }), columnOrderBy)\n\t\t\t})\n\t\t\t.filter((it): it is Input.OrderByFields => !!it)\n\t}\n\n\tprivate static getPrimaryOrderBy(inputOrder: Input.OrderBy[], entity: Model.Entity): Model.OrderBy[] {\n\t\treturn inputOrder.find(it => !!it[entity.primary])\n\t\t\t? []\n\t\t\t: [{ path: [entity.primary], direction: Model.OrderDirection.asc }]\n\t}\n}\n"],"names":["Model"],"mappings":";;;AAGO,MAAM,cAAc;AAAA,EAC1B,OAAc,qBACb,QACA,YACA,iBACmC;AACnC,UAAM,aAAa,WAAW,KAAK,WAAW,CAAC;AACzC,UAAA,aAAa,WAAW,SAAS;AACvC,UAAM,iBAAiB,mBAAmB,OAAO,WAAW,CAAC;AAC7D,QAAI,CAAC,cAAc,eAAe,SAAS,GAAG;AACvC,YAAA,4BAA4B,CAAC,GAAG,gBAAgB,GAAG,KAAK,kBAAkB,YAAY,MAAM,CAAC;AACnG,aAAO,WAAW,QAAQ,WAAW,KAAK,aAAa,yBAAyB,CAAC;AAAA,IAAA;AAElF,UAAM,WAAW,OAAO,WAAW,KAAK,UAAU;AAClD,UAAM,YAAY,OAAO,WAAW,KAAK,WAAW;AACpD,QACE,CAAC,YAAY,CAAC,aAAa,CAAC,cAC5B,eAAe,WAAW,CAAC,EAAE,WAAW,WAAW,CAAC,EAAE,kBAAkB,SACxE;AACM,aAAA;AAAA,IAAA;AAGR,UAAM,UAAU,KAAK,aAAa,KAAK,kBAAkB,YAAY,MAAM,CAAC;AACrE,WAAA,WAAW,QAAQ,WAAW,CAAC,GAAI,cAAc,CAAC,GAAI,GAAG,OAAO,CAAC;AAAA,EAAA;AAAA,EAGzE,OAAe,aAAa,gBAAiE;AAC5F,WAAO,eACL,IAAI,CAAC,EAAE,MAAM,gBAA4C;AACnD,YAAA,cAAc,CAAC,GAAG,IAAI;AACtB,YAAA,WAAW,YAAY,IAAI;AACjC,UAAI,CAAC,UAAU;AACP,eAAA;AAAA,MAAA;AAER,YAAM,gBAAgB,EAAE,CAAC,QAAQ,GAAG,UAAU;AAC9C,aAAO,YAAY,UAAU,OAA4B,CAAC,OAAO,WAAW,EAAE,CAAC,KAAK,GAAG,UAAU,aAAa;AAAA,IAC9G,CAAA,EACA,OAAO,CAAC,OAAkC,CAAC,CAAC,EAAE;AAAA,EAAA;AAAA,EAGjD,OAAe,kBAAkB,YAA6B,QAAuC;AAC7F,WAAA,WAAW,KAAK,CAAM,OAAA,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,IAC9C,CAAA,IACA,CAAC,EAAE,MAAM,CAAC,OAAO,OAAO,GAAG,WAAWA,OAAA,MAAM,eAAe,KAAK;AAAA,EAAA;AAErE;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderByHelper.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByHelper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ObjectNode } from '../../inputProcessing'\n\nexport class OrderByHelper {\n\tpublic static appendDefaultOrderBy(\n\t\tentity: Model.Entity,\n\t\tobjectNode: ObjectNode<Input.ListQueryInput>,\n\t\trelationOrderBy: readonly Model.OrderBy[] | undefined,\n\t): ObjectNode<Input.ListQueryInput> {\n\t\tconst inputOrder = objectNode.args.orderBy || []\n\t\tconst hasOrderBy = inputOrder.length > 0\n\t\tconst defaultOrderBy = relationOrderBy ?? entity.orderBy ?? []\n\t\tif (!hasOrderBy && defaultOrderBy.length > 0) {\n\t\t\tconst defaultOrderByWithPrimary = [...defaultOrderBy, ...this.getPrimaryOrderBy(inputOrder, entity)]\n\t\t\treturn objectNode.withArg('orderBy', this.buildOrderBy(defaultOrderByWithPrimary))\n\t\t}\n\t\tconst hasLimit = typeof objectNode.args.limit === 'number'\n\t\tconst hasOffset = typeof objectNode.args.offset === 'number'\n\t\tif (\n\t\t\t(!hasLimit && !hasOffset && !hasOrderBy) ||\n\t\t\t(hasOrderBy && (inputOrder[0]._random || inputOrder[0]._randomSeeded !== undefined))\n\t\t) {\n\t\t\treturn objectNode\n\t\t}\n\n\t\tconst orderBy = this.buildOrderBy(this.getPrimaryOrderBy(inputOrder, entity))\n\t\treturn objectNode.withArg('orderBy', [...(inputOrder || []), ...orderBy])\n\t}\n\n\tprivate static buildOrderBy(defaultOrderBy: readonly Model.OrderBy[]): Input.OrderByFields[] {\n\t\treturn defaultOrderBy\n\t\t\t.map(({ path, direction }): Input.OrderByFields | null => {\n\t\t\t\tconst mutablePath = [...path]\n\t\t\t\tconst lastItem = mutablePath.pop()\n\t\t\t\tif (!lastItem) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst columnOrderBy = { [lastItem]: direction }\n\t\t\t\treturn mutablePath.reverse().reduce<Input.OrderByFields>((value, field) => ({ [field]: value }), columnOrderBy)\n\t\t\t})\n\t\t\t.filter((it): it is Input.OrderByFields => !!it)\n\t}\n\n\tprivate static getPrimaryOrderBy(inputOrder: Input.OrderBy[], entity: Model.Entity): Model.OrderBy[] {\n\t\treturn inputOrder.find(it => !!it[entity.primary])\n\t\t\t? []\n\t\t\t: [{ path: [entity.primary], direction: Model.OrderDirection.asc }]\n\t}\n}\n"],"names":[],"mappings":";AAGO,MAAM,cAAc;AAAA,EAC1B,OAAc,qBACb,QACA,YACA,iBACmC;AACnC,UAAM,aAAa,WAAW,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"OrderByHelper.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/OrderByHelper.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { ObjectNode } from '../../inputProcessing'\n\nexport class OrderByHelper {\n\tpublic static appendDefaultOrderBy(\n\t\tentity: Model.Entity,\n\t\tobjectNode: ObjectNode<Input.ListQueryInput>,\n\t\trelationOrderBy: readonly Model.OrderBy[] | undefined,\n\t): ObjectNode<Input.ListQueryInput> {\n\t\tconst inputOrder = objectNode.args.orderBy || []\n\t\tconst hasOrderBy = inputOrder.length > 0\n\t\tconst defaultOrderBy = relationOrderBy ?? entity.orderBy ?? []\n\t\tif (!hasOrderBy && defaultOrderBy.length > 0) {\n\t\t\tconst defaultOrderByWithPrimary = [...defaultOrderBy, ...this.getPrimaryOrderBy(inputOrder, entity)]\n\t\t\treturn objectNode.withArg('orderBy', this.buildOrderBy(defaultOrderByWithPrimary))\n\t\t}\n\t\tconst hasLimit = typeof objectNode.args.limit === 'number'\n\t\tconst hasOffset = typeof objectNode.args.offset === 'number'\n\t\tif (\n\t\t\t(!hasLimit && !hasOffset && !hasOrderBy) ||\n\t\t\t(hasOrderBy && (inputOrder[0]._random || inputOrder[0]._randomSeeded !== undefined))\n\t\t) {\n\t\t\treturn objectNode\n\t\t}\n\n\t\tconst orderBy = this.buildOrderBy(this.getPrimaryOrderBy(inputOrder, entity))\n\t\treturn objectNode.withArg('orderBy', [...(inputOrder || []), ...orderBy])\n\t}\n\n\tprivate static buildOrderBy(defaultOrderBy: readonly Model.OrderBy[]): Input.OrderByFields[] {\n\t\treturn defaultOrderBy\n\t\t\t.map(({ path, direction }): Input.OrderByFields | null => {\n\t\t\t\tconst mutablePath = [...path]\n\t\t\t\tconst lastItem = mutablePath.pop()\n\t\t\t\tif (!lastItem) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst columnOrderBy = { [lastItem]: direction }\n\t\t\t\treturn mutablePath.reverse().reduce<Input.OrderByFields>((value, field) => ({ [field]: value }), columnOrderBy)\n\t\t\t})\n\t\t\t.filter((it): it is Input.OrderByFields => !!it)\n\t}\n\n\tprivate static getPrimaryOrderBy(inputOrder: Input.OrderBy[], entity: Model.Entity): Model.OrderBy[] {\n\t\treturn inputOrder.find(it => !!it[entity.primary])\n\t\t\t? []\n\t\t\t: [{ path: [entity.primary], direction: Model.OrderDirection.asc }]\n\t}\n}\n"],"names":[],"mappings":";AAGO,MAAM,cAAc;AAAA,EAC1B,OAAc,qBACb,QACA,YACA,iBACmC;AACnC,UAAM,aAAa,WAAW,KAAK,WAAW,CAAC;AACzC,UAAA,aAAa,WAAW,SAAS;AACvC,UAAM,iBAAiB,mBAAmB,OAAO,WAAW,CAAC;AAC7D,QAAI,CAAC,cAAc,eAAe,SAAS,GAAG;AACvC,YAAA,4BAA4B,CAAC,GAAG,gBAAgB,GAAG,KAAK,kBAAkB,YAAY,MAAM,CAAC;AACnG,aAAO,WAAW,QAAQ,WAAW,KAAK,aAAa,yBAAyB,CAAC;AAAA,IAAA;AAElF,UAAM,WAAW,OAAO,WAAW,KAAK,UAAU;AAClD,UAAM,YAAY,OAAO,WAAW,KAAK,WAAW;AACpD,QACE,CAAC,YAAY,CAAC,aAAa,CAAC,cAC5B,eAAe,WAAW,CAAC,EAAE,WAAW,WAAW,CAAC,EAAE,kBAAkB,SACxE;AACM,aAAA;AAAA,IAAA;AAGR,UAAM,UAAU,KAAK,aAAa,KAAK,kBAAkB,YAAY,MAAM,CAAC;AACrE,WAAA,WAAW,QAAQ,WAAW,CAAC,GAAI,cAAc,CAAC,GAAI,GAAG,OAAO,CAAC;AAAA,EAAA;AAAA,EAGzE,OAAe,aAAa,gBAAiE;AAC5F,WAAO,eACL,IAAI,CAAC,EAAE,MAAM,gBAA4C;AACnD,YAAA,cAAc,CAAC,GAAG,IAAI;AACtB,YAAA,WAAW,YAAY,IAAI;AACjC,UAAI,CAAC,UAAU;AACP,eAAA;AAAA,MAAA;AAER,YAAM,gBAAgB,EAAE,CAAC,QAAQ,GAAG,UAAU;AAC9C,aAAO,YAAY,UAAU,OAA4B,CAAC,OAAO,WAAW,EAAE,CAAC,KAAK,GAAG,UAAU,aAAa;AAAA,IAC9G,CAAA,EACA,OAAO,CAAC,OAAkC,CAAC,CAAC,EAAE;AAAA,EAAA;AAAA,EAGjD,OAAe,kBAAkB,YAA6B,QAAuC;AAC7F,WAAA,WAAW,KAAK,CAAM,OAAA,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,IAC9C,CAAA,IACA,CAAC,EAAE,MAAM,CAAC,OAAO,OAAO,GAAG,WAAW,MAAM,eAAe,KAAK;AAAA,EAAA;AAErE;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Path.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/Path.ts"],"sourcesContent":["const MAX_IDENTIFIER_LENGTH = 63\n\nexport class AliasContext {\n\tprivate aliasIndex = new Map<string, number>()\n\n\tpublic getAliasIndex(alias: string): number {\n\t\tconst index = this.aliasIndex.get(alias)\n\t\tif (index !== undefined) {\n\t\t\treturn index\n\t\t}\n\t\tconst newIndex = this.aliasIndex.size + 1\n\t\tthis.aliasIndex.set(alias, newIndex)\n\t\treturn newIndex\n\t}\n}\n\nexport class PathFactory {\n\tprivate aliasContext = new AliasContext()\n\n\tpublic constructor() {}\n\n\tpublic create(path: string[], rootAlias = 'root_') {\n\t\treturn new Path(path, this.aliasContext, rootAlias)\n\t}\n}\n\nexport class Path {\n\tpublic readonly alias: string\n\n\tconstructor(\n\t\tpublic readonly path: string[],\n\t\tprivate readonly aliasContext: AliasContext,\n\t\tpublic readonly rootAlias = 'root_',\n\t) {\n\t\tthis.alias = this.createAlias()\n\t}\n\n\tpublic get fullAlias() {\n\t\treturn this.rootAlias + this.path.join('_')\n\t}\n\n\tpublic back() {\n\t\tconst newPath = [...this.path]\n\t\tnewPath.pop()\n\t\treturn new Path(newPath, this.aliasContext, this.rootAlias)\n\t}\n\n\tpublic for(path: string) {\n\t\treturn new Path([...this.path, path], this.aliasContext, this.rootAlias)\n\t}\n\n\tprivate createAlias(): string {\n\t\tconst alias = this.fullAlias\n\n\t\t// intentionally not allowing == MAX_IDENTIFIER_LENGTH\n\t\tif (alias.length < MAX_IDENTIFIER_LENGTH) {\n\t\t\treturn alias\n\t\t}\n\t\tconst index = this.aliasContext.getAliasIndex(alias).toString()\n\t\treturn alias.substring(0, MAX_IDENTIFIER_LENGTH - index.length - 1) + '_' + index\n\t}\n}\n"],"names":[],"mappings":";;;;;AAAA,MAAM,wBAAwB;AAEvB,MAAM,aAAa;AAAA,EAAnB,cAAA;AACE,kBAAA,MAAA,kCAAiB,IAAoB,CAAA;AAAA,EAAA;AAAA,EAEtC,cAAc,OAAuB;AAC3C,UAAM,QAAQ,KAAK,WAAW,IAAI,KAAK;AACvC,QAAI,UAAU,QAAW;AACjB,aAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"Path.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/Path.ts"],"sourcesContent":["const MAX_IDENTIFIER_LENGTH = 63\n\nexport class AliasContext {\n\tprivate aliasIndex = new Map<string, number>()\n\n\tpublic getAliasIndex(alias: string): number {\n\t\tconst index = this.aliasIndex.get(alias)\n\t\tif (index !== undefined) {\n\t\t\treturn index\n\t\t}\n\t\tconst newIndex = this.aliasIndex.size + 1\n\t\tthis.aliasIndex.set(alias, newIndex)\n\t\treturn newIndex\n\t}\n}\n\nexport class PathFactory {\n\tprivate aliasContext = new AliasContext()\n\n\tpublic constructor() {}\n\n\tpublic create(path: string[], rootAlias = 'root_') {\n\t\treturn new Path(path, this.aliasContext, rootAlias)\n\t}\n}\n\nexport class Path {\n\tpublic readonly alias: string\n\n\tconstructor(\n\t\tpublic readonly path: string[],\n\t\tprivate readonly aliasContext: AliasContext,\n\t\tpublic readonly rootAlias = 'root_',\n\t) {\n\t\tthis.alias = this.createAlias()\n\t}\n\n\tpublic get fullAlias() {\n\t\treturn this.rootAlias + this.path.join('_')\n\t}\n\n\tpublic back() {\n\t\tconst newPath = [...this.path]\n\t\tnewPath.pop()\n\t\treturn new Path(newPath, this.aliasContext, this.rootAlias)\n\t}\n\n\tpublic for(path: string) {\n\t\treturn new Path([...this.path, path], this.aliasContext, this.rootAlias)\n\t}\n\n\tprivate createAlias(): string {\n\t\tconst alias = this.fullAlias\n\n\t\t// intentionally not allowing == MAX_IDENTIFIER_LENGTH\n\t\tif (alias.length < MAX_IDENTIFIER_LENGTH) {\n\t\t\treturn alias\n\t\t}\n\t\tconst index = this.aliasContext.getAliasIndex(alias).toString()\n\t\treturn alias.substring(0, MAX_IDENTIFIER_LENGTH - index.length - 1) + '_' + index\n\t}\n}\n"],"names":[],"mappings":";;;;;AAAA,MAAM,wBAAwB;AAEvB,MAAM,aAAa;AAAA,EAAnB,cAAA;AACE,kBAAA,MAAA,kCAAiB,IAAoB,CAAA;AAAA,EAAA;AAAA,EAEtC,cAAc,OAAuB;AAC3C,UAAM,QAAQ,KAAK,WAAW,IAAI,KAAK;AACvC,QAAI,UAAU,QAAW;AACjB,aAAA;AAAA,IAAA;AAEF,UAAA,WAAW,KAAK,WAAW,OAAO;AACnC,SAAA,WAAW,IAAI,OAAO,QAAQ;AAC5B,WAAA;AAAA,EAAA;AAET;AAEO,MAAM,YAAY;AAAA,EAGjB,cAAc;AAFb,kBAAA,MAAA,gBAAe,IAAI,aAAa,CAAA;AAAA,EAAA;AAAA,EAIjC,OAAO,MAAgB,YAAY,SAAS;AAClD,WAAO,IAAI,KAAK,MAAM,KAAK,cAAc,SAAS;AAAA,EAAA;AAEpD;AAEO,MAAM,KAAK;AAAA,EAGjB,YACiB,MACC,cACD,YAAY,SAC3B;AAHe,SAAA,OAAA;AACC,SAAA,eAAA;AACD,SAAA,YAAA;AALD,kBAAA,MAAA,OAAA;AAOV,SAAA,QAAQ,KAAK,YAAY;AAAA,EAAA;AAAA,EAG/B,IAAW,YAAY;AACtB,WAAO,KAAK,YAAY,KAAK,KAAK,KAAK,GAAG;AAAA,EAAA;AAAA,EAGpC,OAAO;AACb,UAAM,UAAU,CAAC,GAAG,KAAK,IAAI;AAC7B,YAAQ,IAAI;AACZ,WAAO,IAAI,KAAK,SAAS,KAAK,cAAc,KAAK,SAAS;AAAA,EAAA;AAAA,EAGpD,IAAI,MAAc;AACjB,WAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,cAAc,KAAK,SAAS;AAAA,EAAA;AAAA,EAGhE,cAAsB;AAC7B,UAAM,QAAQ,KAAK;AAGf,QAAA,MAAM,SAAS,uBAAuB;AAClC,aAAA;AAAA,IAAA;AAER,UAAM,QAAQ,KAAK,aAAa,cAAc,KAAK,EAAE,SAAS;AACvD,WAAA,MAAM,UAAU,GAAG,wBAAwB,MAAM,SAAS,CAAC,IAAI,MAAM;AAAA,EAAA;AAE9E;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Path.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/Path.ts"],"sourcesContent":["const MAX_IDENTIFIER_LENGTH = 63\n\nexport class AliasContext {\n\tprivate aliasIndex = new Map<string, number>()\n\n\tpublic getAliasIndex(alias: string): number {\n\t\tconst index = this.aliasIndex.get(alias)\n\t\tif (index !== undefined) {\n\t\t\treturn index\n\t\t}\n\t\tconst newIndex = this.aliasIndex.size + 1\n\t\tthis.aliasIndex.set(alias, newIndex)\n\t\treturn newIndex\n\t}\n}\n\nexport class PathFactory {\n\tprivate aliasContext = new AliasContext()\n\n\tpublic constructor() {}\n\n\tpublic create(path: string[], rootAlias = 'root_') {\n\t\treturn new Path(path, this.aliasContext, rootAlias)\n\t}\n}\n\nexport class Path {\n\tpublic readonly alias: string\n\n\tconstructor(\n\t\tpublic readonly path: string[],\n\t\tprivate readonly aliasContext: AliasContext,\n\t\tpublic readonly rootAlias = 'root_',\n\t) {\n\t\tthis.alias = this.createAlias()\n\t}\n\n\tpublic get fullAlias() {\n\t\treturn this.rootAlias + this.path.join('_')\n\t}\n\n\tpublic back() {\n\t\tconst newPath = [...this.path]\n\t\tnewPath.pop()\n\t\treturn new Path(newPath, this.aliasContext, this.rootAlias)\n\t}\n\n\tpublic for(path: string) {\n\t\treturn new Path([...this.path, path], this.aliasContext, this.rootAlias)\n\t}\n\n\tprivate createAlias(): string {\n\t\tconst alias = this.fullAlias\n\n\t\t// intentionally not allowing == MAX_IDENTIFIER_LENGTH\n\t\tif (alias.length < MAX_IDENTIFIER_LENGTH) {\n\t\t\treturn alias\n\t\t}\n\t\tconst index = this.aliasContext.getAliasIndex(alias).toString()\n\t\treturn alias.substring(0, MAX_IDENTIFIER_LENGTH - index.length - 1) + '_' + index\n\t}\n}\n"],"names":[],"mappings":";;;AAAA,MAAM,wBAAwB;AAEvB,MAAM,aAAa;AAAA,EAAnB,cAAA;AACE,kBAAA,MAAA,kCAAiB,IAAoB,CAAA;AAAA,EAAA;AAAA,EAEtC,cAAc,OAAuB;AAC3C,UAAM,QAAQ,KAAK,WAAW,IAAI,KAAK;AACvC,QAAI,UAAU,QAAW;AACjB,aAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"Path.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/Path.ts"],"sourcesContent":["const MAX_IDENTIFIER_LENGTH = 63\n\nexport class AliasContext {\n\tprivate aliasIndex = new Map<string, number>()\n\n\tpublic getAliasIndex(alias: string): number {\n\t\tconst index = this.aliasIndex.get(alias)\n\t\tif (index !== undefined) {\n\t\t\treturn index\n\t\t}\n\t\tconst newIndex = this.aliasIndex.size + 1\n\t\tthis.aliasIndex.set(alias, newIndex)\n\t\treturn newIndex\n\t}\n}\n\nexport class PathFactory {\n\tprivate aliasContext = new AliasContext()\n\n\tpublic constructor() {}\n\n\tpublic create(path: string[], rootAlias = 'root_') {\n\t\treturn new Path(path, this.aliasContext, rootAlias)\n\t}\n}\n\nexport class Path {\n\tpublic readonly alias: string\n\n\tconstructor(\n\t\tpublic readonly path: string[],\n\t\tprivate readonly aliasContext: AliasContext,\n\t\tpublic readonly rootAlias = 'root_',\n\t) {\n\t\tthis.alias = this.createAlias()\n\t}\n\n\tpublic get fullAlias() {\n\t\treturn this.rootAlias + this.path.join('_')\n\t}\n\n\tpublic back() {\n\t\tconst newPath = [...this.path]\n\t\tnewPath.pop()\n\t\treturn new Path(newPath, this.aliasContext, this.rootAlias)\n\t}\n\n\tpublic for(path: string) {\n\t\treturn new Path([...this.path, path], this.aliasContext, this.rootAlias)\n\t}\n\n\tprivate createAlias(): string {\n\t\tconst alias = this.fullAlias\n\n\t\t// intentionally not allowing == MAX_IDENTIFIER_LENGTH\n\t\tif (alias.length < MAX_IDENTIFIER_LENGTH) {\n\t\t\treturn alias\n\t\t}\n\t\tconst index = this.aliasContext.getAliasIndex(alias).toString()\n\t\treturn alias.substring(0, MAX_IDENTIFIER_LENGTH - index.length - 1) + '_' + index\n\t}\n}\n"],"names":[],"mappings":";;;AAAA,MAAM,wBAAwB;AAEvB,MAAM,aAAa;AAAA,EAAnB,cAAA;AACE,kBAAA,MAAA,kCAAiB,IAAoB,CAAA;AAAA,EAAA;AAAA,EAEtC,cAAc,OAAuB;AAC3C,UAAM,QAAQ,KAAK,WAAW,IAAI,KAAK;AACvC,QAAI,UAAU,QAAW;AACjB,aAAA;AAAA,IAAA;AAEF,UAAA,WAAW,KAAK,WAAW,OAAO;AACnC,SAAA,WAAW,IAAI,OAAO,QAAQ;AAC5B,WAAA;AAAA,EAAA;AAET;AAEO,MAAM,YAAY;AAAA,EAGjB,cAAc;AAFb,kBAAA,MAAA,gBAAe,IAAI,aAAa,CAAA;AAAA,EAAA;AAAA,EAIjC,OAAO,MAAgB,YAAY,SAAS;AAClD,WAAO,IAAI,KAAK,MAAM,KAAK,cAAc,SAAS;AAAA,EAAA;AAEpD;AAEO,MAAM,KAAK;AAAA,EAGjB,YACiB,MACC,cACD,YAAY,SAC3B;AAHe,SAAA,OAAA;AACC,SAAA,eAAA;AACD,SAAA,YAAA;AALD,kBAAA,MAAA,OAAA;AAOV,SAAA,QAAQ,KAAK,YAAY;AAAA,EAAA;AAAA,EAG/B,IAAW,YAAY;AACtB,WAAO,KAAK,YAAY,KAAK,KAAK,KAAK,GAAG;AAAA,EAAA;AAAA,EAGpC,OAAO;AACb,UAAM,UAAU,CAAC,GAAG,KAAK,IAAI;AAC7B,YAAQ,IAAI;AACZ,WAAO,IAAI,KAAK,SAAS,KAAK,cAAc,KAAK,SAAS;AAAA,EAAA;AAAA,EAGpD,IAAI,MAAc;AACjB,WAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,cAAc,KAAK,SAAS;AAAA,EAAA;AAAA,EAGhE,cAAsB;AAC7B,UAAM,QAAQ,KAAK;AAGf,QAAA,MAAM,SAAS,uBAAuB;AAClC,aAAA;AAAA,IAAA;AAER,UAAM,QAAQ,KAAK,aAAa,cAAc,KAAK,EAAE,SAAS;AACvD,WAAA,MAAM,UAAU,GAAG,wBAAwB,MAAM,SAAS,CAAC,IAAI,MAAM;AAAA,EAAA;AAE9E;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelationFetcher.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/RelationFetcher.ts"],"sourcesContent":["import { PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, Operator, SelectBuilder } from '@contember/database'\nimport { Input, Model, Value } from '@contember/schema'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { PredicatesInjector } from '../../acl'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { JoiningColumns } from '../types'\nimport { OrderByHelper } from './OrderByHelper'\nimport { SelectGroupedObjects, SelectResultObject, SelectRow } from './SelectHydrator'\nimport { Mapper } from '../Mapper'\n\nexport type GroupedCounts = Record<Input.PrimaryValue, number>\n\ntype CountOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tfilter: Input.OptionalWhere | undefined\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype FetchOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tobjectNode: ObjectNode<Input.ListQueryInput>\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype ManyHasManyBaseArgs =\n\t& {\n\t\tmapper: Mapper\n\t\tids: Input.PrimaryValue[]\n\t\trelationPath: Model.AnyRelationContext[]\n\t\trelationContext: Model.ManyHasManyInverseContext | Model.ManyHasManyOwningContext\n\t}\ntype CountManyHasManyGroupArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfilter: Input.OptionalWhere | undefined\n\t}\n\ntype FetchManyHasManyGroupsArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfield: ObjectNode<Input.ListQueryInput>\n\t}\n\nexport class RelationFetcher {\n\tconstructor(\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderBuilder: OrderByBuilder,\n\t\tprivate readonly predicateInjector: PredicatesInjector,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {}\n\n\tpublic async countOneHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountOneHasManyGroupsArgs): Promise<GroupedCounts> {\n\t\tconst { targetRelation, targetEntity } = relationContext\n\t\tconst filterWithParent = this.createOneHasManyFilter(targetEntity, targetRelation, ids, filter)\n\t\treturn mapper.countGrouped(targetEntity, filterWithParent, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tpublic async fetchOneHasManyGroups({\n\t\tmapper,\n\t\tobjectNode,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchOneHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst { relation, targetEntity, targetRelation } = relationContext\n\t\tconst filter = this.createOneHasManyFilter(targetEntity, targetRelation, ids, objectNode.args.filter)\n\t\tconst objectNodeWithWhere = objectNode.withArg<Input.ListQueryInput>('filter', filter)\n\t\tconst objectNodeWithOrder = OrderByHelper.appendDefaultOrderBy(\n\t\t\ttargetEntity,\n\t\t\tobjectNodeWithWhere,\n\t\t\trelation.orderBy,\n\t\t)\n\n\t\treturn mapper.selectGrouped(targetEntity, objectNodeWithOrder, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tprivate createOneHasManyFilter(\n\t\ttargetEntity: Model.Entity,\n\t\ttargetRelation: Model.ManyHasOneRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tfilter: Input.OptionalWhere | undefined,\n\t): Input.OptionalWhere {\n\t\tconst targetRelationFilter: Input.OptionalWhere = { [targetEntity.primary]: { in: ids } }\n\t\treturn {\n\t\t\t...filter,\n\t\t\t[targetRelation.name]: !filter?.[targetRelation.name]\n\t\t\t\t? targetRelationFilter\n\t\t\t\t: ({ and: [filter[targetRelation.name], targetRelationFilter] } as Input.OptionalWhere),\n\t\t}\n\t}\n\n\tpublic async countManyHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountManyHasManyGroupArgs): Promise<GroupedCounts> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\n\t\tconst qb = this.buildJunctionQb(owningRelation, ids, joiningColumns, relationContext.targetEntity, relationContext.entity, { filter }, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t\t\t.select(['junction_', joiningColumns.sourceColumn.columnName])\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.groupBy(['junction_', joiningColumns.sourceColumn.columnName])\n\n\t\tconst result = new Map<string, number>()\n\t\tconst rows = await qb.getResult(mapper.db)\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[joiningColumns.sourceColumn.columnName]), Number(row.row_count))\n\t\t}\n\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async fetchManyHasManyGroups({\n\t\tmapper,\n\t\tfield,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchManyHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\t\tconst defaultOrderBy = relationContext.relation.orderBy\n\t\tconst objectNode = OrderByHelper.appendDefaultOrderBy(relationContext.targetEntity, field, defaultOrderBy)\n\t\tconst { targetEntity, entity } = relationContext\n\t\tconst junctionValues = await this.fetchJunction(\n\t\t\tmapper.db,\n\t\t\towningRelation,\n\t\t\tids,\n\t\t\tjoiningColumns,\n\t\t\ttargetEntity,\n\t\t\tentity,\n\t\t\tobjectNode,\n\t\t\t[...relationPath, relationContext],\n\t\t)\n\t\tif (junctionValues.length === 0) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst primaryField = new FieldNode(targetEntity.primary, targetEntity.primary, {})\n\t\tconst inverseJoiningColumn = joiningColumns.targetColumn.columnName\n\t\tconst inverseIds = junctionValues\n\t\t\t.map(it => it[inverseJoiningColumn])\n\t\t\t.filter((it, index, arr) => arr.indexOf(it) === index)\n\n\t\tconst queryWithWhere = objectNode\n\t\t\t.withArgs({\n\t\t\t\tfilter: {\n\t\t\t\t\t[targetEntity.primary]: { in: inverseIds },\n\t\t\t\t},\n\t\t\t})\n\t\t\t.withField(primaryField)\n\t\tconst result = await mapper.select(targetEntity, queryWithWhere, [...relationPath, relationContext])\n\n\t\treturn this.buildManyHasManyGroups(targetEntity, joiningColumns, result, junctionValues)\n\t}\n\n\tprivate resolveJoiningColumns({ relationType, joiningTable }: { joiningTable: Model.JoiningTable; relationType: 'manyHasManyOwning' | 'manyHasManyInverse' }): JoiningColumns {\n\t\treturn relationType === 'manyHasManyOwning' ? {\n\t\t\tsourceColumn: joiningTable.joiningColumn,\n\t\t\ttargetColumn: joiningTable.inverseJoiningColumn,\n\t\t} : {\n\t\t\tsourceColumn: joiningTable.inverseJoiningColumn,\n\t\t\ttargetColumn: joiningTable.joiningColumn,\n\t\t}\n\t}\n\n\tprivate buildManyHasManyGroups(\n\t\tentity: Model.Entity,\n\t\tjoiningColumns: JoiningColumns,\n\t\tresultObjects: SelectResultObject[],\n\t\tjunctionValues: SelectRow[],\n\t): SelectGroupedObjects {\n\t\tconst dataById: { [id: string]: SelectResultObject } = {}\n\t\tfor (let object of resultObjects) {\n\t\t\tdataById[object[entity.primary] as Value.PrimaryValue] = object\n\t\t}\n\t\tconst sourceColumn = joiningColumns.sourceColumn.columnName\n\t\tconst targetColumn = joiningColumns.targetColumn.columnName\n\t\tconst groupedResult: SelectGroupedObjects = {}\n\t\tfor (let pair of junctionValues) {\n\t\t\tif (!groupedResult[pair[sourceColumn] as Value.PrimaryValue]) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue] = []\n\t\t\t}\n\t\t\tconst resultObject = dataById[pair[targetColumn] as Value.PrimaryValue]\n\t\t\tif (resultObject) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue].push(resultObject)\n\t\t\t}\n\t\t}\n\t\treturn groupedResult\n\t}\n\n\tprivate async fetchJunction(\n\t\tdb: Client,\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tvalues: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobject: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, Value.AtomicValue>[]> {\n\t\tconst joiningTable = relation.joiningTable\n\t\tconst qb = this.buildJunctionQb(relation, values, column, targetEntity, sourceEntity, object.args, relationPath)\n\t\t\t.select(['junction_', joiningTable.inverseJoiningColumn.columnName])\n\t\t\t.select(['junction_', joiningTable.joiningColumn.columnName])\n\t\tconst wrapper = new LimitByGroupWrapper(\n\t\t\t['junction_', column.sourceColumn.columnName],\n\t\t\t(orderable, qb) => {\n\t\t\t\tif (object.args.orderBy) {\n\t\t\t\t\t[qb, orderable] = this.orderBuilder.build(\n\t\t\t\t\t\tqb,\n\t\t\t\t\t\torderable,\n\t\t\t\t\t\ttargetEntity,\n\t\t\t\t\t\tthis.pathFactory.create([]),\n\t\t\t\t\t\tobject.args.orderBy,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn [orderable, qb]\n\t\t\t},\n\t\t\tobject.args.offset,\n\t\t\tobject.args.limit,\n\t\t)\n\n\t\treturn await wrapper.getResult(qb, db)\n\t}\n\n\tprivate buildJunctionQb(\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobjectArgs: Input.ListQueryInput,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): SelectBuilder {\n\t\tconst joiningTable = relation.joiningTable\n\n\t\tconst whereColumn = column.sourceColumn.columnName\n\t\tconst primaryColumn = sourceEntity.fields[sourceEntity.primary] as Model.AnyColumn\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(joiningTable.tableName, 'junction_')\n\t\t\t.where(clause => clause.in(['junction_', whereColumn], ids, primaryColumn.columnType))\n\n\t\tconst where = this.predicateInjector.inject(targetEntity, objectArgs.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst hasWhere = where && Object.keys(where).length > 0\n\t\tconst hasFieldOrderBy =\n\t\t\tobjectArgs.orderBy &&\n\t\t\tobjectArgs.orderBy.length > 0 &&\n\t\t\t!objectArgs.orderBy[0]._random &&\n\t\t\tobjectArgs.orderBy[0]._randomSeeded === undefined\n\n\t\tif (hasWhere || hasFieldOrderBy) {\n\t\t\tconst path = this.pathFactory.create([])\n\t\t\tqb = qb.join(targetEntity.tableName, path.alias, condition =>\n\t\t\t\tcondition.compareColumns(['junction_', column.targetColumn.columnName], Operator.eq, [\n\t\t\t\t\tpath.alias,\n\t\t\t\t\ttargetEntity.primaryColumn,\n\t\t\t\t]),\n\t\t\t)\n\t\t}\n\n\t\tif (where && hasWhere) {\n\t\t\tqb = this.whereBuilder.build(qb, targetEntity, this.pathFactory.create([]), where, { relationPath })\n\t\t}\n\t\treturn qb\n\t}\n}\n"],"names":["OrderByHelper","FieldNode","LimitByGroupWrapper","qb","SelectBuilder","Operator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RelationFetcher.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/RelationFetcher.ts"],"sourcesContent":["import { PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, Operator, SelectBuilder } from '@contember/database'\nimport { Input, Model, Value } from '@contember/schema'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { PredicatesInjector } from '../../acl'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { JoiningColumns } from '../types'\nimport { OrderByHelper } from './OrderByHelper'\nimport { SelectGroupedObjects, SelectResultObject, SelectRow } from './SelectHydrator'\nimport { Mapper } from '../Mapper'\n\nexport type GroupedCounts = Record<Input.PrimaryValue, number>\n\ntype CountOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tfilter: Input.OptionalWhere | undefined\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype FetchOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tobjectNode: ObjectNode<Input.ListQueryInput>\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype ManyHasManyBaseArgs =\n\t& {\n\t\tmapper: Mapper\n\t\tids: Input.PrimaryValue[]\n\t\trelationPath: Model.AnyRelationContext[]\n\t\trelationContext: Model.ManyHasManyInverseContext | Model.ManyHasManyOwningContext\n\t}\ntype CountManyHasManyGroupArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfilter: Input.OptionalWhere | undefined\n\t}\n\ntype FetchManyHasManyGroupsArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfield: ObjectNode<Input.ListQueryInput>\n\t}\n\nexport class RelationFetcher {\n\tconstructor(\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderBuilder: OrderByBuilder,\n\t\tprivate readonly predicateInjector: PredicatesInjector,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {}\n\n\tpublic async countOneHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountOneHasManyGroupsArgs): Promise<GroupedCounts> {\n\t\tconst { targetRelation, targetEntity } = relationContext\n\t\tconst filterWithParent = this.createOneHasManyFilter(targetEntity, targetRelation, ids, filter)\n\t\treturn mapper.countGrouped(targetEntity, filterWithParent, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tpublic async fetchOneHasManyGroups({\n\t\tmapper,\n\t\tobjectNode,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchOneHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst { relation, targetEntity, targetRelation } = relationContext\n\t\tconst filter = this.createOneHasManyFilter(targetEntity, targetRelation, ids, objectNode.args.filter)\n\t\tconst objectNodeWithWhere = objectNode.withArg<Input.ListQueryInput>('filter', filter)\n\t\tconst objectNodeWithOrder = OrderByHelper.appendDefaultOrderBy(\n\t\t\ttargetEntity,\n\t\t\tobjectNodeWithWhere,\n\t\t\trelation.orderBy,\n\t\t)\n\n\t\treturn mapper.selectGrouped(targetEntity, objectNodeWithOrder, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tprivate createOneHasManyFilter(\n\t\ttargetEntity: Model.Entity,\n\t\ttargetRelation: Model.ManyHasOneRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tfilter: Input.OptionalWhere | undefined,\n\t): Input.OptionalWhere {\n\t\tconst targetRelationFilter: Input.OptionalWhere = { [targetEntity.primary]: { in: ids } }\n\t\treturn {\n\t\t\t...filter,\n\t\t\t[targetRelation.name]: !filter?.[targetRelation.name]\n\t\t\t\t? targetRelationFilter\n\t\t\t\t: ({ and: [filter[targetRelation.name], targetRelationFilter] } as Input.OptionalWhere),\n\t\t}\n\t}\n\n\tpublic async countManyHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountManyHasManyGroupArgs): Promise<GroupedCounts> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\n\t\tconst qb = this.buildJunctionQb(owningRelation, ids, joiningColumns, relationContext.targetEntity, relationContext.entity, { filter }, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t\t\t.select(['junction_', joiningColumns.sourceColumn.columnName])\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.groupBy(['junction_', joiningColumns.sourceColumn.columnName])\n\n\t\tconst result = new Map<string, number>()\n\t\tconst rows = await qb.getResult(mapper.db)\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[joiningColumns.sourceColumn.columnName]), Number(row.row_count))\n\t\t}\n\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async fetchManyHasManyGroups({\n\t\tmapper,\n\t\tfield,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchManyHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\t\tconst defaultOrderBy = relationContext.relation.orderBy\n\t\tconst objectNode = OrderByHelper.appendDefaultOrderBy(relationContext.targetEntity, field, defaultOrderBy)\n\t\tconst { targetEntity, entity } = relationContext\n\t\tconst junctionValues = await this.fetchJunction(\n\t\t\tmapper.db,\n\t\t\towningRelation,\n\t\t\tids,\n\t\t\tjoiningColumns,\n\t\t\ttargetEntity,\n\t\t\tentity,\n\t\t\tobjectNode,\n\t\t\t[...relationPath, relationContext],\n\t\t)\n\t\tif (junctionValues.length === 0) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst primaryField = new FieldNode(targetEntity.primary, targetEntity.primary, {})\n\t\tconst inverseJoiningColumn = joiningColumns.targetColumn.columnName\n\t\tconst inverseIds = junctionValues\n\t\t\t.map(it => it[inverseJoiningColumn])\n\t\t\t.filter((it, index, arr) => arr.indexOf(it) === index)\n\n\t\tconst queryWithWhere = objectNode\n\t\t\t.withArgs({\n\t\t\t\tfilter: {\n\t\t\t\t\t[targetEntity.primary]: { in: inverseIds },\n\t\t\t\t},\n\t\t\t})\n\t\t\t.withField(primaryField)\n\t\tconst result = await mapper.select(targetEntity, queryWithWhere, [...relationPath, relationContext])\n\n\t\treturn this.buildManyHasManyGroups(targetEntity, joiningColumns, result, junctionValues)\n\t}\n\n\tprivate resolveJoiningColumns({ relationType, joiningTable }: { joiningTable: Model.JoiningTable; relationType: 'manyHasManyOwning' | 'manyHasManyInverse' }): JoiningColumns {\n\t\treturn relationType === 'manyHasManyOwning' ? {\n\t\t\tsourceColumn: joiningTable.joiningColumn,\n\t\t\ttargetColumn: joiningTable.inverseJoiningColumn,\n\t\t} : {\n\t\t\tsourceColumn: joiningTable.inverseJoiningColumn,\n\t\t\ttargetColumn: joiningTable.joiningColumn,\n\t\t}\n\t}\n\n\tprivate buildManyHasManyGroups(\n\t\tentity: Model.Entity,\n\t\tjoiningColumns: JoiningColumns,\n\t\tresultObjects: SelectResultObject[],\n\t\tjunctionValues: SelectRow[],\n\t): SelectGroupedObjects {\n\t\tconst dataById: { [id: string]: SelectResultObject } = {}\n\t\tfor (let object of resultObjects) {\n\t\t\tdataById[object[entity.primary] as Value.PrimaryValue] = object\n\t\t}\n\t\tconst sourceColumn = joiningColumns.sourceColumn.columnName\n\t\tconst targetColumn = joiningColumns.targetColumn.columnName\n\t\tconst groupedResult: SelectGroupedObjects = {}\n\t\tfor (let pair of junctionValues) {\n\t\t\tif (!groupedResult[pair[sourceColumn] as Value.PrimaryValue]) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue] = []\n\t\t\t}\n\t\t\tconst resultObject = dataById[pair[targetColumn] as Value.PrimaryValue]\n\t\t\tif (resultObject) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue].push(resultObject)\n\t\t\t}\n\t\t}\n\t\treturn groupedResult\n\t}\n\n\tprivate async fetchJunction(\n\t\tdb: Client,\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tvalues: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobject: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, Value.AtomicValue>[]> {\n\t\tconst joiningTable = relation.joiningTable\n\t\tconst qb = this.buildJunctionQb(relation, values, column, targetEntity, sourceEntity, object.args, relationPath)\n\t\t\t.select(['junction_', joiningTable.inverseJoiningColumn.columnName])\n\t\t\t.select(['junction_', joiningTable.joiningColumn.columnName])\n\t\tconst wrapper = new LimitByGroupWrapper(\n\t\t\t['junction_', column.sourceColumn.columnName],\n\t\t\t(orderable, qb) => {\n\t\t\t\tif (object.args.orderBy) {\n\t\t\t\t\t[qb, orderable] = this.orderBuilder.build(\n\t\t\t\t\t\tqb,\n\t\t\t\t\t\torderable,\n\t\t\t\t\t\ttargetEntity,\n\t\t\t\t\t\tthis.pathFactory.create([]),\n\t\t\t\t\t\tobject.args.orderBy,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn [orderable, qb]\n\t\t\t},\n\t\t\tobject.args.offset,\n\t\t\tobject.args.limit,\n\t\t)\n\n\t\treturn await wrapper.getResult(qb, db)\n\t}\n\n\tprivate buildJunctionQb(\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobjectArgs: Input.ListQueryInput,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): SelectBuilder {\n\t\tconst joiningTable = relation.joiningTable\n\n\t\tconst whereColumn = column.sourceColumn.columnName\n\t\tconst primaryColumn = sourceEntity.fields[sourceEntity.primary] as Model.AnyColumn\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(joiningTable.tableName, 'junction_')\n\t\t\t.where(clause => clause.in(['junction_', whereColumn], ids, primaryColumn.columnType))\n\n\t\tconst where = this.predicateInjector.inject(targetEntity, objectArgs.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst hasWhere = where && Object.keys(where).length > 0\n\t\tconst hasFieldOrderBy =\n\t\t\tobjectArgs.orderBy &&\n\t\t\tobjectArgs.orderBy.length > 0 &&\n\t\t\t!objectArgs.orderBy[0]._random &&\n\t\t\tobjectArgs.orderBy[0]._randomSeeded === undefined\n\n\t\tif (hasWhere || hasFieldOrderBy) {\n\t\t\tconst path = this.pathFactory.create([])\n\t\t\tqb = qb.join(targetEntity.tableName, path.alias, condition =>\n\t\t\t\tcondition.compareColumns(['junction_', column.targetColumn.columnName], Operator.eq, [\n\t\t\t\t\tpath.alias,\n\t\t\t\t\ttargetEntity.primaryColumn,\n\t\t\t\t]),\n\t\t\t)\n\t\t}\n\n\t\tif (where && hasWhere) {\n\t\t\tqb = this.whereBuilder.build(qb, targetEntity, this.pathFactory.create([]), where, { relationPath })\n\t\t}\n\t\treturn qb\n\t}\n}\n"],"names":["OrderByHelper","FieldNode","LimitByGroupWrapper","qb","SelectBuilder","Operator"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelationFetcher.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/RelationFetcher.ts"],"sourcesContent":["import { PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, Operator, SelectBuilder } from '@contember/database'\nimport { Input, Model, Value } from '@contember/schema'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { PredicatesInjector } from '../../acl'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { JoiningColumns } from '../types'\nimport { OrderByHelper } from './OrderByHelper'\nimport { SelectGroupedObjects, SelectResultObject, SelectRow } from './SelectHydrator'\nimport { Mapper } from '../Mapper'\n\nexport type GroupedCounts = Record<Input.PrimaryValue, number>\n\ntype CountOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tfilter: Input.OptionalWhere | undefined\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype FetchOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tobjectNode: ObjectNode<Input.ListQueryInput>\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype ManyHasManyBaseArgs =\n\t& {\n\t\tmapper: Mapper\n\t\tids: Input.PrimaryValue[]\n\t\trelationPath: Model.AnyRelationContext[]\n\t\trelationContext: Model.ManyHasManyInverseContext | Model.ManyHasManyOwningContext\n\t}\ntype CountManyHasManyGroupArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfilter: Input.OptionalWhere | undefined\n\t}\n\ntype FetchManyHasManyGroupsArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfield: ObjectNode<Input.ListQueryInput>\n\t}\n\nexport class RelationFetcher {\n\tconstructor(\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderBuilder: OrderByBuilder,\n\t\tprivate readonly predicateInjector: PredicatesInjector,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {}\n\n\tpublic async countOneHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountOneHasManyGroupsArgs): Promise<GroupedCounts> {\n\t\tconst { targetRelation, targetEntity } = relationContext\n\t\tconst filterWithParent = this.createOneHasManyFilter(targetEntity, targetRelation, ids, filter)\n\t\treturn mapper.countGrouped(targetEntity, filterWithParent, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tpublic async fetchOneHasManyGroups({\n\t\tmapper,\n\t\tobjectNode,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchOneHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst { relation, targetEntity, targetRelation } = relationContext\n\t\tconst filter = this.createOneHasManyFilter(targetEntity, targetRelation, ids, objectNode.args.filter)\n\t\tconst objectNodeWithWhere = objectNode.withArg<Input.ListQueryInput>('filter', filter)\n\t\tconst objectNodeWithOrder = OrderByHelper.appendDefaultOrderBy(\n\t\t\ttargetEntity,\n\t\t\tobjectNodeWithWhere,\n\t\t\trelation.orderBy,\n\t\t)\n\n\t\treturn mapper.selectGrouped(targetEntity, objectNodeWithOrder, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tprivate createOneHasManyFilter(\n\t\ttargetEntity: Model.Entity,\n\t\ttargetRelation: Model.ManyHasOneRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tfilter: Input.OptionalWhere | undefined,\n\t): Input.OptionalWhere {\n\t\tconst targetRelationFilter: Input.OptionalWhere = { [targetEntity.primary]: { in: ids } }\n\t\treturn {\n\t\t\t...filter,\n\t\t\t[targetRelation.name]: !filter?.[targetRelation.name]\n\t\t\t\t? targetRelationFilter\n\t\t\t\t: ({ and: [filter[targetRelation.name], targetRelationFilter] } as Input.OptionalWhere),\n\t\t}\n\t}\n\n\tpublic async countManyHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountManyHasManyGroupArgs): Promise<GroupedCounts> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\n\t\tconst qb = this.buildJunctionQb(owningRelation, ids, joiningColumns, relationContext.targetEntity, relationContext.entity, { filter }, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t\t\t.select(['junction_', joiningColumns.sourceColumn.columnName])\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.groupBy(['junction_', joiningColumns.sourceColumn.columnName])\n\n\t\tconst result = new Map<string, number>()\n\t\tconst rows = await qb.getResult(mapper.db)\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[joiningColumns.sourceColumn.columnName]), Number(row.row_count))\n\t\t}\n\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async fetchManyHasManyGroups({\n\t\tmapper,\n\t\tfield,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchManyHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\t\tconst defaultOrderBy = relationContext.relation.orderBy\n\t\tconst objectNode = OrderByHelper.appendDefaultOrderBy(relationContext.targetEntity, field, defaultOrderBy)\n\t\tconst { targetEntity, entity } = relationContext\n\t\tconst junctionValues = await this.fetchJunction(\n\t\t\tmapper.db,\n\t\t\towningRelation,\n\t\t\tids,\n\t\t\tjoiningColumns,\n\t\t\ttargetEntity,\n\t\t\tentity,\n\t\t\tobjectNode,\n\t\t\t[...relationPath, relationContext],\n\t\t)\n\t\tif (junctionValues.length === 0) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst primaryField = new FieldNode(targetEntity.primary, targetEntity.primary, {})\n\t\tconst inverseJoiningColumn = joiningColumns.targetColumn.columnName\n\t\tconst inverseIds = junctionValues\n\t\t\t.map(it => it[inverseJoiningColumn])\n\t\t\t.filter((it, index, arr) => arr.indexOf(it) === index)\n\n\t\tconst queryWithWhere = objectNode\n\t\t\t.withArgs({\n\t\t\t\tfilter: {\n\t\t\t\t\t[targetEntity.primary]: { in: inverseIds },\n\t\t\t\t},\n\t\t\t})\n\t\t\t.withField(primaryField)\n\t\tconst result = await mapper.select(targetEntity, queryWithWhere, [...relationPath, relationContext])\n\n\t\treturn this.buildManyHasManyGroups(targetEntity, joiningColumns, result, junctionValues)\n\t}\n\n\tprivate resolveJoiningColumns({ relationType, joiningTable }: { joiningTable: Model.JoiningTable; relationType: 'manyHasManyOwning' | 'manyHasManyInverse' }): JoiningColumns {\n\t\treturn relationType === 'manyHasManyOwning' ? {\n\t\t\tsourceColumn: joiningTable.joiningColumn,\n\t\t\ttargetColumn: joiningTable.inverseJoiningColumn,\n\t\t} : {\n\t\t\tsourceColumn: joiningTable.inverseJoiningColumn,\n\t\t\ttargetColumn: joiningTable.joiningColumn,\n\t\t}\n\t}\n\n\tprivate buildManyHasManyGroups(\n\t\tentity: Model.Entity,\n\t\tjoiningColumns: JoiningColumns,\n\t\tresultObjects: SelectResultObject[],\n\t\tjunctionValues: SelectRow[],\n\t): SelectGroupedObjects {\n\t\tconst dataById: { [id: string]: SelectResultObject } = {}\n\t\tfor (let object of resultObjects) {\n\t\t\tdataById[object[entity.primary] as Value.PrimaryValue] = object\n\t\t}\n\t\tconst sourceColumn = joiningColumns.sourceColumn.columnName\n\t\tconst targetColumn = joiningColumns.targetColumn.columnName\n\t\tconst groupedResult: SelectGroupedObjects = {}\n\t\tfor (let pair of junctionValues) {\n\t\t\tif (!groupedResult[pair[sourceColumn] as Value.PrimaryValue]) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue] = []\n\t\t\t}\n\t\t\tconst resultObject = dataById[pair[targetColumn] as Value.PrimaryValue]\n\t\t\tif (resultObject) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue].push(resultObject)\n\t\t\t}\n\t\t}\n\t\treturn groupedResult\n\t}\n\n\tprivate async fetchJunction(\n\t\tdb: Client,\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tvalues: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobject: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, Value.AtomicValue>[]> {\n\t\tconst joiningTable = relation.joiningTable\n\t\tconst qb = this.buildJunctionQb(relation, values, column, targetEntity, sourceEntity, object.args, relationPath)\n\t\t\t.select(['junction_', joiningTable.inverseJoiningColumn.columnName])\n\t\t\t.select(['junction_', joiningTable.joiningColumn.columnName])\n\t\tconst wrapper = new LimitByGroupWrapper(\n\t\t\t['junction_', column.sourceColumn.columnName],\n\t\t\t(orderable, qb) => {\n\t\t\t\tif (object.args.orderBy) {\n\t\t\t\t\t[qb, orderable] = this.orderBuilder.build(\n\t\t\t\t\t\tqb,\n\t\t\t\t\t\torderable,\n\t\t\t\t\t\ttargetEntity,\n\t\t\t\t\t\tthis.pathFactory.create([]),\n\t\t\t\t\t\tobject.args.orderBy,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn [orderable, qb]\n\t\t\t},\n\t\t\tobject.args.offset,\n\t\t\tobject.args.limit,\n\t\t)\n\n\t\treturn await wrapper.getResult(qb, db)\n\t}\n\n\tprivate buildJunctionQb(\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobjectArgs: Input.ListQueryInput,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): SelectBuilder {\n\t\tconst joiningTable = relation.joiningTable\n\n\t\tconst whereColumn = column.sourceColumn.columnName\n\t\tconst primaryColumn = sourceEntity.fields[sourceEntity.primary] as Model.AnyColumn\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(joiningTable.tableName, 'junction_')\n\t\t\t.where(clause => clause.in(['junction_', whereColumn], ids, primaryColumn.columnType))\n\n\t\tconst where = this.predicateInjector.inject(targetEntity, objectArgs.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst hasWhere = where && Object.keys(where).length > 0\n\t\tconst hasFieldOrderBy =\n\t\t\tobjectArgs.orderBy &&\n\t\t\tobjectArgs.orderBy.length > 0 &&\n\t\t\t!objectArgs.orderBy[0]._random &&\n\t\t\tobjectArgs.orderBy[0]._randomSeeded === undefined\n\n\t\tif (hasWhere || hasFieldOrderBy) {\n\t\t\tconst path = this.pathFactory.create([])\n\t\t\tqb = qb.join(targetEntity.tableName, path.alias, condition =>\n\t\t\t\tcondition.compareColumns(['junction_', column.targetColumn.columnName], Operator.eq, [\n\t\t\t\t\tpath.alias,\n\t\t\t\t\ttargetEntity.primaryColumn,\n\t\t\t\t]),\n\t\t\t)\n\t\t}\n\n\t\tif (where && hasWhere) {\n\t\t\tqb = this.whereBuilder.build(qb, targetEntity, this.pathFactory.create([]), where, { relationPath })\n\t\t}\n\t\treturn qb\n\t}\n}\n"],"names":["qb"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RelationFetcher.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/RelationFetcher.ts"],"sourcesContent":["import { PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, Operator, SelectBuilder } from '@contember/database'\nimport { Input, Model, Value } from '@contember/schema'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { PredicatesInjector } from '../../acl'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { JoiningColumns } from '../types'\nimport { OrderByHelper } from './OrderByHelper'\nimport { SelectGroupedObjects, SelectResultObject, SelectRow } from './SelectHydrator'\nimport { Mapper } from '../Mapper'\n\nexport type GroupedCounts = Record<Input.PrimaryValue, number>\n\ntype CountOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tfilter: Input.OptionalWhere | undefined\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype FetchOneHasManyGroupsArgs = {\n\tmapper: Mapper\n\tobjectNode: ObjectNode<Input.ListQueryInput>\n\trelationPath: Model.AnyRelationContext[]\n\trelationContext: Model.OneHasManyContext\n\tids: Input.PrimaryValue[]\n}\n\ntype ManyHasManyBaseArgs =\n\t& {\n\t\tmapper: Mapper\n\t\tids: Input.PrimaryValue[]\n\t\trelationPath: Model.AnyRelationContext[]\n\t\trelationContext: Model.ManyHasManyInverseContext | Model.ManyHasManyOwningContext\n\t}\ntype CountManyHasManyGroupArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfilter: Input.OptionalWhere | undefined\n\t}\n\ntype FetchManyHasManyGroupsArgs =\n\t& ManyHasManyBaseArgs\n\t& {\n\t\tfield: ObjectNode<Input.ListQueryInput>\n\t}\n\nexport class RelationFetcher {\n\tconstructor(\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderBuilder: OrderByBuilder,\n\t\tprivate readonly predicateInjector: PredicatesInjector,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {}\n\n\tpublic async countOneHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountOneHasManyGroupsArgs): Promise<GroupedCounts> {\n\t\tconst { targetRelation, targetEntity } = relationContext\n\t\tconst filterWithParent = this.createOneHasManyFilter(targetEntity, targetRelation, ids, filter)\n\t\treturn mapper.countGrouped(targetEntity, filterWithParent, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tpublic async fetchOneHasManyGroups({\n\t\tmapper,\n\t\tobjectNode,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchOneHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst { relation, targetEntity, targetRelation } = relationContext\n\t\tconst filter = this.createOneHasManyFilter(targetEntity, targetRelation, ids, objectNode.args.filter)\n\t\tconst objectNodeWithWhere = objectNode.withArg<Input.ListQueryInput>('filter', filter)\n\t\tconst objectNodeWithOrder = OrderByHelper.appendDefaultOrderBy(\n\t\t\ttargetEntity,\n\t\t\tobjectNodeWithWhere,\n\t\t\trelation.orderBy,\n\t\t)\n\n\t\treturn mapper.selectGrouped(targetEntity, objectNodeWithOrder, targetRelation, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t}\n\n\tprivate createOneHasManyFilter(\n\t\ttargetEntity: Model.Entity,\n\t\ttargetRelation: Model.ManyHasOneRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tfilter: Input.OptionalWhere | undefined,\n\t): Input.OptionalWhere {\n\t\tconst targetRelationFilter: Input.OptionalWhere = { [targetEntity.primary]: { in: ids } }\n\t\treturn {\n\t\t\t...filter,\n\t\t\t[targetRelation.name]: !filter?.[targetRelation.name]\n\t\t\t\t? targetRelationFilter\n\t\t\t\t: ({ and: [filter[targetRelation.name], targetRelationFilter] } as Input.OptionalWhere),\n\t\t}\n\t}\n\n\tpublic async countManyHasManyGroups({\n\t\tmapper,\n\t\tfilter,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: CountManyHasManyGroupArgs): Promise<GroupedCounts> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\n\t\tconst qb = this.buildJunctionQb(owningRelation, ids, joiningColumns, relationContext.targetEntity, relationContext.entity, { filter }, [\n\t\t\t...relationPath,\n\t\t\trelationContext,\n\t\t])\n\t\t\t.select(['junction_', joiningColumns.sourceColumn.columnName])\n\t\t\t.select(expr => expr.raw('count(*)'), 'row_count')\n\t\t\t.groupBy(['junction_', joiningColumns.sourceColumn.columnName])\n\n\t\tconst result = new Map<string, number>()\n\t\tconst rows = await qb.getResult(mapper.db)\n\t\tfor (const row of rows) {\n\t\t\tresult.set(String(row[joiningColumns.sourceColumn.columnName]), Number(row.row_count))\n\t\t}\n\n\t\treturn Object.fromEntries(result)\n\t}\n\n\tpublic async fetchManyHasManyGroups({\n\t\tmapper,\n\t\tfield,\n\t\trelationContext,\n\t\trelationPath,\n\t\tids,\n\t}: FetchManyHasManyGroupsArgs): Promise<SelectGroupedObjects> {\n\t\tconst owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation\n\t\tconst joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })\n\t\tconst defaultOrderBy = relationContext.relation.orderBy\n\t\tconst objectNode = OrderByHelper.appendDefaultOrderBy(relationContext.targetEntity, field, defaultOrderBy)\n\t\tconst { targetEntity, entity } = relationContext\n\t\tconst junctionValues = await this.fetchJunction(\n\t\t\tmapper.db,\n\t\t\towningRelation,\n\t\t\tids,\n\t\t\tjoiningColumns,\n\t\t\ttargetEntity,\n\t\t\tentity,\n\t\t\tobjectNode,\n\t\t\t[...relationPath, relationContext],\n\t\t)\n\t\tif (junctionValues.length === 0) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst primaryField = new FieldNode(targetEntity.primary, targetEntity.primary, {})\n\t\tconst inverseJoiningColumn = joiningColumns.targetColumn.columnName\n\t\tconst inverseIds = junctionValues\n\t\t\t.map(it => it[inverseJoiningColumn])\n\t\t\t.filter((it, index, arr) => arr.indexOf(it) === index)\n\n\t\tconst queryWithWhere = objectNode\n\t\t\t.withArgs({\n\t\t\t\tfilter: {\n\t\t\t\t\t[targetEntity.primary]: { in: inverseIds },\n\t\t\t\t},\n\t\t\t})\n\t\t\t.withField(primaryField)\n\t\tconst result = await mapper.select(targetEntity, queryWithWhere, [...relationPath, relationContext])\n\n\t\treturn this.buildManyHasManyGroups(targetEntity, joiningColumns, result, junctionValues)\n\t}\n\n\tprivate resolveJoiningColumns({ relationType, joiningTable }: { joiningTable: Model.JoiningTable; relationType: 'manyHasManyOwning' | 'manyHasManyInverse' }): JoiningColumns {\n\t\treturn relationType === 'manyHasManyOwning' ? {\n\t\t\tsourceColumn: joiningTable.joiningColumn,\n\t\t\ttargetColumn: joiningTable.inverseJoiningColumn,\n\t\t} : {\n\t\t\tsourceColumn: joiningTable.inverseJoiningColumn,\n\t\t\ttargetColumn: joiningTable.joiningColumn,\n\t\t}\n\t}\n\n\tprivate buildManyHasManyGroups(\n\t\tentity: Model.Entity,\n\t\tjoiningColumns: JoiningColumns,\n\t\tresultObjects: SelectResultObject[],\n\t\tjunctionValues: SelectRow[],\n\t): SelectGroupedObjects {\n\t\tconst dataById: { [id: string]: SelectResultObject } = {}\n\t\tfor (let object of resultObjects) {\n\t\t\tdataById[object[entity.primary] as Value.PrimaryValue] = object\n\t\t}\n\t\tconst sourceColumn = joiningColumns.sourceColumn.columnName\n\t\tconst targetColumn = joiningColumns.targetColumn.columnName\n\t\tconst groupedResult: SelectGroupedObjects = {}\n\t\tfor (let pair of junctionValues) {\n\t\t\tif (!groupedResult[pair[sourceColumn] as Value.PrimaryValue]) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue] = []\n\t\t\t}\n\t\t\tconst resultObject = dataById[pair[targetColumn] as Value.PrimaryValue]\n\t\t\tif (resultObject) {\n\t\t\t\tgroupedResult[pair[sourceColumn] as Value.PrimaryValue].push(resultObject)\n\t\t\t}\n\t\t}\n\t\treturn groupedResult\n\t}\n\n\tprivate async fetchJunction(\n\t\tdb: Client,\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tvalues: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobject: ObjectNode<Input.ListQueryInput>,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): Promise<Record<string, Value.AtomicValue>[]> {\n\t\tconst joiningTable = relation.joiningTable\n\t\tconst qb = this.buildJunctionQb(relation, values, column, targetEntity, sourceEntity, object.args, relationPath)\n\t\t\t.select(['junction_', joiningTable.inverseJoiningColumn.columnName])\n\t\t\t.select(['junction_', joiningTable.joiningColumn.columnName])\n\t\tconst wrapper = new LimitByGroupWrapper(\n\t\t\t['junction_', column.sourceColumn.columnName],\n\t\t\t(orderable, qb) => {\n\t\t\t\tif (object.args.orderBy) {\n\t\t\t\t\t[qb, orderable] = this.orderBuilder.build(\n\t\t\t\t\t\tqb,\n\t\t\t\t\t\torderable,\n\t\t\t\t\t\ttargetEntity,\n\t\t\t\t\t\tthis.pathFactory.create([]),\n\t\t\t\t\t\tobject.args.orderBy,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn [orderable, qb]\n\t\t\t},\n\t\t\tobject.args.offset,\n\t\t\tobject.args.limit,\n\t\t)\n\n\t\treturn await wrapper.getResult(qb, db)\n\t}\n\n\tprivate buildJunctionQb(\n\t\trelation: Model.ManyHasManyOwningRelation,\n\t\tids: Input.PrimaryValue[],\n\t\tcolumn: JoiningColumns,\n\t\ttargetEntity: Model.Entity,\n\t\tsourceEntity: Model.Entity,\n\t\tobjectArgs: Input.ListQueryInput,\n\t\trelationPath: Model.AnyRelationContext[],\n\t): SelectBuilder {\n\t\tconst joiningTable = relation.joiningTable\n\n\t\tconst whereColumn = column.sourceColumn.columnName\n\t\tconst primaryColumn = sourceEntity.fields[sourceEntity.primary] as Model.AnyColumn\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(joiningTable.tableName, 'junction_')\n\t\t\t.where(clause => clause.in(['junction_', whereColumn], ids, primaryColumn.columnType))\n\n\t\tconst where = this.predicateInjector.inject(targetEntity, objectArgs.filter || {}, relationPath[relationPath.length - 1])\n\t\tconst hasWhere = where && Object.keys(where).length > 0\n\t\tconst hasFieldOrderBy =\n\t\t\tobjectArgs.orderBy &&\n\t\t\tobjectArgs.orderBy.length > 0 &&\n\t\t\t!objectArgs.orderBy[0]._random &&\n\t\t\tobjectArgs.orderBy[0]._randomSeeded === undefined\n\n\t\tif (hasWhere || hasFieldOrderBy) {\n\t\t\tconst path = this.pathFactory.create([])\n\t\t\tqb = qb.join(targetEntity.tableName, path.alias, condition =>\n\t\t\t\tcondition.compareColumns(['junction_', column.targetColumn.columnName], Operator.eq, [\n\t\t\t\t\tpath.alias,\n\t\t\t\t\ttargetEntity.primaryColumn,\n\t\t\t\t]),\n\t\t\t)\n\t\t}\n\n\t\tif (where && hasWhere) {\n\t\t\tqb = this.whereBuilder.build(qb, targetEntity, this.pathFactory.create([]), where, { relationPath })\n\t\t}\n\t\treturn qb\n\t}\n}\n"],"names":["qb"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectBuilder.ts"],"sourcesContent":["import { Acl, Input, Model, Value } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport { ColumnValueGetter, SelectHydrator, SelectRow } from './SelectHydrator'\nimport { Path, PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { FieldsVisitorFactory } from './handlers'\nimport { SelectExecutionHandler, SelectExecutionHandlerContext } from './SelectExecutionHandler'\nimport { MetaHandler } from './handlers'\nimport { Mapper } from '../Mapper'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { assertNever } from '../../utils'\nimport { PredicateFactory } from '../../acl'\n\nexport class SelectBuilder {\n\tprivate resolver: (value: SelectRow[]) => void = () => {\n\t\tthrow new Error('SelectBuilder: Resolver called too soon')\n\t}\n\tpublic readonly rows: Promise<SelectRow[]> = new Promise(resolve => (this.resolver = resolve))\n\n\tprivate queryWrapper: LimitByGroupWrapper | null = null\n\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderByBuilder: OrderByBuilder,\n\t\tprivate readonly metaHandler: MetaHandler,\n\t\tprivate qb: DbSelectBuilder<DbSelectBuilder.Result>,\n\t\tprivate readonly hydrator: SelectHydrator,\n\t\tprivate readonly fieldsVisitorFactory: FieldsVisitorFactory,\n\t\tprivate readonly selectHandlers: { [key: string]: SelectExecutionHandler<any> },\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t) {}\n\n\tpublic async execute(db: Client): Promise<SelectRow[]> {\n\t\tlet result: SelectRow[]\n\t\tif (this.queryWrapper) {\n\t\t\tresult = await this.queryWrapper.getResult(this.qb, db)\n\t\t} else {\n\t\t\tresult = await this.qb.getResult(db)\n\t\t}\n\t\tthis.resolver(result)\n\t\treturn result\n\t}\n\n\tpublic select(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\tpath: Path,\n\t\tgroupBy?: string,\n\t) {\n\t\tthis.selectInternal(mapper, entity, path, input)\n\t\tconst where = input.args.filter\n\t\tif (where) {\n\t\t\tthis.qb = this.whereBuilder.build(this.qb, entity, path, where, { relationPath: this.relationPath })\n\t\t}\n\t\tconst orderBy = input.args.orderBy || []\n\n\t\tif (groupBy) {\n\t\t\tconst groupByColumn = getColumnName(this.schema, entity, groupBy)\n\t\t\tthis.queryWrapper = new LimitByGroupWrapper(\n\t\t\t\t[path.alias, groupByColumn],\n\t\t\t\t(orderable, qb) => {\n\t\t\t\t\tif (orderBy.length > 0) {\n\t\t\t\t\t\t[qb, orderable] = this.orderByBuilder.build(qb, orderable, entity, this.pathFactory.create([]), orderBy)\n\t\t\t\t\t}\n\t\t\t\t\treturn [orderable, qb]\n\t\t\t\t},\n\t\t\t\tinput.args.offset,\n\t\t\t\tinput.args.limit,\n\t\t\t)\n\t\t} else {\n\t\t\tif (orderBy.length > 0) {\n\t\t\t\t[this.qb] = this.orderByBuilder.build(this.qb, null, entity, path, orderBy)\n\t\t\t}\n\t\t\tthis.qb = this.qb.limit(input.args.limit, input.args.offset)\n\t\t}\n\t}\n\n\tprivate selectInternal(mapper: Mapper, entity: Model.Entity, path: Path, input: ObjectNode) {\n\t\tif (!input.fields.find(it => it.name === entity.primary && it.alias === entity.primary)) {\n\t\t\tinput = input.withField(new FieldNode(entity.primary, entity.primary, {}))\n\t\t}\n\n\t\tconst fetchedPredicates = new Set()\n\t\tconst addPredicate = (predicate: Acl.Predicate): ColumnValueGetter<boolean> => {\n\t\t\tif (typeof predicate === 'boolean') {\n\t\t\t\treturn () => predicate\n\t\t\t}\n\t\t\tconst predicatePath = path.for('__predicate').for(predicate)\n\n\t\t\tif (!fetchedPredicates.has(predicate)) {\n\t\t\t\tconst relationContext = this.relationPath[this.relationPath.length - 1]\n\n\t\t\t\tconst primaryPredicate = this.predicateFactory.create(entity, Acl.Operation.read, undefined, relationContext)\n\t\t\t\tconst fieldPredicate = this.predicateFactory.buildPredicates(entity, [predicate], relationContext)\n\n\t\t\t\tthis.qb = this.whereBuilder.buildAdvanced(\n\t\t\t\t\tentity,\n\t\t\t\t\tpath.back(),\n\t\t\t\t\tfieldPredicate,\n\t\t\t\t\tapply => this.qb.select(expr =>\n\t\t\t\t\t\texpr.selectCondition(condition => {\n\t\t\t\t\t\t\tcondition = apply(condition)\n\t\t\t\t\t\t\tif (condition.isEmpty()) {\n\t\t\t\t\t\t\t\treturn condition.raw('true')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn condition\n\t\t\t\t\t\t}),\n\t\t\t\t\tpredicatePath.alias,\n\t\t\t\t\t),\n\t\t\t\t\t{ relationPath: this.relationPath, evaluatedPredicates: [primaryPredicate] },\n\t\t\t\t)\n\t\t\t\tfetchedPredicates.add(predicate)\n\t\t\t}\n\t\t\treturn row => row[predicatePath.alias] === true\n\t\t}\n\n\t\tfor (let field of input.fields) {\n\t\t\tconst fieldPath = path.for(field.alias)\n\t\t\tconst fieldProperty = (() => {\n\t\t\t\tif (field instanceof ObjectNode) {\n\t\t\t\t\treturn { objectNode: field }\n\t\t\t\t}\n\t\t\t\tif (field instanceof FieldNode) {\n\t\t\t\t\treturn { fieldNode: field }\n\t\t\t\t}\n\t\t\t\treturn assertNever(field)\n\t\t\t})()\n\n\n\t\t\tconst executionContext: SelectExecutionHandlerContext = {\n\t\t\t\tmapper,\n\t\t\t\trelationPath: this.relationPath,\n\t\t\t\taddData: async ({ field, dataProvider, defaultValue, predicate }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addPromise(fieldPath, () => null, Promise.resolve({}), defaultValue ?? null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tconst columnName = getColumnName(this.schema, entity, field)\n\t\t\t\t\tconst parentValuePath = path.for(field)\n\t\t\t\t\tlet ids = await this.getColumnValues(parentValuePath, columnName, predicateGetter)\n\n\t\t\t\t\tconst data = ids.length > 0 ? dataProvider(ids) : Promise.resolve({})\n\t\t\t\t\tthis.hydrator.addPromise(\n\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\trow => predicateGetter === null || predicateGetter(row) ? (row[parentValuePath.alias] as Value.PrimaryValue) : null,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tdefaultValue ?? null,\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddColumn: ({ path = fieldPath, predicate, query, valueGetter }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addColumn(path, () => null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tif (query) {\n\t\t\t\t\t\tthis.qb = query(this.qb)\n\t\t\t\t\t}\n\t\t\t\t\tthis.hydrator.addColumn(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tvalueGetter ?? (row => predicateGetter === null || predicateGetter(row) ? row[path.alias] : null),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddPredicate: addPredicate,\n\t\t\t\tpath: fieldPath,\n\t\t\t\tentity: entity,\n\t\t\t\t...fieldProperty,\n\t\t\t}\n\n\t\t\tif (field.name === '_meta') {\n\t\t\t\tthis.metaHandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Disregarding __typename field since it's automatically handled by apollo server\n\t\t\tif (field.name === '__typename') {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field.extensions.extensionKey) {\n\t\t\t\tconst handler = this.selectHandlers[field.extensions.extensionKey]\n\t\t\t\tif (!handler) {\n\t\t\t\t\tthrow new Error(`Handler for ${field.extensions.extensionKey} not found`)\n\t\t\t\t}\n\t\t\t\thandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst fieldVisitor = this.fieldsVisitorFactory.create(mapper, executionContext)\n\t\t\tacceptFieldVisitor(this.schema, entity, field.name, fieldVisitor)\n\t\t}\n\t}\n\n\tprivate async getColumnValues(columnPath: Path, columnName: string, predicateGetter: null | ColumnValueGetter<boolean>): Promise<Input.PrimaryValue[]> {\n\t\tthis.qb = this.qb.select([columnPath.back().alias, columnName], columnPath.alias)\n\t\tconst rows = await this.rows\n\t\tconst filteredRows = predicateGetter === null ? rows : rows.filter(predicateGetter)\n\t\tconst columnAlias = columnPath.alias\n\t\tconst ids = filteredRows.map((it): Input.PrimaryValue => it[columnAlias] as Input.PrimaryValue).filter(it => it !== null)\n\t\treturn Array.from(new Set(ids))\n\t}\n}\n"],"names":["schema","getColumnName","LimitByGroupWrapper","FieldNode","Acl","ObjectNode","assertNever","field","path","acceptFieldVisitor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectBuilder.ts"],"sourcesContent":["import { Acl, Input, Model, Value } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport { ColumnValueGetter, SelectHydrator, SelectRow } from './SelectHydrator'\nimport { Path, PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { FieldsVisitorFactory } from './handlers'\nimport { SelectExecutionHandler, SelectExecutionHandlerContext } from './SelectExecutionHandler'\nimport { MetaHandler } from './handlers'\nimport { Mapper } from '../Mapper'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { assertNever } from '../../utils'\nimport { PredicateFactory } from '../../acl'\n\nexport class SelectBuilder {\n\tprivate resolver: (value: SelectRow[]) => void = () => {\n\t\tthrow new Error('SelectBuilder: Resolver called too soon')\n\t}\n\tpublic readonly rows: Promise<SelectRow[]> = new Promise(resolve => (this.resolver = resolve))\n\n\tprivate queryWrapper: LimitByGroupWrapper | null = null\n\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderByBuilder: OrderByBuilder,\n\t\tprivate readonly metaHandler: MetaHandler,\n\t\tprivate qb: DbSelectBuilder<DbSelectBuilder.Result>,\n\t\tprivate readonly hydrator: SelectHydrator,\n\t\tprivate readonly fieldsVisitorFactory: FieldsVisitorFactory,\n\t\tprivate readonly selectHandlers: { [key: string]: SelectExecutionHandler<any> },\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t) {}\n\n\tpublic async execute(db: Client): Promise<SelectRow[]> {\n\t\tlet result: SelectRow[]\n\t\tif (this.queryWrapper) {\n\t\t\tresult = await this.queryWrapper.getResult(this.qb, db)\n\t\t} else {\n\t\t\tresult = await this.qb.getResult(db)\n\t\t}\n\t\tthis.resolver(result)\n\t\treturn result\n\t}\n\n\tpublic select(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\tpath: Path,\n\t\tgroupBy?: string,\n\t) {\n\t\tthis.selectInternal(mapper, entity, path, input)\n\t\tconst where = input.args.filter\n\t\tif (where) {\n\t\t\tthis.qb = this.whereBuilder.build(this.qb, entity, path, where, { relationPath: this.relationPath })\n\t\t}\n\t\tconst orderBy = input.args.orderBy || []\n\n\t\tif (groupBy) {\n\t\t\tconst groupByColumn = getColumnName(this.schema, entity, groupBy)\n\t\t\tthis.queryWrapper = new LimitByGroupWrapper(\n\t\t\t\t[path.alias, groupByColumn],\n\t\t\t\t(orderable, qb) => {\n\t\t\t\t\tif (orderBy.length > 0) {\n\t\t\t\t\t\t[qb, orderable] = this.orderByBuilder.build(qb, orderable, entity, this.pathFactory.create([]), orderBy)\n\t\t\t\t\t}\n\t\t\t\t\treturn [orderable, qb]\n\t\t\t\t},\n\t\t\t\tinput.args.offset,\n\t\t\t\tinput.args.limit,\n\t\t\t)\n\t\t} else {\n\t\t\tif (orderBy.length > 0) {\n\t\t\t\t[this.qb] = this.orderByBuilder.build(this.qb, null, entity, path, orderBy)\n\t\t\t}\n\t\t\tthis.qb = this.qb.limit(input.args.limit, input.args.offset)\n\t\t}\n\t}\n\n\tprivate selectInternal(mapper: Mapper, entity: Model.Entity, path: Path, input: ObjectNode) {\n\t\tif (!input.fields.find(it => it.name === entity.primary && it.alias === entity.primary)) {\n\t\t\tinput = input.withField(new FieldNode(entity.primary, entity.primary, {}))\n\t\t}\n\n\t\tconst fetchedPredicates = new Set()\n\t\tconst addPredicate = (predicate: Acl.Predicate): ColumnValueGetter<boolean> => {\n\t\t\tif (typeof predicate === 'boolean') {\n\t\t\t\treturn () => predicate\n\t\t\t}\n\t\t\tconst predicatePath = path.for('__predicate').for(predicate)\n\n\t\t\tif (!fetchedPredicates.has(predicate)) {\n\t\t\t\tconst relationContext = this.relationPath[this.relationPath.length - 1]\n\n\t\t\t\tconst primaryPredicate = this.predicateFactory.create(entity, Acl.Operation.read, undefined, relationContext)\n\t\t\t\tconst fieldPredicate = this.predicateFactory.buildPredicates(entity, [predicate], relationContext)\n\n\t\t\t\tthis.qb = this.whereBuilder.buildAdvanced(\n\t\t\t\t\tentity,\n\t\t\t\t\tpath.back(),\n\t\t\t\t\tfieldPredicate,\n\t\t\t\t\tapply => this.qb.select(expr =>\n\t\t\t\t\t\texpr.selectCondition(condition => {\n\t\t\t\t\t\t\tcondition = apply(condition)\n\t\t\t\t\t\t\tif (condition.isEmpty()) {\n\t\t\t\t\t\t\t\treturn condition.raw('true')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn condition\n\t\t\t\t\t\t}),\n\t\t\t\t\tpredicatePath.alias,\n\t\t\t\t\t),\n\t\t\t\t\t{ relationPath: this.relationPath, evaluatedPredicates: [primaryPredicate] },\n\t\t\t\t)\n\t\t\t\tfetchedPredicates.add(predicate)\n\t\t\t}\n\t\t\treturn row => row[predicatePath.alias] === true\n\t\t}\n\n\t\tfor (let field of input.fields) {\n\t\t\tconst fieldPath = path.for(field.alias)\n\t\t\tconst fieldProperty = (() => {\n\t\t\t\tif (field instanceof ObjectNode) {\n\t\t\t\t\treturn { objectNode: field }\n\t\t\t\t}\n\t\t\t\tif (field instanceof FieldNode) {\n\t\t\t\t\treturn { fieldNode: field }\n\t\t\t\t}\n\t\t\t\treturn assertNever(field)\n\t\t\t})()\n\n\n\t\t\tconst executionContext: SelectExecutionHandlerContext = {\n\t\t\t\tmapper,\n\t\t\t\trelationPath: this.relationPath,\n\t\t\t\taddData: async ({ field, dataProvider, defaultValue, predicate }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addPromise(fieldPath, () => null, Promise.resolve({}), defaultValue ?? null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tconst columnName = getColumnName(this.schema, entity, field)\n\t\t\t\t\tconst parentValuePath = path.for(field)\n\t\t\t\t\tlet ids = await this.getColumnValues(parentValuePath, columnName, predicateGetter)\n\n\t\t\t\t\tconst data = ids.length > 0 ? dataProvider(ids) : Promise.resolve({})\n\t\t\t\t\tthis.hydrator.addPromise(\n\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\trow => predicateGetter === null || predicateGetter(row) ? (row[parentValuePath.alias] as Value.PrimaryValue) : null,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tdefaultValue ?? null,\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddColumn: ({ path = fieldPath, predicate, query, valueGetter }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addColumn(path, () => null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tif (query) {\n\t\t\t\t\t\tthis.qb = query(this.qb)\n\t\t\t\t\t}\n\t\t\t\t\tthis.hydrator.addColumn(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tvalueGetter ?? (row => predicateGetter === null || predicateGetter(row) ? row[path.alias] : null),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddPredicate: addPredicate,\n\t\t\t\tpath: fieldPath,\n\t\t\t\tentity: entity,\n\t\t\t\t...fieldProperty,\n\t\t\t}\n\n\t\t\tif (field.name === '_meta') {\n\t\t\t\tthis.metaHandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Disregarding __typename field since it's automatically handled by apollo server\n\t\t\tif (field.name === '__typename') {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field.extensions.extensionKey) {\n\t\t\t\tconst handler = this.selectHandlers[field.extensions.extensionKey]\n\t\t\t\tif (!handler) {\n\t\t\t\t\tthrow new Error(`Handler for ${field.extensions.extensionKey} not found`)\n\t\t\t\t}\n\t\t\t\thandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst fieldVisitor = this.fieldsVisitorFactory.create(mapper, executionContext)\n\t\t\tacceptFieldVisitor(this.schema, entity, field.name, fieldVisitor)\n\t\t}\n\t}\n\n\tprivate async getColumnValues(columnPath: Path, columnName: string, predicateGetter: null | ColumnValueGetter<boolean>): Promise<Input.PrimaryValue[]> {\n\t\tthis.qb = this.qb.select([columnPath.back().alias, columnName], columnPath.alias)\n\t\tconst rows = await this.rows\n\t\tconst filteredRows = predicateGetter === null ? rows : rows.filter(predicateGetter)\n\t\tconst columnAlias = columnPath.alias\n\t\tconst ids = filteredRows.map((it): Input.PrimaryValue => it[columnAlias] as Input.PrimaryValue).filter(it => it !== null)\n\t\treturn Array.from(new Set(ids))\n\t}\n}\n"],"names":["schema","getColumnName","LimitByGroupWrapper","FieldNode","Acl","ObjectNode","assertNever","field","path","acceptFieldVisitor"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectBuilder.ts"],"sourcesContent":["import { Acl, Input, Model, Value } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport { ColumnValueGetter, SelectHydrator, SelectRow } from './SelectHydrator'\nimport { Path, PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { FieldsVisitorFactory } from './handlers'\nimport { SelectExecutionHandler, SelectExecutionHandlerContext } from './SelectExecutionHandler'\nimport { MetaHandler } from './handlers'\nimport { Mapper } from '../Mapper'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { assertNever } from '../../utils'\nimport { PredicateFactory } from '../../acl'\n\nexport class SelectBuilder {\n\tprivate resolver: (value: SelectRow[]) => void = () => {\n\t\tthrow new Error('SelectBuilder: Resolver called too soon')\n\t}\n\tpublic readonly rows: Promise<SelectRow[]> = new Promise(resolve => (this.resolver = resolve))\n\n\tprivate queryWrapper: LimitByGroupWrapper | null = null\n\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderByBuilder: OrderByBuilder,\n\t\tprivate readonly metaHandler: MetaHandler,\n\t\tprivate qb: DbSelectBuilder<DbSelectBuilder.Result>,\n\t\tprivate readonly hydrator: SelectHydrator,\n\t\tprivate readonly fieldsVisitorFactory: FieldsVisitorFactory,\n\t\tprivate readonly selectHandlers: { [key: string]: SelectExecutionHandler<any> },\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t) {}\n\n\tpublic async execute(db: Client): Promise<SelectRow[]> {\n\t\tlet result: SelectRow[]\n\t\tif (this.queryWrapper) {\n\t\t\tresult = await this.queryWrapper.getResult(this.qb, db)\n\t\t} else {\n\t\t\tresult = await this.qb.getResult(db)\n\t\t}\n\t\tthis.resolver(result)\n\t\treturn result\n\t}\n\n\tpublic select(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\tpath: Path,\n\t\tgroupBy?: string,\n\t) {\n\t\tthis.selectInternal(mapper, entity, path, input)\n\t\tconst where = input.args.filter\n\t\tif (where) {\n\t\t\tthis.qb = this.whereBuilder.build(this.qb, entity, path, where, { relationPath: this.relationPath })\n\t\t}\n\t\tconst orderBy = input.args.orderBy || []\n\n\t\tif (groupBy) {\n\t\t\tconst groupByColumn = getColumnName(this.schema, entity, groupBy)\n\t\t\tthis.queryWrapper = new LimitByGroupWrapper(\n\t\t\t\t[path.alias, groupByColumn],\n\t\t\t\t(orderable, qb) => {\n\t\t\t\t\tif (orderBy.length > 0) {\n\t\t\t\t\t\t[qb, orderable] = this.orderByBuilder.build(qb, orderable, entity, this.pathFactory.create([]), orderBy)\n\t\t\t\t\t}\n\t\t\t\t\treturn [orderable, qb]\n\t\t\t\t},\n\t\t\t\tinput.args.offset,\n\t\t\t\tinput.args.limit,\n\t\t\t)\n\t\t} else {\n\t\t\tif (orderBy.length > 0) {\n\t\t\t\t[this.qb] = this.orderByBuilder.build(this.qb, null, entity, path, orderBy)\n\t\t\t}\n\t\t\tthis.qb = this.qb.limit(input.args.limit, input.args.offset)\n\t\t}\n\t}\n\n\tprivate selectInternal(mapper: Mapper, entity: Model.Entity, path: Path, input: ObjectNode) {\n\t\tif (!input.fields.find(it => it.name === entity.primary && it.alias === entity.primary)) {\n\t\t\tinput = input.withField(new FieldNode(entity.primary, entity.primary, {}))\n\t\t}\n\n\t\tconst fetchedPredicates = new Set()\n\t\tconst addPredicate = (predicate: Acl.Predicate): ColumnValueGetter<boolean> => {\n\t\t\tif (typeof predicate === 'boolean') {\n\t\t\t\treturn () => predicate\n\t\t\t}\n\t\t\tconst predicatePath = path.for('__predicate').for(predicate)\n\n\t\t\tif (!fetchedPredicates.has(predicate)) {\n\t\t\t\tconst relationContext = this.relationPath[this.relationPath.length - 1]\n\n\t\t\t\tconst primaryPredicate = this.predicateFactory.create(entity, Acl.Operation.read, undefined, relationContext)\n\t\t\t\tconst fieldPredicate = this.predicateFactory.buildPredicates(entity, [predicate], relationContext)\n\n\t\t\t\tthis.qb = this.whereBuilder.buildAdvanced(\n\t\t\t\t\tentity,\n\t\t\t\t\tpath.back(),\n\t\t\t\t\tfieldPredicate,\n\t\t\t\t\tapply => this.qb.select(expr =>\n\t\t\t\t\t\texpr.selectCondition(condition => {\n\t\t\t\t\t\t\tcondition = apply(condition)\n\t\t\t\t\t\t\tif (condition.isEmpty()) {\n\t\t\t\t\t\t\t\treturn condition.raw('true')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn condition\n\t\t\t\t\t\t}),\n\t\t\t\t\tpredicatePath.alias,\n\t\t\t\t\t),\n\t\t\t\t\t{ relationPath: this.relationPath, evaluatedPredicates: [primaryPredicate] },\n\t\t\t\t)\n\t\t\t\tfetchedPredicates.add(predicate)\n\t\t\t}\n\t\t\treturn row => row[predicatePath.alias] === true\n\t\t}\n\n\t\tfor (let field of input.fields) {\n\t\t\tconst fieldPath = path.for(field.alias)\n\t\t\tconst fieldProperty = (() => {\n\t\t\t\tif (field instanceof ObjectNode) {\n\t\t\t\t\treturn { objectNode: field }\n\t\t\t\t}\n\t\t\t\tif (field instanceof FieldNode) {\n\t\t\t\t\treturn { fieldNode: field }\n\t\t\t\t}\n\t\t\t\treturn assertNever(field)\n\t\t\t})()\n\n\n\t\t\tconst executionContext: SelectExecutionHandlerContext = {\n\t\t\t\tmapper,\n\t\t\t\trelationPath: this.relationPath,\n\t\t\t\taddData: async ({ field, dataProvider, defaultValue, predicate }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addPromise(fieldPath, () => null, Promise.resolve({}), defaultValue ?? null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tconst columnName = getColumnName(this.schema, entity, field)\n\t\t\t\t\tconst parentValuePath = path.for(field)\n\t\t\t\t\tlet ids = await this.getColumnValues(parentValuePath, columnName, predicateGetter)\n\n\t\t\t\t\tconst data = ids.length > 0 ? dataProvider(ids) : Promise.resolve({})\n\t\t\t\t\tthis.hydrator.addPromise(\n\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\trow => predicateGetter === null || predicateGetter(row) ? (row[parentValuePath.alias] as Value.PrimaryValue) : null,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tdefaultValue ?? null,\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddColumn: ({ path = fieldPath, predicate, query, valueGetter }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addColumn(path, () => null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tif (query) {\n\t\t\t\t\t\tthis.qb = query(this.qb)\n\t\t\t\t\t}\n\t\t\t\t\tthis.hydrator.addColumn(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tvalueGetter ?? (row => predicateGetter === null || predicateGetter(row) ? row[path.alias] : null),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddPredicate: addPredicate,\n\t\t\t\tpath: fieldPath,\n\t\t\t\tentity: entity,\n\t\t\t\t...fieldProperty,\n\t\t\t}\n\n\t\t\tif (field.name === '_meta') {\n\t\t\t\tthis.metaHandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Disregarding __typename field since it's automatically handled by apollo server\n\t\t\tif (field.name === '__typename') {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field.extensions.extensionKey) {\n\t\t\t\tconst handler = this.selectHandlers[field.extensions.extensionKey]\n\t\t\t\tif (!handler) {\n\t\t\t\t\tthrow new Error(`Handler for ${field.extensions.extensionKey} not found`)\n\t\t\t\t}\n\t\t\t\thandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst fieldVisitor = this.fieldsVisitorFactory.create(mapper, executionContext)\n\t\t\tacceptFieldVisitor(this.schema, entity, field.name, fieldVisitor)\n\t\t}\n\t}\n\n\tprivate async getColumnValues(columnPath: Path, columnName: string, predicateGetter: null | ColumnValueGetter<boolean>): Promise<Input.PrimaryValue[]> {\n\t\tthis.qb = this.qb.select([columnPath.back().alias, columnName], columnPath.alias)\n\t\tconst rows = await this.rows\n\t\tconst filteredRows = predicateGetter === null ? rows : rows.filter(predicateGetter)\n\t\tconst columnAlias = columnPath.alias\n\t\tconst ids = filteredRows.map((it): Input.PrimaryValue => it[columnAlias] as Input.PrimaryValue).filter(it => it !== null)\n\t\treturn Array.from(new Set(ids))\n\t}\n}\n"],"names":["field","path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectBuilder.ts"],"sourcesContent":["import { Acl, Input, Model, Value } from '@contember/schema'\nimport { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'\nimport { ColumnValueGetter, SelectHydrator, SelectRow } from './SelectHydrator'\nimport { Path, PathFactory } from './Path'\nimport { WhereBuilder } from './WhereBuilder'\nimport { Client, LimitByGroupWrapper, SelectBuilder as DbSelectBuilder } from '@contember/database'\nimport { OrderByBuilder } from './OrderByBuilder'\nimport { FieldsVisitorFactory } from './handlers'\nimport { SelectExecutionHandler, SelectExecutionHandlerContext } from './SelectExecutionHandler'\nimport { MetaHandler } from './handlers'\nimport { Mapper } from '../Mapper'\nimport { FieldNode, ObjectNode } from '../../inputProcessing'\nimport { assertNever } from '../../utils'\nimport { PredicateFactory } from '../../acl'\n\nexport class SelectBuilder {\n\tprivate resolver: (value: SelectRow[]) => void = () => {\n\t\tthrow new Error('SelectBuilder: Resolver called too soon')\n\t}\n\tpublic readonly rows: Promise<SelectRow[]> = new Promise(resolve => (this.resolver = resolve))\n\n\tprivate queryWrapper: LimitByGroupWrapper | null = null\n\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly orderByBuilder: OrderByBuilder,\n\t\tprivate readonly metaHandler: MetaHandler,\n\t\tprivate qb: DbSelectBuilder<DbSelectBuilder.Result>,\n\t\tprivate readonly hydrator: SelectHydrator,\n\t\tprivate readonly fieldsVisitorFactory: FieldsVisitorFactory,\n\t\tprivate readonly selectHandlers: { [key: string]: SelectExecutionHandler<any> },\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t) {}\n\n\tpublic async execute(db: Client): Promise<SelectRow[]> {\n\t\tlet result: SelectRow[]\n\t\tif (this.queryWrapper) {\n\t\t\tresult = await this.queryWrapper.getResult(this.qb, db)\n\t\t} else {\n\t\t\tresult = await this.qb.getResult(db)\n\t\t}\n\t\tthis.resolver(result)\n\t\treturn result\n\t}\n\n\tpublic select(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tinput: ObjectNode<Input.ListQueryInput>,\n\t\tpath: Path,\n\t\tgroupBy?: string,\n\t) {\n\t\tthis.selectInternal(mapper, entity, path, input)\n\t\tconst where = input.args.filter\n\t\tif (where) {\n\t\t\tthis.qb = this.whereBuilder.build(this.qb, entity, path, where, { relationPath: this.relationPath })\n\t\t}\n\t\tconst orderBy = input.args.orderBy || []\n\n\t\tif (groupBy) {\n\t\t\tconst groupByColumn = getColumnName(this.schema, entity, groupBy)\n\t\t\tthis.queryWrapper = new LimitByGroupWrapper(\n\t\t\t\t[path.alias, groupByColumn],\n\t\t\t\t(orderable, qb) => {\n\t\t\t\t\tif (orderBy.length > 0) {\n\t\t\t\t\t\t[qb, orderable] = this.orderByBuilder.build(qb, orderable, entity, this.pathFactory.create([]), orderBy)\n\t\t\t\t\t}\n\t\t\t\t\treturn [orderable, qb]\n\t\t\t\t},\n\t\t\t\tinput.args.offset,\n\t\t\t\tinput.args.limit,\n\t\t\t)\n\t\t} else {\n\t\t\tif (orderBy.length > 0) {\n\t\t\t\t[this.qb] = this.orderByBuilder.build(this.qb, null, entity, path, orderBy)\n\t\t\t}\n\t\t\tthis.qb = this.qb.limit(input.args.limit, input.args.offset)\n\t\t}\n\t}\n\n\tprivate selectInternal(mapper: Mapper, entity: Model.Entity, path: Path, input: ObjectNode) {\n\t\tif (!input.fields.find(it => it.name === entity.primary && it.alias === entity.primary)) {\n\t\t\tinput = input.withField(new FieldNode(entity.primary, entity.primary, {}))\n\t\t}\n\n\t\tconst fetchedPredicates = new Set()\n\t\tconst addPredicate = (predicate: Acl.Predicate): ColumnValueGetter<boolean> => {\n\t\t\tif (typeof predicate === 'boolean') {\n\t\t\t\treturn () => predicate\n\t\t\t}\n\t\t\tconst predicatePath = path.for('__predicate').for(predicate)\n\n\t\t\tif (!fetchedPredicates.has(predicate)) {\n\t\t\t\tconst relationContext = this.relationPath[this.relationPath.length - 1]\n\n\t\t\t\tconst primaryPredicate = this.predicateFactory.create(entity, Acl.Operation.read, undefined, relationContext)\n\t\t\t\tconst fieldPredicate = this.predicateFactory.buildPredicates(entity, [predicate], relationContext)\n\n\t\t\t\tthis.qb = this.whereBuilder.buildAdvanced(\n\t\t\t\t\tentity,\n\t\t\t\t\tpath.back(),\n\t\t\t\t\tfieldPredicate,\n\t\t\t\t\tapply => this.qb.select(expr =>\n\t\t\t\t\t\texpr.selectCondition(condition => {\n\t\t\t\t\t\t\tcondition = apply(condition)\n\t\t\t\t\t\t\tif (condition.isEmpty()) {\n\t\t\t\t\t\t\t\treturn condition.raw('true')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn condition\n\t\t\t\t\t\t}),\n\t\t\t\t\tpredicatePath.alias,\n\t\t\t\t\t),\n\t\t\t\t\t{ relationPath: this.relationPath, evaluatedPredicates: [primaryPredicate] },\n\t\t\t\t)\n\t\t\t\tfetchedPredicates.add(predicate)\n\t\t\t}\n\t\t\treturn row => row[predicatePath.alias] === true\n\t\t}\n\n\t\tfor (let field of input.fields) {\n\t\t\tconst fieldPath = path.for(field.alias)\n\t\t\tconst fieldProperty = (() => {\n\t\t\t\tif (field instanceof ObjectNode) {\n\t\t\t\t\treturn { objectNode: field }\n\t\t\t\t}\n\t\t\t\tif (field instanceof FieldNode) {\n\t\t\t\t\treturn { fieldNode: field }\n\t\t\t\t}\n\t\t\t\treturn assertNever(field)\n\t\t\t})()\n\n\n\t\t\tconst executionContext: SelectExecutionHandlerContext = {\n\t\t\t\tmapper,\n\t\t\t\trelationPath: this.relationPath,\n\t\t\t\taddData: async ({ field, dataProvider, defaultValue, predicate }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addPromise(fieldPath, () => null, Promise.resolve({}), defaultValue ?? null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tconst columnName = getColumnName(this.schema, entity, field)\n\t\t\t\t\tconst parentValuePath = path.for(field)\n\t\t\t\t\tlet ids = await this.getColumnValues(parentValuePath, columnName, predicateGetter)\n\n\t\t\t\t\tconst data = ids.length > 0 ? dataProvider(ids) : Promise.resolve({})\n\t\t\t\t\tthis.hydrator.addPromise(\n\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\trow => predicateGetter === null || predicateGetter(row) ? (row[parentValuePath.alias] as Value.PrimaryValue) : null,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tdefaultValue ?? null,\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddColumn: ({ path = fieldPath, predicate, query, valueGetter }) => {\n\t\t\t\t\tif (predicate === false) {\n\t\t\t\t\t\tthis.hydrator.addColumn(path, () => null)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null\n\t\t\t\t\tif (query) {\n\t\t\t\t\t\tthis.qb = query(this.qb)\n\t\t\t\t\t}\n\t\t\t\t\tthis.hydrator.addColumn(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tvalueGetter ?? (row => predicateGetter === null || predicateGetter(row) ? row[path.alias] : null),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\taddPredicate: addPredicate,\n\t\t\t\tpath: fieldPath,\n\t\t\t\tentity: entity,\n\t\t\t\t...fieldProperty,\n\t\t\t}\n\n\t\t\tif (field.name === '_meta') {\n\t\t\t\tthis.metaHandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Disregarding __typename field since it's automatically handled by apollo server\n\t\t\tif (field.name === '__typename') {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field.extensions.extensionKey) {\n\t\t\t\tconst handler = this.selectHandlers[field.extensions.extensionKey]\n\t\t\t\tif (!handler) {\n\t\t\t\t\tthrow new Error(`Handler for ${field.extensions.extensionKey} not found`)\n\t\t\t\t}\n\t\t\t\thandler.process(executionContext)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst fieldVisitor = this.fieldsVisitorFactory.create(mapper, executionContext)\n\t\t\tacceptFieldVisitor(this.schema, entity, field.name, fieldVisitor)\n\t\t}\n\t}\n\n\tprivate async getColumnValues(columnPath: Path, columnName: string, predicateGetter: null | ColumnValueGetter<boolean>): Promise<Input.PrimaryValue[]> {\n\t\tthis.qb = this.qb.select([columnPath.back().alias, columnName], columnPath.alias)\n\t\tconst rows = await this.rows\n\t\tconst filteredRows = predicateGetter === null ? rows : rows.filter(predicateGetter)\n\t\tconst columnAlias = columnPath.alias\n\t\tconst ids = filteredRows.map((it): Input.PrimaryValue => it[columnAlias] as Input.PrimaryValue).filter(it => it !== null)\n\t\treturn Array.from(new Set(ids))\n\t}\n}\n"],"names":["field","path"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectHydrator.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectHydrator.ts"],"sourcesContent":["import { Path } from './Path'\nimport { Value } from '@contember/schema'\nimport { getFulfilledValues, getRejections } from '../../utils'\nimport { logger } from '@contember/logger'\n\ntype DataPromises = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: Promise<SelectNestedData>\n\tdefaultValue: SelectNestedDefaultValue\n}\n\ntype ResolvedData = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: SelectNestedData\n\tdefaultValue: SelectNestedDefaultValue\n}\n\nexport type ColumnValueGetter<T extends Value.FieldValue = Value.FieldValue> = (row: SelectRow) => T\n\ntype Column = {\n\tpath: Path\n\tgetValue: ColumnValueGetter\n}\n\nexport class SelectHydrator {\n\tprivate columns: Column[] = []\n\tprivate promises: DataPromises[] = []\n\n\tpublic addColumn(path: Path, getValue: ColumnValueGetter) {\n\t\tthis.columns.push({ path, getValue })\n\t}\n\n\tpublic addPromise(\n\t\tpath: Path,\n\t\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>,\n\t\tdata: Promise<SelectNestedData>,\n\t\tdefaultValue: SelectNestedDefaultValue,\n\t) {\n\t\tthis.promises.push({ path, getParentValue, data, defaultValue })\n\t}\n\n\tpublic async hydrateGroups(rows: SelectRow[], groupBy: string): Promise<SelectGroupedObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tconst result: SelectGroupedObjects = {}\n\t\tfor (let row of rows) {\n\t\t\tconst key = row[groupBy] as Value.PrimaryValue\n\t\t\tif (!result[key]) {\n\t\t\t\tresult[key] = []\n\t\t\t}\n\t\t\tresult[key].push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic async hydrateAll(rows: SelectRow[]): Promise<SelectResultObject[]>\n\tpublic async hydrateAll(rows: SelectRow[], indexBy: string): Promise<SelectIndexedResultObjects>\n\n\tpublic async hydrateAll(\n\t\trows: SelectRow[],\n\t\tindexBy?: string,\n\t): Promise<SelectResultObject[] | SelectIndexedResultObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tif (indexBy) {\n\t\t\tconst result: SelectIndexedResultObjects = {}\n\t\t\tfor (let row of rows) {\n\t\t\t\tresult[row[indexBy] as Value.PrimaryValue] = this.hydrateRow(row, resolved)\n\t\t\t}\n\t\t\treturn result\n\t\t}\n\t\tconst result: SelectResultObject[] = []\n\t\tfor (const row of rows) {\n\t\t\tresult.push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate hydrateRow(row: SelectRow, resolvedData: ResolvedData[]): SelectResultObject {\n\t\tconst result: SelectResultObject = {}\n\n\t\tfor (let columnPath of this.columns) {\n\t\t\tconst path = [...columnPath.path.path]\n\t\t\tconst last: string = path.pop() as string\n\t\t\tconst currentObject = path.reduce<any>((obj, part) => (obj[part] = obj[part] || {}), result)\n\n\t\t\tcurrentObject[last] = this.formatValue(columnPath.getValue(row))\n\t\t}\n\n\t\tfor (let { path, getParentValue, data, defaultValue } of resolvedData) {\n\t\t\tconst pathTmp = [...path.path]\n\t\t\tconst last = pathTmp.pop() as string\n\t\t\tconst currentObject = pathTmp.reduce<any>((obj, part) => (obj && obj[part]) || undefined, result)\n\t\t\tconst parentValue = getParentValue(row)\n\t\t\tif (currentObject) {\n\t\t\t\tcurrentObject[last] = (parentValue ? data[parentValue] : undefined) || defaultValue\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate async resolveDataPromises(): Promise<ResolvedData[]> {\n\t\tconst results = await Promise.allSettled(this.promises.map(async (it): Promise<ResolvedData> => ({\n\t\t\tdefaultValue: it.defaultValue,\n\t\t\tgetParentValue: it.getParentValue,\n\t\t\tpath: it.path,\n\t\t\tdata: await it.data,\n\t\t})))\n\t\tconst failures = getRejections(results)\n\t\tif (failures.length > 0) {\n\t\t\tif (failures.length > 1) {\n\t\t\t\tfailures.slice(1).map(e => logger.error(e, { loc: 'SelectHydrator' }))\n\t\t\t}\n\t\t\tthrow failures[0]\n\t\t}\n\n\t\treturn getFulfilledValues(results)\n\t}\n\n\tprivate formatValue(value: any) {\n\t\tif (value instanceof Date) {\n\t\t\treturn value.toISOString()\n\t\t}\n\t\treturn value\n\t}\n}\n\nexport type SelectRow = { [key: string]: Value.FieldValue }\nexport type SelectResultObject = Value.Object\nexport type SelectIndexedResultObjects = { [key: string]: SelectResultObject }\nexport type SelectGroupedObjects = { [groupingKey: string]: SelectResultObject[] }\nexport type SelectNestedData = SelectGroupedObjects | SelectIndexedResultObjects\nexport type SelectNestedDefaultValue = [] | null\n"],"names":["result","getRejections","logger","getFulfilledValues"],"mappings":";;;;;;;;AA0BO,MAAM,eAAe;AAAA,EAArB,cAAA;AACN,kBAAA,MAAQ,WAAoB,
|
|
1
|
+
{"version":3,"file":"SelectHydrator.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectHydrator.ts"],"sourcesContent":["import { Path } from './Path'\nimport { Value } from '@contember/schema'\nimport { getFulfilledValues, getRejections } from '../../utils'\nimport { logger } from '@contember/logger'\n\ntype DataPromises = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: Promise<SelectNestedData>\n\tdefaultValue: SelectNestedDefaultValue\n}\n\ntype ResolvedData = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: SelectNestedData\n\tdefaultValue: SelectNestedDefaultValue\n}\n\nexport type ColumnValueGetter<T extends Value.FieldValue = Value.FieldValue> = (row: SelectRow) => T\n\ntype Column = {\n\tpath: Path\n\tgetValue: ColumnValueGetter\n}\n\nexport class SelectHydrator {\n\tprivate columns: Column[] = []\n\tprivate promises: DataPromises[] = []\n\n\tpublic addColumn(path: Path, getValue: ColumnValueGetter) {\n\t\tthis.columns.push({ path, getValue })\n\t}\n\n\tpublic addPromise(\n\t\tpath: Path,\n\t\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>,\n\t\tdata: Promise<SelectNestedData>,\n\t\tdefaultValue: SelectNestedDefaultValue,\n\t) {\n\t\tthis.promises.push({ path, getParentValue, data, defaultValue })\n\t}\n\n\tpublic async hydrateGroups(rows: SelectRow[], groupBy: string): Promise<SelectGroupedObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tconst result: SelectGroupedObjects = {}\n\t\tfor (let row of rows) {\n\t\t\tconst key = row[groupBy] as Value.PrimaryValue\n\t\t\tif (!result[key]) {\n\t\t\t\tresult[key] = []\n\t\t\t}\n\t\t\tresult[key].push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic async hydrateAll(rows: SelectRow[]): Promise<SelectResultObject[]>\n\tpublic async hydrateAll(rows: SelectRow[], indexBy: string): Promise<SelectIndexedResultObjects>\n\n\tpublic async hydrateAll(\n\t\trows: SelectRow[],\n\t\tindexBy?: string,\n\t): Promise<SelectResultObject[] | SelectIndexedResultObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tif (indexBy) {\n\t\t\tconst result: SelectIndexedResultObjects = {}\n\t\t\tfor (let row of rows) {\n\t\t\t\tresult[row[indexBy] as Value.PrimaryValue] = this.hydrateRow(row, resolved)\n\t\t\t}\n\t\t\treturn result\n\t\t}\n\t\tconst result: SelectResultObject[] = []\n\t\tfor (const row of rows) {\n\t\t\tresult.push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate hydrateRow(row: SelectRow, resolvedData: ResolvedData[]): SelectResultObject {\n\t\tconst result: SelectResultObject = {}\n\n\t\tfor (let columnPath of this.columns) {\n\t\t\tconst path = [...columnPath.path.path]\n\t\t\tconst last: string = path.pop() as string\n\t\t\tconst currentObject = path.reduce<any>((obj, part) => (obj[part] = obj[part] || {}), result)\n\n\t\t\tcurrentObject[last] = this.formatValue(columnPath.getValue(row))\n\t\t}\n\n\t\tfor (let { path, getParentValue, data, defaultValue } of resolvedData) {\n\t\t\tconst pathTmp = [...path.path]\n\t\t\tconst last = pathTmp.pop() as string\n\t\t\tconst currentObject = pathTmp.reduce<any>((obj, part) => (obj && obj[part]) || undefined, result)\n\t\t\tconst parentValue = getParentValue(row)\n\t\t\tif (currentObject) {\n\t\t\t\tcurrentObject[last] = (parentValue ? data[parentValue] : undefined) || defaultValue\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate async resolveDataPromises(): Promise<ResolvedData[]> {\n\t\tconst results = await Promise.allSettled(this.promises.map(async (it): Promise<ResolvedData> => ({\n\t\t\tdefaultValue: it.defaultValue,\n\t\t\tgetParentValue: it.getParentValue,\n\t\t\tpath: it.path,\n\t\t\tdata: await it.data,\n\t\t})))\n\t\tconst failures = getRejections(results)\n\t\tif (failures.length > 0) {\n\t\t\tif (failures.length > 1) {\n\t\t\t\tfailures.slice(1).map(e => logger.error(e, { loc: 'SelectHydrator' }))\n\t\t\t}\n\t\t\tthrow failures[0]\n\t\t}\n\n\t\treturn getFulfilledValues(results)\n\t}\n\n\tprivate formatValue(value: any) {\n\t\tif (value instanceof Date) {\n\t\t\treturn value.toISOString()\n\t\t}\n\t\treturn value\n\t}\n}\n\nexport type SelectRow = { [key: string]: Value.FieldValue }\nexport type SelectResultObject = Value.Object\nexport type SelectIndexedResultObjects = { [key: string]: SelectResultObject }\nexport type SelectGroupedObjects = { [groupingKey: string]: SelectResultObject[] }\nexport type SelectNestedData = SelectGroupedObjects | SelectIndexedResultObjects\nexport type SelectNestedDefaultValue = [] | null\n"],"names":["result","getRejections","logger","getFulfilledValues"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectHydrator.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectHydrator.ts"],"sourcesContent":["import { Path } from './Path'\nimport { Value } from '@contember/schema'\nimport { getFulfilledValues, getRejections } from '../../utils'\nimport { logger } from '@contember/logger'\n\ntype DataPromises = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: Promise<SelectNestedData>\n\tdefaultValue: SelectNestedDefaultValue\n}\n\ntype ResolvedData = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: SelectNestedData\n\tdefaultValue: SelectNestedDefaultValue\n}\n\nexport type ColumnValueGetter<T extends Value.FieldValue = Value.FieldValue> = (row: SelectRow) => T\n\ntype Column = {\n\tpath: Path\n\tgetValue: ColumnValueGetter\n}\n\nexport class SelectHydrator {\n\tprivate columns: Column[] = []\n\tprivate promises: DataPromises[] = []\n\n\tpublic addColumn(path: Path, getValue: ColumnValueGetter) {\n\t\tthis.columns.push({ path, getValue })\n\t}\n\n\tpublic addPromise(\n\t\tpath: Path,\n\t\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>,\n\t\tdata: Promise<SelectNestedData>,\n\t\tdefaultValue: SelectNestedDefaultValue,\n\t) {\n\t\tthis.promises.push({ path, getParentValue, data, defaultValue })\n\t}\n\n\tpublic async hydrateGroups(rows: SelectRow[], groupBy: string): Promise<SelectGroupedObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tconst result: SelectGroupedObjects = {}\n\t\tfor (let row of rows) {\n\t\t\tconst key = row[groupBy] as Value.PrimaryValue\n\t\t\tif (!result[key]) {\n\t\t\t\tresult[key] = []\n\t\t\t}\n\t\t\tresult[key].push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic async hydrateAll(rows: SelectRow[]): Promise<SelectResultObject[]>\n\tpublic async hydrateAll(rows: SelectRow[], indexBy: string): Promise<SelectIndexedResultObjects>\n\n\tpublic async hydrateAll(\n\t\trows: SelectRow[],\n\t\tindexBy?: string,\n\t): Promise<SelectResultObject[] | SelectIndexedResultObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tif (indexBy) {\n\t\t\tconst result: SelectIndexedResultObjects = {}\n\t\t\tfor (let row of rows) {\n\t\t\t\tresult[row[indexBy] as Value.PrimaryValue] = this.hydrateRow(row, resolved)\n\t\t\t}\n\t\t\treturn result\n\t\t}\n\t\tconst result: SelectResultObject[] = []\n\t\tfor (const row of rows) {\n\t\t\tresult.push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate hydrateRow(row: SelectRow, resolvedData: ResolvedData[]): SelectResultObject {\n\t\tconst result: SelectResultObject = {}\n\n\t\tfor (let columnPath of this.columns) {\n\t\t\tconst path = [...columnPath.path.path]\n\t\t\tconst last: string = path.pop() as string\n\t\t\tconst currentObject = path.reduce<any>((obj, part) => (obj[part] = obj[part] || {}), result)\n\n\t\t\tcurrentObject[last] = this.formatValue(columnPath.getValue(row))\n\t\t}\n\n\t\tfor (let { path, getParentValue, data, defaultValue } of resolvedData) {\n\t\t\tconst pathTmp = [...path.path]\n\t\t\tconst last = pathTmp.pop() as string\n\t\t\tconst currentObject = pathTmp.reduce<any>((obj, part) => (obj && obj[part]) || undefined, result)\n\t\t\tconst parentValue = getParentValue(row)\n\t\t\tif (currentObject) {\n\t\t\t\tcurrentObject[last] = (parentValue ? data[parentValue] : undefined) || defaultValue\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate async resolveDataPromises(): Promise<ResolvedData[]> {\n\t\tconst results = await Promise.allSettled(this.promises.map(async (it): Promise<ResolvedData> => ({\n\t\t\tdefaultValue: it.defaultValue,\n\t\t\tgetParentValue: it.getParentValue,\n\t\t\tpath: it.path,\n\t\t\tdata: await it.data,\n\t\t})))\n\t\tconst failures = getRejections(results)\n\t\tif (failures.length > 0) {\n\t\t\tif (failures.length > 1) {\n\t\t\t\tfailures.slice(1).map(e => logger.error(e, { loc: 'SelectHydrator' }))\n\t\t\t}\n\t\t\tthrow failures[0]\n\t\t}\n\n\t\treturn getFulfilledValues(results)\n\t}\n\n\tprivate formatValue(value: any) {\n\t\tif (value instanceof Date) {\n\t\t\treturn value.toISOString()\n\t\t}\n\t\treturn value\n\t}\n}\n\nexport type SelectRow = { [key: string]: Value.FieldValue }\nexport type SelectResultObject = Value.Object\nexport type SelectIndexedResultObjects = { [key: string]: SelectResultObject }\nexport type SelectGroupedObjects = { [groupingKey: string]: SelectResultObject[] }\nexport type SelectNestedData = SelectGroupedObjects | SelectIndexedResultObjects\nexport type SelectNestedDefaultValue = [] | null\n"],"names":["result"],"mappings":";;;;;;AA0BO,MAAM,eAAe;AAAA,EAArB,cAAA;AACN,kBAAA,MAAQ,WAAoB,
|
|
1
|
+
{"version":3,"file":"SelectHydrator.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/SelectHydrator.ts"],"sourcesContent":["import { Path } from './Path'\nimport { Value } from '@contember/schema'\nimport { getFulfilledValues, getRejections } from '../../utils'\nimport { logger } from '@contember/logger'\n\ntype DataPromises = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: Promise<SelectNestedData>\n\tdefaultValue: SelectNestedDefaultValue\n}\n\ntype ResolvedData = {\n\tpath: Path\n\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>\n\tdata: SelectNestedData\n\tdefaultValue: SelectNestedDefaultValue\n}\n\nexport type ColumnValueGetter<T extends Value.FieldValue = Value.FieldValue> = (row: SelectRow) => T\n\ntype Column = {\n\tpath: Path\n\tgetValue: ColumnValueGetter\n}\n\nexport class SelectHydrator {\n\tprivate columns: Column[] = []\n\tprivate promises: DataPromises[] = []\n\n\tpublic addColumn(path: Path, getValue: ColumnValueGetter) {\n\t\tthis.columns.push({ path, getValue })\n\t}\n\n\tpublic addPromise(\n\t\tpath: Path,\n\t\tgetParentValue: ColumnValueGetter<Value.PrimaryValue | null>,\n\t\tdata: Promise<SelectNestedData>,\n\t\tdefaultValue: SelectNestedDefaultValue,\n\t) {\n\t\tthis.promises.push({ path, getParentValue, data, defaultValue })\n\t}\n\n\tpublic async hydrateGroups(rows: SelectRow[], groupBy: string): Promise<SelectGroupedObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tconst result: SelectGroupedObjects = {}\n\t\tfor (let row of rows) {\n\t\t\tconst key = row[groupBy] as Value.PrimaryValue\n\t\t\tif (!result[key]) {\n\t\t\t\tresult[key] = []\n\t\t\t}\n\t\t\tresult[key].push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic async hydrateAll(rows: SelectRow[]): Promise<SelectResultObject[]>\n\tpublic async hydrateAll(rows: SelectRow[], indexBy: string): Promise<SelectIndexedResultObjects>\n\n\tpublic async hydrateAll(\n\t\trows: SelectRow[],\n\t\tindexBy?: string,\n\t): Promise<SelectResultObject[] | SelectIndexedResultObjects> {\n\t\tconst resolved = await this.resolveDataPromises()\n\t\tif (indexBy) {\n\t\t\tconst result: SelectIndexedResultObjects = {}\n\t\t\tfor (let row of rows) {\n\t\t\t\tresult[row[indexBy] as Value.PrimaryValue] = this.hydrateRow(row, resolved)\n\t\t\t}\n\t\t\treturn result\n\t\t}\n\t\tconst result: SelectResultObject[] = []\n\t\tfor (const row of rows) {\n\t\t\tresult.push(this.hydrateRow(row, resolved))\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate hydrateRow(row: SelectRow, resolvedData: ResolvedData[]): SelectResultObject {\n\t\tconst result: SelectResultObject = {}\n\n\t\tfor (let columnPath of this.columns) {\n\t\t\tconst path = [...columnPath.path.path]\n\t\t\tconst last: string = path.pop() as string\n\t\t\tconst currentObject = path.reduce<any>((obj, part) => (obj[part] = obj[part] || {}), result)\n\n\t\t\tcurrentObject[last] = this.formatValue(columnPath.getValue(row))\n\t\t}\n\n\t\tfor (let { path, getParentValue, data, defaultValue } of resolvedData) {\n\t\t\tconst pathTmp = [...path.path]\n\t\t\tconst last = pathTmp.pop() as string\n\t\t\tconst currentObject = pathTmp.reduce<any>((obj, part) => (obj && obj[part]) || undefined, result)\n\t\t\tconst parentValue = getParentValue(row)\n\t\t\tif (currentObject) {\n\t\t\t\tcurrentObject[last] = (parentValue ? data[parentValue] : undefined) || defaultValue\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n\tprivate async resolveDataPromises(): Promise<ResolvedData[]> {\n\t\tconst results = await Promise.allSettled(this.promises.map(async (it): Promise<ResolvedData> => ({\n\t\t\tdefaultValue: it.defaultValue,\n\t\t\tgetParentValue: it.getParentValue,\n\t\t\tpath: it.path,\n\t\t\tdata: await it.data,\n\t\t})))\n\t\tconst failures = getRejections(results)\n\t\tif (failures.length > 0) {\n\t\t\tif (failures.length > 1) {\n\t\t\t\tfailures.slice(1).map(e => logger.error(e, { loc: 'SelectHydrator' }))\n\t\t\t}\n\t\t\tthrow failures[0]\n\t\t}\n\n\t\treturn getFulfilledValues(results)\n\t}\n\n\tprivate formatValue(value: any) {\n\t\tif (value instanceof Date) {\n\t\t\treturn value.toISOString()\n\t\t}\n\t\treturn value\n\t}\n}\n\nexport type SelectRow = { [key: string]: Value.FieldValue }\nexport type SelectResultObject = Value.Object\nexport type SelectIndexedResultObjects = { [key: string]: SelectResultObject }\nexport type SelectGroupedObjects = { [groupingKey: string]: SelectResultObject[] }\nexport type SelectNestedData = SelectGroupedObjects | SelectIndexedResultObjects\nexport type SelectNestedDefaultValue = [] | null\n"],"names":["result"],"mappings":";;;;;;AA0BO,MAAM,eAAe;AAAA,EAArB,cAAA;AACN,kBAAA,MAAQ,WAAoB,EAAC;AAC7B,kBAAA,MAAQ,YAA2B,EAAC;AAAA,EAAA;AAAA,EAE7B,UAAU,MAAY,UAA6B;AACzD,SAAK,QAAQ,KAAK,EAAE,MAAM,UAAU;AAAA,EAAA;AAAA,EAG9B,WACN,MACA,gBACA,MACA,cACC;AACD,SAAK,SAAS,KAAK,EAAE,MAAM,gBAAgB,MAAM,cAAc;AAAA,EAAA;AAAA,EAGhE,MAAa,cAAc,MAAmB,SAAgD;AACvF,UAAA,WAAW,MAAM,KAAK,oBAAoB;AAChD,UAAM,SAA+B,CAAC;AACtC,aAAS,OAAO,MAAM;AACf,YAAA,MAAM,IAAI,OAAO;AACnB,UAAA,CAAC,OAAO,GAAG,GAAG;AACV,eAAA,GAAG,IAAI,CAAC;AAAA,MAAA;AAEhB,aAAO,GAAG,EAAE,KAAK,KAAK,WAAW,KAAK,QAAQ,CAAC;AAAA,IAAA;AAEzC,WAAA;AAAA,EAAA;AAAA,EAMR,MAAa,WACZ,MACA,SAC6D;AACvD,UAAA,WAAW,MAAM,KAAK,oBAAoB;AAChD,QAAI,SAAS;AACZ,YAAMA,UAAqC,CAAC;AAC5C,eAAS,OAAO,MAAM;AACrBA,gBAAO,IAAI,OAAO,CAAuB,IAAI,KAAK,WAAW,KAAK,QAAQ;AAAA,MAAA;AAEpEA,aAAAA;AAAAA,IAAA;AAER,UAAM,SAA+B,CAAC;AACtC,eAAW,OAAO,MAAM;AACvB,aAAO,KAAK,KAAK,WAAW,KAAK,QAAQ,CAAC;AAAA,IAAA;AAEpC,WAAA;AAAA,EAAA;AAAA,EAGA,WAAW,KAAgB,cAAkD;AACpF,UAAM,SAA6B,CAAC;AAE3B,aAAA,cAAc,KAAK,SAAS;AACpC,YAAM,OAAO,CAAC,GAAG,WAAW,KAAK,IAAI;AAC/B,YAAA,OAAe,KAAK,IAAI;AAC9B,YAAM,gBAAgB,KAAK,OAAY,CAAC,KAAK,SAAU,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,CAAA,GAAK,MAAM;AAE3F,oBAAc,IAAI,IAAI,KAAK,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,IAAA;AAGhE,aAAS,EAAE,MAAM,gBAAgB,MAAM,kBAAkB,cAAc;AACtE,YAAM,UAAU,CAAC,GAAG,KAAK,IAAI;AACvB,YAAA,OAAO,QAAQ,IAAI;AACnB,YAAA,gBAAgB,QAAQ,OAAY,CAAC,KAAK,SAAU,OAAO,IAAI,IAAI,KAAM,QAAW,MAAM;AAC1F,YAAA,cAAc,eAAe,GAAG;AACtC,UAAI,eAAe;AAClB,sBAAc,IAAI,KAAK,cAAc,KAAK,WAAW,IAAI,WAAc;AAAA,MAAA;AAAA,IACxE;AAGM,WAAA;AAAA,EAAA;AAAA,EAGR,MAAc,sBAA+C;AACtD,UAAA,UAAU,MAAM,QAAQ,WAAW,KAAK,SAAS,IAAI,OAAO,QAA+B;AAAA,MAChG,cAAc,GAAG;AAAA,MACjB,gBAAgB,GAAG;AAAA,MACnB,MAAM,GAAG;AAAA,MACT,MAAM,MAAM,GAAG;AAAA,MACd,CAAC;AACG,UAAA,WAAW,cAAc,OAAO;AAClC,QAAA,SAAS,SAAS,GAAG;AACpB,UAAA,SAAS,SAAS,GAAG;AACxB,iBAAS,MAAM,CAAC,EAAE,IAAI,CAAK,MAAA,OAAO,MAAM,GAAG,EAAE,KAAK,iBAAkB,CAAA,CAAC;AAAA,MAAA;AAEtE,YAAM,SAAS,CAAC;AAAA,IAAA;AAGjB,WAAO,mBAAmB,OAAO;AAAA,EAAA;AAAA,EAG1B,YAAY,OAAY;AAC/B,QAAI,iBAAiB,MAAM;AAC1B,aAAO,MAAM,YAAY;AAAA,IAAA;AAEnB,WAAA;AAAA,EAAA;AAET;"}
|