@contember/engine-content-api 1.2.0-alpha.9 → 1.2.0-beta.2

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 (378) hide show
  1. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts +2 -3
  2. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts.map +1 -1
  3. package/dist/src/acl/EvaluatedPredicateReplacer.js +5 -14
  4. package/dist/src/acl/EvaluatedPredicateReplacer.js.map +1 -1
  5. package/dist/src/acl/PredicateFactory.d.ts +9 -3
  6. package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
  7. package/dist/src/acl/PredicateFactory.js +47 -36
  8. package/dist/src/acl/PredicateFactory.js.map +1 -1
  9. package/dist/src/acl/PredicatesInjector.d.ts +1 -1
  10. package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
  11. package/dist/src/acl/PredicatesInjector.js +13 -18
  12. package/dist/src/acl/PredicatesInjector.js.map +1 -1
  13. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
  14. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
  15. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +26 -23
  16. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
  17. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
  18. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
  19. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
  20. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
  21. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
  22. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
  23. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +11 -14
  24. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
  25. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
  26. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +18 -14
  27. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
  28. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
  29. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
  30. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
  31. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
  32. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
  33. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
  34. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +11 -15
  35. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
  36. package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
  37. package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
  38. package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
  39. package/dist/src/input-validation/EntityRulesResolver.js +4 -4
  40. package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
  41. package/dist/src/input-validation/QueryAstFactory.js +1 -1
  42. package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
  43. package/dist/src/input-validation/ValidationDataSelector.js +1 -1
  44. package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
  45. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
  46. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
  47. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  48. package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
  49. package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
  50. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
  51. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
  52. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  53. package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
  54. package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
  55. package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
  56. package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
  57. package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
  58. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  59. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
  60. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
  61. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
  62. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
  63. package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
  64. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  65. package/dist/src/inputProcessing/index.d.ts +0 -1
  66. package/dist/src/inputProcessing/index.d.ts.map +1 -1
  67. package/dist/src/inputProcessing/index.js +0 -1
  68. package/dist/src/inputProcessing/index.js.map +1 -1
  69. package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
  70. package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
  71. package/dist/src/mapper/ErrorUtils.d.ts.map +1 -1
  72. package/dist/src/mapper/ErrorUtils.js +2 -2
  73. package/dist/src/mapper/ErrorUtils.js.map +1 -1
  74. package/dist/src/mapper/JunctionTableManager.js.map +1 -1
  75. package/dist/src/mapper/Mapper.d.ts +6 -6
  76. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  77. package/dist/src/mapper/Mapper.js +26 -21
  78. package/dist/src/mapper/Mapper.js.map +1 -1
  79. package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
  80. package/dist/src/mapper/MapperContainer.js +4 -4
  81. package/dist/src/mapper/MapperContainer.js.map +1 -1
  82. package/dist/src/mapper/Result.d.ts.map +1 -1
  83. package/dist/src/mapper/Result.js +2 -4
  84. package/dist/src/mapper/Result.js.map +1 -1
  85. package/dist/src/mapper/delete/DeleteExecutor.js +6 -6
  86. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  87. package/dist/src/mapper/insert/InsertBuilder.d.ts +1 -1
  88. package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
  89. package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
  90. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
  91. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  92. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  93. package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
  94. package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
  95. package/dist/src/mapper/select/JoinVisitor.js +6 -6
  96. package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
  97. package/dist/src/mapper/select/Path.d.ts +1 -0
  98. package/dist/src/mapper/select/Path.d.ts.map +1 -1
  99. package/dist/src/mapper/select/Path.js +4 -1
  100. package/dist/src/mapper/select/Path.js.map +1 -1
  101. package/dist/src/mapper/select/RelationFetcher.d.ts +11 -19
  102. package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
  103. package/dist/src/mapper/select/RelationFetcher.js +34 -25
  104. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  105. package/dist/src/mapper/select/SelectBuilder.d.ts +4 -1
  106. package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
  107. package/dist/src/mapper/select/SelectBuilder.js +52 -12
  108. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  109. package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
  110. package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
  111. package/dist/src/mapper/select/SelectExecutionHandler.d.ts +16 -4
  112. package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
  113. package/dist/src/mapper/select/SelectHydrator.d.ts +3 -2
  114. package/dist/src/mapper/select/SelectHydrator.d.ts.map +1 -1
  115. package/dist/src/mapper/select/SelectHydrator.js +6 -9
  116. package/dist/src/mapper/select/SelectHydrator.js.map +1 -1
  117. package/dist/src/mapper/select/WhereBuilder.d.ts +8 -4
  118. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  119. package/dist/src/mapper/select/WhereBuilder.js +137 -35
  120. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  121. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +10 -8
  122. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  123. package/dist/src/mapper/select/handlers/FieldsVisitor.js +129 -94
  124. package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  125. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
  126. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
  127. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  128. package/dist/src/mapper/select/handlers/MetaHandler.d.ts.map +1 -1
  129. package/dist/src/mapper/select/handlers/MetaHandler.js +6 -11
  130. package/dist/src/mapper/select/handlers/MetaHandler.js.map +1 -1
  131. package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -1
  132. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +6 -0
  133. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -1
  134. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +9 -1
  135. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
  136. package/dist/src/mapper/select/optimizer/WhereOptimizer.js +127 -13
  137. package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
  138. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +3 -0
  139. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -0
  140. package/dist/src/mapper/select/optimizer/WhereReplacer.js +46 -0
  141. package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -0
  142. package/dist/src/mapper/select/optimizer/helpers.d.ts +1 -1
  143. package/dist/src/mapper/select/optimizer/helpers.js +1 -1
  144. package/dist/src/mapper/select/optimizer/helpers.js.map +1 -1
  145. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
  146. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  147. package/dist/src/mapper/update/SqlUpdateInputProcessor.js +3 -4
  148. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  149. package/dist/src/mapper/update/UpdateBuilder.js +3 -3
  150. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  151. package/dist/src/resolvers/ExecutionContainerFactory.d.ts +1 -1
  152. package/dist/src/resolvers/ExecutionContainerFactory.d.ts.map +1 -1
  153. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts +1 -2
  154. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts.map +1 -1
  155. package/dist/src/resolvers/GraphQlQueryAstFactory.js +2 -2
  156. package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
  157. package/dist/src/resolvers/MutationResolver.d.ts.map +1 -1
  158. package/dist/src/resolvers/MutationResolver.js +13 -2
  159. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  160. package/dist/src/resolvers/ReadHelpers.js +3 -3
  161. package/dist/src/resolvers/ReadHelpers.js.map +1 -1
  162. package/dist/src/resolvers/ReadResolver.js +2 -2
  163. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  164. package/dist/src/schema/EnumsProvider.d.ts.map +1 -1
  165. package/dist/src/schema/EnumsProvider.js +1 -2
  166. package/dist/src/schema/EnumsProvider.js.map +1 -1
  167. package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
  168. package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
  169. package/dist/src/schema/FieldAccessVisitor.js +2 -2
  170. package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
  171. package/dist/src/schema/OrderByTypeProvider.d.ts +1 -1
  172. package/dist/src/schema/OrderByTypeProvider.d.ts.map +1 -1
  173. package/dist/src/schema/OrderByTypeProvider.js +2 -2
  174. package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
  175. package/dist/src/schema/WhereTypeProvider.d.ts +1 -2
  176. package/dist/src/schema/WhereTypeProvider.d.ts.map +1 -1
  177. package/dist/src/schema/WhereTypeProvider.js +4 -4
  178. package/dist/src/schema/WhereTypeProvider.js.map +1 -1
  179. package/dist/src/schema/entities/FieldArgsVisitor.d.ts +4 -5
  180. package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
  181. package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
  182. package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
  183. package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
  184. package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
  185. package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
  186. package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
  187. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
  188. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  189. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
  190. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  191. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  192. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  193. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
  194. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  195. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
  196. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  197. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
  198. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  199. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
  200. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  201. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
  202. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  203. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  204. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  205. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
  206. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  207. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
  208. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  209. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
  210. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  211. package/dist/src/schema/utils.d.ts +1 -1
  212. package/dist/src/schema/utils.d.ts.map +1 -1
  213. package/dist/src/tsconfig.tsbuildinfo +1 -1
  214. package/dist/src/utils/uniqueWhereFields.js +3 -3
  215. package/dist/src/utils/uniqueWhereFields.js.map +1 -1
  216. package/dist/tests/cases/bugs/bug102.test.js +6 -6
  217. package/dist/tests/cases/bugs/bug102.test.js.map +1 -1
  218. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +5 -5
  219. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  220. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +5 -5
  221. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
  222. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +5 -5
  223. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
  224. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +5 -5
  225. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
  226. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +5 -5
  227. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
  228. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +5 -5
  229. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
  230. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js +51 -4
  231. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js.map +1 -1
  232. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +26 -25
  233. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
  234. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +9 -6
  235. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
  236. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts +2 -0
  237. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts.map +1 -0
  238. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js +109 -0
  239. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js.map +1 -0
  240. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js +17 -15
  241. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js.map +1 -1
  242. package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js +4 -5
  243. package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js.map +1 -1
  244. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js +9 -13
  245. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js.map +1 -1
  246. package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js +5 -3
  247. package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js.map +1 -1
  248. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +5 -5
  249. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js.map +1 -1
  250. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js +5 -5
  251. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js.map +1 -1
  252. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js +10 -10
  253. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js.map +1 -1
  254. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js +5 -5
  255. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js.map +1 -1
  256. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js +5 -5
  257. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
  258. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +5 -5
  259. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
  260. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +4 -4
  261. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
  262. package/dist/tests/cases/unit/predicatesFactory.test.js +7 -1
  263. package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -1
  264. package/dist/tests/cases/unit/predicatesInjector.test.js +105 -0
  265. package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
  266. package/dist/tests/cases/unit/whereBuilder.test.d.ts +2 -0
  267. package/dist/tests/cases/unit/whereBuilder.test.d.ts.map +1 -0
  268. package/dist/tests/cases/unit/whereBuilder.test.js +131 -0
  269. package/dist/tests/cases/unit/whereBuilder.test.js.map +1 -0
  270. package/dist/tests/cases/unit/whereOptimizer.test.js +173 -0
  271. package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
  272. package/dist/tests/src/test.js +2 -2
  273. package/dist/tests/src/test.js.map +1 -1
  274. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  275. package/dist/tests/src/testGraphql.js +9 -5
  276. package/dist/tests/src/testGraphql.js.map +1 -1
  277. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  278. package/package.json +12 -10
  279. package/src/acl/EvaluatedPredicateReplacer.ts +9 -15
  280. package/src/acl/PredicateFactory.ts +64 -40
  281. package/src/acl/PredicatesInjector.ts +18 -17
  282. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +21 -28
  283. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
  284. package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +10 -28
  285. package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +11 -8
  286. package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
  287. package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +10 -29
  288. package/src/input-validation/ColumnValueResolver.ts +2 -3
  289. package/src/input-validation/EntityRulesResolver.ts +4 -4
  290. package/src/input-validation/QueryAstFactory.ts +1 -1
  291. package/src/input-validation/ValidationDataSelector.ts +1 -1
  292. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
  293. package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
  294. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
  295. package/src/inputProcessing/CreateInputProcessor.ts +8 -9
  296. package/src/inputProcessing/CreateInputVisitor.ts +27 -89
  297. package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
  298. package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
  299. package/src/inputProcessing/index.ts +0 -1
  300. package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
  301. package/src/mapper/ErrorUtils.ts +2 -2
  302. package/src/mapper/JunctionTableManager.ts +3 -3
  303. package/src/mapper/Mapper.ts +34 -31
  304. package/src/mapper/MapperContainer.ts +7 -5
  305. package/src/mapper/Result.ts +2 -4
  306. package/src/mapper/delete/DeleteExecutor.ts +6 -6
  307. package/src/mapper/insert/InsertBuilder.ts +2 -2
  308. package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
  309. package/src/mapper/select/JoinVisitor.ts +6 -33
  310. package/src/mapper/select/Path.ts +4 -1
  311. package/src/mapper/select/RelationFetcher.ts +49 -50
  312. package/src/mapper/select/SelectBuilder.ts +71 -13
  313. package/src/mapper/select/SelectBuilderFactory.ts +2 -1
  314. package/src/mapper/select/SelectExecutionHandler.ts +16 -8
  315. package/src/mapper/select/SelectHydrator.ts +15 -11
  316. package/src/mapper/select/WhereBuilder.ts +168 -61
  317. package/src/mapper/select/handlers/FieldsVisitor.ts +80 -111
  318. package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
  319. package/src/mapper/select/handlers/MetaHandler.ts +6 -17
  320. package/src/mapper/select/optimizer/ConditionOptimizer.ts +6 -0
  321. package/src/mapper/select/optimizer/WhereOptimizer.ts +148 -21
  322. package/src/mapper/select/optimizer/WhereReplacer.ts +39 -0
  323. package/src/mapper/select/optimizer/helpers.ts +2 -2
  324. package/src/mapper/update/SqlUpdateInputProcessor.ts +4 -10
  325. package/src/mapper/update/UpdateBuilder.ts +3 -3
  326. package/src/resolvers/ExecutionContainerFactory.ts +1 -1
  327. package/src/resolvers/GraphQlQueryAstFactory.ts +5 -4
  328. package/src/resolvers/MutationResolver.ts +14 -4
  329. package/src/resolvers/ReadHelpers.ts +3 -3
  330. package/src/resolvers/ReadResolver.ts +2 -2
  331. package/src/schema/EnumsProvider.ts +2 -4
  332. package/src/schema/FieldAccessVisitor.ts +2 -2
  333. package/src/schema/OrderByTypeProvider.ts +10 -3
  334. package/src/schema/WhereTypeProvider.ts +5 -6
  335. package/src/schema/entities/FieldArgsVisitor.ts +4 -5
  336. package/src/schema/entities/FieldTypeVisitor.ts +3 -3
  337. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
  338. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
  339. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +6 -20
  340. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
  341. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
  342. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +9 -14
  343. package/src/schema/utils.ts +1 -1
  344. package/src/tsconfig.json +6 -6
  345. package/src/utils/uniqueWhereFields.ts +3 -3
  346. package/tests/cases/bugs/bug102.test.ts +6 -6
  347. package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +5 -5
  348. package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +5 -5
  349. package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +5 -5
  350. package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +5 -5
  351. package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +5 -5
  352. package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +5 -5
  353. package/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.ts +54 -4
  354. package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +26 -25
  355. package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +9 -6
  356. package/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.ts +104 -0
  357. package/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.ts +17 -15
  358. package/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.ts +4 -5
  359. package/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.ts +9 -13
  360. package/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.ts +5 -3
  361. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +5 -5
  362. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +5 -5
  363. package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +10 -10
  364. package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +5 -5
  365. package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +5 -5
  366. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +5 -5
  367. package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +2 -3
  368. package/tests/cases/unit/predicatesFactory.test.ts +8 -2
  369. package/tests/cases/unit/predicatesInjector.test.ts +97 -2
  370. package/tests/cases/unit/whereBuilder.test.ts +148 -0
  371. package/tests/cases/unit/whereOptimizer.test.ts +199 -0
  372. package/tests/src/test.ts +2 -2
  373. package/tests/src/testGraphql.ts +9 -5
  374. package/dist/src/inputProcessing/InputContext.d.ts +0 -43
  375. package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
  376. package/dist/src/inputProcessing/InputContext.js +0 -3
  377. package/dist/src/inputProcessing/InputContext.js.map +0 -1
  378. package/src/inputProcessing/InputContext.ts +0 -49
