@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.
Files changed (236) hide show
  1. package/dist/src/acl/PredicateFactory.d.ts +1 -1
  2. package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
  3. package/dist/src/acl/PredicateFactory.js +6 -13
  4. package/dist/src/acl/PredicateFactory.js.map +1 -1
  5. package/dist/src/acl/PredicatesInjector.d.ts +1 -1
  6. package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
  7. package/dist/src/acl/PredicatesInjector.js +13 -20
  8. package/dist/src/acl/PredicatesInjector.js.map +1 -1
  9. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
  10. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
  11. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +14 -15
  12. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
  13. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
  14. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
  15. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
  16. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
  17. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
  18. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
  19. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +11 -14
  20. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
  21. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
  22. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +2 -2
  23. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
  24. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
  25. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
  26. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
  27. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
  28. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
  29. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
  30. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +11 -15
  31. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
  32. package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
  33. package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
  34. package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
  35. package/dist/src/input-validation/EntityRulesResolver.js +4 -4
  36. package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
  37. package/dist/src/input-validation/QueryAstFactory.js +1 -1
  38. package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
  39. package/dist/src/input-validation/ValidationDataSelector.js +1 -1
  40. package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
  41. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
  42. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
  43. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  44. package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
  45. package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
  46. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
  47. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
  48. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  49. package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
  50. package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
  51. package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
  52. package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
  53. package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
  54. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  55. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
  56. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
  57. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
  58. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
  59. package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
  60. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  61. package/dist/src/inputProcessing/index.d.ts +0 -1
  62. package/dist/src/inputProcessing/index.d.ts.map +1 -1
  63. package/dist/src/inputProcessing/index.js +0 -1
  64. package/dist/src/inputProcessing/index.js.map +1 -1
  65. package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
  66. package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
  67. package/dist/src/mapper/Mapper.d.ts +6 -6
  68. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  69. package/dist/src/mapper/Mapper.js +28 -23
  70. package/dist/src/mapper/Mapper.js.map +1 -1
  71. package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
  72. package/dist/src/mapper/MapperContainer.js +2 -2
  73. package/dist/src/mapper/MapperContainer.js.map +1 -1
  74. package/dist/src/mapper/delete/DeleteExecutor.js +3 -3
  75. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  76. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
  77. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  78. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  79. package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
  80. package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
  81. package/dist/src/mapper/select/JoinVisitor.js +6 -6
  82. package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
  83. package/dist/src/mapper/select/RelationFetcher.d.ts +11 -19
  84. package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
  85. package/dist/src/mapper/select/RelationFetcher.js +34 -25
  86. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  87. package/dist/src/mapper/select/SelectBuilder.d.ts +2 -1
  88. package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
  89. package/dist/src/mapper/select/SelectBuilder.js +4 -2
  90. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  91. package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
  92. package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
  93. package/dist/src/mapper/select/SelectExecutionHandler.d.ts +1 -0
  94. package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
  95. package/dist/src/mapper/select/WhereBuilder.d.ts +3 -2
  96. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  97. package/dist/src/mapper/select/WhereBuilder.js +29 -24
  98. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  99. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +9 -8
  100. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  101. package/dist/src/mapper/select/handlers/FieldsVisitor.js +33 -25
  102. package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  103. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
  104. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
  105. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  106. package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -1
  107. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +6 -0
  108. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -1
  109. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +2 -1
  110. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
  111. package/dist/src/mapper/select/optimizer/WhereOptimizer.js +52 -20
  112. package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
  113. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +4 -1
  114. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
  115. package/dist/src/mapper/select/optimizer/WhereReplacer.js +4 -3
  116. package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -1
  117. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
  118. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  119. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  120. package/dist/src/mapper/update/UpdateBuilder.js +3 -3
  121. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  122. package/dist/src/resolvers/MutationResolver.js +1 -1
  123. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  124. package/dist/src/resolvers/ReadHelpers.js +3 -3
  125. package/dist/src/resolvers/ReadHelpers.js.map +1 -1
  126. package/dist/src/resolvers/ReadResolver.js +2 -2
  127. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  128. package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
  129. package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
  130. package/dist/src/schema/FieldAccessVisitor.js +2 -2
  131. package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
  132. package/dist/src/schema/OrderByTypeProvider.js +1 -1
  133. package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
  134. package/dist/src/schema/WhereTypeProvider.js +4 -4
  135. package/dist/src/schema/WhereTypeProvider.js.map +1 -1
  136. package/dist/src/schema/entities/FieldArgsVisitor.d.ts +3 -3
  137. package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
  138. package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
  139. package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
  140. package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
  141. package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
  142. package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
  143. package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
  144. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
  145. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  146. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
  147. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  148. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  149. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  150. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
  151. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  152. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
  153. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  154. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
  155. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  156. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
  157. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  158. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
  159. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  160. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  161. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  162. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
  163. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  164. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
  165. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  166. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
  167. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  168. package/dist/src/tsconfig.tsbuildinfo +1 -1
  169. package/dist/src/utils/uniqueWhereFields.js +3 -3
  170. package/dist/src/utils/uniqueWhereFields.js.map +1 -1
  171. package/dist/tests/cases/unit/predicatesFactory.test.js +7 -1
  172. package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -1
  173. package/dist/tests/cases/unit/whereOptimizer.test.js +82 -0
  174. package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
  175. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  176. package/package.json +10 -10
  177. package/src/acl/PredicateFactory.ts +7 -14
  178. package/src/acl/PredicatesInjector.ts +13 -18
  179. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +17 -24
  180. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
  181. package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +10 -28
  182. package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +6 -3
  183. package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
  184. package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +10 -29
  185. package/src/input-validation/ColumnValueResolver.ts +2 -3
  186. package/src/input-validation/EntityRulesResolver.ts +4 -4
  187. package/src/input-validation/QueryAstFactory.ts +1 -1
  188. package/src/input-validation/ValidationDataSelector.ts +1 -1
  189. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
  190. package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
  191. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
  192. package/src/inputProcessing/CreateInputProcessor.ts +8 -9
  193. package/src/inputProcessing/CreateInputVisitor.ts +27 -89
  194. package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
  195. package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
  196. package/src/inputProcessing/index.ts +0 -1
  197. package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
  198. package/src/mapper/Mapper.ts +36 -33
  199. package/src/mapper/MapperContainer.ts +3 -2
  200. package/src/mapper/delete/DeleteExecutor.ts +3 -3
  201. package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
  202. package/src/mapper/select/JoinVisitor.ts +6 -33
  203. package/src/mapper/select/RelationFetcher.ts +49 -50
  204. package/src/mapper/select/SelectBuilder.ts +3 -1
  205. package/src/mapper/select/SelectBuilderFactory.ts +2 -1
  206. package/src/mapper/select/SelectExecutionHandler.ts +1 -0
  207. package/src/mapper/select/WhereBuilder.ts +45 -34
  208. package/src/mapper/select/handlers/FieldsVisitor.ts +32 -49
  209. package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
  210. package/src/mapper/select/optimizer/ConditionOptimizer.ts +6 -0
  211. package/src/mapper/select/optimizer/WhereOptimizer.ts +58 -20
  212. package/src/mapper/select/optimizer/WhereReplacer.ts +8 -3
  213. package/src/mapper/update/SqlUpdateInputProcessor.ts +1 -1
  214. package/src/mapper/update/UpdateBuilder.ts +3 -3
  215. package/src/resolvers/MutationResolver.ts +1 -1
  216. package/src/resolvers/ReadHelpers.ts +3 -3
  217. package/src/resolvers/ReadResolver.ts +2 -2
  218. package/src/schema/FieldAccessVisitor.ts +2 -2
  219. package/src/schema/OrderByTypeProvider.ts +1 -1
  220. package/src/schema/WhereTypeProvider.ts +4 -4
  221. package/src/schema/entities/FieldArgsVisitor.ts +3 -3
  222. package/src/schema/entities/FieldTypeVisitor.ts +3 -3
  223. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
  224. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
  225. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +5 -18
  226. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
  227. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
  228. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +2 -12
  229. package/src/utils/uniqueWhereFields.ts +3 -3
  230. package/tests/cases/unit/predicatesFactory.test.ts +8 -2
  231. package/tests/cases/unit/whereOptimizer.test.ts +94 -0
  232. package/dist/src/inputProcessing/InputContext.d.ts +0 -43
  233. package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
  234. package/dist/src/inputProcessing/InputContext.js +0 -3
  235. package/dist/src/inputProcessing/InputContext.js.map +0 -1
  236. 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: ({}, relation): EntityOwningRelationTuple => [entity, relation],
