@contember/engine-content-api 2.0.2 → 2.1.0-alpha.10
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 +1 -0
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +1 -0
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ExecutionContainer.cjs +6 -4
- package/dist/development/src/ExecutionContainer.cjs.map +1 -1
- package/dist/development/src/ExecutionContainer.js +6 -4
- package/dist/development/src/ExecutionContainer.js.map +1 -1
- package/dist/development/src/acl/Authorizator.cjs +5 -1
- package/dist/development/src/acl/Authorizator.cjs.map +1 -1
- package/dist/development/src/acl/Authorizator.js +5 -1
- package/dist/development/src/acl/Authorizator.js.map +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.cjs +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.cjs.map +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.js +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.js.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
- package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyCollector.js +3 -0
- package/dist/development/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
- package/dist/development/src/mapper/Mapper.cjs +1 -0
- package/dist/development/src/mapper/Mapper.cjs.map +1 -1
- package/dist/development/src/mapper/Mapper.js +1 -0
- package/dist/development/src/mapper/Mapper.js.map +1 -1
- package/dist/development/src/mapper/insert/Inserter.cjs +3 -2
- package/dist/development/src/mapper/insert/Inserter.cjs.map +1 -1
- package/dist/development/src/mapper/insert/Inserter.js +3 -2
- package/dist/development/src/mapper/insert/Inserter.js.map +1 -1
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs +3 -2
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js +3 -2
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.cjs +9 -2
- package/dist/development/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.js +10 -3
- package/dist/development/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/WhereBuilder.cjs +3 -3
- package/dist/development/src/mapper/select/WhereBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/WhereBuilder.js +3 -3
- package/dist/development/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs +33 -3
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.js +33 -3
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/development/src/resolvers/MutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/MutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/MutationResolver.js +1 -0
- package/dist/development/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/RefreshViewResolver.cjs +21 -0
- package/dist/development/src/resolvers/RefreshViewResolver.cjs.map +1 -0
- package/dist/development/src/resolvers/RefreshViewResolver.js +21 -0
- package/dist/development/src/resolvers/RefreshViewResolver.js.map +1 -0
- package/dist/development/src/schema/ColumnTypeResolver.cjs +9 -0
- package/dist/development/src/schema/ColumnTypeResolver.cjs.map +1 -1
- package/dist/development/src/schema/ColumnTypeResolver.js +10 -1
- package/dist/development/src/schema/ColumnTypeResolver.js.map +1 -1
- package/dist/development/src/schema/ConditionTypeProvider.cjs +35 -23
- package/dist/development/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/ConditionTypeProvider.js +36 -24
- package/dist/development/src/schema/ConditionTypeProvider.js.map +1 -1
- package/dist/development/src/schema/CustomTypesProvider.cjs +30 -0
- package/dist/development/src/schema/CustomTypesProvider.cjs.map +1 -1
- package/dist/development/src/schema/CustomTypesProvider.js +30 -0
- package/dist/development/src/schema/CustomTypesProvider.js.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.cjs +6 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.js +6 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.js.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
- package/dist/development/src/schema/OrderByTypeProvider.cjs +6 -1
- package/dist/development/src/schema/OrderByTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/OrderByTypeProvider.js +6 -1
- package/dist/development/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/development/src/schema/RefreshViewMutationProvider.cjs +42 -0
- package/dist/development/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
- package/dist/development/src/schema/RefreshViewMutationProvider.js +42 -0
- package/dist/development/src/schema/RefreshViewMutationProvider.js.map +1 -0
- package/dist/development/src/schema/WhereTypeProvider.cjs +1 -1
- package/dist/development/src/schema/WhereTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/WhereTypeProvider.js +1 -1
- package/dist/development/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/development/src/schema/entities/FieldTypeVisitor.cjs +3 -3
- package/dist/development/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
- package/dist/development/src/schema/entities/FieldTypeVisitor.js +3 -3
- package/dist/development/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.cjs +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.js +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.js +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/development/src/utils/viewComputedId.cjs +16 -0
- package/dist/development/src/utils/viewComputedId.cjs.map +1 -0
- package/dist/development/src/utils/viewComputedId.js +16 -0
- package/dist/development/src/utils/viewComputedId.js.map +1 -0
- package/dist/production/index.cjs +1 -0
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +1 -0
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ExecutionContainer.cjs +6 -4
- package/dist/production/src/ExecutionContainer.cjs.map +1 -1
- package/dist/production/src/ExecutionContainer.js +6 -4
- package/dist/production/src/ExecutionContainer.js.map +1 -1
- package/dist/production/src/acl/Authorizator.cjs +5 -1
- package/dist/production/src/acl/Authorizator.cjs.map +1 -1
- package/dist/production/src/acl/Authorizator.js +5 -1
- package/dist/production/src/acl/Authorizator.js.map +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.cjs +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.cjs.map +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.js +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.js.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
- package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyCollector.js +3 -0
- package/dist/production/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
- package/dist/production/src/mapper/Mapper.cjs +1 -0
- package/dist/production/src/mapper/Mapper.cjs.map +1 -1
- package/dist/production/src/mapper/Mapper.js +1 -0
- package/dist/production/src/mapper/Mapper.js.map +1 -1
- package/dist/production/src/mapper/insert/Inserter.cjs +3 -2
- package/dist/production/src/mapper/insert/Inserter.cjs.map +1 -1
- package/dist/production/src/mapper/insert/Inserter.js +3 -2
- package/dist/production/src/mapper/insert/Inserter.js.map +1 -1
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs +3 -2
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js +3 -2
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.cjs +9 -2
- package/dist/production/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.js +10 -3
- package/dist/production/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/WhereBuilder.cjs +3 -3
- package/dist/production/src/mapper/select/WhereBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/WhereBuilder.js +3 -3
- package/dist/production/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs +33 -3
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.js +33 -3
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/production/src/resolvers/MutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/MutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/MutationResolver.js +1 -0
- package/dist/production/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/RefreshViewResolver.cjs +21 -0
- package/dist/production/src/resolvers/RefreshViewResolver.cjs.map +1 -0
- package/dist/production/src/resolvers/RefreshViewResolver.js +21 -0
- package/dist/production/src/resolvers/RefreshViewResolver.js.map +1 -0
- package/dist/production/src/schema/ColumnTypeResolver.cjs +9 -0
- package/dist/production/src/schema/ColumnTypeResolver.cjs.map +1 -1
- package/dist/production/src/schema/ColumnTypeResolver.js +10 -1
- package/dist/production/src/schema/ColumnTypeResolver.js.map +1 -1
- package/dist/production/src/schema/ConditionTypeProvider.cjs +35 -23
- package/dist/production/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/ConditionTypeProvider.js +36 -24
- package/dist/production/src/schema/ConditionTypeProvider.js.map +1 -1
- package/dist/production/src/schema/CustomTypesProvider.cjs +30 -0
- package/dist/production/src/schema/CustomTypesProvider.cjs.map +1 -1
- package/dist/production/src/schema/CustomTypesProvider.js +30 -0
- package/dist/production/src/schema/CustomTypesProvider.js.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.cjs +6 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.js +6 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.js.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
- package/dist/production/src/schema/OrderByTypeProvider.cjs +6 -1
- package/dist/production/src/schema/OrderByTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/OrderByTypeProvider.js +6 -1
- package/dist/production/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/production/src/schema/RefreshViewMutationProvider.cjs +42 -0
- package/dist/production/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
- package/dist/production/src/schema/RefreshViewMutationProvider.js +42 -0
- package/dist/production/src/schema/RefreshViewMutationProvider.js.map +1 -0
- package/dist/production/src/schema/WhereTypeProvider.cjs +1 -1
- package/dist/production/src/schema/WhereTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/WhereTypeProvider.js +1 -1
- package/dist/production/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/production/src/schema/entities/FieldTypeVisitor.cjs +3 -3
- package/dist/production/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
- package/dist/production/src/schema/entities/FieldTypeVisitor.js +3 -3
- package/dist/production/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.cjs +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.js +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.js +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/production/src/utils/viewComputedId.cjs +16 -0
- package/dist/production/src/utils/viewComputedId.cjs.map +1 -0
- package/dist/production/src/utils/viewComputedId.js +16 -0
- package/dist/production/src/utils/viewComputedId.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/validation/utils.d.ts.map +1 -1
- package/dist/tests/src/tags.d.ts.map +1 -1
- package/dist/tests/src/test.d.ts.map +1 -1
- package/dist/tests/src/testGraphql.d.ts.map +1 -1
- package/dist/tests/src/testUuid.d.ts.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ExecutionContainer.d.ts +8 -2
- package/dist/types/ExecutionContainer.d.ts.map +1 -1
- package/dist/types/acl/Authorizator.d.ts +3 -1
- package/dist/types/acl/Authorizator.d.ts.map +1 -1
- package/dist/types/acl/VariableUtils.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationContext.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationEvaluation.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationPath.d.ts.map +1 -1
- package/dist/types/introspection/introspection.schema.d.ts.map +1 -1
- package/dist/types/mapper/ColumnValue.d.ts.map +1 -1
- package/dist/types/mapper/ErrorUtils.d.ts.map +1 -1
- package/dist/types/mapper/EventManager.d.ts.map +1 -1
- package/dist/types/mapper/MutationProcessorHelper.d.ts.map +1 -1
- package/dist/types/mapper/Result.d.ts.map +1 -1
- package/dist/types/mapper/delete/helpers.d.ts.map +1 -1
- package/dist/types/mapper/insert/Inserter.d.ts +4 -1
- package/dist/types/mapper/insert/Inserter.d.ts.map +1 -1
- package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts +4 -1
- package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/select/ConditionBuilder.d.ts +2 -2
- package/dist/types/mapper/select/ConditionBuilder.d.ts.map +1 -1
- package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts +4 -1
- package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts +5 -2
- package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/helpers.d.ts.map +1 -1
- package/dist/types/resolvers/ReadHelpers.d.ts.map +1 -1
- package/dist/types/resolvers/RefreshViewResolver.d.ts +13 -0
- package/dist/types/resolvers/RefreshViewResolver.d.ts.map +1 -0
- package/dist/types/schema/ColumnTypeResolver.d.ts +5 -5
- package/dist/types/schema/ColumnTypeResolver.d.ts.map +1 -1
- package/dist/types/schema/ConditionTypeProvider.d.ts +1 -0
- package/dist/types/schema/ConditionTypeProvider.d.ts.map +1 -1
- package/dist/types/schema/CustomTypesProvider.d.ts +1 -0
- package/dist/types/schema/CustomTypesProvider.d.ts.map +1 -1
- package/dist/types/schema/GraphQlSchemaBuilder.d.ts +3 -1
- package/dist/types/schema/GraphQlSchemaBuilder.d.ts.map +1 -1
- package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
- package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
- package/dist/types/schema/OperationExtension.d.ts.map +1 -1
- package/dist/types/schema/OrderByTypeProvider.d.ts.map +1 -1
- package/dist/types/schema/RefreshViewMutationProvider.d.ts +11 -0
- package/dist/types/schema/RefreshViewMutationProvider.d.ts.map +1 -0
- package/dist/types/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +1 -1
- package/dist/types/schema/utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/utils/isIt.d.ts.map +1 -1
- package/dist/types/utils/paginationUtils.d.ts.map +1 -1
- package/dist/types/utils/promises.d.ts.map +1 -1
- package/dist/types/utils/singletonFactory.d.ts.map +1 -1
- package/dist/types/utils/strings.d.ts.map +1 -1
- package/dist/types/utils/tuple.d.ts.map +1 -1
- package/dist/types/utils/uniqueWhereFields.d.ts.map +1 -1
- package/dist/types/utils/viewComputedId.d.ts +2 -0
- package/dist/types/utils/viewComputedId.d.ts.map +1 -0
- package/package.json +11 -11
- package/src/ExecutionContainer.ts +9 -5
- package/src/acl/Authorizator.ts +5 -0
- package/src/input-validation/ColumnValueResolver.ts +1 -1
- package/src/mapper/insert/Inserter.ts +2 -1
- package/src/mapper/insert/SqlCreateInputProcessor.ts +2 -1
- package/src/mapper/select/ConditionBuilder.ts +19 -5
- package/src/mapper/select/WhereBuilder.ts +3 -3
- package/src/mapper/select/handlers/FieldsVisitor.ts +36 -1
- package/src/mapper/select/handlers/FieldsVisitorFactory.ts +6 -1
- package/src/resolvers/RefreshViewResolver.ts +23 -0
- package/src/schema/ColumnTypeResolver.ts +15 -3
- package/src/schema/ConditionTypeProvider.ts +40 -25
- package/src/schema/CustomTypesProvider.ts +37 -0
- package/src/schema/GraphQlSchemaBuilder.ts +8 -0
- package/src/schema/GraphQlSchemaBuilderFactory.ts +5 -2
- package/src/schema/OrderByTypeProvider.ts +6 -1
- package/src/schema/RefreshViewMutationProvider.ts +47 -0
- package/src/schema/WhereTypeProvider.ts +1 -1
- package/src/schema/entities/FieldTypeVisitor.ts +3 -3
- package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +1 -1
- package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +1 -1
- package/src/utils/viewComputedId.ts +23 -0
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +38 -2
- package/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +6 -0
- package/tests/cases/integration/graphQlSchema/schema-array.gql +257 -0
- package/tests/cases/integration/graphQlSchema/schema-column-types.gql +420 -0
- package/tests/src/test.ts +1 -1
|
@@ -122,7 +122,7 @@ class WhereBuilder {
|
|
|
122
122
|
conditionBuilder,
|
|
123
123
|
tableName,
|
|
124
124
|
relation.joiningColumn.columnName,
|
|
125
|
-
targetEntity.fields[targetEntity.primary]
|
|
125
|
+
targetEntity.fields[targetEntity.primary],
|
|
126
126
|
primaryCondition
|
|
127
127
|
);
|
|
128
128
|
}
|
|
@@ -139,7 +139,7 @@ class WhereBuilder {
|
|
|
139
139
|
};
|
|
140
140
|
conditionBuilder = schemaUtils.acceptFieldVisitor(this.schema, entity, fieldName, {
|
|
141
141
|
visitColumn: ({ entity: entity2, column }) => {
|
|
142
|
-
return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column
|
|
142
|
+
return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column, fieldWhere);
|
|
143
143
|
},
|
|
144
144
|
visitOneHasOneInverse: joinedWhere,
|
|
145
145
|
visitOneHasOneOwning: joinedWhere,
|
|
@@ -206,7 +206,7 @@ class WhereBuilder {
|
|
|
206
206
|
const qb = Database.SelectBuilder.create().from(joiningTable.tableName, junctionPath.alias).select((it) => it.raw("1")).where((it) => it.columnsEq(outerColumn, [junctionPath.alias, fromColumn]));
|
|
207
207
|
const primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary);
|
|
208
208
|
if (primaryCondition !== null) {
|
|
209
|
-
const columnType = targetEntity.fields[targetEntity.primary]
|
|
209
|
+
const columnType = targetEntity.fields[targetEntity.primary];
|
|
210
210
|
return qb.where(
|
|
211
211
|
(condition) => this.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition)
|
|
212
212
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/WhereBuilder.ts"],"sourcesContent":["import { isIt } from '../../utils'\nimport { acceptFieldVisitor, isColumn } from '@contember/schema-utils'\nimport { Input, Model } from '@contember/schema'\nimport { Path, PathFactory } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { ConditionBuilder } from './ConditionBuilder'\nimport {\n\tConditionBuilder as SqlConditionBuilder,\n\tLiteral,\n\tOperator,\n\tQueryBuilder,\n\tSelectBuilder, wrapIdentifier,\n} from '@contember/database'\nimport { WhereOptimizationHints, WhereOptimizer } from './optimizer/WhereOptimizer'\n\nexport class WhereBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly conditionBuilder: ConditionBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly whereOptimizer: WhereOptimizer,\n\t\tprivate readonly useExistsInHasManyFilter: boolean,\n\t) {}\n\n\tpublic build<R extends SelectBuilder.Result>(\n\t\tqb: SelectBuilder<R>,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\n\tpublic buildAdvanced<R extends SelectBuilder.Result>(\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\tcallback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback,\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\tprivate buildInternal<R extends SelectBuilder.Result>({\n\t\tcallback,\n\t\t...args\n\t}: { entity: Model.Entity; path: Path; where: Input.OptionalWhere; callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>; allowManyJoin: boolean },\n\t): SelectBuilder<R> {\n\t\tconst joinList: WhereJoinDefinition[] = []\n\n\t\tconst qbWithWhere = callback(clause => this.buildRecursive({\n\t\t\tconditionBuilder: clause,\n\t\t\tjoinList: joinList,\n\t\t\t...args,\n\t\t}))\n\t\treturn joinList.reduce<SelectBuilder<R>>(\n\t\t\t(qb, { path, entity, relationName }) => this.joinBuilder.join<R>(qb, path, entity, relationName),\n\t\t\tqbWithWhere,\n\t\t)\n\t}\n\n\tprivate buildRecursive({\n\t\tconditionBuilder,\n\t\tentity,\n\t\tpath,\n\t\twhere,\n\t\tjoinList,\n\t\tallowManyJoin,\n\t}: { conditionBuilder: SqlConditionBuilder; entity: Model.Entity; path: Path; where: Input.OptionalWhere; joinList: WhereJoinDefinition[]; allowManyJoin: boolean },\n\t): SqlConditionBuilder {\n\t\tconst tableName = path.alias\n\n\t\tif (where.and !== undefined && where.and !== null && where.and.length > 0) {\n\t\t\tconst expr = where.and\n\t\t\tconditionBuilder = conditionBuilder.and(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where ? clause2 : this.buildRecursive({\n\t\t\t\t\t\t\tconditionBuilder: clause2,\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t}),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.or !== undefined && where.or !== null && where.or.length > 0) {\n\t\t\tconst expr = where.or\n\t\t\tconditionBuilder = conditionBuilder.or(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where\n\t\t\t\t\t\t\t? clause2\n\t\t\t\t\t\t\t: clause2.and(clause3 => this.buildRecursive({\n\t\t\t\t\t\t\t\tconditionBuilder: clause3,\n\t\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.not !== undefined && where.not !== null) {\n\t\t\tconst expr = where.not\n\t\t\tconditionBuilder = conditionBuilder.not(clause =>\n\t\t\t\tthis.buildRecursive({\n\t\t\t\t\tconditionBuilder: clause,\n\t\t\t\t\tentity,\n\t\t\t\t\tpath,\n\t\t\t\t\twhere: expr,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tfor (const fieldName in where) {\n\t\t\tif (fieldName === 'and' || fieldName === 'or' || fieldName === 'not') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst fieldWhere = where[fieldName]\n\t\t\tif (!fieldWhere) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst targetPath = path.for(fieldName)\n\n\t\t\tconst joinedWhere = ({ targetEntity, relation, entity }: Model.AnyRelationContext): SqlConditionBuilder => {\n\t\t\t\tconst relationWhere = where[fieldName] as Input.OptionalWhere | null\n\t\t\t\tif (!relationWhere || Object.keys(relationWhere).length === 0) {\n\t\t\t\t\treturn conditionBuilder\n\t\t\t\t}\n\t\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\t\t\t\tif (primaryCondition !== null) {\n\t\t\t\t\t\treturn this.conditionBuilder.build(\n\t\t\t\t\t\t\tconditionBuilder,\n\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\trelation.joiningColumn.columnName,\n\t\t\t\t\t\t\t(targetEntity.fields[targetEntity.primary] as Model.AnyColumn).columnType,\n\t\t\t\t\t\t\tprimaryCondition,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tjoinList.push({ path: targetPath, entity, relationName: relation.name })\n\n\t\t\t\treturn this.buildRecursive({\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tentity: targetEntity,\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t})\n\t\t\t}\n\n\n\n\t\t\tconditionBuilder = acceptFieldVisitor<SqlConditionBuilder>(this.schema, entity, fieldName, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\treturn this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column.columnType, fieldWhere as Input.Condition<Input.ColumnValue>)\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: joinedWhere,\n\t\t\t\tvisitOneHasOneOwning: joinedWhere,\n\t\t\t\tvisitManyHasOne: joinedWhere,\n\t\t\t\tvisitManyHasManyInverse: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.targetRelation.joiningTable,\n\t\t\t\t\t\t\t'inverse',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = where[fieldName] as Input.Where | null\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.relation.joiningTable,\n\t\t\t\t\t\t\t'owning',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = fieldWhere as Input.OptionalWhere\n\n\t\t\t\t\tconst qb = this.hasRootIsNull(relationWhere, context.targetEntity)\n\t\t\t\t\t\t? SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(new Literal(`(select ${wrapIdentifier(tableName)}.${wrapIdentifier(entity.primaryColumn)})`), targetPath.for('tmp_').alias)\n\t\t\t\t\t\t\t.leftJoin(context.targetEntity.tableName, targetPath.alias, it =>\n\t\t\t\t\t\t\t\tit.columnsEq([targetPath.for('tmp_').alias, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(context.targetEntity.tableName, targetPath.alias)\n\t\t\t\t\t\t\t.where(it => it.columnsEq([tableName, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]))\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.buildInternal({\n\t\t\t\t\t\t\tentity: context.targetEntity,\n\t\t\t\t\t\t\tpath: targetPath,\n\t\t\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\t\t\t\t\tallowManyJoin: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\treturn conditionBuilder\n\t}\n\n\n\tprivate createManyHasManySubquery(\n\t\touterColumn: QueryBuilder.ColumnIdentifier,\n\t\trelationWhere: Input.OptionalWhere,\n\t\ttargetEntity: Model.Entity,\n\t\tjoiningTable: Model.JoiningTable,\n\t\tfromSide: 'owning' | 'inverse',\n\t\tpath: Path,\n\t) {\n\t\tconst fromColumn = fromSide === 'owning' ? joiningTable.joiningColumn.columnName : joiningTable.inverseJoiningColumn.columnName\n\t\tconst toColumn = fromSide === 'owning' ? joiningTable.inverseJoiningColumn.columnName : joiningTable.joiningColumn.columnName\n\t\tconst junctionPath = path.for('junction_')\n\t\tconst qb = SelectBuilder.create<SelectBuilder.Result>()\n\t\t\t.from(joiningTable.tableName, junctionPath.alias)\n\t\t\t.select(it => it.raw('1'))\n\t\t\t.where(it => it.columnsEq(outerColumn, [junctionPath.alias, fromColumn]))\n\n\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\tif (primaryCondition !== null) {\n\n\t\t\tconst columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn).columnType\n\n\t\t\treturn qb.where(condition =>\n\t\t\t\tthis.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition),\n\t\t\t)\n\t\t}\n\n\t\tconst qbJoined = qb.join(targetEntity.tableName, path.alias, clause =>\n\t\t\tclause.compareColumns([junctionPath.alias, toColumn], Operator.eq, [path.alias, targetEntity.primary]),\n\t\t)\n\t\treturn this.buildInternal({\n\t\t\tentity: targetEntity,\n\t\t\tpath: this.pathFactory.create([], path.fullAlias),\n\t\t\twhere: relationWhere,\n\t\t\tcallback: cb => qbJoined.where(clause => cb(clause)),\n\t\t\tallowManyJoin: true,\n\t\t})\n\t}\n\n\tprivate transformWhereToPrimaryCondition(where: Input.OptionalWhere, primaryField: string): Input.Condition<never> | null {\n\t\tconst keys = Object.keys(where)\n\t\tif (keys.filter(it => !['and', 'or', 'not', primaryField].includes(it)).length > 0) {\n\t\t\treturn null\n\t\t}\n\t\tlet condition: {\n\t\t\tand?: Array<Input.Condition<never>>\n\t\t\tor?: Array<Input.Condition<never>>\n\t\t\tnot?: Input.Condition<never>\n\t\t} = {}\n\t\tif (where.and) {\n\t\t\tconst conditions = where.and\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.and = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.or) {\n\t\t\tconst conditions = where.or\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.or = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.not) {\n\t\t\tconst conditions = this.transformWhereToPrimaryCondition(where.not, primaryField)\n\t\t\tif (conditions === null) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.not = conditions as Input.Condition<never>\n\t\t}\n\t\tif (where[primaryField]) {\n\t\t\tif (Object.keys(condition).length > 0) {\n\t\t\t\treturn { and: [condition, where[primaryField] as Input.Condition<never>] }\n\t\t\t}\n\t\t\treturn where[primaryField] as Input.Condition<never>\n\t\t}\n\t\treturn condition\n\t}\n\n\tprivate hasRootIsNull(where: Input.OptionalWhere, entity: Model.Entity): boolean {\n\t\tfor (const key in where) {\n\t\t\tif (key === 'and' || key === 'or') {\n\t\t\t\tif (where[key]?.some(it => it && this.hasRootIsNull(it, entity))) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (key === 'not') {\n\t\t\t\tif (where.not && this.hasRootIsNull(where.not, entity)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (isColumn(entity.fields[key]) && this.conditionHasIsNull(where[key] as Input.Condition)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate conditionHasIsNull(cond: Input.Condition): boolean {\n\t\tif (cond.isNull !== undefined) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.and && cond.and.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.or && cond.or.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.not && this.conditionHasIsNull(cond.not)) {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport type WhereJoinDefinition = { path: Path; entity: Model.Entity; relationName: string }\n"],"names":["where","entity","isIt","acceptFieldVisitor","SelectBuilder","Literal","wrapIdentifier","Operator","isColumn"],"mappings":";;;;;AAeO,MAAM,aAAa;AAAA,EACzB,YACkB,QACA,aACA,kBACA,aACA,gBACA,0BAChB;AANgB,SAAA,SAAA;AACA,SAAA,cAAA;AACA,SAAA,mBAAA;AACA,SAAA,cAAA;AACA,SAAA,iBAAA;AACA,SAAA,2BAAA;AAAA,EAAA;AAAA,EAGX,MACN,IACA,QACA,MACA,OACA,oBAA4C,IACzB;AACnB,UAAM,iBAAiB,KAAK,eAAe,SAAS,OAAO,QAAQ,iBAAiB;AACpF,WAAO,KAAK,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAM,OAAA,GAAG,MAAM,CAAU,WAAA,GAAG,MAAM,CAAC;AAAA,MAC7C,eAAe;AAAA,IAAA,CACf;AAAA,EAAA;AAAA,EAIK,cACN,QACA,MACA,OACA,UACA,oBAA4C,IACzB;AACnB,UAAM,iBAAiB,KAAK,eAAe,SAAS,OAAO,QAAQ,iBAAiB;AACpF,WAAO,KAAK,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAe;AAAA,IAAA,CACf;AAAA,EAAA;AAAA,EAGM,cAA8C;AAAA,IACrD;AAAA,IACA,GAAG;AAAA,EAAA,GAEgB;AACnB,UAAM,WAAkC,CAAC;AAEzC,UAAM,cAAc,SAAS,CAAU,WAAA,KAAK,eAAe;AAAA,MAC1D,kBAAkB;AAAA,MAClB;AAAA,MACA,GAAG;AAAA,IAAA,CACH,CAAC;AACF,WAAO,SAAS;AAAA,MACf,CAAC,IAAI,EAAE,MAAM,QAAQ,aAAA,MAAmB,KAAK,YAAY,KAAQ,IAAI,MAAM,QAAQ,YAAY;AAAA,MAC/F;AAAA,IACD;AAAA,EAAA;AAAA,EAGO,eAAe;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAEsB;AACtB,UAAM,YAAY,KAAK;AAEnB,QAAA,MAAM,QAAQ,UAAa,MAAM,QAAQ,QAAQ,MAAM,IAAI,SAAS,GAAG;AAC1E,YAAM,OAAO,MAAM;AACnB,yBAAmB,iBAAiB;AAAA,QAAI,YACvC,KAAK;AAAA,UACJ,CAAC,SAASA,WACT,CAACA,SAAQ,UAAU,KAAK,eAAe;AAAA,YACtC,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,YACA,OAAAA;AAAAA,YACA;AAAA,YACA;AAAA,UAAA,CACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEF;AAAA,IAAA;AAEG,QAAA,MAAM,OAAO,UAAa,MAAM,OAAO,QAAQ,MAAM,GAAG,SAAS,GAAG;AACvE,YAAM,OAAO,MAAM;AACnB,yBAAmB,iBAAiB;AAAA,QAAG,YACtC,KAAK;AAAA,UACJ,CAAC,SAASA,WACT,CAACA,SACE,UACA,QAAQ,IAAI,CAAW,YAAA,KAAK,eAAe;AAAA,YAC5C,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,YACA,OAAAA;AAAAA,YACA;AAAA,YACA;AAAA,UAAA,CACA,CAAC;AAAA,UACJ;AAAA,QAAA;AAAA,MAEF;AAAA,IAAA;AAED,QAAI,MAAM,QAAQ,UAAa,MAAM,QAAQ,MAAM;AAClD,YAAM,OAAO,MAAM;AACnB,yBAAmB,iBAAiB;AAAA,QAAI,CAAA,WACvC,KAAK,eAAe;AAAA,UACnB,kBAAkB;AAAA,UAClB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QACA,CAAA;AAAA,MACF;AAAA,IAAA;AAGD,eAAW,aAAa,OAAO;AAC9B,UAAI,cAAc,SAAS,cAAc,QAAQ,cAAc,OAAO;AACrE;AAAA,MAAA;AAEK,YAAA,aAAa,MAAM,SAAS;AAClC,UAAI,CAAC,YAAY;AAChB;AAAA,MAAA;AAGK,YAAA,aAAa,KAAK,IAAI,SAAS;AAErC,YAAM,cAAc,CAAC,EAAE,cAAc,UAAU,QAAAC,cAA4D;AACpG,cAAA,gBAAgB,MAAM,SAAS;AACrC,YAAI,CAAC,iBAAiB,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AACvD,iBAAA;AAAA,QAAA;AAEJ,YAAAC,KAAA,KAAkC,UAAU,eAAe,GAAG;AACjE,gBAAM,mBAAmB,KAAK,iCAAiC,eAAe,aAAa,OAAO;AAClG,cAAI,qBAAqB,MAAM;AAC9B,mBAAO,KAAK,iBAAiB;AAAA,cAC5B;AAAA,cACA;AAAA,cACA,SAAS,cAAc;AAAA,cACtB,aAAa,OAAO,aAAa,OAAO,EAAsB;AAAA,cAC/D;AAAA,YACD;AAAA,UAAA;AAAA,QACD;AAGQ,iBAAA,KAAK,EAAE,MAAM,YAAY,QAAAD,SAAQ,cAAc,SAAS,MAAM;AAEvE,eAAO,KAAK,eAAe;AAAA,UAC1B;AAAA,UACA,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QAAA,CACA;AAAA,MACF;AAIA,yBAAmBE,YAAAA,mBAAwC,KAAK,QAAQ,QAAQ,WAAW;AAAA,QAC1F,aAAa,CAAC,EAAE,QAAAF,SAAQ,aAAa;AAC7B,iBAAA,KAAK,iBAAiB,MAAM,kBAAkB,WAAW,OAAO,YAAY,OAAO,YAAY,UAAgD;AAAA,QACvJ;AAAA,QACA,uBAAuB;AAAA,QACvB,sBAAsB;AAAA,QACtB,iBAAiB;AAAA,QACjB,yBAAyB,CAAW,YAAA;AAC/B,cAAA,iBAAiB,CAAC,KAAK,0BAA0B;AACpD,mBAAO,YAAY,OAAO;AAAA,UAAA;AAG3B,iBAAO,iBAAiB;AAAA,YACvB,KAAK;AAAA,cACJ,CAAC,WAAW,OAAO,aAAa;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ,eAAe;AAAA,cACvB;AAAA,cACA;AAAA,YAAA;AAAA,UAEF;AAAA,QACD;AAAA,QACA,wBAAwB,CAAW,YAAA;AAC9B,cAAA,iBAAiB,CAAC,KAAK,0BAA0B;AACpD,mBAAO,YAAY,OAAO;AAAA,UAAA;AAGL,gBAAM,SAAS;AAErC,iBAAO,iBAAiB;AAAA,YACvB,KAAK;AAAA,cACJ,CAAC,WAAW,OAAO,aAAa;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ,SAAS;AAAA,cACjB;AAAA,cACA;AAAA,YAAA;AAAA,UAEF;AAAA,QACD;AAAA,QACA,iBAAiB,CAAW,YAAA;AACvB,cAAA,iBAAiB,CAAC,KAAK,0BAA0B;AACpD,mBAAO,YAAY,OAAO;AAAA,UAAA;AAG3B,gBAAM,gBAAgB;AAEtB,gBAAM,KAAK,KAAK,cAAc,eAAe,QAAQ,YAAY,IAC9DG,SAAA,cAAc,OAAO,EACrB,OAAO,CAAM,OAAA,GAAG,IAAI,GAAG,CAAC,EACxB,KAAK,IAAIC,SAAAA,QAAQ,WAAWC,wBAAe,SAAS,CAAC,IAAIA,wBAAe,OAAO,aAAa,CAAC,GAAG,GAAG,WAAW,IAAI,MAAM,EAAE,KAAK,EAC/H;AAAA,YAAS,QAAQ,aAAa;AAAA,YAAW,WAAW;AAAA,YAAO,QAC3D,GAAG,UAAU,CAAC,WAAW,IAAI,MAAM,EAAE,OAAO,OAAO,aAAa,GAAG,CAAC,WAAW,OAAO,QAAQ,eAAe,cAAc,UAAU,CAAC;AAAA,UAAA,IAEtIF,SAAAA,cAAc,OAAO,EACrB,OAAO,CAAM,OAAA,GAAG,IAAI,GAAG,CAAC,EACxB,KAAK,QAAQ,aAAa,WAAW,WAAW,KAAK,EACrD,MAAM,QAAM,GAAG,UAAU,CAAC,WAAW,OAAO,aAAa,GAAG,CAAC,WAAW,OAAO,QAAQ,eAAe,cAAc,UAAU,CAAC,CAAC;AAEnI,iBAAO,iBAAiB;AAAA,YACvB,KAAK,cAAc;AAAA,cAClB,QAAQ,QAAQ;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU,CAAM,OAAA,GAAG,MAAM,CAAU,WAAA,GAAG,MAAM,CAAC;AAAA,cAC7C,eAAe;AAAA,YACf,CAAA;AAAA,UACF;AAAA,QAAA;AAAA,MACD,CACA;AAAA,IAAA;AAEK,WAAA;AAAA,EAAA;AAAA,EAIA,0BACP,aACA,eACA,cACA,cACA,UACA,MACC;AACD,UAAM,aAAa,aAAa,WAAW,aAAa,cAAc,aAAa,aAAa,qBAAqB;AACrH,UAAM,WAAW,aAAa,WAAW,aAAa,qBAAqB,aAAa,aAAa,cAAc;AAC7G,UAAA,eAAe,KAAK,IAAI,WAAW;AACnC,UAAA,KAAKA,SAAAA,cAAc,OAAA,EACvB,KAAK,aAAa,WAAW,aAAa,KAAK,EAC/C,OAAO,CAAM,OAAA,GAAG,IAAI,GAAG,CAAC,EACxB,MAAM,CAAA,OAAM,GAAG,UAAU,aAAa,CAAC,aAAa,OAAO,UAAU,CAAC,CAAC;AAEzE,UAAM,mBAAmB,KAAK,iCAAiC,eAAe,aAAa,OAAO;AAClG,QAAI,qBAAqB,MAAM;AAE9B,YAAM,aAAc,aAAa,OAAO,aAAa,OAAO,EAAsB;AAElF,aAAO,GAAG;AAAA,QAAM,CAAA,cACf,KAAK,iBAAiB,MAAM,WAAW,aAAa,OAAO,UAAU,YAAY,gBAAgB;AAAA,MAClG;AAAA,IAAA;AAGD,UAAM,WAAW,GAAG;AAAA,MAAK,aAAa;AAAA,MAAW,KAAK;AAAA,MAAO,CAC5D,WAAA,OAAO,eAAe,CAAC,aAAa,OAAO,QAAQ,GAAGG,SAAA,SAAS,IAAI,CAAC,KAAK,OAAO,aAAa,OAAO,CAAC;AAAA,IACtG;AACA,WAAO,KAAK,cAAc;AAAA,MACzB,QAAQ;AAAA,MACR,MAAM,KAAK,YAAY,OAAO,CAAC,GAAG,KAAK,SAAS;AAAA,MAChD,OAAO;AAAA,MACP,UAAU,CAAM,OAAA,SAAS,MAAM,CAAU,WAAA,GAAG,MAAM,CAAC;AAAA,MACnD,eAAe;AAAA,IAAA,CACf;AAAA,EAAA;AAAA,EAGM,iCAAiC,OAA4B,cAAqD;AACnH,UAAA,OAAO,OAAO,KAAK,KAAK;AAC9B,QAAI,KAAK,OAAO,CAAM,OAAA,CAAC,CAAC,OAAO,MAAM,OAAO,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG;AAC5E,aAAA;AAAA,IAAA;AAER,QAAI,YAIA,CAAC;AACL,QAAI,MAAM,KAAK;AACd,YAAM,aAAa,MAAM,IACvB,OAAO,CAAC,OAA0B,CAAC,CAAC,EAAE,EACtC,IAAI,CAAM,OAAA,KAAK,iCAAiC,IAAI,YAAY,CAAC;AAC/D,UAAA,WAAW,SAAS,IAAI,GAAG;AACvB,eAAA;AAAA,MAAA;AAER,gBAAU,MAAM;AAAA,IAAA;AAEjB,QAAI,MAAM,IAAI;AACb,YAAM,aAAa,MAAM,GACvB,OAAO,CAAC,OAA0B,CAAC,CAAC,EAAE,EACtC,IAAI,CAAM,OAAA,KAAK,iCAAiC,IAAI,YAAY,CAAC;AAC/D,UAAA,WAAW,SAAS,IAAI,GAAG;AACvB,eAAA;AAAA,MAAA;AAER,gBAAU,KAAK;AAAA,IAAA;AAEhB,QAAI,MAAM,KAAK;AACd,YAAM,aAAa,KAAK,iCAAiC,MAAM,KAAK,YAAY;AAChF,UAAI,eAAe,MAAM;AACjB,eAAA;AAAA,MAAA;AAER,gBAAU,MAAM;AAAA,IAAA;AAEb,QAAA,MAAM,YAAY,GAAG;AACxB,UAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACtC,eAAO,EAAE,KAAK,CAAC,WAAW,MAAM,YAAY,CAA2B,EAAE;AAAA,MAAA;AAE1E,aAAO,MAAM,YAAY;AAAA,IAAA;AAEnB,WAAA;AAAA,EAAA;AAAA,EAGA,cAAc,OAA4B,QAA+B;AAChF,eAAW,OAAO,OAAO;AACpB,UAAA,QAAQ,SAAS,QAAQ,MAAM;AAC9B,YAAA,MAAM,GAAG,GAAG,KAAK,CAAA,OAAM,MAAM,KAAK,cAAc,IAAI,MAAM,CAAC,GAAG;AAC1D,iBAAA;AAAA,QAAA;AAAA,MACR,WACU,QAAQ,OAAO;AACzB,YAAI,MAAM,OAAO,KAAK,cAAc,MAAM,KAAK,MAAM,GAAG;AAChD,iBAAA;AAAA,QAAA;AAAA,MAEE,WAAAC,YAAA,SAAS,OAAO,OAAO,GAAG,CAAC,KAAK,KAAK,mBAAmB,MAAM,GAAG,CAAoB,GAAG;AAC3F,eAAA;AAAA,MAAA;AAAA,IACR;AAEM,WAAA;AAAA,EAAA;AAAA,EAGA,mBAAmB,MAAgC;AACtD,QAAA,KAAK,WAAW,QAAW;AACvB,aAAA;AAAA,IAAA;AAEJ,QAAA,KAAK,OAAO,KAAK,IAAI,KAAK,QAAM,KAAK,mBAAmB,EAAE,CAAC,GAAG;AAC1D,aAAA;AAAA,IAAA;AAEJ,QAAA,KAAK,MAAM,KAAK,GAAG,KAAK,QAAM,KAAK,mBAAmB,EAAE,CAAC,GAAG;AACxD,aAAA;AAAA,IAAA;AAER,QAAI,KAAK,OAAO,KAAK,mBAAmB,KAAK,GAAG,GAAG;AAC3C,aAAA;AAAA,IAAA;AAED,WAAA;AAAA,EAAA;AAET;;"}
|
|
1
|
+
{"version":3,"file":"WhereBuilder.cjs","sources":["../../../../../../packages/engine-content-api/src/mapper/select/WhereBuilder.ts"],"sourcesContent":["import { isIt } from '../../utils'\nimport { acceptFieldVisitor, isColumn } from '@contember/schema-utils'\nimport { Input, Model } from '@contember/schema'\nimport { Path, PathFactory } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { ConditionBuilder } from './ConditionBuilder'\nimport {\n\tConditionBuilder as SqlConditionBuilder,\n\tLiteral,\n\tOperator,\n\tQueryBuilder,\n\tSelectBuilder, wrapIdentifier,\n} from '@contember/database'\nimport { WhereOptimizationHints, WhereOptimizer } from './optimizer/WhereOptimizer'\n\nexport class WhereBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly conditionBuilder: ConditionBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly whereOptimizer: WhereOptimizer,\n\t\tprivate readonly useExistsInHasManyFilter: boolean,\n\t) {}\n\n\tpublic build<R extends SelectBuilder.Result>(\n\t\tqb: SelectBuilder<R>,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\n\tpublic buildAdvanced<R extends SelectBuilder.Result>(\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\tcallback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback,\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\tprivate buildInternal<R extends SelectBuilder.Result>({\n\t\tcallback,\n\t\t...args\n\t}: { entity: Model.Entity; path: Path; where: Input.OptionalWhere; callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>; allowManyJoin: boolean },\n\t): SelectBuilder<R> {\n\t\tconst joinList: WhereJoinDefinition[] = []\n\n\t\tconst qbWithWhere = callback(clause => this.buildRecursive({\n\t\t\tconditionBuilder: clause,\n\t\t\tjoinList: joinList,\n\t\t\t...args,\n\t\t}))\n\t\treturn joinList.reduce<SelectBuilder<R>>(\n\t\t\t(qb, { path, entity, relationName }) => this.joinBuilder.join<R>(qb, path, entity, relationName),\n\t\t\tqbWithWhere,\n\t\t)\n\t}\n\n\tprivate buildRecursive({\n\t\tconditionBuilder,\n\t\tentity,\n\t\tpath,\n\t\twhere,\n\t\tjoinList,\n\t\tallowManyJoin,\n\t}: { conditionBuilder: SqlConditionBuilder; entity: Model.Entity; path: Path; where: Input.OptionalWhere; joinList: WhereJoinDefinition[]; allowManyJoin: boolean },\n\t): SqlConditionBuilder {\n\t\tconst tableName = path.alias\n\n\t\tif (where.and !== undefined && where.and !== null && where.and.length > 0) {\n\t\t\tconst expr = where.and\n\t\t\tconditionBuilder = conditionBuilder.and(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where ? clause2 : this.buildRecursive({\n\t\t\t\t\t\t\tconditionBuilder: clause2,\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t}),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.or !== undefined && where.or !== null && where.or.length > 0) {\n\t\t\tconst expr = where.or\n\t\t\tconditionBuilder = conditionBuilder.or(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where\n\t\t\t\t\t\t\t? clause2\n\t\t\t\t\t\t\t: clause2.and(clause3 => this.buildRecursive({\n\t\t\t\t\t\t\t\tconditionBuilder: clause3,\n\t\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.not !== undefined && where.not !== null) {\n\t\t\tconst expr = where.not\n\t\t\tconditionBuilder = conditionBuilder.not(clause =>\n\t\t\t\tthis.buildRecursive({\n\t\t\t\t\tconditionBuilder: clause,\n\t\t\t\t\tentity,\n\t\t\t\t\tpath,\n\t\t\t\t\twhere: expr,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tfor (const fieldName in where) {\n\t\t\tif (fieldName === 'and' || fieldName === 'or' || fieldName === 'not') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst fieldWhere = where[fieldName]\n\t\t\tif (!fieldWhere) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst targetPath = path.for(fieldName)\n\n\t\t\tconst joinedWhere = ({ targetEntity, relation, entity }: Model.AnyRelationContext): SqlConditionBuilder => {\n\t\t\t\tconst relationWhere = where[fieldName] as Input.OptionalWhere | null\n\t\t\t\tif (!relationWhere || Object.keys(relationWhere).length === 0) {\n\t\t\t\t\treturn conditionBuilder\n\t\t\t\t}\n\t\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\t\t\t\tif (primaryCondition !== null) {\n\t\t\t\t\t\treturn this.conditionBuilder.build(\n\t\t\t\t\t\t\tconditionBuilder,\n\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\trelation.joiningColumn.columnName,\n\t\t\t\t\t\t\t(targetEntity.fields[targetEntity.primary] as Model.AnyColumn),\n\t\t\t\t\t\t\tprimaryCondition,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tjoinList.push({ path: targetPath, entity, relationName: relation.name })\n\n\t\t\t\treturn this.buildRecursive({\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tentity: targetEntity,\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t})\n\t\t\t}\n\n\n\n\t\t\tconditionBuilder = acceptFieldVisitor<SqlConditionBuilder>(this.schema, entity, fieldName, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\treturn this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column, fieldWhere as Input.Condition<Input.ColumnValue>)\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: joinedWhere,\n\t\t\t\tvisitOneHasOneOwning: joinedWhere,\n\t\t\t\tvisitManyHasOne: joinedWhere,\n\t\t\t\tvisitManyHasManyInverse: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.targetRelation.joiningTable,\n\t\t\t\t\t\t\t'inverse',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = where[fieldName] as Input.Where | null\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.relation.joiningTable,\n\t\t\t\t\t\t\t'owning',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = fieldWhere as Input.OptionalWhere\n\n\t\t\t\t\tconst qb = this.hasRootIsNull(relationWhere, context.targetEntity)\n\t\t\t\t\t\t? SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(new Literal(`(select ${wrapIdentifier(tableName)}.${wrapIdentifier(entity.primaryColumn)})`), targetPath.for('tmp_').alias)\n\t\t\t\t\t\t\t.leftJoin(context.targetEntity.tableName, targetPath.alias, it =>\n\t\t\t\t\t\t\t\tit.columnsEq([targetPath.for('tmp_').alias, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(context.targetEntity.tableName, targetPath.alias)\n\t\t\t\t\t\t\t.where(it => it.columnsEq([tableName, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]))\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.buildInternal({\n\t\t\t\t\t\t\tentity: context.targetEntity,\n\t\t\t\t\t\t\tpath: targetPath,\n\t\t\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\t\t\t\t\tallowManyJoin: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\treturn conditionBuilder\n\t}\n\n\n\tprivate createManyHasManySubquery(\n\t\touterColumn: QueryBuilder.ColumnIdentifier,\n\t\trelationWhere: Input.OptionalWhere,\n\t\ttargetEntity: Model.Entity,\n\t\tjoiningTable: Model.JoiningTable,\n\t\tfromSide: 'owning' | 'inverse',\n\t\tpath: Path,\n\t) {\n\t\tconst fromColumn = fromSide === 'owning' ? joiningTable.joiningColumn.columnName : joiningTable.inverseJoiningColumn.columnName\n\t\tconst toColumn = fromSide === 'owning' ? joiningTable.inverseJoiningColumn.columnName : joiningTable.joiningColumn.columnName\n\t\tconst junctionPath = path.for('junction_')\n\t\tconst qb = SelectBuilder.create<SelectBuilder.Result>()\n\t\t\t.from(joiningTable.tableName, junctionPath.alias)\n\t\t\t.select(it => it.raw('1'))\n\t\t\t.where(it => it.columnsEq(outerColumn, [junctionPath.alias, fromColumn]))\n\n\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\tif (primaryCondition !== null) {\n\n\t\t\tconst columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn)\n\n\t\t\treturn qb.where(condition =>\n\t\t\t\tthis.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition),\n\t\t\t)\n\t\t}\n\n\t\tconst qbJoined = qb.join(targetEntity.tableName, path.alias, clause =>\n\t\t\tclause.compareColumns([junctionPath.alias, toColumn], Operator.eq, [path.alias, targetEntity.primary]),\n\t\t)\n\t\treturn this.buildInternal({\n\t\t\tentity: targetEntity,\n\t\t\tpath: this.pathFactory.create([], path.fullAlias),\n\t\t\twhere: relationWhere,\n\t\t\tcallback: cb => qbJoined.where(clause => cb(clause)),\n\t\t\tallowManyJoin: true,\n\t\t})\n\t}\n\n\tprivate transformWhereToPrimaryCondition(where: Input.OptionalWhere, primaryField: string): Input.Condition<never> | null {\n\t\tconst keys = Object.keys(where)\n\t\tif (keys.filter(it => !['and', 'or', 'not', primaryField].includes(it)).length > 0) {\n\t\t\treturn null\n\t\t}\n\t\tlet condition: {\n\t\t\tand?: Array<Input.Condition<never>>\n\t\t\tor?: Array<Input.Condition<never>>\n\t\t\tnot?: Input.Condition<never>\n\t\t} = {}\n\t\tif (where.and) {\n\t\t\tconst conditions = where.and\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.and = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.or) {\n\t\t\tconst conditions = where.or\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.or = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.not) {\n\t\t\tconst conditions = this.transformWhereToPrimaryCondition(where.not, primaryField)\n\t\t\tif (conditions === null) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.not = conditions as Input.Condition<never>\n\t\t}\n\t\tif (where[primaryField]) {\n\t\t\tif (Object.keys(condition).length > 0) {\n\t\t\t\treturn { and: [condition, where[primaryField] as Input.Condition<never>] }\n\t\t\t}\n\t\t\treturn where[primaryField] as Input.Condition<never>\n\t\t}\n\t\treturn condition\n\t}\n\n\tprivate hasRootIsNull(where: Input.OptionalWhere, entity: Model.Entity): boolean {\n\t\tfor (const key in where) {\n\t\t\tif (key === 'and' || key === 'or') {\n\t\t\t\tif (where[key]?.some(it => it && this.hasRootIsNull(it, entity))) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (key === 'not') {\n\t\t\t\tif (where.not && this.hasRootIsNull(where.not, entity)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (isColumn(entity.fields[key]) && this.conditionHasIsNull(where[key] as Input.Condition)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate conditionHasIsNull(cond: Input.Condition): boolean {\n\t\tif (cond.isNull !== undefined) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.and && cond.and.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.or && cond.or.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.not && this.conditionHasIsNull(cond.not)) {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport type WhereJoinDefinition = { path: Path; entity: Model.Entity; relationName: string }\n"],"names":["where","entity","isIt","acceptFieldVisitor","SelectBuilder","Literal","wrapIdentifier","Operator","isColumn"],"mappings":"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"}
|
|
@@ -120,7 +120,7 @@ class WhereBuilder {
|
|
|
120
120
|
conditionBuilder,
|
|
121
121
|
tableName,
|
|
122
122
|
relation.joiningColumn.columnName,
|
|
123
|
-
targetEntity.fields[targetEntity.primary]
|
|
123
|
+
targetEntity.fields[targetEntity.primary],
|
|
124
124
|
primaryCondition
|
|
125
125
|
);
|
|
126
126
|
}
|
|
@@ -137,7 +137,7 @@ class WhereBuilder {
|
|
|
137
137
|
};
|
|
138
138
|
conditionBuilder = acceptFieldVisitor(this.schema, entity, fieldName, {
|
|
139
139
|
visitColumn: ({ entity: entity2, column }) => {
|
|
140
|
-
return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column
|
|
140
|
+
return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column, fieldWhere);
|
|
141
141
|
},
|
|
142
142
|
visitOneHasOneInverse: joinedWhere,
|
|
143
143
|
visitOneHasOneOwning: joinedWhere,
|
|
@@ -204,7 +204,7 @@ class WhereBuilder {
|
|
|
204
204
|
const qb = SelectBuilder.create().from(joiningTable.tableName, junctionPath.alias).select((it) => it.raw("1")).where((it) => it.columnsEq(outerColumn, [junctionPath.alias, fromColumn]));
|
|
205
205
|
const primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary);
|
|
206
206
|
if (primaryCondition !== null) {
|
|
207
|
-
const columnType = targetEntity.fields[targetEntity.primary]
|
|
207
|
+
const columnType = targetEntity.fields[targetEntity.primary];
|
|
208
208
|
return qb.where(
|
|
209
209
|
(condition) => this.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition)
|
|
210
210
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/WhereBuilder.ts"],"sourcesContent":["import { isIt } from '../../utils'\nimport { acceptFieldVisitor, isColumn } from '@contember/schema-utils'\nimport { Input, Model } from '@contember/schema'\nimport { Path, PathFactory } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { ConditionBuilder } from './ConditionBuilder'\nimport {\n\tConditionBuilder as SqlConditionBuilder,\n\tLiteral,\n\tOperator,\n\tQueryBuilder,\n\tSelectBuilder, wrapIdentifier,\n} from '@contember/database'\nimport { WhereOptimizationHints, WhereOptimizer } from './optimizer/WhereOptimizer'\n\nexport class WhereBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly conditionBuilder: ConditionBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly whereOptimizer: WhereOptimizer,\n\t\tprivate readonly useExistsInHasManyFilter: boolean,\n\t) {}\n\n\tpublic build<R extends SelectBuilder.Result>(\n\t\tqb: SelectBuilder<R>,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\n\tpublic buildAdvanced<R extends SelectBuilder.Result>(\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\tcallback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback,\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\tprivate buildInternal<R extends SelectBuilder.Result>({\n\t\tcallback,\n\t\t...args\n\t}: { entity: Model.Entity; path: Path; where: Input.OptionalWhere; callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>; allowManyJoin: boolean },\n\t): SelectBuilder<R> {\n\t\tconst joinList: WhereJoinDefinition[] = []\n\n\t\tconst qbWithWhere = callback(clause => this.buildRecursive({\n\t\t\tconditionBuilder: clause,\n\t\t\tjoinList: joinList,\n\t\t\t...args,\n\t\t}))\n\t\treturn joinList.reduce<SelectBuilder<R>>(\n\t\t\t(qb, { path, entity, relationName }) => this.joinBuilder.join<R>(qb, path, entity, relationName),\n\t\t\tqbWithWhere,\n\t\t)\n\t}\n\n\tprivate buildRecursive({\n\t\tconditionBuilder,\n\t\tentity,\n\t\tpath,\n\t\twhere,\n\t\tjoinList,\n\t\tallowManyJoin,\n\t}: { conditionBuilder: SqlConditionBuilder; entity: Model.Entity; path: Path; where: Input.OptionalWhere; joinList: WhereJoinDefinition[]; allowManyJoin: boolean },\n\t): SqlConditionBuilder {\n\t\tconst tableName = path.alias\n\n\t\tif (where.and !== undefined && where.and !== null && where.and.length > 0) {\n\t\t\tconst expr = where.and\n\t\t\tconditionBuilder = conditionBuilder.and(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where ? clause2 : this.buildRecursive({\n\t\t\t\t\t\t\tconditionBuilder: clause2,\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t}),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.or !== undefined && where.or !== null && where.or.length > 0) {\n\t\t\tconst expr = where.or\n\t\t\tconditionBuilder = conditionBuilder.or(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where\n\t\t\t\t\t\t\t? clause2\n\t\t\t\t\t\t\t: clause2.and(clause3 => this.buildRecursive({\n\t\t\t\t\t\t\t\tconditionBuilder: clause3,\n\t\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.not !== undefined && where.not !== null) {\n\t\t\tconst expr = where.not\n\t\t\tconditionBuilder = conditionBuilder.not(clause =>\n\t\t\t\tthis.buildRecursive({\n\t\t\t\t\tconditionBuilder: clause,\n\t\t\t\t\tentity,\n\t\t\t\t\tpath,\n\t\t\t\t\twhere: expr,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tfor (const fieldName in where) {\n\t\t\tif (fieldName === 'and' || fieldName === 'or' || fieldName === 'not') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst fieldWhere = where[fieldName]\n\t\t\tif (!fieldWhere) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst targetPath = path.for(fieldName)\n\n\t\t\tconst joinedWhere = ({ targetEntity, relation, entity }: Model.AnyRelationContext): SqlConditionBuilder => {\n\t\t\t\tconst relationWhere = where[fieldName] as Input.OptionalWhere | null\n\t\t\t\tif (!relationWhere || Object.keys(relationWhere).length === 0) {\n\t\t\t\t\treturn conditionBuilder\n\t\t\t\t}\n\t\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\t\t\t\tif (primaryCondition !== null) {\n\t\t\t\t\t\treturn this.conditionBuilder.build(\n\t\t\t\t\t\t\tconditionBuilder,\n\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\trelation.joiningColumn.columnName,\n\t\t\t\t\t\t\t(targetEntity.fields[targetEntity.primary] as Model.AnyColumn).columnType,\n\t\t\t\t\t\t\tprimaryCondition,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tjoinList.push({ path: targetPath, entity, relationName: relation.name })\n\n\t\t\t\treturn this.buildRecursive({\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tentity: targetEntity,\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t})\n\t\t\t}\n\n\n\n\t\t\tconditionBuilder = acceptFieldVisitor<SqlConditionBuilder>(this.schema, entity, fieldName, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\treturn this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column.columnType, fieldWhere as Input.Condition<Input.ColumnValue>)\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: joinedWhere,\n\t\t\t\tvisitOneHasOneOwning: joinedWhere,\n\t\t\t\tvisitManyHasOne: joinedWhere,\n\t\t\t\tvisitManyHasManyInverse: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.targetRelation.joiningTable,\n\t\t\t\t\t\t\t'inverse',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = where[fieldName] as Input.Where | null\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.relation.joiningTable,\n\t\t\t\t\t\t\t'owning',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = fieldWhere as Input.OptionalWhere\n\n\t\t\t\t\tconst qb = this.hasRootIsNull(relationWhere, context.targetEntity)\n\t\t\t\t\t\t? SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(new Literal(`(select ${wrapIdentifier(tableName)}.${wrapIdentifier(entity.primaryColumn)})`), targetPath.for('tmp_').alias)\n\t\t\t\t\t\t\t.leftJoin(context.targetEntity.tableName, targetPath.alias, it =>\n\t\t\t\t\t\t\t\tit.columnsEq([targetPath.for('tmp_').alias, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(context.targetEntity.tableName, targetPath.alias)\n\t\t\t\t\t\t\t.where(it => it.columnsEq([tableName, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]))\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.buildInternal({\n\t\t\t\t\t\t\tentity: context.targetEntity,\n\t\t\t\t\t\t\tpath: targetPath,\n\t\t\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\t\t\t\t\tallowManyJoin: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\treturn conditionBuilder\n\t}\n\n\n\tprivate createManyHasManySubquery(\n\t\touterColumn: QueryBuilder.ColumnIdentifier,\n\t\trelationWhere: Input.OptionalWhere,\n\t\ttargetEntity: Model.Entity,\n\t\tjoiningTable: Model.JoiningTable,\n\t\tfromSide: 'owning' | 'inverse',\n\t\tpath: Path,\n\t) {\n\t\tconst fromColumn = fromSide === 'owning' ? joiningTable.joiningColumn.columnName : joiningTable.inverseJoiningColumn.columnName\n\t\tconst toColumn = fromSide === 'owning' ? joiningTable.inverseJoiningColumn.columnName : joiningTable.joiningColumn.columnName\n\t\tconst junctionPath = path.for('junction_')\n\t\tconst qb = SelectBuilder.create<SelectBuilder.Result>()\n\t\t\t.from(joiningTable.tableName, junctionPath.alias)\n\t\t\t.select(it => it.raw('1'))\n\t\t\t.where(it => it.columnsEq(outerColumn, [junctionPath.alias, fromColumn]))\n\n\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\tif (primaryCondition !== null) {\n\n\t\t\tconst columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn).columnType\n\n\t\t\treturn qb.where(condition =>\n\t\t\t\tthis.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition),\n\t\t\t)\n\t\t}\n\n\t\tconst qbJoined = qb.join(targetEntity.tableName, path.alias, clause =>\n\t\t\tclause.compareColumns([junctionPath.alias, toColumn], Operator.eq, [path.alias, targetEntity.primary]),\n\t\t)\n\t\treturn this.buildInternal({\n\t\t\tentity: targetEntity,\n\t\t\tpath: this.pathFactory.create([], path.fullAlias),\n\t\t\twhere: relationWhere,\n\t\t\tcallback: cb => qbJoined.where(clause => cb(clause)),\n\t\t\tallowManyJoin: true,\n\t\t})\n\t}\n\n\tprivate transformWhereToPrimaryCondition(where: Input.OptionalWhere, primaryField: string): Input.Condition<never> | null {\n\t\tconst keys = Object.keys(where)\n\t\tif (keys.filter(it => !['and', 'or', 'not', primaryField].includes(it)).length > 0) {\n\t\t\treturn null\n\t\t}\n\t\tlet condition: {\n\t\t\tand?: Array<Input.Condition<never>>\n\t\t\tor?: Array<Input.Condition<never>>\n\t\t\tnot?: Input.Condition<never>\n\t\t} = {}\n\t\tif (where.and) {\n\t\t\tconst conditions = where.and\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.and = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.or) {\n\t\t\tconst conditions = where.or\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.or = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.not) {\n\t\t\tconst conditions = this.transformWhereToPrimaryCondition(where.not, primaryField)\n\t\t\tif (conditions === null) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.not = conditions as Input.Condition<never>\n\t\t}\n\t\tif (where[primaryField]) {\n\t\t\tif (Object.keys(condition).length > 0) {\n\t\t\t\treturn { and: [condition, where[primaryField] as Input.Condition<never>] }\n\t\t\t}\n\t\t\treturn where[primaryField] as Input.Condition<never>\n\t\t}\n\t\treturn condition\n\t}\n\n\tprivate hasRootIsNull(where: Input.OptionalWhere, entity: Model.Entity): boolean {\n\t\tfor (const key in where) {\n\t\t\tif (key === 'and' || key === 'or') {\n\t\t\t\tif (where[key]?.some(it => it && this.hasRootIsNull(it, entity))) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (key === 'not') {\n\t\t\t\tif (where.not && this.hasRootIsNull(where.not, entity)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (isColumn(entity.fields[key]) && this.conditionHasIsNull(where[key] as Input.Condition)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate conditionHasIsNull(cond: Input.Condition): boolean {\n\t\tif (cond.isNull !== undefined) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.and && cond.and.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.or && cond.or.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.not && this.conditionHasIsNull(cond.not)) {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport type WhereJoinDefinition = { path: Path; entity: Model.Entity; relationName: string }\n"],"names":["where","entity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WhereBuilder.js","sources":["../../../../../../packages/engine-content-api/src/mapper/select/WhereBuilder.ts"],"sourcesContent":["import { isIt } from '../../utils'\nimport { acceptFieldVisitor, isColumn } from '@contember/schema-utils'\nimport { Input, Model } from '@contember/schema'\nimport { Path, PathFactory } from './Path'\nimport { JoinBuilder } from './JoinBuilder'\nimport { ConditionBuilder } from './ConditionBuilder'\nimport {\n\tConditionBuilder as SqlConditionBuilder,\n\tLiteral,\n\tOperator,\n\tQueryBuilder,\n\tSelectBuilder, wrapIdentifier,\n} from '@contember/database'\nimport { WhereOptimizationHints, WhereOptimizer } from './optimizer/WhereOptimizer'\n\nexport class WhereBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly conditionBuilder: ConditionBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t\tprivate readonly whereOptimizer: WhereOptimizer,\n\t\tprivate readonly useExistsInHasManyFilter: boolean,\n\t) {}\n\n\tpublic build<R extends SelectBuilder.Result>(\n\t\tqb: SelectBuilder<R>,\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\n\tpublic buildAdvanced<R extends SelectBuilder.Result>(\n\t\tentity: Model.Entity,\n\t\tpath: Path,\n\t\twhere: Input.OptionalWhere,\n\t\tcallback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>,\n\t\toptimizationHints: WhereOptimizationHints = {},\n\t): SelectBuilder<R> {\n\t\tconst optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)\n\t\treturn this.buildInternal({\n\t\t\tentity,\n\t\t\tpath,\n\t\t\twhere: optimizedWhere,\n\t\t\tcallback,\n\t\t\tallowManyJoin: false,\n\t\t})\n\t}\n\n\tprivate buildInternal<R extends SelectBuilder.Result>({\n\t\tcallback,\n\t\t...args\n\t}: { entity: Model.Entity; path: Path; where: Input.OptionalWhere; callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>; allowManyJoin: boolean },\n\t): SelectBuilder<R> {\n\t\tconst joinList: WhereJoinDefinition[] = []\n\n\t\tconst qbWithWhere = callback(clause => this.buildRecursive({\n\t\t\tconditionBuilder: clause,\n\t\t\tjoinList: joinList,\n\t\t\t...args,\n\t\t}))\n\t\treturn joinList.reduce<SelectBuilder<R>>(\n\t\t\t(qb, { path, entity, relationName }) => this.joinBuilder.join<R>(qb, path, entity, relationName),\n\t\t\tqbWithWhere,\n\t\t)\n\t}\n\n\tprivate buildRecursive({\n\t\tconditionBuilder,\n\t\tentity,\n\t\tpath,\n\t\twhere,\n\t\tjoinList,\n\t\tallowManyJoin,\n\t}: { conditionBuilder: SqlConditionBuilder; entity: Model.Entity; path: Path; where: Input.OptionalWhere; joinList: WhereJoinDefinition[]; allowManyJoin: boolean },\n\t): SqlConditionBuilder {\n\t\tconst tableName = path.alias\n\n\t\tif (where.and !== undefined && where.and !== null && where.and.length > 0) {\n\t\t\tconst expr = where.and\n\t\t\tconditionBuilder = conditionBuilder.and(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where ? clause2 : this.buildRecursive({\n\t\t\t\t\t\t\tconditionBuilder: clause2,\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t}),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.or !== undefined && where.or !== null && where.or.length > 0) {\n\t\t\tconst expr = where.or\n\t\t\tconditionBuilder = conditionBuilder.or(clause =>\n\t\t\t\texpr.reduce(\n\t\t\t\t\t(clause2, where) =>\n\t\t\t\t\t\t!where\n\t\t\t\t\t\t\t? clause2\n\t\t\t\t\t\t\t: clause2.and(clause3 => this.buildRecursive({\n\t\t\t\t\t\t\t\tconditionBuilder: clause3,\n\t\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\twhere,\n\t\t\t\t\t\t\t\tjoinList,\n\t\t\t\t\t\t\t\tallowManyJoin,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\tclause,\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (where.not !== undefined && where.not !== null) {\n\t\t\tconst expr = where.not\n\t\t\tconditionBuilder = conditionBuilder.not(clause =>\n\t\t\t\tthis.buildRecursive({\n\t\t\t\t\tconditionBuilder: clause,\n\t\t\t\t\tentity,\n\t\t\t\t\tpath,\n\t\t\t\t\twhere: expr,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tfor (const fieldName in where) {\n\t\t\tif (fieldName === 'and' || fieldName === 'or' || fieldName === 'not') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst fieldWhere = where[fieldName]\n\t\t\tif (!fieldWhere) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst targetPath = path.for(fieldName)\n\n\t\t\tconst joinedWhere = ({ targetEntity, relation, entity }: Model.AnyRelationContext): SqlConditionBuilder => {\n\t\t\t\tconst relationWhere = where[fieldName] as Input.OptionalWhere | null\n\t\t\t\tif (!relationWhere || Object.keys(relationWhere).length === 0) {\n\t\t\t\t\treturn conditionBuilder\n\t\t\t\t}\n\t\t\t\tif (isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {\n\t\t\t\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\t\t\t\tif (primaryCondition !== null) {\n\t\t\t\t\t\treturn this.conditionBuilder.build(\n\t\t\t\t\t\t\tconditionBuilder,\n\t\t\t\t\t\t\ttableName,\n\t\t\t\t\t\t\trelation.joiningColumn.columnName,\n\t\t\t\t\t\t\t(targetEntity.fields[targetEntity.primary] as Model.AnyColumn),\n\t\t\t\t\t\t\tprimaryCondition,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tjoinList.push({ path: targetPath, entity, relationName: relation.name })\n\n\t\t\t\treturn this.buildRecursive({\n\t\t\t\t\tconditionBuilder,\n\t\t\t\t\tentity: targetEntity,\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\tjoinList,\n\t\t\t\t\tallowManyJoin,\n\t\t\t\t})\n\t\t\t}\n\n\n\n\t\t\tconditionBuilder = acceptFieldVisitor<SqlConditionBuilder>(this.schema, entity, fieldName, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\treturn this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column, fieldWhere as Input.Condition<Input.ColumnValue>)\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: joinedWhere,\n\t\t\t\tvisitOneHasOneOwning: joinedWhere,\n\t\t\t\tvisitManyHasOne: joinedWhere,\n\t\t\t\tvisitManyHasManyInverse: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.targetRelation.joiningTable,\n\t\t\t\t\t\t\t'inverse',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = where[fieldName] as Input.Where | null\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.createManyHasManySubquery(\n\t\t\t\t\t\t\t[tableName, entity.primaryColumn],\n\t\t\t\t\t\t\tfieldWhere as Input.OptionalWhere,\n\t\t\t\t\t\t\tcontext.targetEntity,\n\t\t\t\t\t\t\tcontext.relation.joiningTable,\n\t\t\t\t\t\t\t'owning',\n\t\t\t\t\t\t\ttargetPath,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: context => {\n\t\t\t\t\tif (allowManyJoin && !this.useExistsInHasManyFilter) {\n\t\t\t\t\t\treturn joinedWhere(context)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst relationWhere = fieldWhere as Input.OptionalWhere\n\n\t\t\t\t\tconst qb = this.hasRootIsNull(relationWhere, context.targetEntity)\n\t\t\t\t\t\t? SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(new Literal(`(select ${wrapIdentifier(tableName)}.${wrapIdentifier(entity.primaryColumn)})`), targetPath.for('tmp_').alias)\n\t\t\t\t\t\t\t.leftJoin(context.targetEntity.tableName, targetPath.alias, it =>\n\t\t\t\t\t\t\t\tit.columnsEq([targetPath.for('tmp_').alias, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: SelectBuilder.create()\n\t\t\t\t\t\t\t.select(it => it.raw('1'))\n\t\t\t\t\t\t\t.from(context.targetEntity.tableName, targetPath.alias)\n\t\t\t\t\t\t\t.where(it => it.columnsEq([tableName, entity.primaryColumn], [targetPath.alias, context.targetRelation.joiningColumn.columnName]))\n\n\t\t\t\t\treturn conditionBuilder.exists(\n\t\t\t\t\t\tthis.buildInternal({\n\t\t\t\t\t\t\tentity: context.targetEntity,\n\t\t\t\t\t\t\tpath: targetPath,\n\t\t\t\t\t\t\twhere: relationWhere,\n\t\t\t\t\t\t\tcallback: cb => qb.where(clause => cb(clause)),\n\t\t\t\t\t\t\tallowManyJoin: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\treturn conditionBuilder\n\t}\n\n\n\tprivate createManyHasManySubquery(\n\t\touterColumn: QueryBuilder.ColumnIdentifier,\n\t\trelationWhere: Input.OptionalWhere,\n\t\ttargetEntity: Model.Entity,\n\t\tjoiningTable: Model.JoiningTable,\n\t\tfromSide: 'owning' | 'inverse',\n\t\tpath: Path,\n\t) {\n\t\tconst fromColumn = fromSide === 'owning' ? joiningTable.joiningColumn.columnName : joiningTable.inverseJoiningColumn.columnName\n\t\tconst toColumn = fromSide === 'owning' ? joiningTable.inverseJoiningColumn.columnName : joiningTable.joiningColumn.columnName\n\t\tconst junctionPath = path.for('junction_')\n\t\tconst qb = SelectBuilder.create<SelectBuilder.Result>()\n\t\t\t.from(joiningTable.tableName, junctionPath.alias)\n\t\t\t.select(it => it.raw('1'))\n\t\t\t.where(it => it.columnsEq(outerColumn, [junctionPath.alias, fromColumn]))\n\n\t\tconst primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)\n\t\tif (primaryCondition !== null) {\n\n\t\t\tconst columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn)\n\n\t\t\treturn qb.where(condition =>\n\t\t\t\tthis.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition),\n\t\t\t)\n\t\t}\n\n\t\tconst qbJoined = qb.join(targetEntity.tableName, path.alias, clause =>\n\t\t\tclause.compareColumns([junctionPath.alias, toColumn], Operator.eq, [path.alias, targetEntity.primary]),\n\t\t)\n\t\treturn this.buildInternal({\n\t\t\tentity: targetEntity,\n\t\t\tpath: this.pathFactory.create([], path.fullAlias),\n\t\t\twhere: relationWhere,\n\t\t\tcallback: cb => qbJoined.where(clause => cb(clause)),\n\t\t\tallowManyJoin: true,\n\t\t})\n\t}\n\n\tprivate transformWhereToPrimaryCondition(where: Input.OptionalWhere, primaryField: string): Input.Condition<never> | null {\n\t\tconst keys = Object.keys(where)\n\t\tif (keys.filter(it => !['and', 'or', 'not', primaryField].includes(it)).length > 0) {\n\t\t\treturn null\n\t\t}\n\t\tlet condition: {\n\t\t\tand?: Array<Input.Condition<never>>\n\t\t\tor?: Array<Input.Condition<never>>\n\t\t\tnot?: Input.Condition<never>\n\t\t} = {}\n\t\tif (where.and) {\n\t\t\tconst conditions = where.and\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.and = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.or) {\n\t\t\tconst conditions = where.or\n\t\t\t\t.filter((it): it is Input.Where => !!it)\n\t\t\t\t.map(it => this.transformWhereToPrimaryCondition(it, primaryField))\n\t\t\tif (conditions.includes(null)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.or = conditions as Input.Condition<never>[]\n\t\t}\n\t\tif (where.not) {\n\t\t\tconst conditions = this.transformWhereToPrimaryCondition(where.not, primaryField)\n\t\t\tif (conditions === null) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tcondition.not = conditions as Input.Condition<never>\n\t\t}\n\t\tif (where[primaryField]) {\n\t\t\tif (Object.keys(condition).length > 0) {\n\t\t\t\treturn { and: [condition, where[primaryField] as Input.Condition<never>] }\n\t\t\t}\n\t\t\treturn where[primaryField] as Input.Condition<never>\n\t\t}\n\t\treturn condition\n\t}\n\n\tprivate hasRootIsNull(where: Input.OptionalWhere, entity: Model.Entity): boolean {\n\t\tfor (const key in where) {\n\t\t\tif (key === 'and' || key === 'or') {\n\t\t\t\tif (where[key]?.some(it => it && this.hasRootIsNull(it, entity))) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (key === 'not') {\n\t\t\t\tif (where.not && this.hasRootIsNull(where.not, entity)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (isColumn(entity.fields[key]) && this.conditionHasIsNull(where[key] as Input.Condition)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate conditionHasIsNull(cond: Input.Condition): boolean {\n\t\tif (cond.isNull !== undefined) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.and && cond.and.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.or && cond.or.some(it => this.conditionHasIsNull(it))) {\n\t\t\treturn true\n\t\t}\n\t\tif (cond.not && this.conditionHasIsNull(cond.not)) {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport type WhereJoinDefinition = { path: Path; entity: Model.Entity; relationName: string }\n"],"names":["where","entity"],"mappings":";;;AAeO,MAAM,aAAa;AAAA,EACzB,YACkB,QACA,aACA,kBACA,aACA,gBACA,0BAChB;AANgB,SAAA,SAAA;AACA,SAAA,cAAA;AACA,SAAA,mBAAA;AACA,SAAA,cAAA;AACA,SAAA,iBAAA;AACA,SAAA,2BAAA;AAAA,EAAA;AAAA,EAGX,MACN,IACA,QACA,MACA,OACA,oBAA4C,IACzB;AACnB,UAAM,iBAAiB,KAAK,eAAe,SAAS,OAAO,QAAQ,iBAAiB;AACpF,WAAO,KAAK,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAM,OAAA,GAAG,MAAM,CAAU,WAAA,GAAG,MAAM,CAAC;AAAA,MAC7C,eAAe;AAAA,IAAA,CACf;AAAA,EAAA;AAAA,EAIK,cACN,QACA,MACA,OACA,UACA,oBAA4C,IACzB;AACnB,UAAM,iBAAiB,KAAK,eAAe,SAAS,OAAO,QAAQ,iBAAiB;AACpF,WAAO,KAAK,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,eAAe;AAAA,IAAA,CACf;AAAA,EAAA;AAAA,EAGM,cAA8C;AAAA,IACrD;AAAA,IACA,GAAG;AAAA,EAAA,GAEgB;AACnB,UAAM,WAAkC,CAAC;AAEzC,UAAM,cAAc,SAAS,CAAU,WAAA,KAAK,eAAe;AAAA,MAC1D,kBAAkB;AAAA,MAClB;AAAA,MACA,GAAG;AAAA,IAAA,CACH,CAAC;AACF,WAAO,SAAS;AAAA,MACf,CAAC,IAAI,EAAE,MAAM,QAAQ,aAAA,MAAmB,KAAK,YAAY,KAAQ,IAAI,MAAM,QAAQ,YAAY;AAAA,MAC/F;AAAA,IACD;AAAA,EAAA;AAAA,EAGO,eAAe;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAEsB;AACtB,UAAM,YAAY,KAAK;AAEnB,QAAA,MAAM,QAAQ,UAAa,MAAM,QAAQ,QAAQ,MAAM,IAAI,SAAS,GAAG;AAC1E,YAAM,OAAO,MAAM;AACnB,yBAAmB,iBAAiB;AAAA,QAAI,YACvC,KAAK;AAAA,UACJ,CAAC,SAASA,WACT,CAACA,SAAQ,UAAU,KAAK,eAAe;AAAA,YACtC,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,YACA,OAAAA;AAAAA,YACA;AAAA,YACA;AAAA,UAAA,CACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEF;AAAA,IAAA;AAEG,QAAA,MAAM,OAAO,UAAa,MAAM,OAAO,QAAQ,MAAM,GAAG,SAAS,GAAG;AACvE,YAAM,OAAO,MAAM;AACnB,yBAAmB,iBAAiB;AAAA,QAAG,YACtC,KAAK;AAAA,UACJ,CAAC,SAASA,WACT,CAACA,SACE,UACA,QAAQ,IAAI,CAAW,YAAA,KAAK,eAAe;AAAA,YAC5C,kBAAkB;AAAA,YAClB;AAAA,YACA;AAAA,YACA,OAAAA;AAAAA,YACA;AAAA,YACA;AAAA,UAAA,CACA,CAAC;AAAA,UACJ;AAAA,QAAA;AAAA,MAEF;AAAA,IAAA;AAED,QAAI,MAAM,QAAQ,UAAa,MAAM,QAAQ,MAAM;AAClD,YAAM,OAAO,MAAM;AACnB,yBAAmB,iBAAiB;AAAA,QAAI,CAAA,WACvC,KAAK,eAAe;AAAA,UACnB,kBAAkB;AAAA,UAClB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QACA,CAAA;AAAA,MACF;AAAA,IAAA;AAGD,eAAW,aAAa,OAAO;AAC9B,UAAI,cAAc,SAAS,cAAc,QAAQ,cAAc,OAAO;AACrE;AAAA,MAAA;AAEK,YAAA,aAAa,MAAM,SAAS;AAClC,UAAI,CAAC,YAAY;AAChB;AAAA,MAAA;AAGK,YAAA,aAAa,KAAK,IAAI,SAAS;AAErC,YAAM,cAAc,CAAC,EAAE,cAAc,UAAU,QAAAC,cAA4D;AACpG,cAAA,gBAAgB,MAAM,SAAS;AACrC,YAAI,CAAC,iBAAiB,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AACvD,iBAAA;AAAA,QAAA;AAEJ,YAAA,KAAkC,UAAU,eAAe,GAAG;AACjE,gBAAM,mBAAmB,KAAK,iCAAiC,eAAe,aAAa,OAAO;AAClG,cAAI,qBAAqB,MAAM;AAC9B,mBAAO,KAAK,iBAAiB;AAAA,cAC5B;AAAA,cACA;AAAA,cACA,SAAS,cAAc;AAAA,cACtB,aAAa,OAAO,aAAa,OAAO;AAAA,cACzC;AAAA,YACD;AAAA,UAAA;AAAA,QACD;AAGQ,iBAAA,KAAK,EAAE,MAAM,YAAY,QAAAA,SAAQ,cAAc,SAAS,MAAM;AAEvE,eAAO,KAAK,eAAe;AAAA,UAC1B;AAAA,UACA,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QAAA,CACA;AAAA,MACF;AAIA,yBAAmB,mBAAwC,KAAK,QAAQ,QAAQ,WAAW;AAAA,QAC1F,aAAa,CAAC,EAAE,QAAAA,SAAQ,aAAa;AAC7B,iBAAA,KAAK,iBAAiB,MAAM,kBAAkB,WAAW,OAAO,YAAY,QAAQ,UAAgD;AAAA,QAC5I;AAAA,QACA,uBAAuB;AAAA,QACvB,sBAAsB;AAAA,QACtB,iBAAiB;AAAA,QACjB,yBAAyB,CAAW,YAAA;AAC/B,cAAA,iBAAiB,CAAC,KAAK,0BAA0B;AACpD,mBAAO,YAAY,OAAO;AAAA,UAAA;AAG3B,iBAAO,iBAAiB;AAAA,YACvB,KAAK;AAAA,cACJ,CAAC,WAAW,OAAO,aAAa;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ,eAAe;AAAA,cACvB;AAAA,cACA;AAAA,YAAA;AAAA,UAEF;AAAA,QACD;AAAA,QACA,wBAAwB,CAAW,YAAA;AAC9B,cAAA,iBAAiB,CAAC,KAAK,0BAA0B;AACpD,mBAAO,YAAY,OAAO;AAAA,UAAA;AAGL,gBAAM,SAAS;AAErC,iBAAO,iBAAiB;AAAA,YACvB,KAAK;AAAA,cACJ,CAAC,WAAW,OAAO,aAAa;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ,SAAS;AAAA,cACjB;AAAA,cACA;AAAA,YAAA;AAAA,UAEF;AAAA,QACD;AAAA,QACA,iBAAiB,CAAW,YAAA;AACvB,cAAA,iBAAiB,CAAC,KAAK,0BAA0B;AACpD,mBAAO,YAAY,OAAO;AAAA,UAAA;AAG3B,gBAAM,gBAAgB;AAEtB,gBAAM,KAAK,KAAK,cAAc,eAAe,QAAQ,YAAY,IAC9D,cAAc,OAAO,EACrB,OAAO,CAAM,OAAA,GAAG,IAAI,GAAG,CAAC,EACxB,KAAK,IAAI,QAAQ,WAAW,eAAe,SAAS,CAAC,IAAI,eAAe,OAAO,aAAa,CAAC,GAAG,GAAG,WAAW,IAAI,MAAM,EAAE,KAAK,EAC/H;AAAA,YAAS,QAAQ,aAAa;AAAA,YAAW,WAAW;AAAA,YAAO,QAC3D,GAAG,UAAU,CAAC,WAAW,IAAI,MAAM,EAAE,OAAO,OAAO,aAAa,GAAG,CAAC,WAAW,OAAO,QAAQ,eAAe,cAAc,UAAU,CAAC;AAAA,UAAA,IAEtI,cAAc,OAAO,EACrB,OAAO,CAAM,OAAA,GAAG,IAAI,GAAG,CAAC,EACxB,KAAK,QAAQ,aAAa,WAAW,WAAW,KAAK,EACrD,MAAM,QAAM,GAAG,UAAU,CAAC,WAAW,OAAO,aAAa,GAAG,CAAC,WAAW,OAAO,QAAQ,eAAe,cAAc,UAAU,CAAC,CAAC;AAEnI,iBAAO,iBAAiB;AAAA,YACvB,KAAK,cAAc;AAAA,cAClB,QAAQ,QAAQ;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU,CAAM,OAAA,GAAG,MAAM,CAAU,WAAA,GAAG,MAAM,CAAC;AAAA,cAC7C,eAAe;AAAA,YACf,CAAA;AAAA,UACF;AAAA,QAAA;AAAA,MACD,CACA;AAAA,IAAA;AAEK,WAAA;AAAA,EAAA;AAAA,EAIA,0BACP,aACA,eACA,cACA,cACA,UACA,MACC;AACD,UAAM,aAAa,aAAa,WAAW,aAAa,cAAc,aAAa,aAAa,qBAAqB;AACrH,UAAM,WAAW,aAAa,WAAW,aAAa,qBAAqB,aAAa,aAAa,cAAc;AAC7G,UAAA,eAAe,KAAK,IAAI,WAAW;AACnC,UAAA,KAAK,cAAc,OAAA,EACvB,KAAK,aAAa,WAAW,aAAa,KAAK,EAC/C,OAAO,CAAM,OAAA,GAAG,IAAI,GAAG,CAAC,EACxB,MAAM,CAAA,OAAM,GAAG,UAAU,aAAa,CAAC,aAAa,OAAO,UAAU,CAAC,CAAC;AAEzE,UAAM,mBAAmB,KAAK,iCAAiC,eAAe,aAAa,OAAO;AAClG,QAAI,qBAAqB,MAAM;AAE9B,YAAM,aAAc,aAAa,OAAO,aAAa,OAAO;AAE5D,aAAO,GAAG;AAAA,QAAM,CAAA,cACf,KAAK,iBAAiB,MAAM,WAAW,aAAa,OAAO,UAAU,YAAY,gBAAgB;AAAA,MAClG;AAAA,IAAA;AAGD,UAAM,WAAW,GAAG;AAAA,MAAK,aAAa;AAAA,MAAW,KAAK;AAAA,MAAO,CAC5D,WAAA,OAAO,eAAe,CAAC,aAAa,OAAO,QAAQ,GAAG,SAAS,IAAI,CAAC,KAAK,OAAO,aAAa,OAAO,CAAC;AAAA,IACtG;AACA,WAAO,KAAK,cAAc;AAAA,MACzB,QAAQ;AAAA,MACR,MAAM,KAAK,YAAY,OAAO,CAAC,GAAG,KAAK,SAAS;AAAA,MAChD,OAAO;AAAA,MACP,UAAU,CAAM,OAAA,SAAS,MAAM,CAAU,WAAA,GAAG,MAAM,CAAC;AAAA,MACnD,eAAe;AAAA,IAAA,CACf;AAAA,EAAA;AAAA,EAGM,iCAAiC,OAA4B,cAAqD;AACnH,UAAA,OAAO,OAAO,KAAK,KAAK;AAC9B,QAAI,KAAK,OAAO,CAAM,OAAA,CAAC,CAAC,OAAO,MAAM,OAAO,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG;AAC5E,aAAA;AAAA,IAAA;AAER,QAAI,YAIA,CAAC;AACL,QAAI,MAAM,KAAK;AACd,YAAM,aAAa,MAAM,IACvB,OAAO,CAAC,OAA0B,CAAC,CAAC,EAAE,EACtC,IAAI,CAAM,OAAA,KAAK,iCAAiC,IAAI,YAAY,CAAC;AAC/D,UAAA,WAAW,SAAS,IAAI,GAAG;AACvB,eAAA;AAAA,MAAA;AAER,gBAAU,MAAM;AAAA,IAAA;AAEjB,QAAI,MAAM,IAAI;AACb,YAAM,aAAa,MAAM,GACvB,OAAO,CAAC,OAA0B,CAAC,CAAC,EAAE,EACtC,IAAI,CAAM,OAAA,KAAK,iCAAiC,IAAI,YAAY,CAAC;AAC/D,UAAA,WAAW,SAAS,IAAI,GAAG;AACvB,eAAA;AAAA,MAAA;AAER,gBAAU,KAAK;AAAA,IAAA;AAEhB,QAAI,MAAM,KAAK;AACd,YAAM,aAAa,KAAK,iCAAiC,MAAM,KAAK,YAAY;AAChF,UAAI,eAAe,MAAM;AACjB,eAAA;AAAA,MAAA;AAER,gBAAU,MAAM;AAAA,IAAA;AAEb,QAAA,MAAM,YAAY,GAAG;AACxB,UAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACtC,eAAO,EAAE,KAAK,CAAC,WAAW,MAAM,YAAY,CAA2B,EAAE;AAAA,MAAA;AAE1E,aAAO,MAAM,YAAY;AAAA,IAAA;AAEnB,WAAA;AAAA,EAAA;AAAA,EAGA,cAAc,OAA4B,QAA+B;AAChF,eAAW,OAAO,OAAO;AACpB,UAAA,QAAQ,SAAS,QAAQ,MAAM;AAC9B,YAAA,MAAM,GAAG,GAAG,KAAK,CAAA,OAAM,MAAM,KAAK,cAAc,IAAI,MAAM,CAAC,GAAG;AAC1D,iBAAA;AAAA,QAAA;AAAA,MACR,WACU,QAAQ,OAAO;AACzB,YAAI,MAAM,OAAO,KAAK,cAAc,MAAM,KAAK,MAAM,GAAG;AAChD,iBAAA;AAAA,QAAA;AAAA,MAEE,WAAA,SAAS,OAAO,OAAO,GAAG,CAAC,KAAK,KAAK,mBAAmB,MAAM,GAAG,CAAoB,GAAG;AAC3F,eAAA;AAAA,MAAA;AAAA,IACR;AAEM,WAAA;AAAA,EAAA;AAAA,EAGA,mBAAmB,MAAgC;AACtD,QAAA,KAAK,WAAW,QAAW;AACvB,aAAA;AAAA,IAAA;AAEJ,QAAA,KAAK,OAAO,KAAK,IAAI,KAAK,QAAM,KAAK,mBAAmB,EAAE,CAAC,GAAG;AAC1D,aAAA;AAAA,IAAA;AAEJ,QAAA,KAAK,MAAM,KAAK,GAAG,KAAK,QAAM,KAAK,mBAAmB,EAAE,CAAC,GAAG;AACxD,aAAA;AAAA,IAAA;AAER,QAAI,KAAK,OAAO,KAAK,mBAAmB,KAAK,GAAG,GAAG;AAC3C,aAAA;AAAA,IAAA;AAED,WAAA;AAAA,EAAA;AAET;"}
|
|
@@ -2,18 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const schema = require("@contember/schema");
|
|
4
4
|
const Database = require("@contember/database");
|
|
5
|
+
const schemaUtils = require("@contember/schema-utils");
|
|
6
|
+
const viewComputedId = require("../../../utils/viewComputedId.cjs");
|
|
5
7
|
class FieldsVisitor {
|
|
6
|
-
constructor(relationFetcher, predicateFactory, mapper, executionContext, relationPath, settings) {
|
|
8
|
+
constructor(schema2, relationFetcher, predicateFactory, mapper, executionContext, relationPath, settings, providers) {
|
|
9
|
+
this.schema = schema2;
|
|
7
10
|
this.relationFetcher = relationFetcher;
|
|
8
11
|
this.predicateFactory = predicateFactory;
|
|
9
12
|
this.mapper = mapper;
|
|
10
13
|
this.executionContext = executionContext;
|
|
11
14
|
this.relationPath = relationPath;
|
|
12
15
|
this.settings = settings;
|
|
16
|
+
this.providers = providers;
|
|
13
17
|
}
|
|
14
18
|
visitColumn({ entity, column }) {
|
|
15
19
|
const columnPath = this.executionContext.path;
|
|
16
|
-
const
|
|
20
|
+
const tablePath = columnPath.back();
|
|
21
|
+
const tableAlias = tablePath.alias;
|
|
17
22
|
const columnAlias = columnPath.alias;
|
|
18
23
|
let selectFrom = Database.wrapIdentifier(tableAlias) + "." + Database.wrapIdentifier(column.columnName);
|
|
19
24
|
if (column.type === schema.Model.ColumnType.Date && this.settings.shortDateResponse) {
|
|
@@ -22,9 +27,34 @@ class FieldsVisitor {
|
|
|
22
27
|
if (column.type === schema.Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {
|
|
23
28
|
selectFrom += "::text";
|
|
24
29
|
}
|
|
30
|
+
if (column.type === schema.Model.ColumnType.Enum && column.list) {
|
|
31
|
+
selectFrom += "::text[]";
|
|
32
|
+
}
|
|
33
|
+
let columnValueGetter = void 0;
|
|
34
|
+
if (entity.view && column.name === entity.primary && column.type === schema.Model.ColumnType.Uuid) {
|
|
35
|
+
if (entity.view.idSource) {
|
|
36
|
+
const aliases = [];
|
|
37
|
+
for (const source of entity.view.idSource) {
|
|
38
|
+
const columnName = schemaUtils.getColumnName(this.schema, entity, source);
|
|
39
|
+
const idSrcPath = columnPath.for(source + "__id_src");
|
|
40
|
+
aliases.push(idSrcPath.alias);
|
|
41
|
+
this.executionContext.addColumn({
|
|
42
|
+
query: (qb) => qb.select([tableAlias, columnName], idSrcPath.alias)
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
columnValueGetter = (row) => {
|
|
46
|
+
return viewComputedId.viewComputedId(aliases.map((it) => row[it]?.toString() || ""));
|
|
47
|
+
};
|
|
48
|
+
} else {
|
|
49
|
+
columnValueGetter = (row) => {
|
|
50
|
+
return row[columnAlias] ?? this.providers.uuid({ version: this.settings.uuidVersion });
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
25
54
|
this.executionContext.addColumn({
|
|
26
55
|
query: (qb) => qb.select(new Database.Literal(selectFrom), columnAlias),
|
|
27
|
-
predicate: this.getRequiredPredicate(entity, column)
|
|
56
|
+
predicate: this.getRequiredPredicate(entity, column),
|
|
57
|
+
valueGetter: columnValueGetter
|
|
28
58
|
});
|
|
29
59
|
}
|
|
30
60
|
visitManyHasManyInverse(relationContext) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldsVisitor.cjs","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitor.ts"],"sourcesContent":["import { Acl, Input, Model, Settings } from '@contember/schema'\nimport { Mapper } from '../../Mapper'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Literal, wrapIdentifier } from '@contember/database'\n\nexport class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.ColumnVisitor<void> {\n\tconstructor(\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly executionContext: SelectExecutionHandlerContext,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t) {}\n\n\tvisitColumn({ entity, column }: Model.ColumnContext): void {\n\t\tconst columnPath = this.executionContext.path\n\t\tconst tableAlias = columnPath.back().alias\n\t\tconst columnAlias = columnPath.alias\n\n\t\tlet selectFrom = wrapIdentifier(tableAlias) + '.' + wrapIdentifier(column.columnName)\n\t\tif (column.type === Model.ColumnType.Date && this.settings.shortDateResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\t\tif (column.type === Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\n\t\tthis.executionContext.addColumn({\n\t\t\tquery: qb => qb.select(new Literal(selectFrom), columnAlias),\n\t\t\tpredicate: this.getRequiredPredicate(entity, column),\n\t\t})\n\t}\n\n\tpublic visitManyHasManyInverse(relationContext: Model.ManyHasManyInverseContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasManyOwning(relationContext: Model.ManyHasManyOwningContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasMany(relationContext: Model.OneHasManyContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchOneHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tobjectNode: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneInverse(relationContext: Model.OneHasOneInverseContext): void {\n\t\tconst { entity, targetRelation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: entity.primary,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetRelation.name]: {\n\t\t\t\t\t\t[entity.primary]: {\n\t\t\t\t\t\t\tin: ids,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst field = this.executionContext.objectNode\n\t\t\t\tif (!field) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, field.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = field.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetRelation.name)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneOwning(relationContext: Model.OneHasOneOwningContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasOne(relationContext: Model.ManyHasOneContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tprivate getRequiredPredicate(entity: Model.Entity, field: Model.AnyField): Acl.Predicate | undefined {\n\t\tconst fieldPredicate = this.predicateFactory.getFieldPredicate(entity, Acl.Operation.read, field.name)\n\t\treturn fieldPredicate.isSameAsPrimary ? undefined : fieldPredicate.predicate\n\t}\n}\n"],"names":["wrapIdentifier","Model","Literal","Acl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FieldsVisitor.cjs","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitor.ts"],"sourcesContent":["import { Acl, Input, Model, Settings } from '@contember/schema'\nimport { Mapper } from '../../Mapper'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Literal, wrapIdentifier } from '@contember/database'\nimport { ColumnValueGetter } from '../SelectHydrator'\nimport { Providers } from '@contember/schema-utils'\nimport { getColumnName } from '@contember/schema-utils'\nimport { viewComputedId } from '../../../utils/viewComputedId'\n\nexport class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.ColumnVisitor<void> {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly executionContext: SelectExecutionHandlerContext,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tvisitColumn({ entity, column }: Model.ColumnContext): void {\n\t\tconst columnPath = this.executionContext.path\n\t\tconst tablePath = columnPath.back()\n\t\tconst tableAlias = tablePath.alias\n\t\tconst columnAlias = columnPath.alias\n\n\t\tlet selectFrom = wrapIdentifier(tableAlias) + '.' + wrapIdentifier(column.columnName)\n\t\tif (column.type === Model.ColumnType.Date && this.settings.shortDateResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\t\tif (column.type === Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\t\tif (column.type === Model.ColumnType.Enum && column.list) {\n\t\t\tselectFrom += '::text[]'\n\t\t}\n\n\t\tlet columnValueGetter: ColumnValueGetter | undefined = undefined\n\t\tif (entity.view && column.name === entity.primary && column.type === Model.ColumnType.Uuid) {\n\t\t\tif (entity.view.idSource) {\n\t\t\t\tconst aliases: string[] = []\n\t\t\t\tfor (const source of entity.view.idSource) {\n\t\t\t\t\tconst columnName = getColumnName(this.schema, entity, source)\n\t\t\t\t\tconst idSrcPath = columnPath.for(source + '__id_src')\n\t\t\t\t\taliases.push(idSrcPath.alias)\n\t\t\t\t\tthis.executionContext.addColumn({\n\t\t\t\t\t\tquery: qb => qb.select([tableAlias, columnName], idSrcPath.alias),\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tcolumnValueGetter = row => {\n\t\t\t\t\treturn viewComputedId(aliases.map(it => row[it]?.toString() || ''))\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcolumnValueGetter = row => {\n\t\t\t\t\treturn row[columnAlias] ?? (this.providers.uuid({ version: this.settings.uuidVersion }))\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.executionContext.addColumn({\n\t\t\tquery: qb => qb.select(new Literal(selectFrom), columnAlias),\n\t\t\tpredicate: this.getRequiredPredicate(entity, column),\n\t\t\tvalueGetter: columnValueGetter,\n\t\t})\n\t}\n\n\tpublic visitManyHasManyInverse(relationContext: Model.ManyHasManyInverseContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasManyOwning(relationContext: Model.ManyHasManyOwningContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasMany(relationContext: Model.OneHasManyContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchOneHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tobjectNode: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneInverse(relationContext: Model.OneHasOneInverseContext): void {\n\t\tconst { entity, targetRelation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: entity.primary,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetRelation.name]: {\n\t\t\t\t\t\t[entity.primary]: {\n\t\t\t\t\t\t\tin: ids,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst field = this.executionContext.objectNode\n\t\t\t\tif (!field) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, field.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = field.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetRelation.name)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneOwning(relationContext: Model.OneHasOneOwningContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasOne(relationContext: Model.ManyHasOneContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tprivate getRequiredPredicate(entity: Model.Entity, field: Model.AnyField): Acl.Predicate | undefined {\n\t\tconst fieldPredicate = this.predicateFactory.getFieldPredicate(entity, Acl.Operation.read, field.name)\n\t\treturn fieldPredicate.isSameAsPrimary ? undefined : fieldPredicate.predicate\n\t}\n}\n"],"names":["schema","wrapIdentifier","Model","getColumnName","viewComputedId","Literal","Acl"],"mappings":"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"}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import { Model, Acl } from "@contember/schema";
|
|
2
2
|
import { wrapIdentifier, Literal } from "@contember/database";
|
|
3
|
+
import { getColumnName } from "@contember/schema-utils";
|
|
4
|
+
import { viewComputedId } from "../../../utils/viewComputedId.js";
|
|
3
5
|
class FieldsVisitor {
|
|
4
|
-
constructor(relationFetcher, predicateFactory, mapper, executionContext, relationPath, settings) {
|
|
6
|
+
constructor(schema, relationFetcher, predicateFactory, mapper, executionContext, relationPath, settings, providers) {
|
|
7
|
+
this.schema = schema;
|
|
5
8
|
this.relationFetcher = relationFetcher;
|
|
6
9
|
this.predicateFactory = predicateFactory;
|
|
7
10
|
this.mapper = mapper;
|
|
8
11
|
this.executionContext = executionContext;
|
|
9
12
|
this.relationPath = relationPath;
|
|
10
13
|
this.settings = settings;
|
|
14
|
+
this.providers = providers;
|
|
11
15
|
}
|
|
12
16
|
visitColumn({ entity, column }) {
|
|
13
17
|
const columnPath = this.executionContext.path;
|
|
14
|
-
const
|
|
18
|
+
const tablePath = columnPath.back();
|
|
19
|
+
const tableAlias = tablePath.alias;
|
|
15
20
|
const columnAlias = columnPath.alias;
|
|
16
21
|
let selectFrom = wrapIdentifier(tableAlias) + "." + wrapIdentifier(column.columnName);
|
|
17
22
|
if (column.type === Model.ColumnType.Date && this.settings.shortDateResponse) {
|
|
@@ -20,9 +25,34 @@ class FieldsVisitor {
|
|
|
20
25
|
if (column.type === Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {
|
|
21
26
|
selectFrom += "::text";
|
|
22
27
|
}
|
|
28
|
+
if (column.type === Model.ColumnType.Enum && column.list) {
|
|
29
|
+
selectFrom += "::text[]";
|
|
30
|
+
}
|
|
31
|
+
let columnValueGetter = void 0;
|
|
32
|
+
if (entity.view && column.name === entity.primary && column.type === Model.ColumnType.Uuid) {
|
|
33
|
+
if (entity.view.idSource) {
|
|
34
|
+
const aliases = [];
|
|
35
|
+
for (const source of entity.view.idSource) {
|
|
36
|
+
const columnName = getColumnName(this.schema, entity, source);
|
|
37
|
+
const idSrcPath = columnPath.for(source + "__id_src");
|
|
38
|
+
aliases.push(idSrcPath.alias);
|
|
39
|
+
this.executionContext.addColumn({
|
|
40
|
+
query: (qb) => qb.select([tableAlias, columnName], idSrcPath.alias)
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
columnValueGetter = (row) => {
|
|
44
|
+
return viewComputedId(aliases.map((it) => row[it]?.toString() || ""));
|
|
45
|
+
};
|
|
46
|
+
} else {
|
|
47
|
+
columnValueGetter = (row) => {
|
|
48
|
+
return row[columnAlias] ?? this.providers.uuid({ version: this.settings.uuidVersion });
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
23
52
|
this.executionContext.addColumn({
|
|
24
53
|
query: (qb) => qb.select(new Literal(selectFrom), columnAlias),
|
|
25
|
-
predicate: this.getRequiredPredicate(entity, column)
|
|
54
|
+
predicate: this.getRequiredPredicate(entity, column),
|
|
55
|
+
valueGetter: columnValueGetter
|
|
26
56
|
});
|
|
27
57
|
}
|
|
28
58
|
visitManyHasManyInverse(relationContext) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldsVisitor.js","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitor.ts"],"sourcesContent":["import { Acl, Input, Model, Settings } from '@contember/schema'\nimport { Mapper } from '../../Mapper'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Literal, wrapIdentifier } from '@contember/database'\n\nexport class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.ColumnVisitor<void> {\n\tconstructor(\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly executionContext: SelectExecutionHandlerContext,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t) {}\n\n\tvisitColumn({ entity, column }: Model.ColumnContext): void {\n\t\tconst columnPath = this.executionContext.path\n\t\tconst tableAlias = columnPath.back().alias\n\t\tconst columnAlias = columnPath.alias\n\n\t\tlet selectFrom = wrapIdentifier(tableAlias) + '.' + wrapIdentifier(column.columnName)\n\t\tif (column.type === Model.ColumnType.Date && this.settings.shortDateResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\t\tif (column.type === Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\n\t\tthis.executionContext.addColumn({\n\t\t\tquery: qb => qb.select(new Literal(selectFrom), columnAlias),\n\t\t\tpredicate: this.getRequiredPredicate(entity, column),\n\t\t})\n\t}\n\n\tpublic visitManyHasManyInverse(relationContext: Model.ManyHasManyInverseContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasManyOwning(relationContext: Model.ManyHasManyOwningContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasMany(relationContext: Model.OneHasManyContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchOneHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tobjectNode: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneInverse(relationContext: Model.OneHasOneInverseContext): void {\n\t\tconst { entity, targetRelation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: entity.primary,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetRelation.name]: {\n\t\t\t\t\t\t[entity.primary]: {\n\t\t\t\t\t\t\tin: ids,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst field = this.executionContext.objectNode\n\t\t\t\tif (!field) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, field.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = field.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetRelation.name)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneOwning(relationContext: Model.OneHasOneOwningContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasOne(relationContext: Model.ManyHasOneContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tprivate getRequiredPredicate(entity: Model.Entity, field: Model.AnyField): Acl.Predicate | undefined {\n\t\tconst fieldPredicate = this.predicateFactory.getFieldPredicate(entity, Acl.Operation.read, field.name)\n\t\treturn fieldPredicate.isSameAsPrimary ? undefined : fieldPredicate.predicate\n\t}\n}\n"],"names":[],"mappings":";;AAOO,MAAM,cAAsF;AAAA,EAClG,YACkB,iBACA,kBACA,QACA,kBACA,cACA,UAChB;AANgB,SAAA,kBAAA;AACA,SAAA,mBAAA;AACA,SAAA,SAAA;AACA,SAAA,mBAAA;AACA,SAAA,eAAA;AACA,SAAA,WAAA;AAAA,EAAA;AAAA,EAGlB,YAAY,EAAE,QAAQ,UAAqC;AACpD,UAAA,aAAa,KAAK,iBAAiB;AACnC,UAAA,aAAa,WAAW,KAAA,EAAO;AACrC,UAAM,cAAc,WAAW;AAE/B,QAAI,aAAa,eAAe,UAAU,IAAI,MAAM,eAAe,OAAO,UAAU;AACpF,QAAI,OAAO,SAAS,MAAM,WAAW,QAAQ,KAAK,SAAS,mBAAmB;AAC/D,oBAAA;AAAA,IAAA;AAEf,QAAI,OAAO,SAAS,MAAM,WAAW,YAAY,KAAK,SAAS,sBAAsB;AACtE,oBAAA;AAAA,IAAA;AAGf,SAAK,iBAAiB,UAAU;AAAA,MAC/B,OAAO,QAAM,GAAG,OAAO,IAAI,QAAQ,UAAU,GAAG,WAAW;AAAA,MAC3D,WAAW,KAAK,qBAAqB,QAAQ,MAAM;AAAA,IAAA,CACnD;AAAA,EAAA;AAAA,EAGK,wBAAwB,iBAAwD;AAChF,UAAA,QAAQ,KAAK,iBAAiB;AACpC,QAAI,CAAC,OAAO;AACX,YAAM,IAAI,MAAM;AAAA,IAAA;AAEjB,SAAK,iBAAiB,QAAQ;AAAA,MAC7B,OAAO,gBAAgB,OAAO;AAAA,MAC9B,cAAc,OAAM,QACnB,KAAK,gBAAgB,uBAAuB;AAAA,QAC3C,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,cAAc,KAAK;AAAA,QACnB;AAAA,MAAA,CACA;AAAA,MACF,cAAc,CAAC;AAAA,MACf,WAAW,KAAK,qBAAqB,gBAAgB,QAAQ,gBAAgB,QAAQ;AAAA,IAAA,CACrF;AAAA,EAAA;AAAA,EAGK,uBAAuB,iBAAuD;AAC9E,UAAA,QAAQ,KAAK,iBAAiB;AACpC,QAAI,CAAC,OAAO;AACX,YAAM,IAAI,MAAM;AAAA,IAAA;AAGjB,SAAK,iBAAiB,QAAQ;AAAA,MAC7B,OAAO,gBAAgB,OAAO;AAAA,MAC9B,cAAc,OAAM,QACnB,KAAK,gBAAgB,uBAAuB;AAAA,QAC3C,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,cAAc,KAAK;AAAA,QACnB;AAAA,MAAA,CACA;AAAA,MACF,cAAc,CAAC;AAAA,MACf,WAAW,KAAK,qBAAqB,gBAAgB,QAAQ,gBAAgB,QAAQ;AAAA,IAAA,CACrF;AAAA,EAAA;AAAA,EAGK,gBAAgB,iBAAgD;AAChE,UAAA,QAAQ,KAAK,iBAAiB;AACpC,QAAI,CAAC,OAAO;AACX,YAAM,IAAI,MAAM;AAAA,IAAA;AAGjB,SAAK,iBAAiB,QAAQ;AAAA,MAC7B,OAAO,gBAAgB,OAAO;AAAA,MAC9B,cAAc,OAAM,QACnB,KAAK,gBAAgB,sBAAsB;AAAA,QAC1C,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,QACA,cAAc,KAAK;AAAA,QACnB;AAAA,MAAA,CACA;AAAA,MACF,cAAc,CAAC;AAAA,MACf,WAAW,KAAK,qBAAqB,gBAAgB,QAAQ,gBAAgB,QAAQ;AAAA,IAAA,CACrF;AAAA,EAAA;AAAA,EAGK,sBAAsB,iBAAsD;AAClF,UAAM,EAAE,QAAQ,gBAAgB,aAAiB,IAAA;AACjD,SAAK,iBAAiB,QAAQ;AAAA,MAC7B,OAAO,OAAO;AAAA,MACd,cAAc,OAAM,QAAO;AAC1B,cAAM,WAAwB;AAAA,UAC7B,CAAC,eAAe,IAAI,GAAG;AAAA,YACtB,CAAC,OAAO,OAAO,GAAG;AAAA,cACjB,IAAI;AAAA,YAAA;AAAA,UACL;AAAA,QAEF;AACM,cAAA,QAAQ,KAAK,iBAAiB;AACpC,YAAI,CAAC,OAAO;AACX,gBAAM,IAAI,MAAM;AAAA,QAAA;AAEjB,cAAM,QAAqB;AAAA,UAC1B,KAAK,CAAC,UAAU,MAAM,KAAK,MAAM,EAAE,OAAO,CAAC,OAA0B,OAAO,MAAS;AAAA,QACtF;AACA,cAAM,kBAAkB,MAAM,QAAQ,UAAU,KAAK;AAErD,eAAO,KAAK,OAAO,YAAY,cAAc,iBAAiB;AAAA,UAC7D,GAAG,KAAK;AAAA,UACR;AAAA,QAAA,GACE,eAAe,IAAI;AAAA,MACvB;AAAA,MACA,cAAc;AAAA,MACd,WAAW,KAAK,qBAAqB,gBAAgB,QAAQ,gBAAgB,QAAQ;AAAA,IAAA,CACrF;AAAA,EAAA;AAAA,EAGK,qBAAqB,iBAAqD;AAC1E,UAAA,EAAE,UAAU,aAAA,IAAiB;AACnC,SAAK,iBAAiB,QAAQ;AAAA,MAC7B,OAAO,SAAS;AAAA,MAChB,cAAc,OAAM,QAAO;AAC1B,cAAM,WAAwB;AAAA,UAC7B,CAAC,aAAa,OAAO,GAAG;AAAA,YACvB,IAAI;AAAA,UAAA;AAAA,QAEN;AACM,cAAA,aAAa,KAAK,iBAAiB;AACzC,YAAI,CAAC,YAAY;AAChB,gBAAM,IAAI,MAAM;AAAA,QAAA;AAEjB,cAAM,QAAqB;AAAA,UAC1B,KAAK,CAAC,UAAU,WAAW,KAAK,MAAM,EAAE,OAAO,CAAC,OAA0B,OAAO,MAAS;AAAA,QAC3F;AACA,cAAM,kBAAkB,WAAW,QAAQ,UAAU,KAAK;AAE1D,eAAO,KAAK,OAAO,YAAY,cAAc,iBAAiB;AAAA,UAC7D,GAAG,KAAK;AAAA,UACR;AAAA,QAAA,GACE,aAAa,OAAO;AAAA,MACxB;AAAA,MACA,cAAc;AAAA,MACd,WAAW,KAAK,qBAAqB,gBAAgB,QAAQ,gBAAgB,QAAQ;AAAA,IAAA,CACrF;AAAA,EAAA;AAAA,EAGK,gBAAgB,iBAAgD;AAChE,UAAA,EAAE,UAAU,aAAA,IAAiB;AACnC,SAAK,iBAAiB,QAAQ;AAAA,MAC7B,OAAO,SAAS;AAAA,MAChB,cAAc,OAAM,QAAO;AAC1B,cAAM,WAAwB;AAAA,UAC7B,CAAC,aAAa,OAAO,GAAG;AAAA,YACvB,IAAI;AAAA,UAAA;AAAA,QAEN;AACM,cAAA,aAAa,KAAK,iBAAiB;AACzC,YAAI,CAAC,YAAY;AAChB,gBAAM,IAAI,MAAM;AAAA,QAAA;AAEjB,cAAM,QAAqB;AAAA,UAC1B,KAAK,CAAC,UAAU,WAAW,KAAK,MAAM,EAAE,OAAO,CAAC,OAA0B,OAAO,MAAS;AAAA,QAC3F;AACA,cAAM,kBAAkB,WAAW,QAAQ,UAAU,KAAK;AAE1D,eAAO,KAAK,OAAO,YAAY,cAAc,iBAAiB;AAAA,UAC7D,GAAG,KAAK;AAAA,UACR;AAAA,QAAA,GACE,aAAa,OAAO;AAAA,MACxB;AAAA,MACA,cAAc;AAAA,MACd,WAAW,KAAK,qBAAqB,gBAAgB,QAAQ,gBAAgB,QAAQ;AAAA,IAAA,CACrF;AAAA,EAAA;AAAA,EAGM,qBAAqB,QAAsB,OAAkD;AAC9F,UAAA,iBAAiB,KAAK,iBAAiB,kBAAkB,QAAQ,IAAI,UAAU,MAAM,MAAM,IAAI;AAC9F,WAAA,eAAe,kBAAkB,SAAY,eAAe;AAAA,EAAA;AAErE;"}
|
|
1
|
+
{"version":3,"file":"FieldsVisitor.js","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitor.ts"],"sourcesContent":["import { Acl, Input, Model, Settings } from '@contember/schema'\nimport { Mapper } from '../../Mapper'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Literal, wrapIdentifier } from '@contember/database'\nimport { ColumnValueGetter } from '../SelectHydrator'\nimport { Providers } from '@contember/schema-utils'\nimport { getColumnName } from '@contember/schema-utils'\nimport { viewComputedId } from '../../../utils/viewComputedId'\n\nexport class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.ColumnVisitor<void> {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly executionContext: SelectExecutionHandlerContext,\n\t\tprivate readonly relationPath: Model.AnyRelationContext[],\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tvisitColumn({ entity, column }: Model.ColumnContext): void {\n\t\tconst columnPath = this.executionContext.path\n\t\tconst tablePath = columnPath.back()\n\t\tconst tableAlias = tablePath.alias\n\t\tconst columnAlias = columnPath.alias\n\n\t\tlet selectFrom = wrapIdentifier(tableAlias) + '.' + wrapIdentifier(column.columnName)\n\t\tif (column.type === Model.ColumnType.Date && this.settings.shortDateResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\t\tif (column.type === Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {\n\t\t\tselectFrom += '::text'\n\t\t}\n\t\tif (column.type === Model.ColumnType.Enum && column.list) {\n\t\t\tselectFrom += '::text[]'\n\t\t}\n\n\t\tlet columnValueGetter: ColumnValueGetter | undefined = undefined\n\t\tif (entity.view && column.name === entity.primary && column.type === Model.ColumnType.Uuid) {\n\t\t\tif (entity.view.idSource) {\n\t\t\t\tconst aliases: string[] = []\n\t\t\t\tfor (const source of entity.view.idSource) {\n\t\t\t\t\tconst columnName = getColumnName(this.schema, entity, source)\n\t\t\t\t\tconst idSrcPath = columnPath.for(source + '__id_src')\n\t\t\t\t\taliases.push(idSrcPath.alias)\n\t\t\t\t\tthis.executionContext.addColumn({\n\t\t\t\t\t\tquery: qb => qb.select([tableAlias, columnName], idSrcPath.alias),\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tcolumnValueGetter = row => {\n\t\t\t\t\treturn viewComputedId(aliases.map(it => row[it]?.toString() || ''))\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcolumnValueGetter = row => {\n\t\t\t\t\treturn row[columnAlias] ?? (this.providers.uuid({ version: this.settings.uuidVersion }))\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.executionContext.addColumn({\n\t\t\tquery: qb => qb.select(new Literal(selectFrom), columnAlias),\n\t\t\tpredicate: this.getRequiredPredicate(entity, column),\n\t\t\tvalueGetter: columnValueGetter,\n\t\t})\n\t}\n\n\tpublic visitManyHasManyInverse(relationContext: Model.ManyHasManyInverseContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasManyOwning(relationContext: Model.ManyHasManyOwningContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchManyHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tfield: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasMany(relationContext: Model.OneHasManyContext): void {\n\t\tconst field = this.executionContext.objectNode\n\t\tif (!field) {\n\t\t\tthrow new Error()\n\t\t}\n\n\t\tthis.executionContext.addData({\n\t\t\tfield: relationContext.entity.primary,\n\t\t\tdataProvider: async ids =>\n\t\t\t\tthis.relationFetcher.fetchOneHasManyGroups({\n\t\t\t\t\tmapper: this.mapper,\n\t\t\t\t\tobjectNode: field,\n\t\t\t\t\trelationContext,\n\t\t\t\t\trelationPath: this.relationPath,\n\t\t\t\t\tids: ids,\n\t\t\t\t}),\n\t\t\tdefaultValue: [],\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneInverse(relationContext: Model.OneHasOneInverseContext): void {\n\t\tconst { entity, targetRelation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: entity.primary,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetRelation.name]: {\n\t\t\t\t\t\t[entity.primary]: {\n\t\t\t\t\t\t\tin: ids,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst field = this.executionContext.objectNode\n\t\t\t\tif (!field) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, field.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = field.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetRelation.name)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitOneHasOneOwning(relationContext: Model.OneHasOneOwningContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tpublic visitManyHasOne(relationContext: Model.ManyHasOneContext): void {\n\t\tconst { relation, targetEntity } = relationContext\n\t\tthis.executionContext.addData({\n\t\t\tfield: relation.name,\n\t\t\tdataProvider: async ids => {\n\t\t\t\tconst idsWhere: Input.Where = {\n\t\t\t\t\t[targetEntity.primary]: {\n\t\t\t\t\t\tin: ids,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tconst objectNode = this.executionContext.objectNode\n\t\t\t\tif (!objectNode) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\tconst where: Input.Where = {\n\t\t\t\t\tand: [idsWhere, objectNode.args.filter].filter((it): it is Input.Where => it !== undefined),\n\t\t\t\t}\n\t\t\t\tconst objectWithWhere = objectNode.withArg('filter', where)\n\n\t\t\t\treturn this.mapper.selectAssoc(targetEntity, objectWithWhere, [\n\t\t\t\t\t...this.relationPath,\n\t\t\t\t\trelationContext,\n\t\t\t\t], targetEntity.primary)\n\t\t\t},\n\t\t\tdefaultValue: null,\n\t\t\tpredicate: this.getRequiredPredicate(relationContext.entity, relationContext.relation),\n\t\t})\n\t}\n\n\tprivate getRequiredPredicate(entity: Model.Entity, field: Model.AnyField): Acl.Predicate | undefined {\n\t\tconst fieldPredicate = this.predicateFactory.getFieldPredicate(entity, Acl.Operation.read, field.name)\n\t\treturn fieldPredicate.isSameAsPrimary ? undefined : fieldPredicate.predicate\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const FieldsVisitor = require("./FieldsVisitor.cjs");
|
|
4
4
|
class FieldsVisitorFactory {
|
|
5
|
-
constructor(relationFetcher, predicateFactory, settings) {
|
|
5
|
+
constructor(schema, relationFetcher, predicateFactory, settings, providers) {
|
|
6
|
+
this.schema = schema;
|
|
6
7
|
this.relationFetcher = relationFetcher;
|
|
7
8
|
this.predicateFactory = predicateFactory;
|
|
8
9
|
this.settings = settings;
|
|
10
|
+
this.providers = providers;
|
|
9
11
|
}
|
|
10
12
|
create(mapper, context) {
|
|
11
13
|
return new FieldsVisitor.FieldsVisitor(
|
|
14
|
+
this.schema,
|
|
12
15
|
this.relationFetcher,
|
|
13
16
|
this.predicateFactory,
|
|
14
17
|
mapper,
|
|
15
18
|
context,
|
|
16
19
|
context.relationPath,
|
|
17
|
-
this.settings
|
|
20
|
+
this.settings,
|
|
21
|
+
this.providers
|
|
18
22
|
);
|
|
19
23
|
}
|
|
20
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldsVisitorFactory.cjs","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitorFactory.ts"],"sourcesContent":["import { FieldsVisitor } from './FieldsVisitor'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { Mapper } from '../../Mapper'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Settings } from '@contember/schema'\n\nexport class FieldsVisitorFactory {\n\tconstructor(\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t) {}\n\n\tcreate(mapper: Mapper, context: SelectExecutionHandlerContext): FieldsVisitor {\n\t\treturn new FieldsVisitor(\n\t\t\tthis.relationFetcher,\n\t\t\tthis.predicateFactory,\n\t\t\tmapper,\n\t\t\tcontext,\n\t\t\tcontext.relationPath,\n\t\t\tthis.settings,\n\t\t)\n\t}\n}\n"],"names":["FieldsVisitor"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"FieldsVisitorFactory.cjs","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitorFactory.ts"],"sourcesContent":["import { FieldsVisitor } from './FieldsVisitor'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { Mapper } from '../../Mapper'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Model, Settings } from '@contember/schema'\nimport { Providers } from '@contember/schema-utils'\n\nexport class FieldsVisitorFactory {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tcreate(mapper: Mapper, context: SelectExecutionHandlerContext): FieldsVisitor {\n\t\treturn new FieldsVisitor(\n\t\t\tthis.schema,\n\t\t\tthis.relationFetcher,\n\t\t\tthis.predicateFactory,\n\t\t\tmapper,\n\t\t\tcontext,\n\t\t\tcontext.relationPath,\n\t\t\tthis.settings,\n\t\t\tthis.providers,\n\t\t)\n\t}\n}\n"],"names":["FieldsVisitor"],"mappings":";;;AAQO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,iBACA,kBACA,UACA,WAChB;AALgB,SAAA,SAAA;AACA,SAAA,kBAAA;AACA,SAAA,mBAAA;AACA,SAAA,WAAA;AACA,SAAA,YAAA;AAAA,EAAA;AAAA,EAGlB,OAAO,QAAgB,SAAuD;AAC7E,WAAO,IAAIA,cAAA;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAAA,EAAA;AAEF;;"}
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import { FieldsVisitor } from "./FieldsVisitor.js";
|
|
2
2
|
class FieldsVisitorFactory {
|
|
3
|
-
constructor(relationFetcher, predicateFactory, settings) {
|
|
3
|
+
constructor(schema, relationFetcher, predicateFactory, settings, providers) {
|
|
4
|
+
this.schema = schema;
|
|
4
5
|
this.relationFetcher = relationFetcher;
|
|
5
6
|
this.predicateFactory = predicateFactory;
|
|
6
7
|
this.settings = settings;
|
|
8
|
+
this.providers = providers;
|
|
7
9
|
}
|
|
8
10
|
create(mapper, context) {
|
|
9
11
|
return new FieldsVisitor(
|
|
12
|
+
this.schema,
|
|
10
13
|
this.relationFetcher,
|
|
11
14
|
this.predicateFactory,
|
|
12
15
|
mapper,
|
|
13
16
|
context,
|
|
14
17
|
context.relationPath,
|
|
15
|
-
this.settings
|
|
18
|
+
this.settings,
|
|
19
|
+
this.providers
|
|
16
20
|
);
|
|
17
21
|
}
|
|
18
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldsVisitorFactory.js","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitorFactory.ts"],"sourcesContent":["import { FieldsVisitor } from './FieldsVisitor'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { Mapper } from '../../Mapper'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Settings } from '@contember/schema'\n\nexport class FieldsVisitorFactory {\n\tconstructor(\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t) {}\n\n\tcreate(mapper: Mapper, context: SelectExecutionHandlerContext): FieldsVisitor {\n\t\treturn new FieldsVisitor(\n\t\t\tthis.relationFetcher,\n\t\t\tthis.predicateFactory,\n\t\t\tmapper,\n\t\t\tcontext,\n\t\t\tcontext.relationPath,\n\t\t\tthis.settings,\n\t\t)\n\t}\n}\n"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"FieldsVisitorFactory.js","sources":["../../../../../../../packages/engine-content-api/src/mapper/select/handlers/FieldsVisitorFactory.ts"],"sourcesContent":["import { FieldsVisitor } from './FieldsVisitor'\nimport { RelationFetcher } from '../RelationFetcher'\nimport { Mapper } from '../../Mapper'\nimport { SelectExecutionHandlerContext } from '../SelectExecutionHandler'\nimport { PredicateFactory } from '../../../acl'\nimport { Model, Settings } from '@contember/schema'\nimport { Providers } from '@contember/schema-utils'\n\nexport class FieldsVisitorFactory {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly relationFetcher: RelationFetcher,\n\t\tprivate readonly predicateFactory: PredicateFactory,\n\t\tprivate readonly settings: Settings.ContentSettings,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tcreate(mapper: Mapper, context: SelectExecutionHandlerContext): FieldsVisitor {\n\t\treturn new FieldsVisitor(\n\t\t\tthis.schema,\n\t\t\tthis.relationFetcher,\n\t\t\tthis.predicateFactory,\n\t\t\tmapper,\n\t\t\tcontext,\n\t\t\tcontext.relationPath,\n\t\t\tthis.settings,\n\t\t\tthis.providers,\n\t\t)\n\t}\n}\n"],"names":[],"mappings":";AAQO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,iBACA,kBACA,UACA,WAChB;AALgB,SAAA,SAAA;AACA,SAAA,kBAAA;AACA,SAAA,mBAAA;AACA,SAAA,WAAA;AACA,SAAA,YAAA;AAAA,EAAA;AAAA,EAGlB,OAAO,QAAgB,SAAuD;AAC7E,WAAO,IAAI;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAAA,EAAA;AAEF;"}
|
|
@@ -8,6 +8,7 @@ const Database = require("@contember/database");
|
|
|
8
8
|
const Result = require("../mapper/Result.cjs");
|
|
9
9
|
const EventManager = require("../mapper/EventManager.cjs");
|
|
10
10
|
const ObjectNode = require("../inputProcessing/ObjectNode.cjs");
|
|
11
|
+
require("node:crypto");
|
|
11
12
|
const logger = require("@contember/logger");
|
|
12
13
|
const ErrorUtils = require("../mapper/ErrorUtils.cjs");
|
|
13
14
|
require("fast-deep-equal");
|