@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
@@ -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
  }
@@ -1,6 +1,6 @@
1
- import { Input, Model } from '@contember/schema'
1
+ import { Acl, Input, Model } from '@contember/schema'
2
2
  import { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'
3
- import { SelectHydrator, SelectRow } from './SelectHydrator'
3
+ import { ColumnValueGetter, SelectHydrator, SelectRow } from './SelectHydrator'
4
4
  import { Path, PathFactory } from './Path'
5
5
  import { WhereBuilder } from './WhereBuilder'
6
6
  import { Client, LimitByGroupWrapper, SelectBuilder as DbSelectBuilder } from '@contember/database'
@@ -11,6 +11,7 @@ import { MetaHandler } from './handlers'
11
11
  import { Mapper } from '../Mapper'
12
12
  import { FieldNode, ObjectNode } from '../../inputProcessing'
13
13
  import { assertNever } from '../../utils'
14
+ import { PredicateFactory } from '../../acl'
14
15
 
15
16
  export class SelectBuilder {
16
17
  private resolver: (value: SelectRow[]) => void = () => {
@@ -30,6 +31,8 @@ export class SelectBuilder {
30
31
  private readonly fieldsVisitorFactory: FieldsVisitorFactory,
31
32
  private readonly selectHandlers: { [key: string]: SelectExecutionHandler<any> },
32
33
  private readonly pathFactory: PathFactory,
34
+ private readonly relationPath: Model.AnyRelationContext[],
35
+ private readonly predicateFactory: PredicateFactory,
33
36
  ) {}
34
37
 
35
38
  public async execute(db: Client): Promise<SelectRow[]> {
@@ -53,7 +56,7 @@ export class SelectBuilder {
53
56
  this.selectInternal(mapper, entity, path, input)
54
57
  const where = input.args.filter
55
58
  if (where) {
56
- this.qb = this.whereBuilder.build(this.qb, entity, path, where)
59
+ this.qb = this.whereBuilder.build(this.qb, entity, path, where, { relationPath: this.relationPath })
57
60
  }
58
61
  const orderBy = input.args.orderBy || []
59
62
 
@@ -83,6 +86,40 @@ export class SelectBuilder {
83
86
  input = input.withField(new FieldNode(entity.primary, entity.primary, {}))
84
87
  }
85
88
 
89
+ const fetchedPredicates = new Set()
90
+ const addPredicate = (predicate: Acl.Predicate): ColumnValueGetter<boolean> => {
91
+ if (typeof predicate === 'boolean') {
92
+ return () => predicate
93
+ }
94
+ const predicatePath = path.for('__predicate').for(predicate)
95
+
96
+ if (!fetchedPredicates.has(predicate)) {
97
+ const relationContext = this.relationPath[this.relationPath.length - 1]
98
+
99
+ const primaryPredicate = this.predicateFactory.create(entity, Acl.Operation.read, undefined, relationContext)
100
+ const fieldPredicate = this.predicateFactory.buildPredicates(entity, [predicate], relationContext)
101
+
102
+ this.qb = this.whereBuilder.buildAdvanced(
103
+ entity,
104
+ path.back(),
105
+ fieldPredicate,
106
+ apply => this.qb.select(expr =>
107
+ expr.selectCondition(condition => {
108
+ condition = apply(condition)
109
+ if (condition.isEmpty()) {
110
+ return condition.raw('true')
111
+ }
112
+ return condition
113
+ }),
114
+ predicatePath.alias,
115
+ ),
116
+ { relationPath: this.relationPath, evaluatedPredicates: [primaryPredicate] },
117
+ )
118
+ fetchedPredicates.add(predicate)
119
+ }
120
+ return row => row[predicatePath.alias] === true
121
+ }
122
+
86
123
  for (let field of input.fields) {
87
124
  const fieldPath = path.for(field.alias)
88
125
  const fieldProperty = (() => {
@@ -94,19 +131,38 @@ export class SelectBuilder {
94
131
  }
95
132
  return assertNever(field)
96
133
  })()
134
+
135
+
97
136
  const executionContext: SelectExecutionHandlerContext = {
98
137
  mapper,
99
- addData: async (fieldName, cb, defaultValue = null) => {
100
- const columnName = getColumnName(this.schema, entity, fieldName)
101
- const ids = (await this.getColumnValues(path.for(fieldName), columnName)).filter(it => it !== null)
138
+ relationPath: this.relationPath,
139
+ addData: async ({ field, dataProvider, defaultValue, predicate }) => {
140
+ if (predicate === false) {
141
+ this.hydrator.addPromise(fieldPath, path.for(field), Promise.resolve({}), defaultValue ?? null)
142
+ return
143
+ }
144
+ const predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null
145
+ const columnName = getColumnName(this.schema, entity, field)
146
+ let ids = await this.getColumnValues(path.for(field), columnName, predicateGetter)
102
147
 
103
- const data = (async () => (ids.length > 0 ? cb(ids) : {}))()
104
- this.hydrator.addPromise(fieldPath, path.for(fieldName), data, defaultValue)
148
+ const data = ids.length > 0 ? dataProvider(ids) : Promise.resolve({})
149
+ this.hydrator.addPromise(fieldPath, path.for(field), data, defaultValue ?? null)
105
150
  },
106
- addColumn: (qbCallback, path) => {
107
- this.qb = qbCallback(this.qb)
108
- this.hydrator.addColumn(path || fieldPath)
151
+ addColumn: ({ path = fieldPath, predicate, query, valueGetter }) => {
152
+ if (predicate === false) {
153
+ this.hydrator.addColumn(path, () => null)
154
+ return
155
+ }
156
+ const predicateGetter = predicate !== undefined && predicate !== true ? addPredicate(predicate) : null
157
+ if (query) {
158
+ this.qb = query(this.qb)
159
+ }
160
+ this.hydrator.addColumn(
161
+ path,
162
+ valueGetter ?? (row => predicateGetter === null || predicateGetter(row) ? row[path.alias] : null),
163
+ )
109
164
  },
165
+ addPredicate: addPredicate,
110
166
  path: fieldPath,
111
167
  entity: entity,
112
168
  ...fieldProperty,
@@ -136,10 +192,12 @@ export class SelectBuilder {
136
192
  }
137
193
  }
138
194
 
139
- private async getColumnValues(columnPath: Path, columnName: string): Promise<Input.PrimaryValue[]> {
195
+ private async getColumnValues(columnPath: Path, columnName: string, predicateGetter: null | ColumnValueGetter<boolean>): Promise<Input.PrimaryValue[]> {
140
196
  this.qb = this.qb.select([columnPath.back().alias, columnName], columnPath.alias)
141
197
  const rows = await this.rows
198
+ const filteredRows = predicateGetter === null ? rows : rows.filter(predicateGetter)
142
199
  const columnAlias = columnPath.alias
143
- return Array.from(new Set(rows.map((it): Input.PrimaryValue => it[columnAlias] as Input.PrimaryValue)))
200
+ const ids = filteredRows.map((it): Input.PrimaryValue => it[columnAlias] as Input.PrimaryValue).filter(it => it !== null)
201
+ return Array.from(new Set(ids))
144
202
  }
145
203
  }
@@ -1,7 +1,8 @@
1
1
  import { SelectBuilder } from './SelectBuilder'
2
2
  import { SelectHydrator } from './SelectHydrator'
3
3
  import { SelectBuilder as DbSelectBuilder } from '@contember/database'
4
+ import { Model } from '@contember/schema'
4
5
 
5
6
  export interface SelectBuilderFactory {
6
- create(qb: DbSelectBuilder<DbSelectBuilder.Result>, hydrator: SelectHydrator): SelectBuilder
7
+ create(qb: DbSelectBuilder<DbSelectBuilder.Result>, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder
7
8
  }
@@ -1,6 +1,6 @@
1
1
  import { Path } from './Path'
2
- import { Input, Model } from '@contember/schema'
3
- import { SelectNestedData, SelectNestedDefaultValue } from './SelectHydrator'
2
+ import { Acl, Input, Model } from '@contember/schema'
3
+ import { ColumnValueGetter, SelectNestedData, SelectNestedDefaultValue, SelectRow } from './SelectHydrator'
4
4
  import { SelectBuilder } from '@contember/database'
5
5
  import { Mapper } from '../Mapper'
6
6
  import { FieldNode, ObjectNode } from '../../inputProcessing'
@@ -21,12 +21,20 @@ export type SelectExecutionHandlerContext<
21
21
  mapper: Mapper
22
22
  path: Path
23
23
  entity: Model.Entity
24
-
25
- addColumn: (
26
- queryCallback: (qb: SelectBuilder<SelectBuilder.Result>) => SelectBuilder<SelectBuilder.Result>,
27
- path?: Path,
28
- ) => void
29
- addData: (parentField: string, cb: DataCallback, defaultValue?: SelectNestedDefaultValue) => void
24
+ relationPath: Model.AnyRelationContext[]
25
+ addPredicate: (predicate: Acl.Predicate) => (row: SelectRow) => boolean
26
+ addColumn: (args: {
27
+ predicate?: Acl.Predicate
28
+ query?: (qb: SelectBuilder<SelectBuilder.Result>) => SelectBuilder<SelectBuilder.Result>
29
+ path?: Path
30
+ valueGetter?: ColumnValueGetter
31
+ }) => void
32
+ addData: (args: {
33
+ field: string
34
+ dataProvider: DataCallback
35
+ predicate?: Acl.Predicate
36
+ defaultValue?: SelectNestedDefaultValue
37
+ }) => void
30
38
  } & (
31
39
  | {
32
40
  fieldNode: FieldNode<FieldExtensions>
@@ -1,6 +1,7 @@
1
1
  import { Path } from './Path'
2
2
  import { Value } from '@contember/schema'
3
3
  import { getFulfilledValues, getRejections } from '../../utils'
4
+ import { logger } from '@contember/logger'
4
5
 
5
6
  type DataPromises = {
6
7
  path: Path
@@ -16,12 +17,19 @@ type ResolvedData = {
16
17
  defaultValue: SelectNestedDefaultValue
17
18
  }
18
19
 
20
+ export type ColumnValueGetter<T extends Value.FieldValue = Value.FieldValue> = (row: SelectRow) => T
21
+
22
+ type Column = {
23
+ path: Path
24
+ getValue: ColumnValueGetter
25
+ }
26
+
19
27
  export class SelectHydrator {
20
- private columns: Path[] = []
28
+ private columns: Column[] = []
21
29
  private promises: DataPromises[] = []
22
30
 
23
- public addColumn(path: Path) {
24
- this.columns.push(path)
31
+ public addColumn(path: Path, getValue: ColumnValueGetter) {
32
+ this.columns.push({ path, getValue })
25
33
  }
26
34
 
27
35
  public addPromise(
@@ -72,12 +80,11 @@ export class SelectHydrator {
72
80
  const result: SelectResultObject = {}
73
81
 
74
82
  for (let columnPath of this.columns) {
75
- const path = [...columnPath.path]
83
+ const path = [...columnPath.path.path]
76
84
  const last: string = path.pop() as string
77
85
  const currentObject = path.reduce<any>((obj, part) => (obj[part] = obj[part] || {}), result)
78
86
 
79
- const field = row[columnPath.alias]
80
- currentObject[last] = this.formatValue(field)
87
+ currentObject[last] = this.formatValue(columnPath.getValue(row))
81
88
  }
82
89
 
83
90
  for (let { path, parentKeyPath, data, defaultValue } of resolvedData) {
@@ -103,10 +110,7 @@ export class SelectHydrator {
103
110
  const failures = getRejections(results)
104
111
  if (failures.length > 0) {
105
112
  if (failures.length > 1) {
106
- // eslint-disable-next-line no-console
107
- console.error('Multiple error has occurred, printing them & rethrowing the first one')
108
- // eslint-disable-next-line no-console
109
- failures.slice(1).map(e => console.error(e))
113
+ failures.slice(1).map(e => logger.error(e, { loc: 'SelectHydrator' }))
110
114
  }
111
115
  throw failures[0]
112
116
  }
@@ -122,7 +126,7 @@ export class SelectHydrator {
122
126
  }
123
127
  }
124
128
 
125
- export type SelectRow = { [key: string]: Value.AtomicValue }
129
+ export type SelectRow = { [key: string]: Value.FieldValue }
126
130
  export type SelectResultObject = Value.Object
127
131
  export type SelectIndexedResultObjects = { [key: string]: SelectResultObject }
128
132
  export type SelectGroupedObjects = { [groupingKey: string]: SelectResultObject[] }