@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
@@ -1,5 +1,4 @@
1
1
  import { UpdateInputProcessor } from '../../inputProcessing'
2
- import * as Context from '../../inputProcessing'
3
2
  import { Input, Model } from '@contember/schema'
4
3
  import { appendRelationToPath, ValidationPath } from '../ValidationPath'
5
4
  import { Mapper } from '../../mapper'
@@ -16,11 +15,11 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
16
15
  private readonly mapper: Mapper,
17
16
  ) {}
18
17
 
19
- async column(context: Context.ColumnContext): Promise<Result> {
18
+ async column(context: Model.ColumnContext): Promise<Result> {
20
19
  return []
21
20
  }
22
21
 
23
- manyHasManyInverse: UpdateInputProcessor.HasManyRelationInputProcessor<Context.ManyHasManyInverseContext, Result> = {
22
+ manyHasManyInverse: UpdateInputProcessor.HasManyRelationInputProcessor<Model.ManyHasManyInverseContext, Result> = {
24
23
  create: ctx => this.processCreate(ctx),
25
24
  update: ctx => this.processUpdate({ ...ctx, input: ctx.input.data }),
26
25
  upsert: ctx => this.processUpsert(ctx),
@@ -28,7 +27,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
28
27
  disconnect: NoResult,
29
28
  ['delete']: NoResult,
30
29
  }
31
- manyHasManyOwning: UpdateInputProcessor.HasManyRelationInputProcessor<Context.ManyHasManyOwningContext, Result> = {
30
+ manyHasManyOwning: UpdateInputProcessor.HasManyRelationInputProcessor<Model.ManyHasManyOwningContext, Result> = {
32
31
  create: ctx => this.processCreate(ctx),
33
32
  update: ctx => this.processUpdate({ ...ctx, input: ctx.input.data }),
34
33
  upsert: ctx => this.processUpsert(ctx),
@@ -36,7 +35,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
36
35
  disconnect: NoResult,
37
36
  ['delete']: NoResult,
38
37
  }
39
- manyHasOne: UpdateInputProcessor.HasOneRelationInputProcessor<Context.ManyHasOneContext, Result> = {
38
+ manyHasOne: UpdateInputProcessor.HasOneRelationInputProcessor<Model.ManyHasOneContext, Result> = {
40
39
  create: ctx => this.processCreate(ctx),
41
40
  update: ctx => this.processUpdate(ctx),
42
41
  upsert: ctx => this.processUpsert(ctx),
@@ -44,7 +43,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
44
43
  disconnect: NoResult,
45
44
  ['delete']: NoResult,
46
45
  }
47
- oneHasMany: UpdateInputProcessor.HasManyRelationInputProcessor<Context.OneHasManyContext, Result> = {
46
+ oneHasMany: UpdateInputProcessor.HasManyRelationInputProcessor<Model.OneHasManyContext, Result> = {
48
47
  create: ctx => this.processCreate(ctx),
49
48
  update: ctx => this.processUpdate({ ...ctx, input: ctx.input.data }),
50
49
  upsert: ctx => this.processUpsert(ctx),
@@ -52,7 +51,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
52
51
  disconnect: NoResult,
53
52
  ['delete']: NoResult,
54
53
  }
55
- oneHasOneInverse: UpdateInputProcessor.HasOneRelationInputProcessor<Context.OneHasOneInverseContext, Result> = {
54
+ oneHasOneInverse: UpdateInputProcessor.HasOneRelationInputProcessor<Model.OneHasOneInverseContext, Result> = {
56
55
  create: ctx => this.processCreate(ctx),
57
56
  update: ctx => this.processUpdate(ctx),
58
57
  upsert: ctx => this.processUpsert(ctx),
@@ -61,7 +60,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
61
60
  ['delete']: NoResult,
62
61
  }
63
62
 
64
- oneHasOneOwning: UpdateInputProcessor.HasOneRelationInputProcessor<Context.OneHasOneOwningContext, Result> = {
63
+ oneHasOneOwning: UpdateInputProcessor.HasOneRelationInputProcessor<Model.OneHasOneOwningContext, Result> = {
65
64
  create: ctx => this.processCreate(ctx),
66
65
  update: ctx => this.processUpdate(ctx),
67
66
  upsert: ctx => this.processUpsert(ctx),
@@ -1,17 +1,16 @@
1
- import { Input } from '@contember/schema'
2
- import * as Context from './InputContext'
1
+ import { Input, Model } from '@contember/schema'
3
2
 
4
3
  interface CreateInputProcessor<Result = void> {
5
- column(context: Context.ColumnContext): Promise<Result>
4
+ column(context: CreateInputProcessor.ContextWithInput<Model.ColumnContext, Input.ColumnValue | undefined>): Promise<Result>
6
5
 
7
- manyHasManyInverse: CreateInputProcessor.HasManyRelationProcessor<Context.ManyHasManyInverseContext, Result>
8
- manyHasManyOwning: CreateInputProcessor.HasManyRelationProcessor<Context.ManyHasManyOwningContext, Result>
6
+ manyHasManyInverse: CreateInputProcessor.HasManyRelationProcessor<Model.ManyHasManyInverseContext, Result>
7
+ manyHasManyOwning: CreateInputProcessor.HasManyRelationProcessor<Model.ManyHasManyOwningContext, Result>
9
8
 
10
- oneHasOneInverse: CreateInputProcessor.HasOneRelationProcessor<Context.OneHasOneInverseContext, Result>
11
- oneHasOneOwning: CreateInputProcessor.HasOneRelationProcessor<Context.OneHasOneOwningContext, Result>
9
+ oneHasOneInverse: CreateInputProcessor.HasOneRelationProcessor<Model.OneHasOneInverseContext, Result>
10
+ oneHasOneOwning: CreateInputProcessor.HasOneRelationProcessor<Model.OneHasOneOwningContext, Result>
12
11
 
13
- oneHasMany: CreateInputProcessor.HasManyRelationProcessor<Context.OneHasManyContext, Result>
14
- manyHasOne: CreateInputProcessor.HasOneRelationProcessor<Context.ManyHasOneContext, Result>
12
+ oneHasMany: CreateInputProcessor.HasManyRelationProcessor<Model.OneHasManyContext, Result>
13
+ manyHasOne: CreateInputProcessor.HasOneRelationProcessor<Model.ManyHasOneContext, Result>
15
14
  }
16
15
 
17
16
  namespace CreateInputProcessor {
@@ -1,7 +1,6 @@
1
1
  import { isIt } from '../utils'
2
2
  import { Input, Model } from '@contember/schema'
3
3
  import { CreateInputProcessor } from './CreateInputProcessor'
4
- import * as Context from './InputContext'
5
4
  import { filterObject } from '../utils'
6
5
  import { UserError } from '../exception'
7
6
  import { ImplementationException } from '../exception'
@@ -16,119 +15,58 @@ export class CreateInputVisitor<Result> implements
16
15
  private readonly data: Input.CreateDataInput,
17
16
  ) {}
18
17
 
19
- public visitColumn(entity: Model.Entity, column: Model.AnyColumn): Promise<Result> {
18
+ public visitColumn(context: Model.ColumnContext): Promise<Result> {
20
19
  return this.createInputProcessor.column({
21
- entity,
22
- column,
23
- input: this.data[column.name] as Input.ColumnValue,
20
+ ...context,
21
+ input: this.data[context.column.name] as Input.ColumnValue,
24
22
  })
25
23
  }
26
24
 
27
- public visitManyHasManyInverse(
28
- entity: Model.Entity,
29
- relation: Model.ManyHasManyInverseRelation,
30
- targetEntity: Model.Entity,
31
- targetRelation: Model.ManyHasManyOwningRelation,
32
- ) {
33
- return this.processManyRelationInput<Context.ManyHasManyInverseContext>(
25
+ public visitManyHasManyInverse(context: Model.ManyHasManyInverseContext) {
26
+ return this.processManyRelationInput(
34
27
  this.createInputProcessor.manyHasManyInverse,
35
- {
36
- entity,
37
- relation,
38
- targetEntity,
39
- targetRelation,
40
- },
41
- this.data[relation.name] as Input.CreateManyRelationInput,
28
+ context,
29
+ this.data[context.relation.name] as Input.CreateManyRelationInput,
42
30
  )
43
31
  }
44
32
 
45
- public visitManyHasManyOwning(
46
- entity: Model.Entity,
47
- relation: Model.ManyHasManyOwningRelation,
48
- targetEntity: Model.Entity,
49
- targetRelation: Model.ManyHasManyInverseRelation | null,
50
- ) {
51
- return this.processManyRelationInput<Context.ManyHasManyOwningContext>(
33
+ public visitManyHasManyOwning(context: Model.ManyHasManyOwningContext) {
34
+ return this.processManyRelationInput(
52
35
  this.createInputProcessor.manyHasManyOwning,
53
- {
54
- entity,
55
- relation,
56
- targetEntity,
57
- targetRelation,
58
- },
59
- this.data[relation.name] as Input.CreateManyRelationInput,
36
+ context,
37
+ this.data[context.relation.name] as Input.CreateManyRelationInput,
60
38
  )
61
39
  }
62
40
 
63
- public visitManyHasOne(
64
- entity: Model.Entity,
65
- relation: Model.ManyHasOneRelation,
66
- targetEntity: Model.Entity,
67
- targetRelation: Model.OneHasManyRelation | null,
68
- ) {
69
- return this.processRelationInput<Context.ManyHasOneContext>(
41
+ public visitManyHasOne(context: Model.ManyHasOneContext) {
42
+ return this.processRelationInput(
70
43
  this.createInputProcessor.manyHasOne,
71
- {
72
- entity,
73
- relation,
74
- targetEntity,
75
- targetRelation,
76
- },
77
- this.data[relation.name] as Input.CreateOneRelationInput,
44
+ context,
45
+ this.data[context.relation.name] as Input.CreateOneRelationInput,
78
46
  )
79
47
  }
80
48
 
81
- public visitOneHasMany(
82
- entity: Model.Entity,
83
- relation: Model.OneHasManyRelation,
84
- targetEntity: Model.Entity,
85
- targetRelation: Model.ManyHasOneRelation,
86
- ) {
87
- return this.processManyRelationInput<Context.OneHasManyContext>(
49
+ public visitOneHasMany(context: Model.OneHasManyContext) {
50
+ return this.processManyRelationInput(
88
51
  this.createInputProcessor.oneHasMany,
89
- {
90
- entity,
91
- relation,
92
- targetEntity,
93
- targetRelation,
94
- },
95
- this.data[relation.name] as Input.CreateManyRelationInput,
52
+ context,
53
+ this.data[context.relation.name] as Input.CreateManyRelationInput,
96
54
  )
97
55
  }
98
56
 
99
- public visitOneHasOneInverse(
100
- entity: Model.Entity,
101
- relation: Model.OneHasOneInverseRelation,
102
- targetEntity: Model.Entity,
103
- targetRelation: Model.OneHasOneOwningRelation,
104
- ) {
105
- return this.processRelationInput<Context.OneHasOneInverseContext>(
57
+ public visitOneHasOneInverse(context: Model.OneHasOneInverseContext) {
58
+ return this.processRelationInput(
106
59
  this.createInputProcessor.oneHasOneInverse,
107
- {
108
- entity,
109
- relation,
110
- targetEntity,
111
- targetRelation,
112
- },
113
- this.data[relation.name] as Input.CreateOneRelationInput,
60
+ context,
61
+ this.data[context.relation.name] as Input.CreateOneRelationInput,
114
62
  )
115
63
  }
116
64
 
117
- public visitOneHasOneOwning(
118
- entity: Model.Entity,
119
- relation: Model.OneHasOneOwningRelation,
120
- targetEntity: Model.Entity,
121
- targetRelation: Model.OneHasOneInverseRelation | null,
122
- ) {
123
- return this.processRelationInput<Context.OneHasOneOwningContext>(
65
+ public visitOneHasOneOwning(context: Model.OneHasOneOwningContext) {
66
+ return this.processRelationInput(
124
67
  this.createInputProcessor.oneHasOneOwning,
125
- {
126
- entity,
127
- relation,
128
- targetEntity,
129
- targetRelation,
130
- },
131
- this.data[relation.name] as Input.CreateOneRelationInput,
68
+ context,
69
+ this.data[context.relation.name] as Input.CreateOneRelationInput,
132
70
  )
133
71
  }
134
72
 
@@ -1,20 +1,19 @@
1
- import { Input } from '@contember/schema'
2
- import * as Context from './InputContext'
1
+ import { Input, Model } from '@contember/schema'
3
2
 
4
3
  interface UpdateInputProcessor<Result = void> {
5
- column(context: Context.ColumnContext): Promise<Result>
4
+ column(context: UpdateInputProcessor.ContextWithInput<Model.ColumnContext, Input.ColumnValue | undefined>): Promise<Result>
6
5
 
7
- manyHasManyInverse: UpdateInputProcessor.HasManyRelationInputProcessor<Context.ManyHasManyInverseContext, Result>
6
+ manyHasManyInverse: UpdateInputProcessor.HasManyRelationInputProcessor<Model.ManyHasManyInverseContext, Result>
8
7
 
9
- manyHasManyOwning: UpdateInputProcessor.HasManyRelationInputProcessor<Context.ManyHasManyOwningContext, Result>
8
+ manyHasManyOwning: UpdateInputProcessor.HasManyRelationInputProcessor<Model.ManyHasManyOwningContext, Result>
10
9
 
11
- manyHasOne: UpdateInputProcessor.HasOneRelationInputProcessor<Context.ManyHasOneContext, Result>
10
+ manyHasOne: UpdateInputProcessor.HasOneRelationInputProcessor<Model.ManyHasOneContext, Result>
12
11
 
13
- oneHasMany: UpdateInputProcessor.HasManyRelationInputProcessor<Context.OneHasManyContext, Result>
12
+ oneHasMany: UpdateInputProcessor.HasManyRelationInputProcessor<Model.OneHasManyContext, Result>
14
13
 
15
- oneHasOneInverse: UpdateInputProcessor.HasOneRelationInputProcessor<Context.OneHasOneInverseContext, Result>
14
+ oneHasOneInverse: UpdateInputProcessor.HasOneRelationInputProcessor<Model.OneHasOneInverseContext, Result>
16
15
 
17
- oneHasOneOwning: UpdateInputProcessor.HasOneRelationInputProcessor<Context.OneHasOneOwningContext, Result>
16
+ oneHasOneOwning: UpdateInputProcessor.HasOneRelationInputProcessor<Model.OneHasOneOwningContext, Result>
18
17
  }
19
18
 
20
19
  namespace UpdateInputProcessor {
@@ -1,7 +1,6 @@
1
1
  import { Input, Model } from '@contember/schema'
2
2
  import { filterObject, isIt } from '../utils'
3
3
  import { UpdateInputProcessor } from './UpdateInputProcessor'
4
- import * as Context from './InputContext'
5
4
  import { ImplementationException, UserError } from '../exception'
6
5
 
7
6
  export class UpdateInputVisitor<Result> implements
@@ -14,7 +13,7 @@ export class UpdateInputVisitor<Result> implements
14
13
  private readonly data: Input.UpdateDataInput,
15
14
  ) {}
16
15
 
17
- public visitColumn(entity: Model.Entity, column: Model.AnyColumn): Promise<Result> {
16
+ public visitColumn({ entity, column }: Model.ColumnContext): Promise<Result> {
18
17
  return this.updateInputProcessor.column({
19
18
  entity,
20
19
  column,
@@ -22,96 +21,51 @@ export class UpdateInputVisitor<Result> implements
22
21
  })
23
22
  }
24
23
 
25
- public visitManyHasManyInverse(
26
- entity: Model.Entity,
27
- relation: Model.ManyHasManyInverseRelation,
28
- targetEntity: Model.Entity,
29
- targetRelation: Model.ManyHasManyOwningRelation,
30
- ) {
31
- return this.processManyRelationInput<Context.ManyHasManyInverseContext>(
24
+ public visitManyHasManyInverse(context: Model.ManyHasManyInverseContext) {
25
+ return this.processManyRelationInput(
32
26
  this.updateInputProcessor.manyHasManyInverse,
33
- { entity, relation, targetEntity, targetRelation },
34
- this.data[relation.name] as Input.CreateManyRelationInput,
27
+ context,
28
+ this.data[context.relation.name] as Input.CreateManyRelationInput,
35
29
  )
36
30
  }
37
31
 
38
- public visitManyHasManyOwning(
39
- entity: Model.Entity,
40
- relation: Model.ManyHasManyOwningRelation,
41
- targetEntity: Model.Entity,
42
- targetRelation: Model.ManyHasManyInverseRelation | null,
43
- ) {
44
- return this.processManyRelationInput<Context.ManyHasManyOwningContext>(
32
+ public visitManyHasManyOwning(context: Model.ManyHasManyOwningContext) {
33
+ return this.processManyRelationInput(
45
34
  this.updateInputProcessor.manyHasManyOwning,
46
- { entity, relation, targetEntity, targetRelation },
47
- this.data[relation.name] as Input.CreateManyRelationInput,
35
+ context,
36
+ this.data[context.relation.name] as Input.CreateManyRelationInput,
48
37
  )
49
38
  }
50
39
 
51
- public visitManyHasOne(
52
- entity: Model.Entity,
53
- relation: Model.ManyHasOneRelation,
54
- targetEntity: Model.Entity,
55
- targetRelation: Model.OneHasManyRelation | null,
56
- ) {
57
- return this.processRelationInput<Context.ManyHasOneContext>(
40
+ public visitManyHasOne(context: Model.ManyHasOneContext) {
41
+ return this.processRelationInput(
58
42
  this.updateInputProcessor.manyHasOne,
59
- {
60
- entity,
61
- relation,
62
- targetEntity,
63
- targetRelation,
64
- },
65
- this.data[relation.name] as Input.CreateOneRelationInput,
43
+ context,
44
+ this.data[context.relation.name] as Input.CreateOneRelationInput,
66
45
  )
67
46
  }
68
47
 
69
- public visitOneHasMany(
70
- entity: Model.Entity,
71
- relation: Model.OneHasManyRelation,
72
- targetEntity: Model.Entity,
73
- targetRelation: Model.ManyHasOneRelation,
74
- ) {
75
- return this.processManyRelationInput<Context.OneHasManyContext>(
48
+ public visitOneHasMany(context: Model.OneHasManyContext) {
49
+ return this.processManyRelationInput(
76
50
  this.updateInputProcessor.oneHasMany,
77
- { entity, relation, targetEntity, targetRelation },
78
- this.data[relation.name] as Input.CreateManyRelationInput,
51
+ context,
52
+ this.data[context.relation.name] as Input.CreateManyRelationInput,
79
53
  )
80
54
  }
81
55
 
82
- public visitOneHasOneInverse(
83
- entity: Model.Entity,
84
- relation: Model.OneHasOneInverseRelation,
85
- targetEntity: Model.Entity,
86
- targetRelation: Model.OneHasOneOwningRelation,
87
- ) {
88
- return this.processRelationInput<Context.OneHasOneInverseContext>(
56
+ public visitOneHasOneInverse(context: Model.OneHasOneInverseContext) {
57
+ return this.processRelationInput(
89
58
  this.updateInputProcessor.oneHasOneInverse,
90
- {
91
- entity,
92
- relation,
93
- targetEntity,
94
- targetRelation,
95
- },
96
- this.data[relation.name] as Input.CreateOneRelationInput,
59
+ context,
60
+ this.data[context.relation.name] as Input.CreateOneRelationInput,
97
61
  )
98
62
  }
99
63
 
100
- public visitOneHasOneOwning(
101
- entity: Model.Entity,
102
- relation: Model.OneHasOneOwningRelation,
103
- targetEntity: Model.Entity,
104
- targetRelation: Model.OneHasOneInverseRelation | null,
105
- ) {
106
- return this.processRelationInput<Context.OneHasOneOwningContext>(
64
+ public visitOneHasOneOwning(context: Model.OneHasOneOwningContext) {
65
+ return this.processRelationInput(
107
66
  this.updateInputProcessor.oneHasOneOwning,
108
- {
109
- entity,
110
- relation,
111
- targetEntity,
112
- targetRelation,
113
- },
114
- this.data[relation.name] as Input.CreateOneRelationInput,
67
+ context,
68
+ this.data[context.relation.name] as Input.CreateOneRelationInput,
115
69
  )
116
70
  }
117
71
 
@@ -1,7 +1,6 @@
1
1
  export * from './CreateInputProcessor'
2
2
  export * from './CreateInputVisitor'
3
3
  export * from './FieldNode'
4
- export * from './InputContext'
5
4
  export * from './ObjectNode'
6
5
  export * from './UniqueWhereExpander'
7
6
  export * from './UpdateInputProcessor'
@@ -40,7 +40,7 @@ export class IntrospectionSchemaFactory {
40
40
  }
41
41
  }
42
42
  const additionalInfo = acceptEveryFieldVisitor<AdditionalFieldInfo>(this.model, entityName, {
43
- visitManyHasManyInverse(entity: Model.Entity, relation: Model.ManyHasManyInverseRelation) {
43
+ visitManyHasManyInverse({ relation }) {
44
44
  return {
45
45
  __typename: '_Relation',
46
46
  targetEntity: relation.target,
@@ -49,7 +49,7 @@ export class IntrospectionSchemaFactory {
49
49
  orderBy: relation.orderBy?.map(convertOrderBy),
50
50
  }
51
51
  },
52
- visitManyHasManyOwning(entity: Model.Entity, relation: Model.ManyHasManyOwningRelation) {
52
+ visitManyHasManyOwning({ relation }) {
53
53
  return {
54
54
  __typename: '_Relation',
55
55
  targetEntity: relation.target,
@@ -58,7 +58,7 @@ export class IntrospectionSchemaFactory {
58
58
  orderBy: relation.orderBy?.map(convertOrderBy),
59
59
  }
60
60
  },
61
- visitManyHasOne(entity: Model.Entity, relation: Model.ManyHasOneRelation) {
61
+ visitManyHasOne({ relation }) {
62
62
  return {
63
63
  __typename: '_Relation',
64
64
  targetEntity: relation.target,
@@ -68,7 +68,7 @@ export class IntrospectionSchemaFactory {
68
68
  nullable: relation.nullable,
69
69
  }
70
70
  },
71
- visitOneHasMany(entity: Model.Entity, relation: Model.OneHasManyRelation) {
71
+ visitOneHasMany({ relation }) {
72
72
  return {
73
73
  __typename: '_Relation',
74
74
  targetEntity: relation.target,
@@ -77,7 +77,7 @@ export class IntrospectionSchemaFactory {
77
77
  orderBy: relation.orderBy?.map(convertOrderBy),
78
78
  }
79
79
  },
80
- visitOneHasOneInverse(entity: Model.Entity, relation: Model.OneHasOneInverseRelation) {
80
+ visitOneHasOneInverse({ relation }) {
81
81
  return {
82
82
  __typename: '_Relation',
83
83
  targetEntity: relation.target,
@@ -86,7 +86,7 @@ export class IntrospectionSchemaFactory {
86
86
  nullable: relation.nullable,
87
87
  }
88
88
  },
89
- visitOneHasOneOwning(entity: Model.Entity, relation: Model.OneHasOneOwningRelation) {
89
+ visitOneHasOneOwning({ relation }) {
90
90
  return {
91
91
  __typename: '_Relation',
92
92
  targetEntity: relation.target,
@@ -97,7 +97,7 @@ export class IntrospectionSchemaFactory {
97
97
  orphanRemoval: relation.orphanRemoval === true,
98
98
  }
99
99
  },
100
- visitColumn(entity: Model.Entity, column: Model.AnyColumn) {
100
+ visitColumn({ column }) {
101
101
  return {
102
102
  __typename: '_Column',
103
103
  defaultValue: column.default ?? undefined,
@@ -1,6 +1,6 @@
1
1
  import { Input, Model } from '@contember/schema'
2
2
  import { getColumnName } from '@contember/schema-utils'
3
- import { SelectHydrator, SelectIndexedResultObjects, SelectResultObject } from './select'
3
+ import { SelectGroupedObjects, SelectHydrator, SelectIndexedResultObjects, SelectResultObject } from './select'
4
4
  import { PathFactory } from './select'
5
5
  import * as database from '@contember/database'
6
6
  import { Client, SelectBuilder } from '@contember/database'
@@ -14,7 +14,7 @@ import { Updater } from './update'
14
14
  import { Inserter } from './insert'
15
15
  import { tryMutation } from './ErrorUtils'
16
16
  import { OrderByHelper } from './select'
17
- import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
17
+ import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
18
18
  import { UpdateBuilder } from './update'
19
19
  import { Mutex } from '../utils'
20
20
  import { CheckedPrimary } from './CheckedPrimary'
@@ -50,62 +50,64 @@ export class Mapper {
50
50
  .from(entity.tableName, 'root_')
51
51
  .select(['root_', columnName])
52
52
  const expandedWhere = this.uniqueWhereExpander.expand(entity, where)
53
- const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere)
53
+ const builtQb = this.whereBuilder.build(qb, entity, this.pathFactory.create([]), expandedWhere, [])
54
54
  const result = await builtQb.getResult(this.db)
55
55
 
56
56
  return result[0] !== undefined ? result[0][columnName] : undefined
57
57
  }
58
58
 
59
- public async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, overRelation: Model.AnyRelation | null): Promise<SelectResultObject[]>
60
- public async select(
59
+ public async selectAssoc(
61
60
  entity: Model.Entity,
62
61
  input: ObjectNode<Input.ListQueryInput>,
63
- overRelation: Model.AnyRelation | null,
62
+ relationPath: Model.AnyRelationContext[],
64
63
  indexBy: string,
65
- ): Promise<SelectIndexedResultObjects>
66
- public async select(
67
- entity: Model.Entity,
68
- input: ObjectNode<Input.ListQueryInput>,
69
- overRelation: Model.AnyRelation | null,
70
- indexBy?: string,
71
- ): Promise<SelectResultObject[] | SelectIndexedResultObjects> {
64
+ ): Promise<SelectIndexedResultObjects> {
72
65
  const hydrator = new SelectHydrator()
73
- let qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()
74
- let indexByAlias: string | null = null
75
- if (indexBy) {
76
- const path = this.pathFactory.create([])
77
- indexByAlias = path.for(indexBy).alias
78
- qb = qb.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)
79
- }
80
- const rows = await this.selectRows(hydrator, qb, entity, input, overRelation)
66
+ const path = this.pathFactory.create([])
67
+ const indexByAlias: string = path.for(indexBy).alias
68
+ const qb: SelectBuilder = SelectBuilder.create()
69
+ .select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)
70
+ const rows = await this.selectRows(hydrator, qb, entity, input, relationPath)
71
+ return await hydrator.hydrateAll(rows, indexByAlias)
72
+ }
81
73
 
82
- return await (indexByAlias !== null ? hydrator.hydrateAll(rows, indexByAlias) : hydrator.hydrateAll(rows))
74
+ public async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {
75
+ const hydrator = new SelectHydrator()
76
+ const qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()
77
+
78
+ const rows = await this.selectRows(hydrator, qb, entity, input, relationPath)
79
+
80
+ return await hydrator.hydrateAll(rows)
83
81
  }
84
82
 
85
83
  public async selectUnique(
86
84
  entity: Model.Entity,
87
85
  query: ObjectNode<Input.UniqueQueryInput>,
88
- overRelation: Model.AnyRelation | null,
86
+ relationPath: Model.AnyRelationContext[],
89
87
  ): Promise<SelectResultObject | null> {
90
88
  const uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)
91
89
  const where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere
92
90
  const queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)
93
91
 
94
- return (await this.select(entity, queryExpanded, overRelation))[0] || null
92
+ const rows = await this.select(entity, queryExpanded, relationPath)
93
+
94
+ return rows[0] ?? null
95
95
  }
96
96
 
97
97
  public async selectGrouped(
98
98
  entity: Model.Entity,
99
99
  input: ObjectNode<Input.ListQueryInput>,
100
100
  relation: Model.JoiningColumnRelation & Model.AnyRelation,
101
- ) {
101
+ relationPath: Model.AnyRelationContext[],
102
+ ): Promise<SelectGroupedObjects> {
102
103
  const hydrator = new SelectHydrator()
103
- let qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()
104
104
  const path = this.pathFactory.create([])
105
105
  const groupingKey = '__grouping_key'
106
- qb = qb.select([path.alias, relation.joiningColumn.columnName], groupingKey)
106
+ const qb: SelectBuilder = SelectBuilder.create()
107
+ .select([path.alias, relation.joiningColumn.columnName], groupingKey)
108
+
109
+ const rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)
107
110
 
108
- const rows = await this.selectRows(hydrator, qb, entity, input, relation, relation.name)
109
111
  return await hydrator.hydrateGroups(rows, groupingKey)
110
112
  }
111
113
 
@@ -114,15 +116,15 @@ export class Mapper {
114
116
  qb: SelectBuilder<SelectBuilder.Result>,
115
117
  entity: Model.Entity,
116
118
  input: ObjectNode<Input.ListQueryInput>,
117
- overRelation: Model.AnyRelation | null,
119
+ relationPath: Model.AnyRelationContext[],
118
120
  groupBy?: string,
119
121
  ) {
120
122
  const inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, [])
121
123
  const path = this.pathFactory.create([])
122
124
  const augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])
123
125
 
124
- const selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator)
125
- const filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, overRelation ?? undefined)
126
+ const selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)
127
+ const filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])
126
128
  const inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)
127
129
  selector.select(this, entity, inputWithPredicates, path, groupBy)
128
130
  return await selector.execute(this.db)
@@ -134,7 +136,7 @@ export class Mapper {
134
136
  .from(entity.tableName, path.alias)
135
137
  .select(expr => expr.raw('count(*)'), 'row_count')
136
138
  const withPredicates = this.predicatesInjector.inject(entity, filter)
137
- const qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)
139
+ const qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, [])
138
140
  const result = await qbWithWhere.getResult(this.db)
139
141
  return result[0].row_count
140
142
  }
@@ -143,6 +145,7 @@ export class Mapper {
143
145
  entity: Model.Entity,
144
146
  filter: Input.OptionalWhere,
145
147
  relation: Model.JoiningColumnRelation & Model.Relation,
148
+ relationPath: Model.AnyRelationContext[],
146
149
  ): Promise<Record<string, number>> {
147
150
  const path = this.pathFactory.create([])
148
151
  const qb = SelectBuilder.create()
@@ -151,7 +154,7 @@ export class Mapper {
151
154
  .select([path.alias, relation.joiningColumn.columnName])
152
155
  .groupBy([path.alias, relation.joiningColumn.columnName])
153
156
  const withPredicates = this.predicatesInjector.inject(entity, filter)
154
- const qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)
157
+ const qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, relationPath)
155
158
  const rows = await qbWithWhere.getResult(this.db)
156
159
  const result = new Map<string, number>()
157
160
  for (const row of rows) {
@@ -27,7 +27,7 @@ import {
27
27
  Updater,
28
28
  } from '../mapper'
29
29
  import { Builder } from '@contember/dic'
30
- import { Acl, Schema } from '@contember/schema'
30
+ import { Acl, Model, Schema } from '@contember/schema'
31
31
  import { Client, SelectBuilder as DbSelectBuilder } from '@contember/database'
32
32
  import { Providers } from '@contember/schema-utils'
33
33
  import { PaginatedHasManyExecutionHandler } from '../extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'
@@ -86,7 +86,7 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
86
86
  }))
87
87
  .addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory }) =>
88
88
  new (class implements SelectBuilderFactory {
89
- create(qb: DbSelectBuilder, hydrator: SelectHydrator): SelectBuilder {
89
+ create(qb: DbSelectBuilder, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder {
90
90
  return new SelectBuilder(
91
91
  schema.model,
92
92
  whereBuilder,
@@ -97,6 +97,7 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
97
97
  fieldsVisitorFactory,
98
98
  selectHandlers,
99
99
  pathFactory,
100
+ relationPath,
100
101
  )
101
102
  }
102
103
  })())