@contember/engine-content-api 1.2.0-alpha.8 → 1.2.0-beta.1

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 (394) 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/PermissionFactory.d.ts.map +1 -1
  6. package/dist/src/acl/PermissionFactory.js +15 -11
  7. package/dist/src/acl/PermissionFactory.js.map +1 -1
  8. package/dist/src/acl/PredicateFactory.d.ts +9 -3
  9. package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
  10. package/dist/src/acl/PredicateFactory.js +47 -36
  11. package/dist/src/acl/PredicateFactory.js.map +1 -1
  12. package/dist/src/acl/PredicatesInjector.d.ts +1 -1
  13. package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
  14. package/dist/src/acl/PredicatesInjector.js +13 -18
  15. package/dist/src/acl/PredicatesInjector.js.map +1 -1
  16. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
  17. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
  18. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +26 -23
  19. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
  20. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
  21. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
  22. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
  23. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
  24. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
  25. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
  26. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +11 -14
  27. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
  28. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
  29. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +18 -14
  30. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
  31. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
  32. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
  33. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
  34. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
  35. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
  36. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
  37. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +11 -15
  38. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
  39. package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
  40. package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
  41. package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
  42. package/dist/src/input-validation/EntityRulesResolver.js +4 -4
  43. package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
  44. package/dist/src/input-validation/QueryAstFactory.js +1 -1
  45. package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
  46. package/dist/src/input-validation/ValidationDataSelector.js +1 -1
  47. package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
  48. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
  49. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
  50. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  51. package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
  52. package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
  53. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
  54. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
  55. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  56. package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
  57. package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
  58. package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
  59. package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
  60. package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
  61. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  62. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
  63. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
  64. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
  65. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
  66. package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
  67. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  68. package/dist/src/inputProcessing/index.d.ts +0 -1
  69. package/dist/src/inputProcessing/index.d.ts.map +1 -1
  70. package/dist/src/inputProcessing/index.js +0 -1
  71. package/dist/src/inputProcessing/index.js.map +1 -1
  72. package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
  73. package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
  74. package/dist/src/mapper/ErrorUtils.d.ts.map +1 -1
  75. package/dist/src/mapper/ErrorUtils.js +2 -2
  76. package/dist/src/mapper/ErrorUtils.js.map +1 -1
  77. package/dist/src/mapper/JunctionTableManager.js.map +1 -1
  78. package/dist/src/mapper/Mapper.d.ts +6 -6
  79. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  80. package/dist/src/mapper/Mapper.js +26 -21
  81. package/dist/src/mapper/Mapper.js.map +1 -1
  82. package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
  83. package/dist/src/mapper/MapperContainer.js +4 -4
  84. package/dist/src/mapper/MapperContainer.js.map +1 -1
  85. package/dist/src/mapper/Result.d.ts.map +1 -1
  86. package/dist/src/mapper/Result.js +2 -4
  87. package/dist/src/mapper/Result.js.map +1 -1
  88. package/dist/src/mapper/delete/DeleteExecutor.js +6 -6
  89. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  90. package/dist/src/mapper/insert/InsertBuilder.d.ts +1 -1
  91. package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
  92. package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
  93. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
  94. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  95. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  96. package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
  97. package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
  98. package/dist/src/mapper/select/JoinVisitor.js +6 -6
  99. package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
  100. package/dist/src/mapper/select/Path.d.ts +1 -0
  101. package/dist/src/mapper/select/Path.d.ts.map +1 -1
  102. package/dist/src/mapper/select/Path.js +4 -1
  103. package/dist/src/mapper/select/Path.js.map +1 -1
  104. package/dist/src/mapper/select/RelationFetcher.d.ts +11 -19
  105. package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
  106. package/dist/src/mapper/select/RelationFetcher.js +34 -25
  107. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  108. package/dist/src/mapper/select/SelectBuilder.d.ts +4 -1
  109. package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
  110. package/dist/src/mapper/select/SelectBuilder.js +52 -12
  111. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  112. package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
  113. package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
  114. package/dist/src/mapper/select/SelectExecutionHandler.d.ts +16 -4
  115. package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
  116. package/dist/src/mapper/select/SelectHydrator.d.ts +3 -2
  117. package/dist/src/mapper/select/SelectHydrator.d.ts.map +1 -1
  118. package/dist/src/mapper/select/SelectHydrator.js +6 -9
  119. package/dist/src/mapper/select/SelectHydrator.js.map +1 -1
  120. package/dist/src/mapper/select/WhereBuilder.d.ts +8 -4
  121. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  122. package/dist/src/mapper/select/WhereBuilder.js +137 -35
  123. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  124. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +10 -8
  125. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  126. package/dist/src/mapper/select/handlers/FieldsVisitor.js +129 -94
  127. package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  128. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
  129. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
  130. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  131. package/dist/src/mapper/select/handlers/MetaHandler.d.ts.map +1 -1
  132. package/dist/src/mapper/select/handlers/MetaHandler.js +6 -11
  133. package/dist/src/mapper/select/handlers/MetaHandler.js.map +1 -1
  134. package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -1
  135. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +6 -0
  136. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -1
  137. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +9 -1
  138. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
  139. package/dist/src/mapper/select/optimizer/WhereOptimizer.js +127 -13
  140. package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
  141. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +3 -0
  142. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -0
  143. package/dist/src/mapper/select/optimizer/WhereReplacer.js +46 -0
  144. package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -0
  145. package/dist/src/mapper/select/optimizer/helpers.d.ts +1 -1
  146. package/dist/src/mapper/select/optimizer/helpers.d.ts.map +1 -1
  147. package/dist/src/mapper/select/optimizer/helpers.js +8 -1
  148. package/dist/src/mapper/select/optimizer/helpers.js.map +1 -1
  149. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
  150. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  151. package/dist/src/mapper/update/SqlUpdateInputProcessor.js +3 -4
  152. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  153. package/dist/src/mapper/update/UpdateBuilder.js +3 -3
  154. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  155. package/dist/src/resolvers/ExecutionContainerFactory.d.ts +1 -1
  156. package/dist/src/resolvers/ExecutionContainerFactory.d.ts.map +1 -1
  157. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts +1 -2
  158. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts.map +1 -1
  159. package/dist/src/resolvers/GraphQlQueryAstFactory.js +2 -2
  160. package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
  161. package/dist/src/resolvers/MutationResolver.d.ts.map +1 -1
  162. package/dist/src/resolvers/MutationResolver.js +13 -2
  163. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  164. package/dist/src/resolvers/ReadHelpers.js +3 -3
  165. package/dist/src/resolvers/ReadHelpers.js.map +1 -1
  166. package/dist/src/resolvers/ReadResolver.js +2 -2
  167. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  168. package/dist/src/schema/EnumsProvider.d.ts.map +1 -1
  169. package/dist/src/schema/EnumsProvider.js +1 -2
  170. package/dist/src/schema/EnumsProvider.js.map +1 -1
  171. package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
  172. package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
  173. package/dist/src/schema/FieldAccessVisitor.js +2 -2
  174. package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
  175. package/dist/src/schema/OrderByTypeProvider.d.ts +1 -1
  176. package/dist/src/schema/OrderByTypeProvider.d.ts.map +1 -1
  177. package/dist/src/schema/OrderByTypeProvider.js +2 -2
  178. package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
  179. package/dist/src/schema/WhereTypeProvider.d.ts +1 -2
  180. package/dist/src/schema/WhereTypeProvider.d.ts.map +1 -1
  181. package/dist/src/schema/WhereTypeProvider.js +4 -4
  182. package/dist/src/schema/WhereTypeProvider.js.map +1 -1
  183. package/dist/src/schema/entities/FieldArgsVisitor.d.ts +4 -5
  184. package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
  185. package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
  186. package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
  187. package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
  188. package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
  189. package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
  190. package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
  191. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
  192. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  193. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
  194. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  195. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  196. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  197. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
  198. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  199. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
  200. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  201. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
  202. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  203. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
  204. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  205. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
  206. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  207. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  208. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  209. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
  210. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  211. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
  212. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  213. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
  214. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  215. package/dist/src/schema/utils.d.ts +1 -1
  216. package/dist/src/schema/utils.d.ts.map +1 -1
  217. package/dist/src/tsconfig.tsbuildinfo +1 -1
  218. package/dist/src/utils/object.d.ts.map +1 -1
  219. package/dist/src/utils/object.js +3 -4
  220. package/dist/src/utils/object.js.map +1 -1
  221. package/dist/src/utils/uniqueWhereFields.js +3 -3
  222. package/dist/src/utils/uniqueWhereFields.js.map +1 -1
  223. package/dist/tests/cases/bugs/bug102.test.js +6 -6
  224. package/dist/tests/cases/bugs/bug102.test.js.map +1 -1
  225. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +5 -5
  226. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  227. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +5 -5
  228. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
  229. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +5 -5
  230. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
  231. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +5 -5
  232. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
  233. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +5 -5
  234. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
  235. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +5 -5
  236. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
  237. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js +51 -4
  238. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js.map +1 -1
  239. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +26 -25
  240. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
  241. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +9 -6
  242. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
  243. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts +2 -0
  244. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts.map +1 -0
  245. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js +109 -0
  246. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js.map +1 -0
  247. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js +17 -15
  248. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js.map +1 -1
  249. package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js +4 -5
  250. package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js.map +1 -1
  251. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js +9 -13
  252. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js.map +1 -1
  253. package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js +5 -3
  254. package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js.map +1 -1
  255. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +5 -5
  256. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js.map +1 -1
  257. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js +5 -5
  258. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js.map +1 -1
  259. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js +10 -10
  260. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js.map +1 -1
  261. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js +5 -5
  262. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js.map +1 -1
  263. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js +5 -5
  264. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
  265. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +5 -5
  266. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
  267. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +4 -4
  268. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
  269. package/dist/tests/cases/integration/graphQlSchema/model.js.map +1 -1
  270. package/dist/tests/cases/unit/conditionOptimizer.test.js +5 -0
  271. package/dist/tests/cases/unit/conditionOptimizer.test.js.map +1 -1
  272. package/dist/tests/cases/unit/permissionMerger.test.js +2 -0
  273. package/dist/tests/cases/unit/permissionMerger.test.js.map +1 -1
  274. package/dist/tests/cases/unit/predicatesFactory.test.js +7 -1
  275. package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -1
  276. package/dist/tests/cases/unit/predicatesInjector.test.js +105 -0
  277. package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
  278. package/dist/tests/cases/unit/whereBuilder.test.d.ts +2 -0
  279. package/dist/tests/cases/unit/whereBuilder.test.d.ts.map +1 -0
  280. package/dist/tests/cases/unit/whereBuilder.test.js +131 -0
  281. package/dist/tests/cases/unit/whereBuilder.test.js.map +1 -0
  282. package/dist/tests/cases/unit/whereOptimizer.test.js +187 -0
  283. package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
  284. package/dist/tests/src/test.js +2 -2
  285. package/dist/tests/src/test.js.map +1 -1
  286. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  287. package/dist/tests/src/testGraphql.js +9 -5
  288. package/dist/tests/src/testGraphql.js.map +1 -1
  289. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  290. package/package.json +13 -11
  291. package/src/acl/EvaluatedPredicateReplacer.ts +9 -15
  292. package/src/acl/PermissionFactory.ts +18 -13
  293. package/src/acl/PredicateFactory.ts +64 -40
  294. package/src/acl/PredicatesInjector.ts +18 -17
  295. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +21 -28
  296. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
  297. package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +10 -28
  298. package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +11 -8
  299. package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
  300. package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +10 -29
  301. package/src/input-validation/ColumnValueResolver.ts +2 -3
  302. package/src/input-validation/EntityRulesResolver.ts +4 -4
  303. package/src/input-validation/QueryAstFactory.ts +1 -1
  304. package/src/input-validation/ValidationDataSelector.ts +1 -1
  305. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
  306. package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
  307. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
  308. package/src/inputProcessing/CreateInputProcessor.ts +8 -9
  309. package/src/inputProcessing/CreateInputVisitor.ts +27 -89
  310. package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
  311. package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
  312. package/src/inputProcessing/index.ts +0 -1
  313. package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
  314. package/src/mapper/ErrorUtils.ts +2 -2
  315. package/src/mapper/JunctionTableManager.ts +3 -3
  316. package/src/mapper/Mapper.ts +34 -31
  317. package/src/mapper/MapperContainer.ts +7 -5
  318. package/src/mapper/Result.ts +2 -4
  319. package/src/mapper/delete/DeleteExecutor.ts +6 -6
  320. package/src/mapper/insert/InsertBuilder.ts +2 -2
  321. package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
  322. package/src/mapper/select/JoinVisitor.ts +6 -33
  323. package/src/mapper/select/Path.ts +4 -1
  324. package/src/mapper/select/RelationFetcher.ts +49 -50
  325. package/src/mapper/select/SelectBuilder.ts +71 -13
  326. package/src/mapper/select/SelectBuilderFactory.ts +2 -1
  327. package/src/mapper/select/SelectExecutionHandler.ts +16 -8
  328. package/src/mapper/select/SelectHydrator.ts +15 -11
  329. package/src/mapper/select/WhereBuilder.ts +168 -61
  330. package/src/mapper/select/handlers/FieldsVisitor.ts +80 -111
  331. package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
  332. package/src/mapper/select/handlers/MetaHandler.ts +6 -17
  333. package/src/mapper/select/optimizer/ConditionOptimizer.ts +6 -0
  334. package/src/mapper/select/optimizer/WhereOptimizer.ts +148 -21
  335. package/src/mapper/select/optimizer/WhereReplacer.ts +39 -0
  336. package/src/mapper/select/optimizer/helpers.ts +7 -3
  337. package/src/mapper/update/SqlUpdateInputProcessor.ts +4 -10
  338. package/src/mapper/update/UpdateBuilder.ts +3 -3
  339. package/src/resolvers/ExecutionContainerFactory.ts +1 -1
  340. package/src/resolvers/GraphQlQueryAstFactory.ts +5 -4
  341. package/src/resolvers/MutationResolver.ts +14 -4
  342. package/src/resolvers/ReadHelpers.ts +3 -3
  343. package/src/resolvers/ReadResolver.ts +2 -2
  344. package/src/schema/EnumsProvider.ts +2 -4
  345. package/src/schema/FieldAccessVisitor.ts +2 -2
  346. package/src/schema/OrderByTypeProvider.ts +10 -3
  347. package/src/schema/WhereTypeProvider.ts +5 -6
  348. package/src/schema/entities/FieldArgsVisitor.ts +4 -5
  349. package/src/schema/entities/FieldTypeVisitor.ts +3 -3
  350. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
  351. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
  352. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +6 -20
  353. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
  354. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
  355. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +9 -14
  356. package/src/schema/utils.ts +1 -1
  357. package/src/tsconfig.json +6 -6
  358. package/src/utils/object.ts +6 -6
  359. package/src/utils/uniqueWhereFields.ts +3 -3
  360. package/tests/cases/bugs/bug102.test.ts +6 -6
  361. package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +5 -5
  362. package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +5 -5
  363. package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +5 -5
  364. package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +5 -5
  365. package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +5 -5
  366. package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +5 -5
  367. package/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.ts +54 -4
  368. package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +26 -25
  369. package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +9 -6
  370. package/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.ts +104 -0
  371. package/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.ts +17 -15
  372. package/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.ts +4 -5
  373. package/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.ts +9 -13
  374. package/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.ts +5 -3
  375. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +5 -5
  376. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +5 -5
  377. package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +10 -10
  378. package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +5 -5
  379. package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +5 -5
  380. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +5 -5
  381. package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +2 -3
  382. package/tests/cases/unit/conditionOptimizer.test.ts +6 -0
  383. package/tests/cases/unit/permissionMerger.test.ts +2 -0
  384. package/tests/cases/unit/predicatesFactory.test.ts +8 -2
  385. package/tests/cases/unit/predicatesInjector.test.ts +97 -2
  386. package/tests/cases/unit/whereBuilder.test.ts +148 -0
  387. package/tests/cases/unit/whereOptimizer.test.ts +215 -0
  388. package/tests/src/test.ts +2 -2
  389. package/tests/src/testGraphql.ts +9 -5
  390. package/dist/src/inputProcessing/InputContext.d.ts +0 -43
  391. package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
  392. package/dist/src/inputProcessing/InputContext.js +0 -3
  393. package/dist/src/inputProcessing/InputContext.js.map +0 -1
  394. package/src/inputProcessing/InputContext.ts +0 -49
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/engine-content-api",
3
- "version": "v1.2.0-alpha.8",
3
+ "version": "1.2.0-beta.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -10,24 +10,26 @@
10
10
  "test": "vitest --no-threads"