@@ -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'
@@ -56,56 +56,58 @@ export class Mapper {
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
+ }
73
+
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)
81
79
 
82
- return await (indexByAlias !== null ? hydrator.hydrateAll(rows, indexByAlias) : hydrator.hydrateAll(rows))
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)
@@ -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) {
@@ -3,9 +3,9 @@ import {
3
3
  ConditionBuilder,
4
4
  FieldsVisitorFactory,
5
5
  JoinBuilder,
6
- RelationFetcher,
7
6
  MetaHandler,
8
7
  OrderByBuilder,
8
+ RelationFetcher,
9
9
  WhereBuilder,
10
10
  } from './select'
11
11
  import { UniqueWhereExpander } from '../inputProcessing'
@@ -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'
@@ -65,7 +65,7 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
65
65
  .addService('whereOptimized', () =>
66
66
  new WhereOptimizer(schema.model, new ConditionOptimizer()))
67
67
  .addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized }) =>
68
- new WhereBuilder(schema.model, joinBuilder, conditionBuilder, pathFactory, whereOptimized))
68
+ new WhereBuilder(schema.model, joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema.settings.useExistsInHasManyFilter === true))
69
69
  .addService('orderByBuilder', ({ joinBuilder }) =>
70
70
  new OrderByBuilder(schema.model, joinBuilder))