135
- visitManyHasOne: ({}, relation): EntityOwningRelationTuple => [entity, relation],
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: ({}, relation, targetEntity) =>
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: Context.ColumnContext): Promise<MutationResultList> {
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: Context.OneHasOneOwningContext & { input: Input.UniqueWhere }): Promise<MutationResultList> => {
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
- targetEntity: Model.Entity
19
- targetRelation: Model.ManyHasOneRelation
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
- targetEntity: Model.Entity
27
- relation: Model.OneHasManyRelation
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
- directionFrom: 'owning'
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
- targetEntity,
73
- targetRelation,
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
- targetEntity,
84
- relation,
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
- targetEntity,
118
- directionFrom,
119
- sourceRelation,
120
- targetRelation,
113
+ relationContext,
114
+ relationPath,
121
115
  ids,
122
116
  }: CountManyHasManyGroupArgs): Promise<GroupedCounts> {
123
- const owningRelation = directionFrom === 'owning' ? sourceRelation : targetRelation
124
- const joiningColumns = this.resolveJoiningColumns({ directionFrom, owningRelation })
125
- const qb = this.buildJunctionQb(owningRelation, ids, joiningColumns, targetEntity, { filter })
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
- sourceRelation,
141
- targetEntity,
142
- targetRelation,
143
- directionFrom,
138
+ relationContext,
139
+ relationPath,
144
140
  ids,
145
141
  }: FetchManyHasManyGroupsArgs): Promise<SelectGroupedObjects> {
146
- const owningRelation = directionFrom === 'owning' ? sourceRelation : targetRelation
147
- const joiningColumns = this.resolveJoiningColumns({ directionFrom, owningRelation })
148
- const defaultOrderBy = sourceRelation.orderBy || []
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, targetRelation)
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({ directionFrom, owningRelation }: { owningRelation: Model.ManyHasManyOwningRelation; directionFrom: 'owning' | 'inverse' }): JoiningColumns {
182
- return directionFrom === 'owning' ? {
183
- sourceColumn: owningRelation.joiningTable.joiningColumn,
184
- targetColumn: owningRelation.joiningTable.inverseJoiningColumn,
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: owningRelation.joiningTable.inverseJoiningColumn,
187
- targetColumn: owningRelation.joiningTable.joiningColumn,
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,6 +21,7 @@ export type SelectExecutionHandlerContext<
21
21
  mapper: Mapper
22
22
  path: Path
23
23
  entity: Model.Entity
24
+ relationPath: Model.AnyRelationContext[]
24
25
 
25
26
  addColumn: (
26
27
  queryCallback: (qb: SelectBuilder<SelectBuilder.Result>) => SelectBuilder<SelectBuilder.Result>,
@@ -21,33 +21,45 @@ export class WhereBuilder {
21
21
  entity: Model.Entity,
22
22
  path: Path,
23
23
  where: Input.OptionalWhere,
24
- allowManyJoin: boolean = false,
24
+ relationPath: Model.AnyRelationContext[] = [],
25
25
  ) {
26
- return this.buildAdvanced(entity, path, where, cb => qb.where(clause => cb(clause)), allowManyJoin)
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
- allowManyJoin: boolean = false,
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.buildInternal(clause, entity, path, optimizedWhere, allowManyJoin, joinList))
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 buildInternal(
58
+ private buildRecursive(
47
59
  conditionBuilder: SqlConditionBuilder,
48
60
  entity: Model.Entity,
49
61
  path: Path,
50
- where: Input.Where,
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.buildInternal(clause2, entity, path, where, allowManyJoin, joinList),
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.buildInternal(clause3, entity, path, where, allowManyJoin, joinList)),
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.buildInternal(clause, entity, path, expr, allowManyJoin, joinList),
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.buildInternal(conditionBuilder, targetEntity, targetPath, relationWhere, allowManyJoin, joinList)
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: (entity, relation, targetEntity, targetRelation) => {
134
+ visitManyHasManyInverse: context => {
127
135
  if (allowManyJoin) {
128
- return joinedWhere(entity, relation, targetEntity)
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: (entity, relation, targetEntity) => {
151
+ visitManyHasManyOwning: context => {
143
152
  if (allowManyJoin) {
144
- return joinedWhere(entity, relation, targetEntity)
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: (entity, relation, targetEntity, targetRelation) => {
168
+ visitOneHasMany: context => {
160
169
  if (allowManyJoin) {
161
- return joinedWhere(entity, relation, targetEntity)
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.build(
168
- SelectBuilder.create()
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.buildAdvanced(
222
+ return this.buildInternal(
212
223
  targetEntity,
213
224
  this.pathFactory.create([], 'sub_'),
214
225
  relationWhere,