11
11
  },
12
12
  "dependencies": {
13
- "@contember/database": "^v1.2.0-alpha.8",
14
- "@contember/dic": "^v1.2.0-alpha.8",
15
- "@contember/engine-common": "^v1.2.0-alpha.8",
16
- "@contember/graphql-utils": "^v1.2.0-alpha.8",
17
- "@contember/schema": "^v1.2.0-alpha.8",
18
- "@contember/schema-utils": "^v1.2.0-alpha.8",
13
+ "@contember/database": "^1.2.0-beta.1",
14
+ "@contember/dic": "^1.2.0-beta.1",
15
+ "@contember/logger": "^1.2.0-beta.1",
16
+ "@contember/graphql-utils": "^1.2.0-beta.1",
17
+ "@contember/schema": "^1.2.0-beta.1",
18
+ "@contember/schema-definition": "^1.2.0-beta.1",
19
+ "@contember/schema-utils": "^1.2.0-beta.1",
19
20
  "@graphql-tools/schema": "^8.3.5",
21
+ "fast-deep-equal": "^3.1.3",
20
22
  "graphql-tag": "^2.12.5"
21
23
  },
22
24
  "devDependencies": {
23
- "@contember/database-tester": "^v1.2.0-alpha.8",
24
- "@contember/engine-api-tester": "^v1.2.0-alpha.8",
25
- "@contember/schema-definition": "^v1.2.0-alpha.8",
25
+ "@contember/database-tester": "^1.2.0-beta.1",
26
+ "@contember/engine-api-tester": "^1.2.0-beta.1",
27
+ "@contember/schema-definition": "^1.2.0-beta.1",
26
28
  "@graphql-codegen/cli": "^2.6.2",
27
29
  "@graphql-codegen/typescript": "^2.5.1",
28
30
  "@graphql-codegen/typescript-operations": "^2.4.2",
29
31
  "@graphql-codegen/typescript-resolvers": "^2.6.6",
30
- "@types/node": "^16",
32
+ "@types/node": "^18",
31
33
  "graphql": "^16.5.0",
32
34
  "pg": "^8.5.0"
33
35
  },
