@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
@@ -40,7 +40,7 @@ export class IntrospectionSchemaFactory {
40
40
  }
41
41
  }
42
42
  const additionalInfo = acceptEveryFieldVisitor<AdditionalFieldInfo>(this.model, entityName, {
43
- visitManyHasManyInverse(entity: Model.Entity, relation: Model.ManyHasManyInverseRelation) {
43
+ visitManyHasManyInverse({ relation }) {
44
44
  return {
45
45
  __typename: '_Relation',
46
46
  targetEntity: relation.target,
@@ -49,7 +49,7 @@ export class IntrospectionSchemaFactory {
49
49
  orderBy: relation.orderBy?.map(convertOrderBy),
50
50
  }
51
51
  },
52
- visitManyHasManyOwning(entity: Model.Entity, relation: Model.ManyHasManyOwningRelation) {
52
+ visitManyHasManyOwning({ relation }) {
53
53
  return {
54
54
  __typename: '_Relation',
55
55
  targetEntity: relation.target,
@@ -58,7 +58,7 @@ export class IntrospectionSchemaFactory {
58
58
  orderBy: relation.orderBy?.map(convertOrderBy),
59
59
  }
60
60
  },
61
- visitManyHasOne(entity: Model.Entity, relation: Model.ManyHasOneRelation) {
61
+ visitManyHasOne({ relation }) {
62
62
  return {
63
63
  __typename: '_Relation',
64
64
  targetEntity: relation.target,
@@ -68,7 +68,7 @@ export class IntrospectionSchemaFactory {
68
68
  nullable: relation.nullable,
69
69
  }
70
70
  },
71
- visitOneHasMany(entity: Model.Entity, relation: Model.OneHasManyRelation) {
71
+ visitOneHasMany({ relation }) {
72
72
  return {
73
73
  __typename: '_Relation',
74
74
  targetEntity: relation.target,
@@ -77,7 +77,7 @@ export class IntrospectionSchemaFactory {
77
77
  orderBy: relation.orderBy?.map(convertOrderBy),
78
78
  }
79
79
  },
80
- visitOneHasOneInverse(entity: Model.Entity, relation: Model.OneHasOneInverseRelation) {
80
+ visitOneHasOneInverse({ relation }) {
81
81
  return {
82
82
  __typename: '_Relation',
83
83
  targetEntity: relation.target,
@@ -86,7 +86,7 @@ export class IntrospectionSchemaFactory {
86
86
  nullable: relation.nullable,
87
87
  }
88
88
  },
89
- visitOneHasOneOwning(entity: Model.Entity, relation: Model.OneHasOneOwningRelation) {
89
+ visitOneHasOneOwning({ relation }) {
90
90
  return {
91
91
  __typename: '_Relation',
92
92
  targetEntity: relation.target,
@@ -97,7 +97,7 @@ export class IntrospectionSchemaFactory {
97
97
  orphanRemoval: relation.orphanRemoval === true,
98
98
  }
99
99
  },
100
- visitColumn(entity: Model.Entity, column: Model.AnyColumn) {
100
+ visitColumn({ column }) {
101
101
  return {
102
102
  __typename: '_Column',
103
103
  defaultValue: column.default ?? undefined,
@@ -12,6 +12,7 @@ import * as Database from '@contember/database'
12
12
  import { UniqueWhereError } from '../inputProcessing'
13
13
  import { Model } from '@contember/schema'
14
14
  import { isOwningRelation, isRelation, NamingHelper } from '@contember/schema-utils'
15
+ import { logger } from '@contember/logger'
15
16
  import RelationType = Model.RelationType
16
17
 
17
18
 
@@ -108,8 +109,7 @@ export const convertError = (schema: Model.Schema, e: any): MutationResult => {
108
109
  return new MutationSqlError([], e.originalMessage, [MutationResultHint.subSequentSqlError])
109
110
  }
110
111
  if (e instanceof Database.QueryError) {
111
- // eslint-disable-next-line no-console
112
- console.error(e)
112
+ logger.error(e, { loc: 'convertError' })
113
113
  return new MutationSqlError([], e.originalMessage, [MutationResultHint.sqlError])
114
114
  }
115
115
  throw e
@@ -87,7 +87,7 @@ export class JunctionTableManager {
87
87
  }
88
88
 
89
89
  const owningPredicate = this.predicateFactory.create(owningEntity, Acl.Operation.update, [relation.name])
90
- let inversePredicate: Input.Where = {}
90
+ let inversePredicate: Input.OptionalWhere = {}
91
91
  if (relation.inversedBy) {
92
92
  inversePredicate = this.predicateFactory.create(inverseEntity, Acl.Operation.update, [relation.inversedBy])
93
93
  }
@@ -99,11 +99,11 @@ export class JunctionTableManager {
99
99
  if (hasNoPredicates) {
100
100
  return await handler.executeSimple({ db, joiningTable, owningPrimary, inversePrimary, okResultFactory })
101
101
  } else {
102
- const owningWhere: Input.Where = {
102
+ const owningWhere: Input.OptionalWhere = {
103
103
  and: [owningPredicate, { [owningEntity.primary]: { eq: owningPrimary } }],
104
104
  }
105
105
 
106
- const inverseWhere: Input.Where = {
106
+ const inverseWhere: Input.OptionalWhere = {
107
107
  and: [inversePredicate, { [inverseEntity.primary]: { eq: inversePrimary } }],
108
108
  }
109
109
 
@@ -1,6 +1,6 @@
1
1
  import { Input, Model } from '@contember/schema'
2
2
  import { getColumnName } from '@contember/schema-utils'
3
- import { SelectHydrator, SelectIndexedResultObjects, SelectResultObject } from './select'
3
+ import { SelectGroupedObjects, SelectHydrator, SelectIndexedResultObjects, SelectResultObject } from './select'
4
4
  import { PathFactory } from './select'
5
5
  import * as database from '@contember/database'
6
6
  import { Client, SelectBuilder } from '@contember/database'
@@ -14,7 +14,7 @@ import { Updater } from './update'
14
14
  import { Inserter } from './insert'
15
15
  import { tryMutation } from './ErrorUtils'
16
16
  import { OrderByHelper } from './select'
17
- import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
17
+ import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
18
18
  import { UpdateBuilder } from './update'
19
19
  import { Mutex } from '../utils'
20
20
  import { CheckedPrimary } from './CheckedPrimary'
@@ -56,56 +56,58 @@ export class Mapper {
56
56
  return result[0] !== undefined ? result[0][columnName] : undefined
57
57
  }
58
58
 
59
- public async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, overRelation: Model.AnyRelation | null): Promise<SelectResultObject[]>
60
- public async select(
59
+ public async selectAssoc(
61
60
  entity: Model.Entity,
62
61
  input: ObjectNode<Input.ListQueryInput>,
63
- overRelation: Model.AnyRelation | null,
62
+ relationPath: Model.AnyRelationContext[],
64
63
  indexBy: string,
65
- ): Promise<SelectIndexedResultObjects>
66
- public async select(
67
- entity: Model.Entity,
68
- input: ObjectNode<Input.ListQueryInput>,
69
- overRelation: Model.AnyRelation | null,
70
- indexBy?: string,
71
- ): Promise<SelectResultObject[] | SelectIndexedResultObjects> {
64
+ ): Promise<SelectIndexedResultObjects> {
72
65
  const hydrator = new SelectHydrator()
73
- let qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()
74
- let indexByAlias: string | null = null
75
- if (indexBy) {
76
- const path = this.pathFactory.create([])
77
- indexByAlias = path.for(indexBy).alias
78
- qb = qb.select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)
79
- }
80
- const rows = await this.selectRows(hydrator, qb, entity, input, overRelation)
66
+ const path = this.pathFactory.create([])
67
+ const indexByAlias: string = path.for(indexBy).alias
68
+ const qb: SelectBuilder = SelectBuilder.create()
69
+ .select([path.alias, getColumnName(this.schema, entity, indexBy)], indexByAlias)
70
+ const rows = await this.selectRows(hydrator, qb, entity, input, relationPath)
71
+ return await hydrator.hydrateAll(rows, indexByAlias)
72
+ }
73
+
74
+ public async select(entity: Model.Entity, input: ObjectNode<Input.ListQueryInput>, relationPath: Model.AnyRelationContext[]): Promise<SelectResultObject[]> {
75
+ const hydrator = new SelectHydrator()
76
+ const qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()
77
+
78
+ const rows = await this.selectRows(hydrator, qb, entity, input, relationPath)
81
79
 
82
- return await (indexByAlias !== null ? hydrator.hydrateAll(rows, indexByAlias) : hydrator.hydrateAll(rows))
80
+ return await hydrator.hydrateAll(rows)
83
81
  }
84
82
 
85
83
  public async selectUnique(
86
84
  entity: Model.Entity,
87
85
  query: ObjectNode<Input.UniqueQueryInput>,
88
- overRelation: Model.AnyRelation | null,
86
+ relationPath: Model.AnyRelationContext[],
89
87
  ): Promise<SelectResultObject | null> {
90
88
  const uniqueWhere = this.uniqueWhereExpander.expand(entity, query.args.by)
91
89
  const where = query.args.filter ? { and: [uniqueWhere, query.args.filter] } : uniqueWhere
92
90
  const queryExpanded = query.withArg<Input.ListQueryInput>('filter', where)
93
91
 
94
- return (await this.select(entity, queryExpanded, overRelation))[0] || null
92
+ const rows = await this.select(entity, queryExpanded, relationPath)
93
+
94
+ return rows[0] ?? null
95
95
  }
96
96
 
97
97
  public async selectGrouped(
98
98
  entity: Model.Entity,
99
99
  input: ObjectNode<Input.ListQueryInput>,
100
100
  relation: Model.JoiningColumnRelation & Model.AnyRelation,
101
- ) {
101
+ relationPath: Model.AnyRelationContext[],
102
+ ): Promise<SelectGroupedObjects> {
102
103
  const hydrator = new SelectHydrator()
103
- let qb: SelectBuilder<SelectBuilder.Result> = SelectBuilder.create()
104
104
  const path = this.pathFactory.create([])
105
105
  const groupingKey = '__grouping_key'
106
- qb = qb.select([path.alias, relation.joiningColumn.columnName], groupingKey)
106
+ const qb: SelectBuilder = SelectBuilder.create()
107
+ .select([path.alias, relation.joiningColumn.columnName], groupingKey)
108
+
109
+ const rows = await this.selectRows(hydrator, qb, entity, input, relationPath, relation.name)
107
110
 
108
- const rows = await this.selectRows(hydrator, qb, entity, input, relation, relation.name)
109
111
  return await hydrator.hydrateGroups(rows, groupingKey)
110
112
  }
111
113
 
@@ -114,15 +116,15 @@ export class Mapper {
114
116
  qb: SelectBuilder<SelectBuilder.Result>,
115
117
  entity: Model.Entity,
116
118
  input: ObjectNode<Input.ListQueryInput>,
117
- overRelation: Model.AnyRelation | null,
119
+ relationPath: Model.AnyRelationContext[],
118
120
  groupBy?: string,
119
121
  ) {
120
122
  const inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, [])
121
123
  const path = this.pathFactory.create([])
122
124
  const augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])
123
125
 
124
- const selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator)
125
- const filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, overRelation ?? undefined)
126
+ const selector = this.selectBuilderFactory.create(augmentedBuilder, hydrator, relationPath)
127
+ const filterWithPredicates = this.predicatesInjector.inject(entity, inputWithOrder.args.filter || {}, relationPath[relationPath.length - 1])
126
128
  const inputWithPredicates = inputWithOrder.withArg('filter', filterWithPredicates)
127
129
  selector.select(this, entity, inputWithPredicates, path, groupBy)
128
130
  return await selector.execute(this.db)
@@ -143,6 +145,7 @@ export class Mapper {
143
145
  entity: Model.Entity,
144
146
  filter: Input.OptionalWhere,
145
147
  relation: Model.JoiningColumnRelation & Model.Relation,
148
+ relationPath: Model.AnyRelationContext[],
146
149
  ): Promise<Record<string, number>> {
147
150
  const path = this.pathFactory.create([])
148
151
  const qb = SelectBuilder.create()
@@ -151,7 +154,7 @@ export class Mapper {
151
154
  .select([path.alias, relation.joiningColumn.columnName])
152
155
  .groupBy([path.alias, relation.joiningColumn.columnName])
153
156
  const withPredicates = this.predicatesInjector.inject(entity, filter)
154
- const qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates)
157
+ const qbWithWhere = this.whereBuilder.build(qb, entity, path, withPredicates, { relationPath })
155
158
  const rows = await qbWithWhere.getResult(this.db)
156
159
  const result = new Map<string, number>()
157
160
  for (const row of rows) {
@@ -3,9 +3,9 @@ import {
3
3
  ConditionBuilder,
4
4
  FieldsVisitorFactory,
5
5
  JoinBuilder,
6
- RelationFetcher,
7
6
  MetaHandler,
8
7
  OrderByBuilder,
8
+ RelationFetcher,
9
9
  WhereBuilder,
10
10
  } from './select'
11
11
  import { UniqueWhereExpander } from '../inputProcessing'
@@ -27,7 +27,7 @@ import {
27
27
  Updater,
28
28
  } from '../mapper'
29
29
  import { Builder } from '@contember/dic'
30
- import { Acl, Schema } from '@contember/schema'
30
+ import { Acl, Model, Schema } from '@contember/schema'
31
31
  import { Client, SelectBuilder as DbSelectBuilder } from '@contember/database'
32
32
  import { Providers } from '@contember/schema-utils'
33
33
  import { PaginatedHasManyExecutionHandler } from '../extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'
@@ -65,7 +65,7 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
65
65
  .addService('whereOptimized', () =>
66
66
  new WhereOptimizer(schema.model, new ConditionOptimizer()))
67
67
  .addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized }) =>
68
- new WhereBuilder(schema.model, joinBuilder, conditionBuilder, pathFactory, whereOptimized))
68
+ new WhereBuilder(schema.model, joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema.settings.useExistsInHasManyFilter === true))
69
69
  .addService('orderByBuilder', ({ joinBuilder }) =>
70
70
  new OrderByBuilder(schema.model, joinBuilder))
71
71
  .addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>
@@ -84,9 +84,9 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
84
84
  [HasManyToHasOneReducer.extensionName]: hasManyToHasOneReducer,
85
85
  [PaginatedHasManyFieldProvider.extensionName]: paginatedHasManyExecutionHandler,
86
86
  }))
87
- .addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory }) =>
87
+ .addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory, predicateFactory }) =>
88
88
  new (class implements SelectBuilderFactory {
89
- create(qb: DbSelectBuilder, hydrator: SelectHydrator): SelectBuilder {
89
+ create(qb: DbSelectBuilder, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder {
90
90
  return new SelectBuilder(
91
91
  schema.model,
92
92
  whereBuilder,
@@ -97,6 +97,8 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
97
97
  fieldsVisitorFactory,
98
98
  selectHandlers,
99
99
  pathFactory,
100
+ relationPath,
101
+ predicateFactory,
100
102
  )
101
103
  }
102
104
  })())
@@ -2,6 +2,7 @@ import { Input, Model, Value } from '@contember/schema'
2
2
  import { convertError } from './ErrorUtils'
3
3
  import { getFulfilledValues, getRejections } from '../utils'
4
4
  import { SerializationFailureError } from '@contember/database'
5
+ import { logger } from '@contember/logger'
5
6
 
6
7
  export enum MutationResultType {
7
8
  ok = 'ok',
@@ -225,10 +226,7 @@ export const collectResults = async (
225
226
  const failures = getRejections(results)
226
227
  if (failures.length > 0) {
227
228
  if (failures.length > 1 && !failures.every(it => it instanceof SerializationFailureError)) {
228
- // eslint-disable-next-line no-console
229
- console.error('Multiple error has occurred, printing them & rethrowing the first one')
230
- // eslint-disable-next-line no-console
231
- failures.slice(1).map(e => console.error(e))
229
+ failures.slice(1).map(e => logger.error(e))
232
230
  }
233
231
  throw failures[0]
234
232
  }
@@ -36,7 +36,6 @@ export class DeleteExecutor {
36
36
  filter?: Input.OptionalWhere,
37
37
  ): Promise<MutationResultList> {
38
38
  return mapper.mutex.execute(async () => {
39
- await mapper.constraintHelper.setFkConstraintsDeferred()
40
39
  const primaryValue = await mapper.getPrimaryValue(entity, by)
41
40
  if (!primaryValue) {
42
41
  return [new MutationEntryNotFoundError([], by as Input.UniqueWhere)]
@@ -44,20 +43,21 @@ export class DeleteExecutor {
44
43
  if (mapper.deletedEntities.isDeleted(entity.name, primaryValue)) {
45
44
  return [new MutationNothingToDo([], NothingToDoReason.alreadyDeleted)]
46
45
  }
46
+ await mapper.constraintHelper.setFkConstraintsDeferred()
47
47
  const primaryWhere = { [entity.primary]: { eq: primaryValue } }
48
48
  const result = await this.delete(mapper, entity, filter ? { and: [primaryWhere, filter] } : primaryWhere)
49
+ await mapper.constraintHelper.setFkConstraintsImmediate()
49
50
  if (result.length === 0) {
50
51
  return [new MutationNoResultError([])]
51
52
  }
52
53
 
53
- await mapper.constraintHelper.setFkConstraintsImmediate()
54
54
  return [new MutationDeleteOk([], entity, primaryValue)]
55
55
  })
56
56
  }
57
57
 
58
58
  private async delete(mapper: Mapper, entity: Model.Entity, where: Input.OptionalWhere): Promise<string[]> {
59
59
  const db = mapper.db
60
- const predicate = this.predicateFactory.create(entity, Acl.Operation.delete)
60
+ const predicate = this.predicateFactory.createDeletePredicate(entity)
61
61
  const inQb = SelectBuilder.create() //
62
62
  .from(entity.tableName, 'root_')
63
63
  .select(['root_', entity.primaryColumn])
@@ -131,8 +131,8 @@ export class DeleteExecutor {
131
131
  visitManyHasManyOwning: () => null,
132
132
  visitOneHasOneInverse: () => null,
133
133
  visitOneHasMany: () => null,
134
- visitOneHasOneOwning: ({}, relation): EntityOwningRelationTuple => [entity, relation],
135
- visitManyHasOne: ({}, relation): EntityOwningRelationTuple => [entity, relation],
134
+ visitOneHasOneOwning: ({ relation }): EntityOwningRelationTuple => [entity, relation],
135
+ visitManyHasOne: ({ relation }): EntityOwningRelationTuple => [entity, relation],
136
136
  }),
137
137
  )
138
138
  .reduce<EntityOwningRelationTuple[]>(
@@ -155,7 +155,7 @@ export class DeleteExecutor {
155
155
  visitManyHasManyOwning: () => null,
156
156
  visitOneHasOneInverse: () => null,
157
157
  visitOneHasMany: () => null,
158
- visitOneHasOneOwning: ({}, relation, targetEntity) =>
158
+ visitOneHasOneOwning: ({ relation, targetEntity }) =>
159
159
  relation.orphanRemoval ? [targetEntity, relation] : null,
160
160
  visitManyHasOne: () => null,
161
161
  }),
@@ -20,7 +20,7 @@ export class InsertBuilder {
20
20
  public readonly insert: Promise<Value.PrimaryValue | null> = new Promise(resolve => (this.resolver = resolve))
21
21
 
22
22
  private rowData: ColumnValue<AbortInsert | undefined>[] = []
23
- private where: Input.Where = {}
23
+ private where: Input.OptionalWhere = {}
24
24
 
25
25
  constructor(
26
26
  private readonly schema: Model.Schema,
@@ -35,7 +35,7 @@ export class InsertBuilder {
35
35
  this.rowData.push({ columnName, value: resolveGenericValue(value), columnType, fieldName })
36
36
  }
37
37
 
38
- public addWhere(where: Input.Where): void {
38
+ public addWhere(where: Input.OptionalWhere): void {
39
39
  this.where = { and: [where, this.where] }
40
40
  }
41
41
 
@@ -1,4 +1,4 @@
1
- import { Input, Value } from '@contember/schema'
1
+ import { Input, Model, Value } from '@contember/schema'
2
2
  import { Mapper } from '../Mapper'
3
3
  import { InsertBuilder } from './InsertBuilder'
4
4
  import { Providers, resolveColumnValue } from '@contember/schema-utils'
@@ -15,7 +15,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<MutationRes
15
15
  private readonly providers: Providers,
16
16
  ) {}
17
17
 
18
- public async column(context: Context.ColumnContext): Promise<MutationResultList> {
18
+ public async column(context: Model.ColumnContext & { input: Input.ColumnValue | undefined }): Promise<MutationResultList> {
19
19
  this.insertBuilder.addFieldValue(
20
20
  context.column.name,
21
21
  ((): Value.GenericValueLike<Value.AtomicValue | undefined> => {
@@ -159,7 +159,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<MutationRes
159
159
  return []
160
160
  },
161
161
  connect: hasOneProcessor(
162
- async (context: Context.OneHasOneOwningContext & { input: Input.UniqueWhere }): Promise<MutationResultList> => {
162
+ async (context: Model.OneHasOneOwningContext & { input: Input.UniqueWhere }): Promise<MutationResultList> => {
163
163
  const primaryValue = this.mapper.getPrimaryValue(context.targetEntity, context.input)
164
164
  this.insertBuilder.addFieldValue(context.relation.name, async () => {
165
165
  const value = await primaryValue
@@ -4,11 +4,7 @@ import { Path } from './Path'
4
4
  export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]> {
5
5
  constructor(private readonly path: Path) {}
6
6
 
7
- visitOneHasOneOwning(
8
- entity: Model.Entity,
9
- relation: Model.OneHasOneOwningRelation,
10
- targetEntity: Model.Entity,
11
- ): JoinDefinition[] {
7
+ visitOneHasOneOwning({ targetEntity, relation }: Model.OneHasOneOwningContext): JoinDefinition[] {
12
8
  return [
13
9
  {
14
10
  tableName: targetEntity.tableName,
@@ -18,12 +14,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
18
14
  ]
19
15
  }
20
16
 
21
- visitOneHasOneInverse(
22
- entity: Model.Entity,
23
- relation: Model.OneHasOneInverseRelation,
24
- targetEntity: Model.Entity,
25
- targetRelation: Model.OneHasOneOwningRelation,
26
- ): JoinDefinition[] {
17
+ visitOneHasOneInverse({ targetEntity, entity, targetRelation }: Model.OneHasOneInverseContext): JoinDefinition[] {
27
18
  return [
28
19
  {
29
20
  tableName: targetEntity.tableName,
@@ -33,11 +24,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
33
24
  ]
34
25
  }
35
26
 
36
- visitManyHasOne(
37
- entity: Model.Entity,
38
- relation: Model.ManyHasOneRelation,
39
- targetEntity: Model.Entity,
40
- ): JoinDefinition[] {
27
+ visitManyHasOne({ targetEntity, relation }: Model.ManyHasOneContext): JoinDefinition[] {
41
28
  return [
42
29
  {
43
30
  tableName: targetEntity.tableName,
@@ -47,12 +34,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
47
34
  ]
48
35
  }
49
36
 
50
- visitOneHasMany(
51
- entity: Model.Entity,
52
- relation: Model.OneHasManyRelation,
53
- targetEntity: Model.Entity,
54
- targetRelation: Model.ManyHasOneRelation,
55
- ): JoinDefinition[] {
37
+ visitOneHasMany({ targetEntity, targetRelation, entity }: Model.OneHasManyContext): JoinDefinition[] {
56
38
  return [
57
39
  {
58
40
  tableName: targetEntity.tableName,
@@ -63,11 +45,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
63
45
  ]
64
46
  }
65
47
 
66
- visitManyHasManyOwning(
67
- entity: Model.Entity,
68
- relation: Model.ManyHasManyOwningRelation,
69
- targetEntity: Model.Entity,
70
- ): JoinDefinition[] {
48
+ visitManyHasManyOwning({ relation, entity, targetEntity }: Model.ManyHasManyOwningContext): JoinDefinition[] {
71
49
  const sourceAlias = this.path.back().alias
72
50
  const targetAlias = this.path.alias
73
51
  const joiningAlias = this.path.back().for('x_' + this.path.alias).alias
@@ -90,12 +68,7 @@ export class JoinVisitor implements Model.RelationByTypeVisitor<JoinDefinition[]
90
68
  ]
91
69
  }
92
70
 
93
- visitManyHasManyInverse(
94
- entity: Model.Entity,
95
- relation: Model.ManyHasManyInverseRelation,
96
- targetEntity: Model.Entity,
97
- targetRelation: Model.ManyHasManyOwningRelation,
98
- ): JoinDefinition[] {
71
+ visitManyHasManyInverse({ targetRelation, entity, targetEntity }: Model.ManyHasManyInverseContext): JoinDefinition[] {
99
72
  const sourceAlias = this.path.back().alias
100
73
  const targetAlias = this.path.alias
101
74
  const joiningAlias = this.path.back().for('x_' + this.path.alias).alias
@@ -27,6 +27,9 @@ export class PathFactory {
27
27
  export class Path {
28
28
  public readonly alias = this.createAlias()
29
29
 
30
+ public get fullAlias() {
31
+ return this.rootAlias + this.path.join('_')
32
+ }
30
33
  constructor(
31
34
  public readonly path: string[],
32
35
  private readonly aliasContext: AliasContext,
@@ -44,7 +47,7 @@ export class Path {
44
47
  }
45
48
 
46
49
  private createAlias(): string {
47
- const alias = this.rootAlias + this.path.join('_')
50
+ const alias = this.fullAlias
48
51
 
49
52
  // intentionally not allowing == MAX_IDENTIFIER_LENGTH
50
53
  if (alias.length < MAX_IDENTIFIER_LENGTH) {