71
71
  .addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>
@@ -84,9 +84,9 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
84
84
  [HasManyToHasOneReducer.extensionName]: hasManyToHasOneReducer,
85
85
  [PaginatedHasManyFieldProvider.extensionName]: paginatedHasManyExecutionHandler,
86
86
  }))
87
- .addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory }) =>
87
+ .addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory, predicateFactory }) =>
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,8 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
97
97
  fieldsVisitorFactory,
98
98
  selectHandlers,
99
99
  pathFactory,
100
+ relationPath,
101
+ predicateFactory,
100
102
  )
101
103
  }
102
104
  })())
@@ -2,6 +2,7 @@ import { Input, Model, Value } from '@contember/schema'
2
2
  import { convertError } from './ErrorUtils'
3
3
  import { getFulfilledValues, getRejections } from '../utils'
4
4
  import { SerializationFailureError } from '@contember/database'
5
+ import { logger } from '@contember/logger'
5
6
 
6
7
  export enum MutationResultType {
7
8
  ok = 'ok',
@@ -225,10 +226,7 @@ export const collectResults = async (
225
226
  const failures = getRejections(results)
226
227
  if (failures.length > 0) {
227
228
  if (failures.length > 1 && !failures.every(it => it instanceof SerializationFailureError)) {
228
- // eslint-disable-next-line no-console
229
- console.error('Multiple error has occurred, printing them & rethrowing the first one')
230
- // eslint-disable-next-line no-console
231
- failures.slice(1).map(e => console.error(e))
229
+ failures.slice(1).map(e => logger.error(e))
232
230
  }
233
231
  throw failures[0]
234
232
  }
@@ -36,7 +36,6 @@ export class DeleteExecutor {
36
36
  filter?: Input.OptionalWhere,
37
37
  ): Promise<MutationResultList> {
38
38
  return mapper.mutex.execute(async () => {
39
- await mapper.constraintHelper.setFkConstraintsDeferred()
40
39
  const primaryValue = await mapper.getPrimaryValue(entity, by)
41
40
  if (!primaryValue) {
42
41
  return [new MutationEntryNotFoundError([], by as Input.UniqueWhere)]
@@ -44,20 +43,21 @@ export class DeleteExecutor {
44
43
  if (mapper.deletedEntities.isDeleted(entity.name, primaryValue)) {
45
44
  return [new MutationNothingToDo([], NothingToDoReason.alreadyDeleted)]
46
45
  }
46
+ await mapper.constraintHelper.setFkConstraintsDeferred()
47
47
  const primaryWhere = { [entity.primary]: { eq: primaryValue } }
48
48
  const result = await this.delete(mapper, entity, filter ? { and: [primaryWhere, filter] } : primaryWhere)
49
+ await mapper.constraintHelper.setFkConstraintsImmediate()
49
50
  if (result.length === 0) {
50
51
  return [new MutationNoResultError([])]
51
52
  }
52
53
 
53
- await mapper.constraintHelper.setFkConstraintsImmediate()
54
54
  return [new MutationDeleteOk([], entity, primaryValue)]
55
55
  })
56
56
  }
57
57
 
58
58
  private async delete(mapper: Mapper, entity: Model.Entity, where: Input.OptionalWhere): Promise<string[]> {
59
59
  const db = mapper.db
60
- const predicate = this.predicateFactory.create(entity, Acl.Operation.delete)
60
+ const predicate = this.predicateFactory.createDeletePredicate(entity)
61
61
  const inQb = SelectBuilder.create() //
62
62
  .from(entity.tableName, 'root_')
63
63
  .select(['root_', entity.primaryColumn])
@@ -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
  }),
@@ -20,7 +20,7 @@ export class InsertBuilder {
20
20
  public readonly insert: Promise<Value.PrimaryValue | null> = new Promise(resolve => (this.resolver = resolve))
21
21
 
22
22
  private rowData: ColumnValue<AbortInsert | undefined>[] = []
23
- private where: Input.Where = {}
23
+ private where: Input.OptionalWhere = {}
24
24
 
25
25
  constructor(
26
26
  private readonly schema: Model.Schema,
@@ -35,7 +35,7 @@ export class InsertBuilder {
35
35
  this.rowData.push({ columnName, value: resolveGenericValue(value), columnType, fieldName })
36
36
  }
37
37
 
38
- public addWhere(where: Input.Where): void {
38
+ public addWhere(where: Input.OptionalWhere): void {
39
39
  this.where = { and: [where, this.where] }
40
40
  }
41
41
 
@@ -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
@@ -27,6 +27,9 @@ export class PathFactory {
27
27
  export class Path {
28
28
  public readonly alias = this.createAlias()
29
29
 
30
+ public get fullAlias() {
31
+ return this.rootAlias + this.path.join('_')
32
+ }
30
33
  constructor(
31
34
  public readonly path: string[],
32
35
  private readonly aliasContext: AliasContext,
@@ -44,7 +47,7 @@ export class Path {
44
47
  }
45
48
 
46
49
  private createAlias(): string {
47
- const alias = this.rootAlias + this.path.join('_')
50
+ const alias = this.fullAlias
48
51
 
49
52
  // intentionally not allowing == MAX_IDENTIFIER_LENGTH
50
53
  if (alias.length < MAX_IDENTIFIER_LENGTH) {
@@ -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
  }