@@ -1,32 +1,25 @@
1
1
  import { Input, Model, Writable } from '@contember/schema'
2
- import deepEqual from 'fast-deep-equal'
2
+ import { replaceWhere } from '../mapper/select/optimizer/WhereReplacer'
3
3
 
4
4
  export class EvaluatedPredicateReplacer {
5
5
  constructor(
6
- private readonly evaluatedPredicate: Input.Where,
6
+ private readonly evaluatedPredicate: Input.OptionalWhere,
7
7
  private readonly sourceEntity: Model.Entity,
8
8
  private readonly relation: Model.AnyRelation,
9
9
  ) {
10
10
  }
11
11
 
12
- public replace(where: Input.Where): Input.Where {
13
- return this.replaceInternal(where, false)
14
- }
15
-
16
- private replaceInternal(where: Input.Where, onRelation: boolean): Input.Where {
17
- if (onRelation && deepEqual(where, this.evaluatedPredicate)) {
18
- return { [this.sourceEntity.primary]: { always: true } }
19
- }
20
- const result: Writable<Input.Where> = {}
12
+ public replace(where: Input.OptionalWhere): Input.OptionalWhere {
13
+ const result: Writable<Input.OptionalWhere> = {}
21
14
  for (const [key, value] of Object.entries(where)) {
22
15
  if (key === 'not') {
23
- result['not'] = this.replaceInternal(value as Input.Where, onRelation)
16
+ result['not'] = this.replace(value as Input.OptionalWhere)
24
17
 
25
18
  } else if (key === 'and' || key === 'or') {
26
- result[key] = (value as Input.Where[]).map(it => this.replaceInternal(it, onRelation))
19
+ result[key] = (value as Input.Where[]).map(it => this.replace(it))
27
20
 
28
- } else if (key === this.relation.name && !onRelation) {
29
- result[key] = this.replaceInternal(value as Input.Where, true)
21
+ } else if (key === this.relation.name) {
22
+ result[key] = replaceWhere(value as Input.Where, this.evaluatedPredicate, { [this.sourceEntity.primary]: { always: true } })
30
23
 
31
24
  } else {
32
25
  result[key] = value
@@ -35,4 +28,5 @@ export class EvaluatedPredicateReplacer {
35
28
  }
36
29
  return result
37
30
  }
31
+
38
32
  }
@@ -17,7 +17,7 @@ export class PermissionFactory {
17
17
  }
18
18
  result = this.mergePermissions(result, rolePermissions)
19
19
  }
20
- this.makePrimaryPredicatesUnionOfAllFields(result)
20
+ result = this.makePrimaryPredicatesUnionOfAllFields(result)
21
21
 
22
22
  return result
23
23
  }
@@ -45,18 +45,20 @@ export class PermissionFactory {
45
45
  }))
