@contember/engine-content-api 1.2.0-alpha.1 → 1.2.0-alpha.12
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/src/acl/EvaluatedPredicateReplacer.d.ts +9 -0
- package/dist/src/acl/EvaluatedPredicateReplacer.d.ts.map +1 -0
- package/dist/src/acl/EvaluatedPredicateReplacer.js +31 -0
- package/dist/src/acl/EvaluatedPredicateReplacer.js.map +1 -0
- package/dist/src/acl/PermissionFactory.d.ts.map +1 -1
- package/dist/src/acl/PermissionFactory.js +15 -11
- package/dist/src/acl/PermissionFactory.js.map +1 -1
- package/dist/src/acl/PredicateFactory.d.ts +4 -2
- package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
- package/dist/src/acl/PredicateFactory.js +17 -6
- package/dist/src/acl/PredicateFactory.js.map +1 -1
- package/dist/src/acl/PredicatesInjector.d.ts +1 -1
- package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
- package/dist/src/acl/PredicatesInjector.js +16 -19
- package/dist/src/acl/PredicatesInjector.js.map +1 -1
- package/dist/src/acl/VariableInjector.d.ts +0 -1
- package/dist/src/acl/VariableInjector.d.ts.map +1 -1
- package/dist/src/acl/VariableInjector.js +4 -14
- package/dist/src/acl/VariableInjector.js.map +1 -1
- package/dist/src/acl/VariableUtils.d.ts +2 -13
- package/dist/src/acl/VariableUtils.d.ts.map +1 -1
- package/dist/src/acl/VariableUtils.js +5 -16
- package/dist/src/acl/VariableUtils.js.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +14 -15
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +29 -20
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +2 -2
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +29 -20
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
- package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
- package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
- package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
- package/dist/src/input-validation/EntityRulesResolver.js +7 -7
- package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
- package/dist/src/input-validation/QueryAstFactory.js +1 -1
- package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
- package/dist/src/input-validation/ValidationContext.d.ts +2 -2
- package/dist/src/input-validation/ValidationContext.d.ts.map +1 -1
- package/dist/src/input-validation/ValidationContext.js.map +1 -1
- package/dist/src/input-validation/ValidationDataSelector.d.ts.map +1 -1
- package/dist/src/input-validation/ValidationDataSelector.js +1 -1
- package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
- package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
- package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
- package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
- package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
- package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
- package/dist/src/inputProcessing/index.d.ts +0 -1
- package/dist/src/inputProcessing/index.d.ts.map +1 -1
- package/dist/src/inputProcessing/index.js +0 -1
- package/dist/src/inputProcessing/index.js.map +1 -1
- package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
- package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
- package/dist/src/introspection/content-schema.types.d.ts +19 -223
- package/dist/src/introspection/content-schema.types.d.ts.map +1 -1
- package/dist/src/introspection/content-schema.types.js +2 -2
- package/dist/src/introspection/content-schema.types.js.map +1 -1
- package/dist/src/mapper/Mapper.d.ts +6 -6
- package/dist/src/mapper/Mapper.d.ts.map +1 -1
- package/dist/src/mapper/Mapper.js +28 -23
- package/dist/src/mapper/Mapper.js.map +1 -1
- package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
- package/dist/src/mapper/MapperContainer.js +7 -4
- package/dist/src/mapper/MapperContainer.js.map +1 -1
- package/dist/src/mapper/delete/DeleteExecutor.js +3 -3
- package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
- package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
- package/dist/src/mapper/select/JoinVisitor.js +6 -6
- package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
- package/dist/src/mapper/select/RelationFetcher.d.ts +32 -5
- package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
- package/dist/src/mapper/select/RelationFetcher.js +37 -15
- package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts +2 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.js +4 -2
- package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
- package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
- package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectExecutionHandler.d.ts +1 -0
- package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.d.ts +8 -3
- package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.js +71 -25
- package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +9 -8
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.js +45 -24
- package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts +5 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +39 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +15 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js +118 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +6 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.js +28 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -0
- package/dist/src/mapper/select/optimizer/helpers.d.ts +10 -0
- package/dist/src/mapper/select/optimizer/helpers.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/helpers.js +72 -0
- package/dist/src/mapper/select/optimizer/helpers.js.map +1 -0
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
- package/dist/src/mapper/update/UpdateBuilder.js +3 -3
- package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
- package/dist/src/resolvers/GraphQlQueryAstFactory.js +2 -2
- package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
- package/dist/src/resolvers/MutationResolver.js +15 -15
- package/dist/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/src/resolvers/ReadHelpers.js +10 -10
- package/dist/src/resolvers/ReadHelpers.js.map +1 -1
- package/dist/src/resolvers/ReadResolver.js +2 -2
- package/dist/src/resolvers/ReadResolver.js.map +1 -1
- package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
- package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
- package/dist/src/schema/FieldAccessVisitor.js +2 -2
- package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
- package/dist/src/schema/MutationProvider.js +4 -4
- package/dist/src/schema/MutationProvider.js.map +1 -1
- package/dist/src/schema/OrderByTypeProvider.js +1 -1
- package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/src/schema/QueryProvider.js +3 -3
- package/dist/src/schema/QueryProvider.js.map +1 -1
- package/dist/src/schema/ResultSchemaTypeProvider.d.ts +2 -2
- package/dist/src/schema/ResultSchemaTypeProvider.d.ts.map +1 -1
- package/dist/src/schema/WhereTypeProvider.js +4 -4
- package/dist/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/src/schema/entities/FieldArgsVisitor.d.ts +7 -7
- package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
- package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
- package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
- package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
- package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
- package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
- package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/utils/object.d.ts.map +1 -1
- package/dist/src/utils/object.js +3 -4
- package/dist/src/utils/object.js.map +1 -1
- package/dist/src/utils/uniqueWhereFields.js +3 -3
- package/dist/src/utils/uniqueWhereFields.js.map +1 -1
- package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js +38 -0
- package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js +2 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +7 -6
- package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js +137 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js +73 -0
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js +73 -0
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js +6 -6
- package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +6 -3
- package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/model.js.map +1 -1
- package/dist/tests/cases/unit/aclVariablesFactory.test.js +7 -33
- package/dist/tests/cases/unit/aclVariablesFactory.test.js.map +1 -1
- package/dist/tests/cases/unit/conditionOptimizer.test.d.ts +2 -0
- package/dist/tests/cases/unit/conditionOptimizer.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/conditionOptimizer.test.js +118 -0
- package/dist/tests/cases/unit/conditionOptimizer.test.js.map +1 -0
- package/dist/tests/cases/unit/orderbyHelper.test.js +1 -0
- package/dist/tests/cases/unit/orderbyHelper.test.js.map +1 -1
- package/dist/tests/cases/unit/permissionMerger.test.js +2 -0
- package/dist/tests/cases/unit/permissionMerger.test.js.map +1 -1
- package/dist/tests/cases/unit/predicatesFactory.test.d.ts +2 -0
- package/dist/tests/cases/unit/predicatesFactory.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/predicatesFactory.test.js +109 -0
- package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -0
- package/dist/tests/cases/unit/predicatesInjector.test.js +88 -14
- package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
- package/dist/tests/cases/unit/variableInjector.test.js +4 -3
- package/dist/tests/cases/unit/variableInjector.test.js.map +1 -1
- package/dist/tests/cases/unit/whereBuilder.test.d.ts +2 -0
- package/dist/tests/cases/unit/whereBuilder.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/whereBuilder.test.js +75 -0
- package/dist/tests/cases/unit/whereBuilder.test.js.map +1 -0
- package/dist/tests/cases/unit/whereOptimizer.test.d.ts +2 -0
- package/dist/tests/cases/unit/whereOptimizer.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/whereOptimizer.test.js +265 -0
- package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -0
- package/dist/tests/src/testGraphql.d.ts.map +1 -1
- package/dist/tests/src/testGraphql.js +10 -2
- package/dist/tests/src/testGraphql.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/graphql.codegen.yml +0 -3
- package/package.json +16 -16
- package/src/acl/EvaluatedPredicateReplacer.ts +32 -0
- package/src/acl/PermissionFactory.ts +18 -13
- package/src/acl/PredicateFactory.ts +32 -8
- package/src/acl/PredicatesInjector.ts +25 -17
- package/src/acl/VariableInjector.ts +2 -15
- package/src/acl/VariableUtils.ts +7 -23
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +17 -24
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
- package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +26 -46
- package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +6 -3
- package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
- package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +26 -49
- package/src/input-validation/ColumnValueResolver.ts +2 -3
- package/src/input-validation/EntityRulesResolver.ts +7 -7
- package/src/input-validation/QueryAstFactory.ts +1 -1
- package/src/input-validation/ValidationContext.ts +2 -2
- package/src/input-validation/ValidationDataSelector.ts +2 -2
- package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
- package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
- package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
- package/src/inputProcessing/CreateInputProcessor.ts +8 -9
- package/src/inputProcessing/CreateInputVisitor.ts +27 -89
- package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
- package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
- package/src/inputProcessing/index.ts +0 -1
- package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
- package/src/introspection/content-schema.types.ts +19 -286
- package/src/mapper/Mapper.ts +37 -30
- package/src/mapper/MapperContainer.ts +10 -5
- package/src/mapper/delete/DeleteExecutor.ts +3 -3
- package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
- package/src/mapper/select/JoinVisitor.ts +6 -33
- package/src/mapper/select/RelationFetcher.ts +101 -41
- package/src/mapper/select/SelectBuilder.ts +3 -1
- package/src/mapper/select/SelectBuilderFactory.ts +2 -1
- package/src/mapper/select/SelectExecutionHandler.ts +1 -0
- package/src/mapper/select/WhereBuilder.ts +95 -34
- package/src/mapper/select/handlers/FieldsVisitor.ts +47 -57
- package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
- package/src/mapper/select/optimizer/ConditionOptimizer.ts +41 -0
- package/src/mapper/select/optimizer/WhereOptimizer.ts +138 -0
- package/src/mapper/select/optimizer/WhereReplacer.ts +27 -0
- package/src/mapper/select/optimizer/helpers.ts +58 -0
- package/src/mapper/update/SqlUpdateInputProcessor.ts +1 -1
- package/src/mapper/update/UpdateBuilder.ts +3 -3
- package/src/resolvers/GraphQlQueryAstFactory.ts +3 -3
- package/src/resolvers/MutationResolver.ts +1 -1
- package/src/resolvers/ReadHelpers.ts +3 -3
- package/src/resolvers/ReadResolver.ts +2 -2
- package/src/schema/FieldAccessVisitor.ts +2 -2
- package/src/schema/OrderByTypeProvider.ts +1 -1
- package/src/schema/WhereTypeProvider.ts +4 -4
- package/src/schema/entities/FieldArgsVisitor.ts +3 -3
- package/src/schema/entities/FieldTypeVisitor.ts +3 -3
- package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
- package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
- package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +5 -18
- package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
- package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
- package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +2 -12
- package/src/utils/object.ts +6 -6
- package/src/utils/uniqueWhereFields.ts +3 -3
- package/tests/cases/integration/graphQlDb/insert/insertSequence.test.ts +34 -0
- package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +2 -2
- package/tests/cases/integration/graphQlRequests/insert/acl/setField.test.ts +3 -3
- package/tests/cases/integration/graphQlRequests/insert/aclInsert.test.ts +2 -2
- package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +7 -6
- package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.ts +130 -0
- 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/relations/manyHasManyInverse.test.ts +74 -0
- package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.ts +77 -0
- package/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.ts +7 -7
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +5 -5
- package/tests/cases/unit/aclVariablesFactory.test.ts +8 -35
- package/tests/cases/unit/conditionOptimizer.test.ts +135 -0
- package/tests/cases/unit/orderbyHelper.test.ts +1 -0
- package/tests/cases/unit/permissionMerger.test.ts +2 -0
- package/tests/cases/unit/predicatesFactory.test.ts +103 -0
- package/tests/cases/unit/predicatesInjector.test.ts +78 -16
- package/tests/cases/unit/variableInjector.test.ts +6 -5
- package/tests/cases/unit/whereBuilder.test.ts +84 -0
- package/tests/cases/unit/whereOptimizer.test.ts +289 -0
- package/tests/src/testGraphql.ts +9 -2
- package/dist/src/inputProcessing/InputContext.d.ts +0 -43
- package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
- package/dist/src/inputProcessing/InputContext.js +0 -3
- package/dist/src/inputProcessing/InputContext.js.map +0 -1
- package/src/inputProcessing/InputContext.ts +0 -49
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const optimizeOr = <P extends Record<string, unknown>>(operands: readonly (P | boolean | undefined)[]): P | { or?: P[] } | boolean => {
|
|
2
|
+
const normalized: P[] = []
|
|
3
|
+
let hasNever = false
|
|
4
|
+
for (const operand of operands) {
|
|
5
|
+
if (operand === true) {
|
|
6
|
+
return true
|
|
7
|
+
} else if (operand === false) {
|
|
8
|
+
hasNever = true
|
|
9
|
+
} else if (operand !== undefined) {
|
|
10
|
+
normalized.push(...Array.isArray(operand.or) ? operand.or : [operand])
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (normalized.length > 1) {
|
|
15
|
+
return { or: normalized }
|
|
16
|
+
} else if (normalized.length === 1) {
|
|
17
|
+
return normalized[0]
|
|
18
|
+
} else if (hasNever) {
|
|
19
|
+
return false
|
|
20
|
+
} else {
|
|
21
|
+
return {}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const optimizeAnd = <P extends Record<string, unknown>>(operands: readonly (P | boolean | undefined)[]): P | { and?: P[] } | boolean => {
|
|
26
|
+
const normalized: P[] = []
|
|
27
|
+
let hasAlways = false
|
|
28
|
+
|
|
29
|
+
for (const operand of operands) {
|
|
30
|
+
if (operand === true) {
|
|
31
|
+
hasAlways = true
|
|
32
|
+
} else if (operand === false) {
|
|
33
|
+
return false
|
|
34
|
+
} else if (operand !== undefined) {
|
|
35
|
+
normalized.push(...Array.isArray(operand.and) ? operand.and : [operand])
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (normalized.length > 1) {
|
|
40
|
+
return { and: normalized }
|
|
41
|
+
} else if (normalized.length === 1) {
|
|
42
|
+
return normalized[0]
|
|
43
|
+
} else if (hasAlways) {
|
|
44
|
+
return true
|
|
45
|
+
} else {
|
|
46
|
+
return {}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const optimizeNot = <P extends Record<string, unknown>>(operand: P | boolean): P['not'] | { not: P } | boolean => {
|
|
51
|
+
if (typeof operand === 'boolean') {
|
|
52
|
+
return !operand
|
|
53
|
+
} else if (operand.not) {
|
|
54
|
+
return operand.not as P['not']
|
|
55
|
+
} else {
|
|
56
|
+
return { not: operand }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -26,7 +26,7 @@ export class SqlUpdateInputProcessor implements UpdateInputProcessor<MutationRes
|
|
|
26
26
|
private readonly mapper: Mapper,
|
|
27
27
|
) {}
|
|
28
28
|
|
|
29
|
-
public column({ entity, column }:
|
|
29
|
+
public column({ entity, column }: Model.ColumnContext) {
|
|
30
30
|
if (this.data[column.name] !== undefined) {
|
|
31
31
|
this.updateBuilder.addFieldValue(column.name, this.data[column.name] as Value.AtomicValue)
|
|
32
32
|
}
|
|
@@ -74,9 +74,9 @@ export class UpdateBuilder {
|
|
|
74
74
|
const columns = new Set(resolvedData.map(it => it.columnName))
|
|
75
75
|
const allColumns: string[] = Object.values(
|
|
76
76
|
acceptEveryFieldVisitor(this.schema, this.entity, {
|
|
77
|
-
visitColumn: (
|
|
78
|
-
visitManyHasOne: (
|
|
79
|
-
visitOneHasOneOwning: (
|
|
77
|
+
visitColumn: ({ column }) => column.columnName,
|
|
78
|
+
visitManyHasOne: ({ relation }) => relation.joiningColumn.columnName,
|
|
79
|
+
visitOneHasOneOwning: ({ relation }) => relation.joiningColumn.columnName,
|
|
80
80
|
visitManyHasManyInverse: () => null,
|
|
81
81
|
visitManyHasManyOwning: () => null,
|
|
82
82
|
visitOneHasOneInverse: () => null,
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
GraphQLResolveInfo,
|
|
8
8
|
isListType,
|
|
9
9
|
isNonNullType,
|
|
10
|
-
isObjectType,
|
|
10
|
+
isObjectType, Kind,
|
|
11
11
|
} from 'graphql'
|
|
12
12
|
import { SelectionSetNode } from 'graphql/language/ast'
|
|
13
13
|
import { getArgumentValues } from 'graphql/execution/values'
|
|
@@ -67,13 +67,13 @@ export class GraphQlQueryAstFactory {
|
|
|
67
67
|
): AnyNode[] {
|
|
68
68
|
const fields: ObjectNode | FieldNode[] = []
|
|
69
69
|
for (const subNode of selectionSet.selections) {
|
|
70
|
-
if (isIt<GraphQlFieldNode>(subNode, 'kind',
|
|
70
|
+
if (isIt<GraphQlFieldNode>(subNode, 'kind', Kind.FIELD)) {
|
|
71
71
|
const field = this.createFromNode(info, parentType, subNode, path, filter)
|
|
72
72
|
if (field === null) {
|
|
73
73
|
continue
|
|
74
74
|
}
|
|
75
75
|
fields.push(field)
|
|
76
|
-
} else if (isIt<FragmentSpreadNode>(subNode, 'kind',
|
|
76
|
+
} else if (isIt<FragmentSpreadNode>(subNode, 'kind', Kind.FRAGMENT_SPREAD)) {
|
|
77
77
|
const fragmentDefinition = info.fragments[subNode.name.value]
|
|
78
78
|
if (!fragmentDefinition) {
|
|
79
79
|
throw new Error(`GraphQlQueryAstFactory: Fragment definition ${subNode.name.value} not found`)
|
|
@@ -457,7 +457,7 @@ export class MutationResolver {
|
|
|
457
457
|
throw new Error('MutationResolver: expected ObjectNode')
|
|
458
458
|
}
|
|
459
459
|
const objectWithArgs = singleNodeQuery.withArgs({ by: where })
|
|
460
|
-
nodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs)
|
|
460
|
+
nodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs, [])
|
|
461
461
|
}
|
|
462
462
|
return nodes
|
|
463
463
|
}
|
|
@@ -15,7 +15,7 @@ export const paginate = async (
|
|
|
15
15
|
const totalCount = paginationHelper.requiresTotalCount
|
|
16
16
|
? await mapper.count(entity, queryAst.args.filter || {})
|
|
17
17
|
: undefined
|
|
18
|
-
const nodes = paginationHelper.nodeField ? await mapper.select(entity, paginationHelper.nodeField) : undefined
|
|
18
|
+
const nodes = paginationHelper.nodeField ? await mapper.select(entity, paginationHelper.nodeField, []) : undefined
|
|
19
19
|
|
|
20
20
|
return paginationHelper.createResponse(totalCount, nodes)
|
|
21
21
|
}
|
|
@@ -37,9 +37,9 @@ export const executeReadOperations = async (
|
|
|
37
37
|
trxResult[field.alias] = await (() => {
|
|
38
38
|
switch (meta.operation) {
|
|
39
39
|
case Operation.get:
|
|
40
|
-
return mapper.selectUnique(meta.entity, field)
|
|
40
|
+
return mapper.selectUnique(meta.entity, field, [])
|
|
41
41
|
case Operation.list:
|
|
42
|
-
return mapper.select(meta.entity, field)
|
|
42
|
+
return mapper.select(meta.entity, field, [])
|
|
43
43
|
case Operation.paginate:
|
|
44
44
|
return paginate(mapper, meta.entity, field)
|
|
45
45
|
case Operation.create:
|
|
@@ -33,12 +33,12 @@ export class ReadResolver {
|
|
|
33
33
|
|
|
34
34
|
public async resolveListQuery(entity: Model.Entity, info: GraphQLResolveInfo) {
|
|
35
35
|
const queryAst: ObjectNode<Input.ListQueryInput> = this.queryAstFactory.create(info)
|
|
36
|
-
return await this.mapperFactory(this.db).select(entity, queryAst)
|
|
36
|
+
return await this.mapperFactory(this.db).select(entity, queryAst, [])
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
public async resolveGetQuery(entity: Model.Entity, info: GraphQLResolveInfo) {
|
|
40
40
|
const queryAst: ObjectNode<Input.UniqueQueryInput> = this.queryAstFactory.create(info)
|
|
41
|
-
return await this.mapperFactory(this.db).selectUnique(entity, queryAst)
|
|
41
|
+
return await this.mapperFactory(this.db).selectUnique(entity, queryAst, [])
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
public async resolvePaginationQuery(entity: Model.Entity, info: GraphQLResolveInfo) {
|
|
@@ -7,11 +7,11 @@ export class FieldAccessVisitor implements Model.ColumnVisitor<boolean>, Model.R
|
|
|
7
7
|
private readonly authorizator: Authorizator,
|
|
8
8
|
) {}
|
|
9
9
|
|
|
10
|
-
visitColumn(
|
|
10
|
+
visitColumn({ column, entity }: Model.ColumnContext) {
|
|
11
11
|
return this.authorizator.getFieldPermissions(this.operation, entity.name, column.name) !== 'no'
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
visitRelation({
|
|
14
|
+
visitRelation({ targetEntity }: Model.AnyRelationContext) {
|
|
15
15
|
return this.authorizator.getEntityPermission(this.operation, targetEntity.name) !== 'no'
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -51,7 +51,7 @@ export class OrderByTypeProvider {
|
|
|
51
51
|
|
|
52
52
|
const field = acceptFieldVisitor(this.schema, name, fieldName, {
|
|
53
53
|
visitColumn: () => ({ type: this.orderDirectionEnum }),
|
|
54
|
-
visitHasOne: (
|
|
54
|
+
visitHasOne: ({ relation }) => ({ type: this.getEntityOrderByType(relation.target) }),
|
|
55
55
|
visitHasMany: () => undefined,
|
|
56
56
|
} as Model.FieldVisitor<GraphQLInputFieldConfig | undefined>)
|
|
57
57
|
|
|
@@ -74,7 +74,7 @@ export class WhereTypeProvider {
|
|
|
74
74
|
continue
|
|
75
75
|
}
|
|
76
76
|
fields[field] = acceptFieldVisitor<GraphQLInputFieldConfig>(this.schema, entity, field, {
|
|
77
|
-
visitRelation: (
|
|
77
|
+
visitRelation: ({ targetEntity }) => {
|
|
78
78
|
// if (!isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {
|
|
79
79
|
// throw new Error('Only column or owning relation can be a part of unique key')
|
|
80
80
|
// }
|
|
@@ -84,7 +84,7 @@ export class WhereTypeProvider {
|
|
|
84
84
|
}
|
|
85
85
|
return { type: uniqueWhere }
|
|
86
86
|
},
|
|
87
|
-
visitColumn: (
|
|
87
|
+
visitColumn: ({ column }) => ({ type: this.columnTypeResolver.getType(column) }),
|
|
88
88
|
})
|
|
89
89
|
}
|
|
90
90
|
}
|
|
@@ -104,8 +104,8 @@ export class WhereTypeProvider {
|
|
|
104
104
|
continue
|
|
105
105
|
}
|
|
106
106
|
fields[fieldName] = acceptFieldVisitor(this.schema, name, fieldName, {
|
|
107
|
-
visitColumn: (
|
|
108
|
-
visitRelation: (
|
|
107
|
+
visitColumn: ({ column }) => ({ type: this.conditionTypeProvider.getCondition(column) }),
|
|
108
|
+
visitRelation: ({ relation }) => ({ type: this.getEntityWhereType(relation.target) }),
|
|
109
109
|
} as Model.FieldVisitor<GraphQLInputFieldConfig>)
|
|
110
110
|
}
|
|
111
111
|
|
|
@@ -15,11 +15,11 @@ export class FieldArgsVisitor implements
|
|
|
15
15
|
this.whereTypeProvider = whereTypeProvider
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
public visitColumn(
|
|
18
|
+
public visitColumn() {
|
|
19
19
|
return undefined
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
public visitHasMany(
|
|
22
|
+
public visitHasMany({ relation }: Model.AnyHasManyRelationContext) {
|
|
23
23
|
const filter = this.getWhereArg(relation)
|
|
24
24
|
const orderBy = this.getOrderByArgs(relation)
|
|
25
25
|
return {
|
|
@@ -30,7 +30,7 @@ export class FieldArgsVisitor implements
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
public visitHasOne(
|
|
33
|
+
public visitHasOne({ relation }: Model.ManyHasOneContext) {
|
|
34
34
|
const filter = this.getWhereArg(relation)
|
|
35
35
|
return { filter }
|
|
36
36
|
}
|
|
@@ -13,7 +13,7 @@ export class FieldTypeVisitor implements Model.ColumnVisitor<GraphQLOutputType>,
|
|
|
13
13
|
) {
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
public visitColumn(
|
|
16
|
+
public visitColumn({ column, entity }: Model.ColumnContext): GraphQLOutputType {
|
|
17
17
|
const basicType = this.columnTypeResolver.getType(column)
|
|
18
18
|
const fieldPredicate = this.authorizator.getFieldPredicate(Acl.Operation.read, entity.name, column.name)
|
|
19
19
|
const idPredicate = this.authorizator.getFieldPredicate(Acl.Operation.read, entity.name, entity.primary)
|
|
@@ -26,12 +26,12 @@ export class FieldTypeVisitor implements Model.ColumnVisitor<GraphQLOutputType>,
|
|
|
26
26
|
return basicType
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
public visitHasMany(
|
|
29
|
+
public visitHasMany({ relation }: Model.AnyHasManyRelationContext): GraphQLOutputType {
|
|
30
30
|
const entityType = this.entityTypeProvider.getEntity(relation.target)
|
|
31
31
|
return new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(entityType)))
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
public visitHasOne(
|
|
34
|
+
public visitHasOne({ relation }: Model.AnyHasOneRelationContext): GraphQLOutputType {
|
|
35
35
|
return this.entityTypeProvider.getEntity(relation.target)
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -15,7 +15,7 @@ export class CreateEntityInputFieldVisitor implements
|
|
|
15
15
|
private readonly createEntityRelationInputProvider: CreateEntityRelationInputProvider,
|
|
16
16
|
) {}
|
|
17
17
|
|
|
18
|
-
public visitColumn(entity
|
|
18
|
+
public visitColumn({ entity, column }: Model.ColumnContext): GraphQLInputFieldConfig | undefined {
|
|
19
19
|
if (entity.primary === column.name && !this.authorizator.isCustomPrimaryAllowed(entity.name)) {
|
|
20
20
|
return undefined
|
|
21
21
|
}
|
|
@@ -28,10 +28,7 @@ export class CreateEntityInputFieldVisitor implements
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
public visitHasOne(
|
|
32
|
-
entity: Model.Entity,
|
|
33
|
-
relation: Model.Relation & Model.NullableRelation,
|
|
34
|
-
): GraphQLInputFieldConfig | undefined {
|
|
31
|
+
public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext): GraphQLInputFieldConfig | undefined {
|
|
35
32
|
const type = this.createEntityRelationInputProvider.getCreateEntityRelationInput(entity.name, relation.name)
|
|
36
33
|
if (type === undefined) {
|
|
37
34
|
return undefined
|
|
@@ -41,7 +38,7 @@ export class CreateEntityInputFieldVisitor implements
|
|
|
41
38
|
}
|
|
42
39
|
}
|
|
43
40
|
|
|
44
|
-
public visitHasMany(entity
|
|
41
|
+
public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext): GraphQLInputFieldConfig | undefined {
|
|
45
42
|
const type = this.createEntityRelationInputProvider.getCreateEntityRelationInput(entity.name, relation.name)
|
|
46
43
|
if (type === undefined) {
|
|
47
44
|
return undefined
|
|
@@ -12,32 +12,23 @@ export class CreateEntityRelationAllowedOperationsVisitor implements
|
|
|
12
12
|
throw new ImplementationException('CreateEntityRelationAllowedOperationsVisitor: Not applicable for a column')
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
public visitManyHasManyInverse({
|
|
15
|
+
public visitManyHasManyInverse({ targetEntity, targetRelation }: Model.ManyHasManyInverseContext) {
|
|
16
16
|
return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
public visitManyHasManyOwning(
|
|
20
|
-
entity: Model.Entity,
|
|
21
|
-
relation: Model.ManyHasManyOwningRelation,
|
|
22
|
-
targetEntity: Model.Entity,
|
|
23
|
-
) {
|
|
19
|
+
public visitManyHasManyOwning({ entity, targetEntity, relation }: Model.ManyHasManyOwningContext) {
|
|
24
20
|
return this.getAllowedOperations(targetEntity, entity, relation)
|
|
25
21
|
}
|
|
26
22
|
|
|
27
|
-
public visitOneHasMany({
|
|
23
|
+
public visitOneHasMany({ targetEntity, targetRelation }: Model.OneHasManyContext) {
|
|
28
24
|
return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
|
|
29
25
|
}
|
|
30
26
|
|
|
31
|
-
public visitManyHasOne(
|
|
27
|
+
public visitManyHasOne({ targetEntity, entity, relation }: Model.ManyHasOneContext) {
|
|
32
28
|
return this.getAllowedOperations(targetEntity, entity, relation)
|
|
33
29
|
}
|
|
34
30
|
|
|
35
|
-
public visitOneHasOneInverse(
|
|
36
|
-
{},
|
|
37
|
-
relation: Model.OneHasOneInverseRelation,
|
|
38
|
-
targetEntity: Model.Entity,
|
|
39
|
-
targetRelation: Model.OneHasOneOwningRelation,
|
|
40
|
-
) {
|
|
31
|
+
public visitOneHasOneInverse({ targetEntity, targetRelation, relation }: Model.OneHasOneInverseContext) {
|
|
41
32
|
const operations = this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
|
|
42
33
|
if (relation.nullable || targetRelation.nullable) {
|
|
43
34
|
return operations
|
|
@@ -45,12 +36,7 @@ export class CreateEntityRelationAllowedOperationsVisitor implements
|
|
|
45
36
|
return operations.filter(it => it === Input.CreateRelationOperation.create)
|
|
46
37
|
}
|
|
47
38
|
|
|
48
|
-
public visitOneHasOneOwning(
|
|
49
|
-
entity: Model.Entity,
|
|
50
|
-
relation: Model.OneHasOneOwningRelation,
|
|
51
|
-
targetEntity: Model.Entity,
|
|
52
|
-
targetRelation: Model.OneHasOneInverseRelation | null,
|
|
53
|
-
) {
|
|
39
|
+
public visitOneHasOneOwning({ targetEntity, entity, relation, targetRelation }: Model.OneHasOneOwningContext) {
|
|
54
40
|
const operations = this.getAllowedOperations(targetEntity, entity, relation)
|
|
55
41
|
if (!targetRelation || targetRelation.nullable || relation.nullable) {
|
|
56
42
|
return operations
|
|
@@ -26,29 +26,16 @@ export class CreateEntityRelationInputFieldVisitor implements
|
|
|
26
26
|
throw new ImplementationException('CreateEntityRelationInputFieldVisitor: Not applicable for a column')
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
public visitHasOne(
|
|
30
|
-
|
|
31
|
-
relation: Model.Relation & Model.NullableRelation,
|
|
32
|
-
targetEntity: Model.Entity,
|
|
33
|
-
targetRelation: Model.Relation | null,
|
|
34
|
-
): GraphQLInputObjectType | undefined {
|
|
35
|
-
return this.createInputObject(entity, relation, targetEntity, targetRelation, false)
|
|
29
|
+
public visitHasOne(context: Model.ManyHasOneContext): GraphQLInputObjectType | undefined {
|
|
30
|
+
return this.createInputObject(context, false)
|
|
36
31
|
}
|
|
37
32
|
|
|
38
|
-
public visitHasMany(
|
|
39
|
-
|
|
40
|
-
relation: Model.Relation,
|
|
41
|
-
targetEntity: Model.Entity,
|
|
42
|
-
targetRelation: Model.Relation | null,
|
|
43
|
-
): GraphQLInputObjectType | undefined {
|
|
44
|
-
return this.createInputObject(entity, relation, targetEntity, targetRelation, true)
|
|
33
|
+
public visitHasMany(context: Model.OneHasManyContext): GraphQLInputObjectType | undefined {
|
|
34
|
+
return this.createInputObject(context, true)
|
|
45
35
|
}
|
|
46
36
|
|
|
47
37
|
public createInputObject(
|
|
48
|
-
entity: Model.
|
|
49
|
-
relation: Model.Relation,
|
|
50
|
-
targetEntity: Model.Entity,
|
|
51
|
-
targetRelation: Model.Relation | null,
|
|
38
|
+
{ entity, relation, targetEntity, targetRelation }: Model.AnyRelationContext,
|
|
52
39
|
withAliasField: boolean,
|
|
53
40
|
): GraphQLInputObjectType | undefined {
|
|
54
41
|
const targetName = targetRelation ? targetRelation.name : undefined
|
|
@@ -14,7 +14,7 @@ export class UpdateEntityInputFieldVisitor implements
|
|
|
14
14
|
private readonly updateEntityRelationInputProvider: UpdateEntityRelationInputProvider,
|
|
15
15
|
) {}
|
|
16
16
|
|
|
17
|
-
public visitColumn(entity
|
|
17
|
+
public visitColumn({ entity, column }: Model.ColumnContext) {
|
|
18
18
|
if (entity.primary === column.name) {
|
|
19
19
|
return undefined
|
|
20
20
|
}
|
|
@@ -27,10 +27,7 @@ export class UpdateEntityInputFieldVisitor implements
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
public visitHasOne(
|
|
31
|
-
entity: Model.Entity,
|
|
32
|
-
relation: Model.Relation & Model.NullableRelation,
|
|
33
|
-
): GraphQLInputFieldConfig | undefined {
|
|
30
|
+
public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext) {
|
|
34
31
|
const type = this.updateEntityRelationInputProvider.getUpdateEntityRelationInput(entity.name, relation.name)
|
|
35
32
|
if (type === undefined) {
|
|
36
33
|
return undefined
|
|
@@ -40,7 +37,7 @@ export class UpdateEntityInputFieldVisitor implements
|
|
|
40
37
|
}
|
|
41
38
|
}
|
|
42
39
|
|
|
43
|
-
public visitHasMany(entity
|
|
40
|
+
public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext) {
|
|
44
41
|
const type = this.updateEntityRelationInputProvider.getUpdateEntityRelationInput(entity.name, relation.name)
|
|
45
42
|
if (type === undefined) {
|
|
46
43
|
return undefined
|
|
@@ -11,23 +11,19 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
|
|
|
11
11
|
throw new Error('UpdateEntityRelationAllowedOperationsVisitor: Not applicable for a column')
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
public visitManyHasManyInverse({
|
|
14
|
+
public visitManyHasManyInverse({ targetEntity, targetRelation }: Model.ManyHasManyInverseContext) {
|
|
15
15
|
return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
public visitManyHasManyOwning(
|
|
19
|
-
entity: Model.Entity,
|
|
20
|
-
relation: Model.ManyHasManyOwningRelation,
|
|
21
|
-
targetEntity: Model.Entity,
|
|
22
|
-
) {
|
|
18
|
+
public visitManyHasManyOwning({ entity, targetEntity, relation }: Model.ManyHasManyOwningContext) {
|
|
23
19
|
return this.getAllowedOperations(targetEntity, entity, relation)
|
|
24
20
|
}
|
|
25
21
|
|
|
26
|
-
public visitOneHasMany({
|
|
22
|
+
public visitOneHasMany({ targetRelation, targetEntity }: Model.OneHasManyContext) {
|
|
27
23
|
return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
|
|
28
24
|
}
|
|
29
25
|
|
|
30
|
-
public visitManyHasOne(
|
|
26
|
+
public visitManyHasOne({ targetEntity, relation, entity }: Model.ManyHasOneContext) {
|
|
31
27
|
const operations = this.getAllowedOperations(targetEntity, entity, relation)
|
|
32
28
|
if (relation.nullable) {
|
|
33
29
|
return operations
|
|
@@ -39,12 +35,7 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
|
|
|
39
35
|
return operations.filter(it => !forbiddenOperations.includes(it))
|
|
40
36
|
}
|
|
41
37
|
|
|
42
|
-
public visitOneHasOneInverse(
|
|
43
|
-
{},
|
|
44
|
-
relation: Model.OneHasOneInverseRelation,
|
|
45
|
-
targetEntity: Model.Entity,
|
|
46
|
-
targetRelation: Model.OneHasOneOwningRelation,
|
|
47
|
-
) {
|
|
38
|
+
public visitOneHasOneInverse({ relation, targetEntity, targetRelation }: Model.OneHasOneInverseContext) {
|
|
48
39
|
const operations = this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
|
|
49
40
|
if (relation.nullable || targetRelation.nullable) {
|
|
50
41
|
return operations
|
|
@@ -52,12 +43,7 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
|
|
|
52
43
|
return operations.filter(it => it === Input.UpdateRelationOperation.update)
|
|
53
44
|
}
|
|
54
45
|
|
|
55
|
-
public visitOneHasOneOwning(
|
|
56
|
-
entity: Model.Entity,
|
|
57
|
-
relation: Model.OneHasOneOwningRelation,
|
|
58
|
-
targetEntity: Model.Entity,
|
|
59
|
-
targetRelation: Model.OneHasOneInverseRelation | null,
|
|
60
|
-
) {
|
|
46
|
+
public visitOneHasOneOwning({ targetEntity, entity, relation, targetRelation }: Model.OneHasOneOwningContext) {
|
|
61
47
|
const operations = this.getAllowedOperations(targetEntity, entity, relation)
|
|
62
48
|
if (relation.nullable || !targetRelation || targetRelation.nullable) {
|
|
63
49
|
return operations
|
|
@@ -27,12 +27,7 @@ export class UpdateEntityRelationInputFieldVisitor implements
|
|
|
27
27
|
throw new Error('UpdateEntityRelationInputFieldVisitor: Not applicable for a column')
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
public visitHasOne(
|
|
31
|
-
entity: Model.Entity,
|
|
32
|
-
relation: Model.Relation & Model.NullableRelation,
|
|
33
|
-
targetEntity: Model.Entity,
|
|
34
|
-
targetRelation: Model.Relation | null,
|
|
35
|
-
): GraphQLInputObjectType | undefined {
|
|
30
|
+
public visitHasOne({ targetRelation, targetEntity, relation, entity }: Model.AnyHasOneRelationContext) {
|
|
36
31
|
const withoutRelation = targetRelation ? targetRelation.name : undefined
|
|
37
32
|
|
|
38
33
|
const whereInput = this.createWhereInput(targetEntity)
|
|
@@ -84,12 +79,7 @@ export class UpdateEntityRelationInputFieldVisitor implements
|
|
|
84
79
|
})
|
|
85
80
|
}
|
|
86
81
|
|
|
87
|
-
public visitHasMany(
|
|
88
|
-
entity: Model.Entity,
|
|
89
|
-
relation: Model.Relation,
|
|
90
|
-
targetEntity: Model.Entity,
|
|
91
|
-
targetRelation: Model.Relation | null,
|
|
92
|
-
): GraphQLInputObjectType | undefined {
|
|
82
|
+
public visitHasMany({ entity, relation, targetEntity, targetRelation }: Model.AnyHasManyRelationContext) {
|
|
93
83
|
const withoutRelation = targetRelation ? targetRelation.name : undefined
|
|
94
84
|
|
|
95
85
|
const whereInput = this.createWhereInput(targetEntity)
|
package/src/utils/object.ts
CHANGED
|
@@ -9,18 +9,18 @@ function filterObject<Input extends {}, Result extends { [Key in keyof Input]: I
|
|
|
9
9
|
object: Input,
|
|
10
10
|
callback: TypeGuard<Input, Result> | Filter<Input>,
|
|
11
11
|
): Result {
|
|
12
|
-
return (Object.entries(object)
|
|
13
|
-
.filter(
|
|
14
|
-
|
|
15
|
-
)
|
|
16
|
-
.reduce((result: Result, [key, value]: [string, any]) => ({ ...(result as any), [key]: value }), {} as Result)
|
|
12
|
+
return Object.fromEntries(Object.entries(object)
|
|
13
|
+
.filter(([key, value]) => (callback as any)(key, value, object)),
|
|
14
|
+
) as Result
|
|
17
15
|
}
|
|
18
16
|
|
|
19
17
|
function mapObject<Input, Result>(
|
|
20
18
|
input: { [key: string]: Input },
|
|
21
19
|
callback: (value: Input, key: string) => Result,
|
|
22
20
|
): { [key: string]: Result } {
|
|
23
|
-
return Object.
|
|
21
|
+
return Object.fromEntries(
|
|
22
|
+
Object.entries(input).map(([key, value]) => [key, callback(value, key)]),
|
|
23
|
+
)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export { filterObject, mapObject }
|
|
@@ -8,10 +8,10 @@ export const getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Enti
|
|
|
8
8
|
visitColumn: () => undefined,
|
|
9
9
|
visitManyHasManyInverse: () => undefined,
|
|
10
10
|
visitManyHasManyOwning: () => undefined,
|
|
11
|
-
visitOneHasMany: ({
|
|
11
|
+
visitOneHasMany: ({ relation }) => [relation.name],
|
|
12
12
|
visitManyHasOne: () => undefined,
|
|
13
|
-
visitOneHasOneInverse: ({
|
|
14
|
-
visitOneHasOneOwning: ({
|
|
13
|
+
visitOneHasOneInverse: ({ relation }) => [relation.name],
|
|
14
|
+
visitOneHasOneOwning: ({ relation }) => [relation.name],
|
|
15
15
|
}),
|
|
16
16
|
).filter((it): it is [string] => !!it)
|
|
17
17
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SchemaDefinition as def } from '@contember/schema-definition'
|
|
2
|
+
import { GQL } from '../../../../src/tags'
|
|
3
|
+
import { test } from 'vitest'
|
|
4
|
+
import { executeDbTest } from '@contember/engine-api-tester'
|
|
5
|
+
|
|
6
|
+
namespace SeqModel {
|
|
7
|
+
export class Order {
|
|
8
|
+
seqId = def.intColumn().sequence().notNull()
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
test('insert author with id', async () => {
|
|
13
|
+
const schema = def.createModel(SeqModel)
|
|
14
|
+
await executeDbTest({
|
|
15
|
+
schema: schema,
|
|
16
|
+
query: GQL`
|
|
17
|
+
mutation {
|
|
18
|
+
createOrder(data: {}) {
|
|
19
|
+
node {
|
|
20
|
+
seqId
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}`,
|
|
24
|
+
seed: [],
|
|
25
|
+
return: {
|
|
26
|
+
createOrder: {
|
|
27
|
+
node: {
|
|
28
|
+
seqId: 1,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { test } from 'vitest'
|
|
2
2
|
import { execute, sqlDeferred, sqlTransaction } from '../../../../src/test'
|
|
3
3
|
import { SchemaBuilder } from '@contember/schema-definition'
|
|
4
|
-
import { Model } from '@contember/schema'
|
|
4
|
+
import { Acl, Model } from '@contember/schema'
|
|
5
5
|
import { GQL, SQL } from '../../../../src/tags'
|
|
6
6
|
import { testUuid } from '../../../../src/testUuid'
|
|
7
7
|
|
|
@@ -32,7 +32,7 @@ test('delete post with acl', async () => {
|
|
|
32
32
|
},
|
|
33
33
|
},
|
|
34
34
|
variables: {
|
|
35
|
-
locale_variable: ['cs'],
|
|
35
|
+
locale_variable: { in: ['cs'] },
|
|
36
36
|
},
|
|
37
37
|
executes: [
|
|
38
38
|
...sqlTransaction([
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { test } from 'vitest'
|
|
2
2
|
import { execute, failedTransaction, sqlTransaction } from '../../../../../src/test'
|
|
3
3
|
import { SchemaBuilder } from '@contember/schema-definition'
|
|
4
|
-
import { Model } from '@contember/schema'
|
|
4
|
+
import { Acl, Model } from '@contember/schema'
|
|
5
5
|
import { GQL, SQL } from '../../../../../src/tags'
|
|
6
6
|
import { testUuid } from '../../../../../src/testUuid'
|
|
7
7
|
|
|
@@ -34,7 +34,7 @@ test('set a name - allowed', async () => {
|
|
|
34
34
|
},
|
|
35
35
|
},
|
|
36
36
|
variables: {
|
|
37
|
-
name_variable: ['John', 'Jack'],
|
|
37
|
+
name_variable: { in: ['John', 'Jack'] },
|
|
38
38
|
},
|
|
39
39
|
executes: [
|
|
40
40
|
...sqlTransaction([
|
|
@@ -89,7 +89,7 @@ test('set a name - denied', async () => {
|
|
|
89
89
|
},
|
|
90
90
|
},
|
|
91
91
|
variables: {
|
|
92
|
-
name_variable: ['John', 'Jack'],
|
|
92
|
+
name_variable: { in: ['John', 'Jack'] },
|
|
93
93
|
},
|
|
94
94
|
executes: [
|
|
95
95
|
...failedTransaction([
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { test } from 'vitest'
|
|
2
2
|
import { execute, sqlTransaction } from '../../../../src/test'
|
|
3
3
|
import { SchemaBuilder } from '@contember/schema-definition'
|
|
4
|
-
import { Model } from '@contember/schema'
|
|
4
|
+
import { Acl, Model } from '@contember/schema'
|
|
5
5
|
import { GQL, SQL } from '../../../../src/tags'
|
|
6
6
|
import { testUuid } from '../../../../src/testUuid'
|
|
7
7
|
|
|
@@ -27,7 +27,7 @@ test('insert author (with acl)', async () => {
|
|
|
27
27
|
},
|
|
28
28
|
},
|
|
29
29
|
variables: {
|
|
30
|
-
name_variable: ['John', 'Jack'],
|
|
30
|
+
name_variable: { in: ['John', 'Jack'] },
|
|
31
31
|
},
|
|
32
32
|
query: GQL`
|
|
33
33
|
mutation {
|