@contember/engine-content-api 1.2.0-alpha.10 → 1.2.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/acl/PredicateFactory.d.ts +1 -1
- package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
- package/dist/src/acl/PredicateFactory.js +6 -13
- package/dist/src/acl/PredicateFactory.js.map +1 -1
- package/dist/src/acl/PredicatesInjector.d.ts +1 -1
- package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
- package/dist/src/acl/PredicatesInjector.js +13 -20
- package/dist/src/acl/PredicatesInjector.js.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +14 -15
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +11 -14
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +2 -2
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +11 -15
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
- package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
- package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
- package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
- package/dist/src/input-validation/EntityRulesResolver.js +4 -4
- package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
- package/dist/src/input-validation/QueryAstFactory.js +1 -1
- package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
- package/dist/src/input-validation/ValidationDataSelector.js +1 -1
- package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
- package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
- package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
- package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
- package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
- package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
- package/dist/src/inputProcessing/index.d.ts +0 -1
- package/dist/src/inputProcessing/index.d.ts.map +1 -1
- package/dist/src/inputProcessing/index.js +0 -1
- package/dist/src/inputProcessing/index.js.map +1 -1
- package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
- package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
- package/dist/src/mapper/Mapper.d.ts +6 -6
- package/dist/src/mapper/Mapper.d.ts.map +1 -1
- package/dist/src/mapper/Mapper.js +28 -23
- package/dist/src/mapper/Mapper.js.map +1 -1
- package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
- package/dist/src/mapper/MapperContainer.js +2 -2
- package/dist/src/mapper/MapperContainer.js.map +1 -1
- package/dist/src/mapper/delete/DeleteExecutor.js +3 -3
- package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
- package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
- package/dist/src/mapper/select/JoinVisitor.js +6 -6
- package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
- package/dist/src/mapper/select/RelationFetcher.d.ts +11 -19
- package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
- package/dist/src/mapper/select/RelationFetcher.js +34 -25
- package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts +2 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.js +4 -2
- package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
- package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
- package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectExecutionHandler.d.ts +1 -0
- package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.d.ts +3 -2
- package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.js +29 -24
- package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +9 -8
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.js +33 -25
- package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +6 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +2 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js +52 -20
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +4 -1
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereReplacer.js +4 -3
- package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -1
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
- package/dist/src/mapper/update/UpdateBuilder.js +3 -3
- package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
- package/dist/src/resolvers/MutationResolver.js +1 -1
- package/dist/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/src/resolvers/ReadHelpers.js +3 -3
- package/dist/src/resolvers/ReadHelpers.js.map +1 -1
- package/dist/src/resolvers/ReadResolver.js +2 -2
- package/dist/src/resolvers/ReadResolver.js.map +1 -1
- package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
- package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
- package/dist/src/schema/FieldAccessVisitor.js +2 -2
- package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
- package/dist/src/schema/OrderByTypeProvider.js +1 -1
- package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/src/schema/WhereTypeProvider.js +4 -4
- package/dist/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/src/schema/entities/FieldArgsVisitor.d.ts +3 -3
- package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
- package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
- package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
- package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
- package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
- package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
- package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/utils/uniqueWhereFields.js +3 -3
- package/dist/src/utils/uniqueWhereFields.js.map +1 -1
- package/dist/tests/cases/unit/predicatesFactory.test.js +7 -1
- package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -1
- package/dist/tests/cases/unit/whereOptimizer.test.js +82 -0
- package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/acl/PredicateFactory.ts +7 -14
- package/src/acl/PredicatesInjector.ts +13 -18
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +17 -24
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
- package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +10 -28
- package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +6 -3
- package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
- package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +10 -29
- package/src/input-validation/ColumnValueResolver.ts +2 -3
- package/src/input-validation/EntityRulesResolver.ts +4 -4
- package/src/input-validation/QueryAstFactory.ts +1 -1
- package/src/input-validation/ValidationDataSelector.ts +1 -1
- package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
- package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
- package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
- package/src/inputProcessing/CreateInputProcessor.ts +8 -9
- package/src/inputProcessing/CreateInputVisitor.ts +27 -89
- package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
- package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
- package/src/inputProcessing/index.ts +0 -1
- package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
- package/src/mapper/Mapper.ts +36 -33
- package/src/mapper/MapperContainer.ts +3 -2
- package/src/mapper/delete/DeleteExecutor.ts +3 -3
- package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
- package/src/mapper/select/JoinVisitor.ts +6 -33
- package/src/mapper/select/RelationFetcher.ts +49 -50
- package/src/mapper/select/SelectBuilder.ts +3 -1
- package/src/mapper/select/SelectBuilderFactory.ts +2 -1
- package/src/mapper/select/SelectExecutionHandler.ts +1 -0
- package/src/mapper/select/WhereBuilder.ts +45 -34
- package/src/mapper/select/handlers/FieldsVisitor.ts +32 -49
- package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
- package/src/mapper/select/optimizer/ConditionOptimizer.ts +6 -0
- package/src/mapper/select/optimizer/WhereOptimizer.ts +58 -20
- package/src/mapper/select/optimizer/WhereReplacer.ts +8 -3
- package/src/mapper/update/SqlUpdateInputProcessor.ts +1 -1
- package/src/mapper/update/UpdateBuilder.ts +3 -3
- package/src/resolvers/MutationResolver.ts +1 -1
- package/src/resolvers/ReadHelpers.ts +3 -3
- package/src/resolvers/ReadResolver.ts +2 -2
- package/src/schema/FieldAccessVisitor.ts +2 -2
- package/src/schema/OrderByTypeProvider.ts +1 -1
- package/src/schema/WhereTypeProvider.ts +4 -4
- package/src/schema/entities/FieldArgsVisitor.ts +3 -3
- package/src/schema/entities/FieldTypeVisitor.ts +3 -3
- package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
- package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
- package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +5 -18
- package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
- package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
- package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +2 -12
- package/src/utils/uniqueWhereFields.ts +3 -3
- package/tests/cases/unit/predicatesFactory.test.ts +8 -2
- package/tests/cases/unit/whereOptimizer.test.ts +94 -0
- package/dist/src/inputProcessing/InputContext.d.ts +0 -43
- package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
- package/dist/src/inputProcessing/InputContext.js +0 -3
- package/dist/src/inputProcessing/InputContext.js.map +0 -1
- package/src/inputProcessing/InputContext.ts +0 -49
|
@@ -131,8 +131,8 @@ export class DeleteExecutor {
|
|
|
131
131
|
visitManyHasManyOwning: () => null,
|
|
132
132
|
visitOneHasOneInverse: () => null,
|
|
133
133
|
visitOneHasMany: () => null,
|
|
134
|
-
visitOneHasOneOwning: ({
|
|
135
|
-
visitManyHasOne: ({
|
|
134
|
+
visitOneHasOneOwning: ({ relation }): EntityOwningRelationTuple => [entity, relation],
|
|
135
|
+
visitManyHasOne: ({ relation }): EntityOwningRelationTuple => [entity, relation],
|
|
136
136
|
}),
|
|
137
137
|
)
|
|
138
138
|
.reduce<EntityOwningRelationTuple[]>(
|
|
@@ -155,7 +155,7 @@ export class DeleteExecutor {
|
|
|
155
155
|
visitManyHasManyOwning: () => null,
|
|
156
156
|
visitOneHasOneInverse: () => null,
|
|
157
157
|
visitOneHasMany: () => null,
|
|
158
|
-
visitOneHasOneOwning: ({
|
|
158
|
+
visitOneHasOneOwning: ({ relation, targetEntity }) =>
|
|
159
159
|
relation.orphanRemoval ? [targetEntity, relation] : null,
|
|
160
160
|
visitManyHasOne: () => null,
|
|
161
161
|
}),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Input, Value } from '@contember/schema'
|
|
1
|
+
import { Input, Model, Value } from '@contember/schema'
|
|
2
2
|
import { Mapper } from '../Mapper'
|
|
3
3
|
import { InsertBuilder } from './InsertBuilder'
|
|
4
4
|
import { Providers, resolveColumnValue } from '@contember/schema-utils'
|
|
@@ -15,7 +15,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<MutationRes
|
|
|
15
15
|
private readonly providers: Providers,
|
|
16
16
|
) {}
|
|
17
17
|
|
|
18
|
-
public async column(context:
|
|
18
|
+
public async column(context: Model.ColumnContext & { input: Input.ColumnValue | undefined }): Promise<MutationResultList> {
|
|
19
19
|
this.insertBuilder.addFieldValue(
|
|
20
20
|
context.column.name,
|
|
21
21
|
((): Value.GenericValueLike<Value.AtomicValue | undefined> => {
|
|
@@ -159,7 +159,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<MutationRes
|
|
|
159
159
|
return []
|
|
160
160
|
},
|
|
161
161
|
connect: hasOneProcessor(
|
|
162
|
-
async (context:
|
|
162
|
+
async (context: Model.OneHasOneOwningContext & { input: Input.UniqueWhere }): Promise<MutationResultList> => {
|
|
163
163
|
const primaryValue = this.mapper.getPrimaryValue(context.targetEntity, context.input)
|
|
164
164
|
this.insertBuilder.addFieldValue(context.relation.name, async () => {
|
|
165
165
|
const value = await primaryValue
|
|
@@ -4,11 +4,7 @@ import { Path } from './Path'
|
|
|
4
4
|
export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]> {
|
|
5
5
|
constructor(private readonly path: Path) {}
|
|
6
6
|
|
|
7
|
-
visitOneHasOneOwning(
|
|
8
|
-
entity: Model.Entity,
|
|
9
|
-
relation: Model.OneHasOneOwningRelation,
|
|
10
|
-
targetEntity: Model.Entity,
|
|
11
|
-
): JoinDefinition[] {
|
|
7
|
+
visitOneHasOneOwning({ targetEntity, relation }: Model.OneHasOneOwningContext): JoinDefinition[] {
|
|
12
8
|
return [
|
|
13
9
|
{
|
|
14
10
|
tableName: targetEntity.tableName,
|
|
@@ -18,12 +14,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
|
|
|
18
14
|
]
|
|
19
15
|
}
|
|
20
16
|
|
|
21
|
-
visitOneHasOneInverse(
|
|
22
|
-
entity: Model.Entity,
|
|
23
|
-
relation: Model.OneHasOneInverseRelation,
|
|
24
|
-
targetEntity: Model.Entity,
|
|
25
|
-
targetRelation: Model.OneHasOneOwningRelation,
|
|
26
|
-
): JoinDefinition[] {
|
|
17
|
+
visitOneHasOneInverse({ targetEntity, entity, targetRelation }: Model.OneHasOneInverseContext): JoinDefinition[] {
|
|
27
18
|
return [
|
|
28
19
|
{
|
|
29
20
|
tableName: targetEntity.tableName,
|
|
@@ -33,11 +24,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
|
|
|
33
24
|
]
|
|
34
25
|
}
|
|
35
26
|
|
|
36
|
-
visitManyHasOne(
|
|
37
|
-
entity: Model.Entity,
|
|
38
|
-
relation: Model.ManyHasOneRelation,
|
|
39
|
-
targetEntity: Model.Entity,
|
|
40
|
-
): JoinDefinition[] {
|
|
27
|
+
visitManyHasOne({ targetEntity, relation }: Model.ManyHasOneContext): JoinDefinition[] {
|
|
41
28
|
return [
|
|
42
29
|
{
|
|
43
30
|
tableName: targetEntity.tableName,
|
|
@@ -47,12 +34,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
|
|
|
47
34
|
]
|
|
48
35
|
}
|
|
49
36
|
|
|
50
|
-
visitOneHasMany(
|
|
51
|
-
entity: Model.Entity,
|
|
52
|
-
relation: Model.OneHasManyRelation,
|
|
53
|
-
targetEntity: Model.Entity,
|
|
54
|
-
targetRelation: Model.ManyHasOneRelation,
|
|
55
|
-
): JoinDefinition[] {
|
|
37
|
+
visitOneHasMany({ targetEntity, targetRelation, entity }: Model.OneHasManyContext): JoinDefinition[] {
|
|
56
38
|
return [
|
|
57
39
|
{
|
|
58
40
|
tableName: targetEntity.tableName,
|
|
@@ -63,11 +45,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
|
|
|
63
45
|
]
|
|
64
46
|
}
|
|
65
47
|
|
|
66
|
-
visitManyHasManyOwning(
|
|
67
|
-
entity: Model.Entity,
|
|
68
|
-
relation: Model.ManyHasManyOwningRelation,
|
|
69
|
-
targetEntity: Model.Entity,
|
|
70
|
-
): JoinDefinition[] {
|
|
48
|
+
visitManyHasManyOwning({ relation, entity, targetEntity }: Model.ManyHasManyOwningContext): JoinDefinition[] {
|
|
71
49
|
const sourceAlias = this.path.back().alias
|
|
72
50
|
const targetAlias = this.path.alias
|
|
73
51
|
const joiningAlias = this.path.back().for('x_' + this.path.alias).alias
|
|
@@ -90,12 +68,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
|
|
|
90
68
|
]
|
|
91
69
|
}
|
|
92
70
|
|
|
93
|
-
visitManyHasManyInverse(
|
|
94
|
-
entity: Model.Entity,
|
|
95
|
-
relation: Model.ManyHasManyInverseRelation,
|
|
96
|
-
targetEntity: Model.Entity,
|
|
97
|
-
targetRelation: Model.ManyHasManyOwningRelation,
|
|
98
|
-
): JoinDefinition[] {
|
|
71
|
+
visitManyHasManyInverse({ targetRelation, entity, targetEntity }: Model.ManyHasManyInverseContext): JoinDefinition[] {
|
|
99
72
|
const sourceAlias = this.path.back().alias
|
|
100
73
|
const targetAlias = this.path.alias
|
|
101
74
|
const joiningAlias = this.path.back().for('x_' + this.path.alias).alias
|
|
@@ -15,37 +15,26 @@ export type GroupedCounts = Record<Input.PrimaryValue, number>
|
|
|
15
15
|
type CountOneHasManyGroupsArgs = {
|
|
16
16
|
mapper: Mapper
|
|
17
17
|
filter: Input.OptionalWhere | undefined
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
relationPath: Model.AnyRelationContext[]
|
|
19
|
+
relationContext: Model.OneHasManyContext
|
|
20
20
|
ids: Input.PrimaryValue[]
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
type FetchOneHasManyGroupsArgs = {
|
|
24
24
|
mapper: Mapper
|
|
25
25
|
objectNode: ObjectNode<Input.ListQueryInput>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
targetRelation: Model.ManyHasOneRelation
|
|
26
|
+
relationPath: Model.AnyRelationContext[]
|
|
27
|
+
relationContext: Model.OneHasManyContext
|
|
29
28
|
ids: Input.PrimaryValue[]
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
type ManyHasManyBaseArgs =
|
|
33
32
|
& {
|
|
34
33
|
mapper: Mapper
|
|
35
|
-
targetEntity: Model.Entity
|
|
36
34
|
ids: Input.PrimaryValue[]
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
|
|
40
|
-
sourceRelation: Model.ManyHasManyOwningRelation
|
|
41
|
-
targetRelation: Model.ManyHasManyInverseRelation | null
|
|
42
|
-
}
|
|
43
|
-
| {
|
|
44
|
-
directionFrom: 'inverse'
|
|
45
|
-
sourceRelation: Model.ManyHasManyInverseRelation
|
|
46
|
-
targetRelation: Model.ManyHasManyOwningRelation
|
|
47
|
-
}
|
|
48
|
-
)
|
|
35
|
+
relationPath: Model.AnyRelationContext[]
|
|
36
|
+
relationContext: Model.ManyHasManyInverseContext | Model.ManyHasManyOwningContext
|
|
37
|
+
}
|
|
49
38
|
type CountManyHasManyGroupArgs =
|
|
50
39
|
& ManyHasManyBaseArgs
|
|
51
40
|
& {
|
|
@@ -69,22 +58,26 @@ export class RelationFetcher {
|
|
|
69
58
|
public async countOneHasManyGroups({
|
|
70
59
|
mapper,
|
|
71
60
|
filter,
|
|
72
|
-
|
|
73
|
-
|
|
61
|
+
relationContext,
|
|
62
|
+
relationPath,
|
|
74
63
|
ids,
|
|
75
64
|
}: CountOneHasManyGroupsArgs): Promise<GroupedCounts> {
|
|
65
|
+
const { targetRelation, targetEntity } = relationContext
|
|
76
66
|
const filterWithParent = this.createOneHasManyFilter(targetEntity, targetRelation, ids, filter)
|
|
77
|
-
return mapper.countGrouped(targetEntity, filterWithParent, targetRelation
|
|
67
|
+
return mapper.countGrouped(targetEntity, filterWithParent, targetRelation, [
|
|
68
|
+
...relationPath,
|
|
69
|
+
relationContext,
|
|
70
|
+
])
|
|
78
71
|
}
|
|
79
72
|
|
|
80
73
|
public async fetchOneHasManyGroups({
|
|
81
74
|
mapper,
|
|
82
75
|
objectNode,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
targetRelation,
|
|
76
|
+
relationContext,
|
|
77
|
+
relationPath,
|
|
86
78
|
ids,
|
|
87
79
|
}: FetchOneHasManyGroupsArgs): Promise<SelectGroupedObjects> {
|
|
80
|
+
const { relation, targetEntity, targetRelation } = relationContext
|
|
88
81
|
const filter = this.createOneHasManyFilter(targetEntity, targetRelation, ids, objectNode.args.filter)
|
|
89
82
|
const objectNodeWithWhere = objectNode.withArg<Input.ListQueryInput>('filter', filter)
|
|
90
83
|
const objectNodeWithOrder = OrderByHelper.appendDefaultOrderBy(
|
|
@@ -93,7 +86,10 @@ export class RelationFetcher {
|
|
|
93
86
|
relation.orderBy || [],
|
|
94
87
|
)
|
|
95
88
|
|
|
96
|
-
return mapper.selectGrouped(targetEntity, objectNodeWithOrder, targetRelation
|
|
89
|
+
return mapper.selectGrouped(targetEntity, objectNodeWithOrder, targetRelation, [
|
|
90
|
+
...relationPath,
|
|
91
|
+
relationContext,
|
|
92
|
+
])
|
|
97
93
|
}
|
|
98
94
|
|
|
99
95
|
private createOneHasManyFilter(
|
|
@@ -114,40 +110,40 @@ export class RelationFetcher {
|
|
|
114
110
|
public async countManyHasManyGroups({
|
|
115
111
|
mapper,
|
|
116
112
|
filter,
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
sourceRelation,
|
|
120
|
-
targetRelation,
|
|
113
|
+
relationContext,
|
|
114
|
+
relationPath,
|
|
121
115
|
ids,
|
|
122
116
|
}: CountManyHasManyGroupArgs): Promise<GroupedCounts> {
|
|
123
|
-
const owningRelation =
|
|
124
|
-
|
|
125
|
-
const
|
|
117
|
+
const owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation
|
|
118
|
+
|
|
119
|
+
const joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })
|
|
120
|
+
|
|
121
|
+
const qb = this.buildJunctionQb(owningRelation, ids, joiningColumns, relationContext.targetEntity, { filter }, relationPath)
|
|
126
122
|
.select(['junction_', joiningColumns.sourceColumn.columnName])
|
|
127
123
|
.select(expr => expr.raw('count(*)'), 'row_count')
|
|
128
124
|
.groupBy(['junction_', joiningColumns.sourceColumn.columnName])
|
|
125
|
+
|
|
129
126
|
const result = new Map<string, number>()
|
|
130
127
|
const rows = await qb.getResult(mapper.db)
|
|
131
128
|
for (const row of rows) {
|
|
132
129
|
result.set(String(row[joiningColumns.sourceColumn.columnName]), Number(row.row_count))
|
|
133
130
|
}
|
|
131
|
+
|
|
134
132
|
return Object.fromEntries(result)
|
|
135
133
|
}
|
|
136
134
|
|
|
137
135
|
public async fetchManyHasManyGroups({
|
|
138
136
|
mapper,
|
|
139
137
|
field,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
targetRelation,
|
|
143
|
-
directionFrom,
|
|
138
|
+
relationContext,
|
|
139
|
+
relationPath,
|
|
144
140
|
ids,
|
|
145
141
|
}: FetchManyHasManyGroupsArgs): Promise<SelectGroupedObjects> {
|
|
146
|
-
const owningRelation =
|
|
147
|
-
const joiningColumns = this.resolveJoiningColumns({
|
|
148
|
-
const defaultOrderBy =
|
|
149
|
-
const objectNode = OrderByHelper.appendDefaultOrderBy(targetEntity, field, defaultOrderBy)
|
|
150
|
-
|
|
142
|
+
const owningRelation = relationContext.type === 'manyHasManyInverse' ? relationContext.targetRelation : relationContext.relation
|
|
143
|
+
const joiningColumns = this.resolveJoiningColumns({ relationType: relationContext.type, joiningTable: owningRelation.joiningTable })
|
|
144
|
+
const defaultOrderBy = relationContext.relation.orderBy || []
|
|
145
|
+
const objectNode = OrderByHelper.appendDefaultOrderBy(relationContext.targetEntity, field, defaultOrderBy)
|
|
146
|
+
const { targetEntity } = relationContext
|
|
151
147
|
const junctionValues = await this.fetchJunction(
|
|
152
148
|
mapper.db,
|
|
153
149
|
owningRelation,
|
|
@@ -155,6 +151,7 @@ export class RelationFetcher {
|
|
|
155
151
|
joiningColumns,
|
|
156
152
|
targetEntity,
|
|
157
153
|
objectNode,
|
|
154
|
+
relationPath,
|
|
158
155
|
)
|
|
159
156
|
if (junctionValues.length === 0) {
|
|
160
157
|
return {}
|
|
@@ -173,18 +170,18 @@ export class RelationFetcher {
|
|
|
173
170
|
},
|
|
174
171
|
})
|
|
175
172
|
.withField(primaryField)
|
|
176
|
-
const result = await mapper.select(targetEntity, queryWithWhere,
|
|
173
|
+
const result = await mapper.select(targetEntity, queryWithWhere, [...relationPath, relationContext])
|
|
177
174
|
|
|
178
175
|
return this.buildManyHasManyGroups(targetEntity, joiningColumns, result, junctionValues)
|
|
179
176
|
}
|
|
180
177
|
|
|
181
|
-
private resolveJoiningColumns({
|
|
182
|
-
return
|
|
183
|
-
sourceColumn:
|
|
184
|
-
targetColumn:
|
|
178
|
+
private resolveJoiningColumns({ relationType, joiningTable }: { joiningTable: Model.JoiningTable; relationType: 'manyHasManyOwning' | 'manyHasManyInverse' }): JoiningColumns {
|
|
179
|
+
return relationType === 'manyHasManyOwning' ? {
|
|
180
|
+
sourceColumn: joiningTable.joiningColumn,
|
|
181
|
+
targetColumn: joiningTable.inverseJoiningColumn,
|
|
185
182
|
} : {
|
|
186
|
-
sourceColumn:
|
|
187
|
-
targetColumn:
|
|
183
|
+
sourceColumn: joiningTable.inverseJoiningColumn,
|
|
184
|
+
targetColumn: joiningTable.joiningColumn,
|
|
188
185
|
}
|
|
189
186
|
}
|
|
190
187
|
|
|
@@ -220,9 +217,10 @@ export class RelationFetcher {
|
|
|
220
217
|
column: JoiningColumns,
|
|
221
218
|
targetEntity: Model.Entity,
|
|
222
219
|
object: ObjectNode<Input.ListQueryInput>,
|
|
220
|
+
relationPath: Model.AnyRelationContext[],
|
|
223
221
|
): Promise<Record<string, Value.AtomicValue>[]> {
|
|
224
222
|
const joiningTable = relation.joiningTable
|
|
225
|
-
const qb = this.buildJunctionQb(relation, values, column, targetEntity, object.args)
|
|
223
|
+
const qb = this.buildJunctionQb(relation, values, column, targetEntity, object.args, relationPath)
|
|
226
224
|
.select(['junction_', joiningTable.inverseJoiningColumn.columnName])
|
|
227
225
|
.select(['junction_', joiningTable.joiningColumn.columnName])
|
|
228
226
|
const wrapper = new LimitByGroupWrapper(
|
|
@@ -252,6 +250,7 @@ export class RelationFetcher {
|
|
|
252
250
|
column: JoiningColumns,
|
|
253
251
|
targetEntity: Model.Entity,
|
|
254
252
|
objectArgs: Input.ListQueryInput,
|
|
253
|
+
relationPath: Model.AnyRelationContext[],
|
|
255
254
|
): SelectBuilder {
|
|
256
255
|
const joiningTable = relation.joiningTable
|
|
257
256
|
|
|
@@ -279,7 +278,7 @@ export class RelationFetcher {
|
|
|
279
278
|
}
|
|
280
279
|
|
|
281
280
|
if (where && hasWhere) {
|
|
282
|
-
qb = this.whereBuilder.build(qb, targetEntity, this.pathFactory.create([]), where)
|
|
281
|
+
qb = this.whereBuilder.build(qb, targetEntity, this.pathFactory.create([]), where, relationPath)
|
|
283
282
|
}
|
|
284
283
|
return qb
|
|
285
284
|
}
|
|
@@ -30,6 +30,7 @@ export class SelectBuilder {
|
|
|
30
30
|
private readonly fieldsVisitorFactory: FieldsVisitorFactory,
|
|
31
31
|
private readonly selectHandlers: { [key: string]: SelectExecutionHandler<any> },
|
|
32
32
|
private readonly pathFactory: PathFactory,
|
|
33
|
+
private readonly relationPath: Model.AnyRelationContext[],
|
|
33
34
|
) {}
|
|
34
35
|
|
|
35
36
|
public async execute(db: Client): Promise<SelectRow[]> {
|
|
@@ -53,7 +54,7 @@ export class SelectBuilder {
|
|
|
53
54
|
this.selectInternal(mapper, entity, path, input)
|
|
54
55
|
const where = input.args.filter
|
|
55
56
|
if (where) {
|
|
56
|
-
this.qb = this.whereBuilder.build(this.qb, entity, path, where)
|
|
57
|
+
this.qb = this.whereBuilder.build(this.qb, entity, path, where, this.relationPath)
|
|
57
58
|
}
|
|
58
59
|
const orderBy = input.args.orderBy || []
|
|
59
60
|
|
|
@@ -96,6 +97,7 @@ export class SelectBuilder {
|
|
|
96
97
|
})()
|
|
97
98
|
const executionContext: SelectExecutionHandlerContext = {
|
|
98
99
|
mapper,
|
|
100
|
+
relationPath: this.relationPath,
|
|
99
101
|
addData: async (fieldName, cb, defaultValue = null) => {
|
|
100
102
|
const columnName = getColumnName(this.schema, entity, fieldName)
|
|
101
103
|
const ids = (await this.getColumnValues(path.for(fieldName), columnName)).filter(it => it !== null)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SelectBuilder } from './SelectBuilder'
|
|
2
2
|
import { SelectHydrator } from './SelectHydrator'
|
|
3
3
|
import { SelectBuilder as DbSelectBuilder } from '@contember/database'
|
|
4
|
+
import { Model } from '@contember/schema'
|
|
4
5
|
|
|
5
6
|
export interface SelectBuilderFactory {
|
|
6
|
-
create(qb: DbSelectBuilder<DbSelectBuilder.Result>, hydrator: SelectHydrator): SelectBuilder
|
|
7
|
+
create(qb: DbSelectBuilder<DbSelectBuilder.Result>, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder
|
|
7
8
|
}
|
|
@@ -21,33 +21,45 @@ export class WhereBuilder {
|
|
|
21
21
|
entity: Model.Entity,
|
|
22
22
|
path: Path,
|
|
23
23
|
where: Input.OptionalWhere,
|
|
24
|
-
|
|
24
|
+
relationPath: Model.AnyRelationContext[] = [],
|
|
25
25
|
) {
|
|
26
|
-
|
|
26
|
+
const optimizedWhere = this.whereOptimizer.optimize(where, entity, relationPath)
|
|
27
|
+
return this.buildInternal(entity, path, optimizedWhere, cb => qb.where(clause => cb(clause)), false)
|
|
27
28
|
}
|
|
28
29
|
|
|
30
|
+
|
|
29
31
|
public buildAdvanced(
|
|
30
32
|
entity: Model.Entity,
|
|
31
33
|
path: Path,
|
|
32
34
|
where: Input.OptionalWhere,
|
|
33
35
|
callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<SelectBuilder.Result>,
|
|
34
|
-
|
|
36
|
+
relationPath: Model.AnyRelationContext[] = [],
|
|
37
|
+
) {
|
|
38
|
+
const optimizedWhere = this.whereOptimizer.optimize(where, entity, relationPath)
|
|
39
|
+
return this.buildInternal(entity, path, optimizedWhere, callback, false)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private buildInternal(
|
|
43
|
+
entity: Model.Entity,
|
|
44
|
+
path: Path,
|
|
45
|
+
where: Input.OptionalWhere,
|
|
46
|
+
callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<SelectBuilder.Result>,
|
|
47
|
+
allowManyJoin: boolean,
|
|
35
48
|
) {
|
|
36
|
-
const optimizedWhere = this.whereOptimizer.optimize(where, entity)
|
|
37
49
|
const joinList: WhereJoinDefinition[] = []
|
|
38
50
|
|
|
39
|
-
const qbWithWhere = callback(clause => this.
|
|
51
|
+
const qbWithWhere = callback(clause => this.buildRecursive(clause, entity, path, where, allowManyJoin, joinList))
|
|
40
52
|
return joinList.reduce<SelectBuilder<SelectBuilder.Result>>(
|
|
41
53
|
(qb, { path, entity, relationName }) => this.joinBuilder.join(qb, path, entity, relationName),
|
|
42
54
|
qbWithWhere,
|
|
43
55
|
)
|
|
44
56
|
}
|
|
45
57
|
|
|
46
|
-
private
|
|
58
|
+
private buildRecursive(
|
|
47
59
|
conditionBuilder: SqlConditionBuilder,
|
|
48
60
|
entity: Model.Entity,
|
|
49
61
|
path: Path,
|
|
50
|
-
where: Input.
|
|
62
|
+
where: Input.OptionalWhere,
|
|
51
63
|
allowManyJoin: boolean,
|
|
52
64
|
joinList: WhereJoinDefinition[],
|
|
53
65
|
): SqlConditionBuilder {
|
|
@@ -58,7 +70,7 @@ export class WhereBuilder {
|
|
|
58
70
|
conditionBuilder = conditionBuilder.and(clause =>
|
|
59
71
|
expr.reduce(
|
|
60
72
|
(clause2, where) =>
|
|
61
|
-
!where ? clause2 : this.
|
|
73
|
+
!where ? clause2 : this.buildRecursive(clause2, entity, path, where, allowManyJoin, joinList),
|
|
62
74
|
clause,
|
|
63
75
|
),
|
|
64
76
|
)
|
|
@@ -70,7 +82,7 @@ export class WhereBuilder {
|
|
|
70
82
|
(clause2, where) =>
|
|
71
83
|
!where
|
|
72
84
|
? clause2
|
|
73
|
-
: clause2.and(clause3 => this.
|
|
85
|
+
: clause2.and(clause3 => this.buildRecursive(clause3, entity, path, where, allowManyJoin, joinList)),
|
|
74
86
|
clause,
|
|
75
87
|
),
|
|
76
88
|
)
|
|
@@ -78,7 +90,7 @@ export class WhereBuilder {
|
|
|
78
90
|
if (where.not !== undefined) {
|
|
79
91
|
const expr = where.not
|
|
80
92
|
conditionBuilder = conditionBuilder.not(clause =>
|
|
81
|
-
this.
|
|
93
|
+
this.buildRecursive(clause, entity, path, expr, allowManyJoin, joinList),
|
|
82
94
|
)
|
|
83
95
|
}
|
|
84
96
|
|
|
@@ -87,11 +99,7 @@ export class WhereBuilder {
|
|
|
87
99
|
continue
|
|
88
100
|
}
|
|
89
101
|
|
|
90
|
-
const joinedWhere = (
|
|
91
|
-
entity: Model.Entity,
|
|
92
|
-
relation: Model.Relation,
|
|
93
|
-
targetEntity: Model.Entity,
|
|
94
|
-
): SqlConditionBuilder => {
|
|
102
|
+
const joinedWhere = ({ targetEntity, relation, entity }: Model.AnyRelationContext): SqlConditionBuilder => {
|
|
95
103
|
const targetPath = path.for(fieldName)
|
|
96
104
|
const relationWhere = where[fieldName] as Input.Where
|
|
97
105
|
if (Object.keys(relationWhere).length === 0) {
|
|
@@ -112,36 +120,37 @@ export class WhereBuilder {
|
|
|
112
120
|
|
|
113
121
|
joinList.push({ path: targetPath, entity, relationName: relation.name })
|
|
114
122
|
|
|
115
|
-
return this.
|
|
123
|
+
return this.buildRecursive(conditionBuilder, targetEntity, targetPath, relationWhere, allowManyJoin, joinList)
|
|
116
124
|
}
|
|
117
125
|
|
|
118
126
|
conditionBuilder = acceptFieldVisitor<SqlConditionBuilder>(this.schema, entity, fieldName, {
|
|
119
|
-
visitColumn: (entity, column) => {
|
|
127
|
+
visitColumn: ({ entity, column }) => {
|
|
120
128
|
const subWhere: Input.Condition<Input.ColumnValue> = where[column.name] as Input.Condition<Input.ColumnValue>
|
|
121
129
|
return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column.columnType, subWhere)
|
|
122
130
|
},
|
|
123
131
|
visitOneHasOneInverse: joinedWhere,
|
|
124
132
|
visitOneHasOneOwning: joinedWhere,
|
|
125
133
|
visitManyHasOne: joinedWhere,
|
|
126
|
-
visitManyHasManyInverse:
|
|
134
|
+
visitManyHasManyInverse: context => {
|
|
127
135
|
if (allowManyJoin) {
|
|
128
|
-
return joinedWhere(
|
|
136
|
+
return joinedWhere(context)
|
|
129
137
|
}
|
|
138
|
+
|
|
130
139
|
const relationWhere = where[fieldName] as Input.Where
|
|
131
140
|
|
|
132
141
|
return conditionBuilder.exists(
|
|
133
142
|
this.createManyHasManySubquery(
|
|
134
143
|
[tableName, entity.primaryColumn],
|
|
135
144
|
relationWhere,
|
|
136
|
-
targetEntity,
|
|
137
|
-
targetRelation.joiningTable,
|
|
145
|
+
context.targetEntity,
|
|
146
|
+
context.targetRelation.joiningTable,
|
|
138
147
|
'inverse',
|
|
139
148
|
),
|
|
140
149
|
)
|
|
141
150
|
},
|
|
142
|
-
visitManyHasManyOwning:
|
|
151
|
+
visitManyHasManyOwning: context => {
|
|
143
152
|
if (allowManyJoin) {
|
|
144
|
-
return joinedWhere(
|
|
153
|
+
return joinedWhere(context)
|
|
145
154
|
}
|
|
146
155
|
|
|
147
156
|
const relationWhere = where[fieldName] as Input.Where
|
|
@@ -150,28 +159,30 @@ export class WhereBuilder {
|
|
|
150
159
|
this.createManyHasManySubquery(
|
|
151
160
|
[tableName, entity.primaryColumn],
|
|
152
161
|
relationWhere,
|
|
153
|
-
targetEntity,
|
|
154
|
-
relation.joiningTable,
|
|
162
|
+
context.targetEntity,
|
|
163
|
+
context.relation.joiningTable,
|
|
155
164
|
'owning',
|
|
156
165
|
),
|
|
157
166
|
)
|
|
158
167
|
},
|
|
159
|
-
visitOneHasMany:
|
|
168
|
+
visitOneHasMany: context => {
|
|
160
169
|
if (allowManyJoin) {
|
|
161
|
-
return joinedWhere(
|
|
170
|
+
return joinedWhere(context)
|
|
162
171
|
}
|
|
163
172
|
|
|
164
173
|
const relationWhere = where[fieldName] as Input.Where
|
|
165
174
|
|
|
175
|
+
const qb = SelectBuilder.create()
|
|
176
|
+
.select(it => it.raw('1'))
|
|
177
|
+
.from(context.targetEntity.tableName, 'sub_')
|
|
178
|
+
.where(it => it.columnsEq([tableName, entity.primaryColumn], ['sub_', context.targetRelation.joiningColumn.columnName]))
|
|
179
|
+
|
|
166
180
|
return conditionBuilder.exists(
|
|
167
|
-
this.
|
|
168
|
-
|
|
169
|
-
.select(it => it.raw('1'))
|
|
170
|
-
.from(targetEntity.tableName, 'sub_')
|
|
171
|
-
.where(it => it.columnsEq([tableName, entity.primaryColumn], ['sub_', targetRelation.joiningColumn.columnName])),
|
|
172
|
-
targetEntity,
|
|
181
|
+
this.buildInternal(
|
|
182
|
+
context.targetEntity,
|
|
173
183
|
this.pathFactory.create([], 'sub_'),
|
|
174
184
|
relationWhere,
|
|
185
|
+
cb => qb.where(clause => cb(clause)),
|
|
175
186
|
true,
|
|
176
187
|
),
|
|
177
188
|
)
|
|
@@ -208,7 +219,7 @@ export class WhereBuilder {
|
|
|
208
219
|
const qbJoined = qb.join(targetEntity.tableName, 'sub_', clause =>
|
|
209
220
|
clause.compareColumns(['junction_', toColumn], Operator.eq, ['sub_', targetEntity.primary]),
|
|
210
221
|
)
|
|
211
|
-
return this.
|
|
222
|
+
return this.buildInternal(
|
|
212
223
|
targetEntity,
|
|
213
224
|
this.pathFactory.create([], 'sub_'),
|
|
214
225
|
relationWhere,
|