46
46
  }
47
47
 
48
- private makePrimaryPredicatesUnionOfAllFields(permissions: Acl.Permissions): void {
49
- for (let entityName in permissions) {
48
+ private makePrimaryPredicatesUnionOfAllFields(permissions: Acl.Permissions): Acl.Permissions {
49
+ return mapObject(permissions, (permission, entityName): Acl.EntityPermissions => {
50
50
  const entity = getEntity(this.schema, entityName)
51
- const entityPermissions: Acl.EntityPermissions = permissions[entityName]
52
- const entityPredicates: Writable<Acl.PredicateMap> = entityPermissions.predicates
51
+ const entityPredicates: Writable<Acl.PredicateMap> = { ...permission.predicates }
52
+ const entityOperations: Writable<Acl.EntityOperations> = { ...permission.operations }
53
53
 
54
54
  const operationNames = ['read', 'create', 'update'] as const
55
55
  for (let operation of operationNames) {
56
- const fieldPermissions: Writable<Acl.FieldPermissions> | undefined = entityPermissions.operations[operation]
57
- if (fieldPermissions === undefined) {
56
+ if (!entityOperations[operation]) {
58
57
  continue
59
58
  }
59
+ const fieldPermissions: Writable<Acl.FieldPermissions> = { ...entityOperations[operation] }
60
+ entityOperations[operation] = fieldPermissions
61
+
60
62
  if (Object.values(fieldPermissions).some(it => it === true)) {
61
63
  fieldPermissions[entity.primary] = true
62
64
  }
@@ -70,25 +72,28 @@ export class PermissionFactory {
70
72
  .filter((value, index, array): value is string => array.indexOf(value) === index)
71
73
 
72
74
  let idPermissions: Acl.Predicate = fieldPermissions[entity.primary] || false
73
- const predicates = { ...entityPermissions.predicates }
74
75
 
75
76
  for (let predicateReference of predicateReferences) {
76
77
  const [predicateDefinition, predicate] = this.mergePredicates(
77
- predicates,
78
+ entityPredicates,
78
79
  idPermissions,
79
- predicates,
80
+ entityPredicates,
80
81
  predicateReference,
81
82
  )
82
83
  if (typeof predicate !== 'string' || predicateDefinition === undefined) {
83
84
  throw new Error('should not happen')
84
85
  }
85
86
  idPermissions = predicate
86
- predicates[predicate] = predicateDefinition
87
+ entityPredicates[predicate] = predicateDefinition
87
88
  }
88
89
  fieldPermissions[entity.primary] = idPermissions
89
- entityPredicates[idPermissions as Acl.PredicateReference] = predicates[idPermissions as Acl.PredicateReference]
90
+ entityPredicates[idPermissions as Acl.PredicateReference] = entityPredicates[idPermissions as Acl.PredicateReference]
90
91
  }
91
- }
92
+ return {
93
+ operations: entityOperations,
94
+ predicates: entityPredicates,
95
+ }
96
+ })
92
97
  }
93
98
 
94
99
  private mergePermissions(left: Acl.Permissions, right: Acl.Permissions): Acl.Permissions {
@@ -1,11 +1,14 @@
1
1
  import { Acl, Input, Model } from '@contember/schema'
2
2
  import { VariableInjector } from './VariableInjector'
3
- import { isOwningRelation } from '@contember/schema-utils'
4
- import { ImplementationException } from '../exception'
5
3
  import { EvaluatedPredicateReplacer } from './EvaluatedPredicateReplacer'
6
4
 
7
5
  const getRowLevelPredicatePseudoField = (entity: Model.Entity) => entity.primary
8
6
 
7
+ export interface FieldRequiredPredicate {
8
+ predicate: Acl.Predicate
9
+ isSameAsPrimary: boolean
10
+ }
11
+
9
12
  export class PredicateFactory {
10
13
  constructor(
11
14
  private readonly permissions: Acl.Permissions,
@@ -13,6 +16,24 @@ export class PredicateFactory {
13
16
  private readonly variableInjector: VariableInjector,
14
17
  ) {}
15
18
 
19
+ public getFieldPredicate(
20
+ entity: Model.Entity,
21
+ operation: Acl.Operation.update | Acl.Operation.read | Acl.Operation.create,
22
+ fieldName: string,
23
+ ): FieldRequiredPredicate {
24
+ const permissions = this.permissions[entity.name]?.operations?.[operation]
25
+ const predicate = permissions?.[fieldName] ?? false
26
+ const rowLevelField = getRowLevelPredicatePseudoField(entity)
27
+
28
+ const primaryPredicate = permissions?.[rowLevelField] ?? false
29
+ const isSameAsPrimary = predicate === primaryPredicate
30
+
31
+ return {
32
+ isSameAsPrimary,
33
+ predicate,
34
+ }
35
+ }
36
+
16
37
  public shouldApplyCellLevelPredicate(
17
38
  entity: Model.Entity,
18
39
  operation: Acl.Operation.read,
@@ -23,14 +44,28 @@ export class PredicateFactory {
23
44
  return permissions?.[fieldName] !== permissions?.[rowLevelField]
24
45
  }
25
46
 
26
- public create(entity: Model.Entity, operation: Acl.Operation.delete): Input.Where
47
+ public createDeletePredicate(entity: Model.Entity) {
48
+ const neverCondition: Input.Where = { [entity.primary]: { never: true } }
49
+ const entityPermissions = this.permissions[entity.name]
50
+ if (!entityPermissions) {
51
+ return neverCondition
52
+ }
53
+ const deletePredicate = entityPermissions.operations.delete
54
+ if (deletePredicate === undefined || deletePredicate === false) {
55
+ return neverCondition
56
+ }
57
+ if (deletePredicate === true) {
58
+ return {}
59
+ }
60
+ return this.buildPredicates(entity, [deletePredicate])
61
+ }
62
+
27
63
  public create(
28
64
  entity: Model.Entity,
29
65
  operation: Acl.Operation.update | Acl.Operation.read | Acl.Operation.create,
30
- fieldNames?: string[],
31
- overRelation?: Model.AnyRelation,
32
- ): Input.Where
33
- public create(entity: Model.Entity, operation: Acl.Operation, fieldNames?: string[], overRelation?: Model.AnyRelation): Input.Where {
66
+ fieldNames: string[] = [getRowLevelPredicatePseudoField(entity)],
67
+ relationContext?: Model.AnyRelationContext,
68
+ ): Input.OptionalWhere {
34
69
  const entityPermissions: Acl.EntityPermissions = this.permissions[entity.name]
35
70
  const neverCondition: Input.Where = { [entity.primary]: { never: true } }
36
71
 
@@ -38,31 +73,24 @@ export class PredicateFactory {
38
73
  return neverCondition
39
74
  }
40
75
 
41
- let predicates: Acl.PredicateReference[]
42
- if (operation === Acl.Operation.delete) {
43
- const deletePredicate = entityPermissions.operations.delete
44
- if (deletePredicate === undefined || deletePredicate === false) {
45
- return neverCondition
46
- }
47
- if (deletePredicate === true) {
48
- return {}
49
- }
50
- predicates = [deletePredicate]
51
- } else {
52
- if (fieldNames === undefined) {
53
- fieldNames = [getRowLevelPredicatePseudoField(entity)]
54
- }
55
- const fieldPermissions = entityPermissions.operations[operation]
56
- if (fieldPermissions === undefined) {
57
- return neverCondition
58
- }
59
- const operationPredicates = this.getRequiredPredicates(fieldNames, fieldPermissions)
60
- if (operationPredicates === false) {
61
- return neverCondition
62
- }
63
- predicates = operationPredicates
76
+ if (fieldNames === undefined) {
77
+ fieldNames = [getRowLevelPredicatePseudoField(entity)]
78
+ }
79
+ const fieldPermissions = entityPermissions.operations[operation]
80
+ if (fieldPermissions === undefined) {
81
+ return neverCondition
82
+ }
83
+ const operationPredicates = this.getRequiredPredicates(fieldNames, fieldPermissions)
84
+ if (operationPredicates === false) {
85
+ return neverCondition
64
86
  }
65
87
 
88
+ return this.buildPredicates(entity, operationPredicates, relationContext)
89
+ }
90
+
91
+ public buildPredicates(entity: Model.Entity, predicates: Acl.PredicateReference[], relationContext?: Model.AnyRelationContext): Input.OptionalWhere {
92
+ const entityPermissions: Acl.EntityPermissions = this.permissions[entity.name] ?? {}
93
+
66
94
  const predicatesWhere: Input.Where[] = predicates.reduce(
67
95
  (result: Input.Where[], name: Acl.PredicateReference): Input.Where[] => {
68
96
  if (!entityPermissions.predicates[name]) {
@@ -77,7 +105,8 @@ export class PredicateFactory {
77
105
  return {}
78
106
  }
79
107
  const where: Input.Where = predicatesWhere.length === 1 ? predicatesWhere[0] : { and: predicatesWhere }
80
- return this.optimizePredicates(where, overRelation)
108
+ return this.optimizePredicates(where, relationContext)
109
+
81
110
  }
82
111
 
83
112
  private getRequiredPredicates(
@@ -100,21 +129,16 @@ export class PredicateFactory {
100
129
  return predicates
101
130
  }
102
131
 
103
- private optimizePredicates(where: Input.Where, overRelation?: Model.AnyRelation) {
104
- if (!overRelation) {
132
+ public optimizePredicates(where: Input.OptionalWhere, relationContext?: Model.AnyRelationContext) {
133
+ if (!relationContext || !relationContext.targetRelation) {
105
134
  return where
106
135
  }
107
- const otherSide = isOwningRelation(overRelation) ? overRelation.inversedBy : overRelation.ownedBy
108
- if (!otherSide) {
109
- throw new ImplementationException()
110
- }
111
- const sourceEntity = this.model.entities[overRelation.target]
112
- const sourcePredicate = this.create(sourceEntity, Acl.Operation.read, [otherSide])
136
+ const sourcePredicate = this.create(relationContext.entity, Acl.Operation.read, [relationContext.relation.name])
113
137
  if (Object.keys(sourcePredicate).length === 0) {
114
138
  return where
115
139
  }
116
140
 
117
- const replacer = new EvaluatedPredicateReplacer(sourcePredicate, sourceEntity, overRelation)
141
+ const replacer = new EvaluatedPredicateReplacer(sourcePredicate, relationContext.entity, relationContext.targetRelation)
118
142
  return replacer.replace(where)
119
143
  }
120
144
  }
@@ -5,18 +5,19 @@ import { PredicateFactory } from './PredicateFactory'
5
5
  export class PredicatesInjector {
6
6
  constructor(private readonly schema: Model.Schema, private readonly predicateFactory: PredicateFactory) {}
7
7
 
8
- public inject(entity: Model.Entity, where: Input.OptionalWhere, overRelation?: Model.AnyRelation): Input.OptionalWhere {
8
+ public inject(entity: Model.Entity, where: Input.OptionalWhere, relationContext?: Model.AnyRelationContext): Input.OptionalWhere {
9
9
  const restrictedWhere = this.injectToWhere(where, entity, true)
10
- return this.createWhere(entity, undefined, restrictedWhere, overRelation)
10
+ return this.createWhere(entity, undefined, restrictedWhere, relationContext)
11
11
  }
12
12
 
13
13
  private createWhere(
14
14
  entity: Model.Entity,
15
15
  fieldNames: string[] | undefined,
16
16
  where: Input.OptionalWhere,
17
- overRelation?: Model.AnyRelation,
17
+ relationContext?: Model.AnyRelationContext,
18
18
  ): Input.OptionalWhere {
19
- const predicatesWhere: Input.Where = this.predicateFactory.create(entity, Acl.Operation.read, fieldNames, overRelation)
19
+ const predicatesWhere = this.predicateFactory.create(entity, Acl.Operation.read, fieldNames, relationContext)
20
+ where = this.predicateFactory.optimizePredicates(where, relationContext)
20
21
 
21
22
  const and = [where, predicatesWhere].filter(it => Object.keys(it).length > 0)
22
23
  if (and.length === 0) {
@@ -28,16 +29,21 @@ export class PredicatesInjector {
28
29
  return { and: and }
29
30
  }
30
31
 
31
- private injectToWhere(where: Input.OptionalWhere, entity: Model.Entity, isRoot: boolean): Input.OptionalWhere {
32
+ private injectToWhere(
33
+ where: Input.OptionalWhere,
34
+ entity: Model.Entity,
35
+ isRoot: boolean,
36
+ relationContext?: Model.AnyRelationContext,
37
+ ): Input.OptionalWhere {
32
38
  const resultWhere: Writable<Input.OptionalWhere> = {}
33
39
  if (where.and) {
34
- resultWhere.and = where.and.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot))
40
+ resultWhere.and = where.and.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot, relationContext))
35
41
  }
36
42
  if (where.or) {
37
- resultWhere.or = where.or.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot))
43
+ resultWhere.or = where.or.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot, relationContext))
38
44
  }
39
45
  if (where.not) {
40
- resultWhere.not = this.injectToWhere(where.not, entity, isRoot)
46
+ resultWhere.not = this.injectToWhere(where.not, entity, isRoot, relationContext)
41
47
  }
42
48
 
43
49
  const fields = Object.keys(where).filter(it => !['and', 'or', 'not'].includes(it))
@@ -46,21 +52,16 @@ export class PredicatesInjector {
46
52
  return resultWhere
47
53
  }
48
54
  for (let field of fields) {
49
- const targetEntity = acceptFieldVisitor(this.schema, entity, field, {
50
- visitColumn: () => null,
51
- visitRelation: (_a, _b, targetEntity) => targetEntity,
55
+ resultWhere[field] = acceptFieldVisitor(this.schema, entity, field, {
56
+ visitColumn: () => where[field],
57
+ visitRelation: context => this.injectToWhere(where[field] as Input.Where, context.targetEntity, false, context),
52
58
  })
53
- if (targetEntity) {
54
- resultWhere[field] = this.injectToWhere(where[field] as Input.Where, targetEntity, false)
55
- } else {
56
- resultWhere[field] = where[field]
57
- }
58
59
  }
59
60
  const fieldsForPredicate = !isRoot
60
61
  ? fields
61
62
  : fields.filter(it => this.predicateFactory.shouldApplyCellLevelPredicate(entity, Acl.Operation.read, it))
62
63
 
63
- return this.createWhere(entity, fieldsForPredicate, resultWhere)
64
+ return this.createWhere(entity, fieldsForPredicate, resultWhere, relationContext)
64
65
  }
65
66
 
66
67
  }
@@ -15,10 +15,22 @@ export class HasManyToHasOneReducerExecutionHandler implements SelectExecutionHa
15
15
  if (!objectNode) {
16
16
  throw new Error()
17
17
  }
18
- addData(
19
- entity.primary,
20
- async (ids: Input.PrimaryValue[]) => {
21
- const [targetEntity, targetRelation] = this.getRelationTarget(entity, objectNode.extensions.relationName)
18
+ addData({
19
+ field: entity.primary,
20
+ dataProvider: async (ids: Input.PrimaryValue[]) => {
21
+
22
+ const relationContext = acceptFieldVisitor(this.schema, entity, objectNode.extensions.relationName, {
23
+ visitRelation: context => context,
24
+ visitColumn: (): never => {
25
+ throw new ImplementationException('HasManyToHasOneReducerExecutionHandler: Not applicable for a column')
26
+ },
27
+ })
28
+
29
+ const { targetEntity, targetRelation } = relationContext
30
+ if (!targetRelation || !isIt<Model.JoiningColumnRelation>(targetRelation, 'joiningColumn')) {
31
+ throw new Error('HasManyToHasOneReducerExecutionHandler: only applicable for relations with joiningColumn')
32
+ }
33
+
22
34
  const uniqueWhere = this.uniqueWhereExpander.expand(targetEntity, {
23
35
  ...objectNode.args.by,
24
36
  [targetRelation.name]: { [entity.primary]: ids },
@@ -31,31 +43,12 @@ export class HasManyToHasOneReducerExecutionHandler implements SelectExecutionHa
31
43
  }
32
44
  const newObjectNode = objectNode.withArgs<Input.ListQueryInput>({ filter: whereWithParentId })
33
45
 
34
- return context.mapper.select(targetEntity, newObjectNode, targetRelation, targetRelation.name)
35
- },
36
- null,
37
- )
38
- }
39
-
40
- private getRelationTarget(
41
- entity: Model.Entity,
42
- relationName: string,
43
- ): [Model.Entity, Model.AnyRelation & Model.JoiningColumnRelation] {
44
- return acceptFieldVisitor(this.schema, entity, relationName, {
45
- visitColumn: (): never => {
46
- throw new ImplementationException('HasManyToHasOneReducerExecutionHandler: Not applicable for a column')
47
- },
48
- visitRelation: (
49
- entity,
50
- relation,
51
- targetEntity,
52
- targetRelation,
53
- ): [Model.Entity, Model.AnyRelation & Model.JoiningColumnRelation] => {
54
- if (!targetRelation || !isIt<Model.JoiningColumnRelation>(targetRelation, 'joiningColumn')) {
55
- throw new Error('HasManyToHasOneReducerExecutionHandler: only applicable for relations with joiningColumn')
56
- }
57
- return [targetEntity, targetRelation]
46
+ return context.mapper.selectAssoc(targetEntity, newObjectNode, [
47
+ ...context.relationPath,
48
+ relationContext,
49
+ ], targetRelation.name)
58
50
  },
51
+ defaultValue: null,
59
52
  })
60
53
  }
61
54
  }
@@ -48,12 +48,7 @@ export class HasManyToHasOneRelationReducerFieldVisitor implements
48
48
  return {}
49
49
  }
50
50
 
51
- public visitOneHasMany(
52
- entity: Model.Entity,
53
- relation: Model.AnyRelation,
54
- targetEntity: Model.Entity,
55
- targetRelation: Model.AnyRelation | null,
56
- ) {
51
+ public visitOneHasMany({ entity, targetEntity, targetRelation, relation }: Model.OneHasManyContext) {
57
52
  if (!targetRelation) {
58
53
  return {}
59
54
  }
@@ -11,58 +11,40 @@ export class PaginatedHasManyCountVisitor implements
11
11
  private readonly objectNode: ObjectNode<Input.PaginationQueryInput>,
12
12
  private readonly relationFetcher: RelationFetcher,
13
13
  private readonly mapper: Mapper,
14
+ private readonly relationPath: Model.AnyRelationContext[],
14
15
  ) {}
15
16
 
16
- async visitOneHasMany(
17
- entity: Model.Entity,
18
- relation: Model.OneHasManyRelation,
19
- targetEntity: Model.Entity,
20
- targetRelation: Model.ManyHasOneRelation,
21
- ): Promise<GroupedCounts> {
17
+ async visitOneHasMany(relationContext: Model.OneHasManyContext): Promise<GroupedCounts> {
22
18
  return await this.relationFetcher.countOneHasManyGroups(
23
19
  {
24
20
  mapper: this.mapper,
25
21
  filter: this.objectNode.args.filter,
26
- targetEntity: targetEntity,
27
- targetRelation: targetRelation,
22
+ relationContext,
23
+ relationPath: this.relationPath,
28
24
  ids: this.ids,
29
25
  },
30
26
  )
31
27
  }
32
28
 
33
- async visitManyHasManyOwning(
34
- entity: Model.Entity,
35
- relation: Model.ManyHasManyOwningRelation,
36
- targetEntity: Model.Entity,
37
- targetRelation: Model.ManyHasManyInverseRelation | null,
38
- ): Promise<GroupedCounts> {
29
+ async visitManyHasManyOwning(relationContext: Model.ManyHasManyOwningContext): Promise<GroupedCounts> {
39
30
  return await this.relationFetcher.countManyHasManyGroups(
40
31
  {
41
32
  mapper: this.mapper,
42
33
  filter: this.objectNode.args.filter,
43
- targetEntity: targetEntity,
44
- sourceRelation: relation,
45
- targetRelation,
46
- directionFrom: 'owning',
34
+ relationContext,
35
+ relationPath: this.relationPath,
47
36
  ids: this.ids,
48
37
  },
49
38
  )
50
39
  }
51
40
 
52
- async visitManyHasManyInverse(
53
- entity: Model.Entity,
54
- relation: Model.ManyHasManyInverseRelation,
55
- targetEntity: Model.Entity,
56
- targetRelation: Model.ManyHasManyOwningRelation,
57
- ): Promise<GroupedCounts> {
41
+ async visitManyHasManyInverse(relationContext: Model.ManyHasManyInverseContext): Promise<GroupedCounts> {
58
42
  return await this.relationFetcher.countManyHasManyGroups(
59
43
  {
60
44
  mapper: this.mapper,
61
45
  filter: this.objectNode.args.filter,
62
- targetEntity: targetEntity,
63
- sourceRelation: relation,
64
- targetRelation,
65
- directionFrom: 'inverse',
46
+ relationContext,
47
+ relationPath: this.relationPath,
66
48
  ids: this.ids,
67
49
  },
68
50
  )
@@ -7,7 +7,10 @@ import { PaginatedHasManyCountVisitor } from './PaginatedHasManyCountVisitor'
7
7
  import { PaginatedHasManyNodesVisitor } from './PaginatedHasManyNodesVisitor'
8
8
 
9
9
  export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<Input.PaginationQueryInput, PaginatedHasManyFieldProviderExtension> {
10
- constructor(private readonly schema: Model.Schema, private readonly relationFetcher: RelationFetcher) {}
10
+ constructor(
11
+ private readonly schema: Model.Schema,
12
+ private readonly relationFetcher: RelationFetcher,
13
+ ) {}
11
14
 
12
15
  process(
13
16
  context: SelectExecutionHandlerContext<Input.PaginationQueryInput, PaginatedHasManyFieldProviderExtension>,
@@ -17,15 +20,15 @@ export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<
17
20
  throw new Error()
18
21
  }
19
22
  const pagination = createPaginationHelper(objectNode)
20
- addData(
21
- context.entity.primary,
22
- async ids => {
23
+ addData({
24
+ field: context.entity.primary,
25
+ dataProvider: async ids => {
23
26
  const counts = pagination.requiresTotalCount
24
27
  ? await acceptFieldVisitor(
25
28
  this.schema,
26
29
  entity,
27
30
  objectNode.extensions.relationName,
28
- new PaginatedHasManyCountVisitor(ids, objectNode, this.relationFetcher, mapper),
31
+ new PaginatedHasManyCountVisitor(ids, objectNode, this.relationFetcher, mapper, context.relationPath),
29
32
  )
30
33
  : {}
31
34
 
@@ -34,7 +37,7 @@ export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<
34
37
  this.schema,
35
38
  entity,
36
39
  objectNode.extensions.relationName,
37
- new PaginatedHasManyNodesVisitor(ids, pagination.nodeField, this.relationFetcher, mapper),
40
+ new PaginatedHasManyNodesVisitor(ids, pagination.nodeField, this.relationFetcher, mapper, context.relationPath),
38
41
  )
39
42
  : undefined
40
43
  const result = new Map<Input.PrimaryValue, any>()
@@ -43,7 +46,7 @@ export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<
43
46
  }
44
47
  return Object.fromEntries(result)
45
48
  },
46
- pagination.createResponse(0, []),
47
- )
49
+ defaultValue: pagination.createResponse(0, []),
50
+ })
48
51
  }
49
52
  }
@@ -11,37 +11,19 @@ export class PaginatedHasManyFieldProviderVisitor implements
11
11
 
12
12
  constructor(private readonly paginatedFieldFactory: PaginatedFieldConfigFactory) {}
13
13
 
14
- visitOneHasMany(
15
- entity: Model.Entity,
16
- relation: Model.OneHasManyRelation,
17
- targetEntity: Model.Entity,
18
- targetRelation: Model.ManyHasOneRelation,
19
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
14
+ visitOneHasMany({ targetEntity, relation }: Model.OneHasManyContext) {
20
15
  return this.createField(targetEntity, relation)
21
16
  }
22
17
 
23
- visitManyHasManyOwning(
24
- entity: Model.Entity,
25
- relation: Model.ManyHasManyOwningRelation,
26
- targetEntity: Model.Entity,
27
- targetRelation: Model.ManyHasManyInverseRelation | null,
28
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
18
+ visitManyHasManyOwning({ targetEntity, relation }: Model.ManyHasManyOwningContext) {
29
19
  return this.createField(targetEntity, relation)
30
20
  }
31
21
 
32
- visitManyHasManyInverse(
33
- entity: Model.Entity,
34
- relation: Model.ManyHasManyInverseRelation,
35
- targetEntity: Model.Entity,
36
- targetRelation: Model.ManyHasManyOwningRelation,
37
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
22
+ visitManyHasManyInverse({ targetEntity, relation }: Model.ManyHasManyInverseContext) {
38
23
  return this.createField(targetEntity, relation)
39
24
  }
40
25
 
41
- private createField(
42
- entity: Model.Entity,
43
- relation: Model.Relation,
44
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
26
+ private createField(entity: Model.Entity, relation: Model.Relation): FieldMap<PaginatedHasManyFieldProviderExtension> {
45
27
  return {
46
28
  [`paginate${capitalizeFirstLetter(relation.name)}`]: {
47
29
  ...this.paginatedFieldFactory.createFieldConfig(entity),