@contember/engine-content-api 1.2.0-alpha.12 → 1.2.0-alpha.14

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 (101) hide show
  1. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts +2 -2
  2. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts.map +1 -1
  3. package/dist/src/acl/EvaluatedPredicateReplacer.js.map +1 -1
  4. package/dist/src/acl/PredicateFactory.d.ts +9 -3
  5. package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
  6. package/dist/src/acl/PredicateFactory.js +42 -24
  7. package/dist/src/acl/PredicateFactory.js.map +1 -1
  8. package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
  9. package/dist/src/acl/PredicatesInjector.js +1 -0
  10. package/dist/src/acl/PredicatesInjector.js.map +1 -1
  11. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +31 -27
  12. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
  13. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +18 -14
  14. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
  15. package/dist/src/mapper/JunctionTableManager.js.map +1 -1
  16. package/dist/src/mapper/Mapper.js +3 -3
  17. package/dist/src/mapper/Mapper.js.map +1 -1
  18. package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
  19. package/dist/src/mapper/MapperContainer.js +2 -2
  20. package/dist/src/mapper/MapperContainer.js.map +1 -1
  21. package/dist/src/mapper/delete/DeleteExecutor.js +1 -1
  22. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  23. package/dist/src/mapper/insert/InsertBuilder.d.ts +1 -1
  24. package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
  25. package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
  26. package/dist/src/mapper/select/RelationFetcher.js +1 -1
  27. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  28. package/dist/src/mapper/select/SelectBuilder.d.ts +3 -1
  29. package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
  30. package/dist/src/mapper/select/SelectBuilder.js +50 -12
  31. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  32. package/dist/src/mapper/select/SelectExecutionHandler.d.ts +15 -4
  33. package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
  34. package/dist/src/mapper/select/SelectHydrator.d.ts +3 -2
  35. package/dist/src/mapper/select/SelectHydrator.d.ts.map +1 -1
  36. package/dist/src/mapper/select/SelectHydrator.js +4 -5
  37. package/dist/src/mapper/select/SelectHydrator.js.map +1 -1
  38. package/dist/src/mapper/select/WhereBuilder.d.ts +3 -3
  39. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  40. package/dist/src/mapper/select/WhereBuilder.js +4 -4
  41. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  42. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +1 -0
  43. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  44. package/dist/src/mapper/select/handlers/FieldsVisitor.js +118 -91
  45. package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  46. package/dist/src/mapper/select/handlers/MetaHandler.d.ts.map +1 -1
  47. package/dist/src/mapper/select/handlers/MetaHandler.js +6 -11
  48. package/dist/src/mapper/select/handlers/MetaHandler.js.map +1 -1
  49. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +5 -1
  50. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
  51. package/dist/src/mapper/select/optimizer/WhereOptimizer.js +76 -23
  52. package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
  53. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +1 -4
  54. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
  55. package/dist/src/mapper/select/optimizer/WhereReplacer.js +27 -9
  56. package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -1
  57. package/dist/src/tsconfig.tsbuildinfo +1 -1
  58. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js +51 -4
  59. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js.map +1 -1
  60. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +26 -25
  61. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
  62. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +9 -6
  63. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
  64. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts +2 -0
  65. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts.map +1 -0
  66. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js +109 -0
  67. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js.map +1 -0
  68. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js +9 -13
  69. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js.map +1 -1
  70. package/dist/tests/cases/unit/predicatesInjector.test.js +31 -3
  71. package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
  72. package/dist/tests/cases/unit/whereOptimizer.test.js +24 -21
  73. package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
  74. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  75. package/package.json +10 -10
  76. package/src/acl/EvaluatedPredicateReplacer.ts +4 -4
  77. package/src/acl/PredicateFactory.ts +59 -36
  78. package/src/acl/PredicatesInjector.ts +2 -1
  79. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +5 -5
  80. package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +5 -5
  81. package/src/mapper/JunctionTableManager.ts +3 -3
  82. package/src/mapper/Mapper.ts +3 -3
  83. package/src/mapper/MapperContainer.ts +2 -1
  84. package/src/mapper/delete/DeleteExecutor.ts +1 -1
  85. package/src/mapper/insert/InsertBuilder.ts +2 -2
  86. package/src/mapper/select/RelationFetcher.ts +1 -1
  87. package/src/mapper/select/SelectBuilder.ts +69 -13
  88. package/src/mapper/select/SelectExecutionHandler.ts +15 -8
  89. package/src/mapper/select/SelectHydrator.ts +13 -7
  90. package/src/mapper/select/WhereBuilder.ts +5 -5
  91. package/src/mapper/select/handlers/FieldsVisitor.ts +53 -67
  92. package/src/mapper/select/handlers/MetaHandler.ts +6 -17
  93. package/src/mapper/select/optimizer/WhereOptimizer.ts +96 -40
  94. package/src/mapper/select/optimizer/WhereReplacer.ts +27 -15
  95. package/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.ts +54 -4
  96. package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +26 -25
  97. package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +9 -6
  98. package/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.ts +104 -0
  99. package/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.ts +9 -13
  100. package/tests/cases/unit/predicatesInjector.test.ts +37 -7
  101. package/tests/cases/unit/whereOptimizer.test.ts +20 -17
@@ -63,26 +63,23 @@ test('querying id and title', async () => {
63
63
  }`,
64
64
  executes: [
65
65
  {
66
- sql: SQL`select
67
- "root_"."id" as "root_id",
68
- case when "root_"."locale" in (?) then "root_"."title" else null end as "root_title",
69
- "root_"."locale" in (?) as "root__meta_title_readable",
70
- false as "root__meta_title_updatable"
71
- from "public"."post_locale" as "root_"`,
72
- parameters: ['cs', 'cs'],
66
+ sql: SQL`SELECT
67
+ "root_"."id" AS "root_id",
68
+ "root_"."locale" IN (?) AS "root___predicate_localePredicate",
69
+ "root_"."title" AS "root_title"
70
+ FROM "public"."post_locale" AS "root_"`,
71
+ parameters: ['cs'],
73
72
  response: {
74
73
  rows: [
75
74
  {
76
75
  root_id: testUuid(1),
77
76
  root_title: null,
78
- root__meta_title_readable: false,
79
- root__meta_title_updatable: false,
77
+ root___predicate_localePredicate: false,
80
78
  },
81
79
  {
82
80
  root_id: testUuid(2),
83
81
  root_title: 'bar',
84
- root__meta_title_readable: true,
85
- root__meta_title_updatable: false,
82
+ root___predicate_localePredicate: true,
86
83
  },
87
84
  ],
88
85
  },
@@ -134,8 +131,9 @@ test('querying with extra where', async () => {
134
131
  executes: [
135
132
  {
136
133
  sql: SQL`select
137
- "root_"."id" as "root_id",
138
- case when "root_"."locale" in (?) then "root_"."title" else null end as "root_title"
134
+ "root_"."id" as "root_id",
135
+ "root_"."locale" in (?) as "root___predicate_localePredicate",
136
+ "root_"."title" as "root_title"
139
137
  from "public"."post_locale" as "root_"
140
138
  where "root_"."title" = ? and "root_"."locale" in (?)`,
141
139
  parameters: ['cs', 'foo', 'cs'],
@@ -144,7 +142,7 @@ test('querying with extra where', async () => {
144
142
  {
145
143
  root_id: testUuid(1),
146
144
  root_title: 'foo',
147
- root_title__readable: true,
145
+ root___predicate_localePredicate: true,
148
146
  },
149
147
  ],
150
148
  },
@@ -217,10 +215,11 @@ test('not defined acl variable', async () => {
217
215
  }`,
218
216
  executes: [
219
217
  {
220
- sql: SQL`select
221
- "root_"."id" as "root_id",
222
- case when false then "root_"."title" else null end as "root_title"
223
- from "public"."post_locale" as "root_"`,
218
+ sql: SQL`
219
+ select "root_"."id" as "root_id",
220
+ false as "root___predicate_localePredicate",
221
+ "root_"."title" as "root_title"
222
+ from "public"."post_locale" as "root_"`,
224
223
  parameters: [],
225
224
  response: {
226
225
  rows: [],
@@ -270,23 +269,25 @@ test('querying on nested field', async () => {
270
269
  },
271
270
  },
272
271
  {
273
- sql: SQL`select
274
- "root_"."post_id" as "__grouping_key",
275
- "root_"."id" as "root_id",
276
- case when "root_"."locale" in (?) then "root_"."title" else null end as "root_title"
277
- from "public"."post_locale" as "root_"
278
- where "root_"."post_id" in (?, ?)`,
272
+ sql: SQL`
273
+ select "root_"."post_id" as "__grouping_key",
274
+ "root_"."id" as "root_id",
275
+ "root_"."locale" in (?) as "root___predicate_localePredicate",
276
+ "root_"."title" as "root_title"
277
+ from "public"."post_locale" as "root_" where "root_"."post_id" in (?, ?)`,
279
278
  parameters: ['cs', testUuid(1), testUuid(2)],
280
279
  response: {
281
280
  rows: [
282
281
  {
283
282
  __grouping_key: testUuid(1),
284
283
  root_id: testUuid(3),
285
- root_title: null,
284
+ root___predicate_localePredicate: false,
285
+ root_title: 'foo',
286
286
  },
287
287
  {
288
288
  __grouping_key: testUuid(2),
289
289
  root_id: testUuid(4),
290
+ root___predicate_localePredicate: true,
290
291
  root_title: 'bar',
291
292
  },
292
293
  ],
@@ -90,17 +90,20 @@ test('querying post + author name', async () => {
90
90
  },
91
91
  },
92
92
  {
93
- sql: SQL`select
94
- "root_"."id" as "root_id",
95
- case when "root_country"."name" in (?) then "root_"."name" else null end as "root_name",
96
- "root_"."id" as "root_id"
97
- from "public"."author" as "root_" left join "public"."country" as "root_country" on "root_"."country_id" = "root_country"."id"
98
- where "root_"."id" in (?, ?)`,
93
+ sql: SQL`SELECT
94
+ "root_"."id" AS "root_id",
95
+ "root_country"."name" IN (?) AS "root___predicate_countryPredicate",
96
+ "root_"."name" AS "root_name",
97
+ "root_"."id" AS "root_id"
98
+ FROM "public"."author" AS "root_"
99
+ LEFT JOIN "public"."country" AS "root_country" ON "root_"."country_id" = "root_country"."id"
100
+ WHERE "root_"."id" IN (?, ?)`,
99
101
  parameters: ['Czechia', testUuid(3), testUuid(4)],
100
102
  response: {
101
103
  rows: [
102
104
  {
103
105
  root_id: testUuid(3),
106
+ root___predicate_countryPredicate: true,
104
107
  root_name: 'John',
105
108
  },
106
109
  ],
@@ -0,0 +1,104 @@
1
+ import { SchemaDefinition as def, AclDefinition as acl, createSchema } from '@contember/schema-definition'
2
+ import { Acl } from '@contember/schema'
3
+ import { test } from 'vitest'
4
+ import { execute } from '../../../../../src/test'
5
+ import { GQL, SQL } from '../../../../../src/tags'
6
+ import { testUuid } from '../../../../../src/testUuid'
7
+ import { PermissionFactory } from '../../../../../../src'
8
+
9
+
10
+ namespace RowPredicateSubset {
11
+ export const readerRole = acl.createRole('reader')
12
+ @acl.allow(readerRole, {
13
+ when: {
14
+ isPublished: { eq: true },
15
+ },
16
+ read: ['isPublished', 'isUnlocked', 'title'],
17
+ })
18
+ @acl.allow(readerRole, {
19
+ when: {
20
+ and: [
21
+ { isUnlocked: { eq: true } },
22
+ { isPublished: { eq: true } },
23
+ ],
24
+ },
25
+ read: ['content'],
26
+ })
27
+ export class Article {
28
+ isPublished = def.boolColumn()
29
+ isUnlocked = def.boolColumn()
30
+ title = def.stringColumn()
31
+ content = def.stringColumn()
32
+ }
33
+ }
34
+
35
+
36
+
37
+ test('row level predicate includes main predicate', async () => {
38
+ const schema = createSchema(RowPredicateSubset)
39
+
40
+ const permissions = new PermissionFactory(schema.model).create(schema.acl, ['reader'])
41
+
42
+ await execute({
43
+ schema: schema.model,
44
+ permissions: permissions,
45
+ variables: {},
46
+ query: GQL`
47
+ query {
48
+ listArticle {
49
+ id
50
+ title
51
+ content
52
+ }
53
+ }`,
54
+ executes: [
55
+ {
56
+ sql: SQL`SELECT
57
+ "root_"."id" AS "root_id",
58
+ TRUE AS "root___predicate_isPublished_eq_true",
59
+ "root_"."title" AS "root_title",
60
+ "root_"."is_unlocked" = ? AS "root___predicate_and_isUnlocked_eq_true_isPubl",
61
+ "root_"."content" AS "root_content"
62
+ FROM "public"."article" AS "root_"
63
+ WHERE "root_"."is_published" = ?`,
64
+ parameters: [true, true],
65
+ response: {
66
+ rows: [
67
+ {
68
+ root_id: testUuid(1),
69
+ root___predicate_isPublished_eq_true: true,
70
+ root_title: 'Hello',
71
+ root___predicate_and_isUnlocked_eq_true_isPubl: false,
72
+ root_content: 'Foo bar',
73
+ },
74
+ {
75
+ root_id: testUuid(2),
76
+ root___predicate_isPublished_eq_true: true,
77
+ root_title: 'Hello 2',
78
+ root___predicate_and_isUnlocked_eq_true_isPubl: true,
79
+ root_content: 'Lorem ipsum',
80
+ },
81
+ ],
82
+ },
83
+ },
84
+ ],
85
+ return: {
86
+ data: {
87
+ listArticle: [
88
+ {
89
+ id: testUuid(1),
90
+ title: 'Hello',
91
+ content: null,
92
+ },
93
+ {
94
+ id: testUuid(2),
95
+ title: 'Hello 2',
96
+ content: 'Lorem ipsum',
97
+ },
98
+ ],
99
+ },
100
+ },
101
+ })
102
+ })
103
+
104
+
@@ -77,15 +77,13 @@ test('aliases', async () => {
77
77
  }`,
78
78
  executes: [
79
79
  {
80
- sql: SQL`select
81
- "root_"."id" as "root_idx",
82
- "root_"."name" as "root_name1",
83
- "root_"."name" as "root_name2",
84
- true as "root_meta_name1_readable1",
85
- true as "root_meta_name1_readable2",
86
- "root_"."name" = ? as "root_meta_name1_updatable1",
87
- "root_"."id" as "root_id"
88
- from "public"."author" as "root_"`,
80
+ sql: SQL`SELECT
81
+ "root_"."id" AS "root_idx",
82
+ "root_"."name" AS "root_name1",
83
+ "root_"."name" AS "root_name2",
84
+ "root_"."name" = ? AS "root___predicate_name_eq",
85
+ "root_"."id" AS "root_id"
86
+ FROM "public"."author" AS "root_"`,
89
87
  parameters: ['John'],
90
88
  response: {
91
89
  rows: [
@@ -94,9 +92,7 @@ test('aliases', async () => {
94
92
  root_idx: testUuid(1),
95
93
  root_name1: 'John',
96
94
  root_name2: 'John',
97
- root_meta_name1_readable1: true,
98
- root_meta_name1_readable2: true,
99
- root_meta_name1_updatable1: false,
95
+ root___predicate_name_eq: true,
100
96
  },
101
97
  ],
102
98
  },
@@ -111,7 +107,7 @@ test('aliases', async () => {
111
107
  name1: {
112
108
  readable1: true,
113
109
  readable2: true,
114
- updatable1: false,
110
+ updatable1: true,
115
111
  },
116
112
  },
117
113
  name1: 'John',
@@ -5,6 +5,8 @@ import { describe, it, assert } from 'vitest'
5
5
  import { PermissionsFactory } from '@contember/engine-system-api/dist/src/model'
6
6
  import { WhereOptimizer } from '../../../src/mapper/select/optimizer/WhereOptimizer'
7
7
  import { ConditionOptimizer } from '../../../src/mapper/select/optimizer/ConditionOptimizer'
8
+ import { acceptFieldVisitor } from '@contember/schema-utils'
9
+ import { testUuid } from '@contember/engine-api-tester'
8
10
 
9
11
 
10
12
 
@@ -157,14 +159,14 @@ namespace DeepFilterModel {
157
159
 
158
160
 
159
161
  describe('predicates injector elimination', () => {
160
- it('eliminates predicates in where', () => {
161
- const schema = createSchema(DeepFilterModel)
162
- const permissions = new PermissionFactory(schema.model).create(schema.acl, ['reader'])
162
+ const schema = createSchema(DeepFilterModel)
163
+ const permissions = new PermissionFactory(schema.model).create(schema.acl, ['reader'])
163
164
 
164
- const injector = new PredicatesInjector(
165
- schema.model,
166
- new PredicateFactory(permissions, schema.model, new VariableInjector(schema.model, {})),
167
- )
165
+ const injector = new PredicatesInjector(
166
+ schema.model,
167
+ new PredicateFactory(permissions, schema.model, new VariableInjector(schema.model, {})),
168
+ )
169
+ it('eliminates predicates in where', () => {
168
170
  const injected = injector.inject(schema.model.entities.Article, {
169
171
  coverPhoto: { image: { tags: { label: { eq: 'foo' } } } },
170
172
  })
@@ -173,4 +175,32 @@ describe('predicates injector elimination', () => {
173
175
 
174
176
  assert.deepStrictEqual(result, { and: [{ coverPhoto: { image: { tags: { label: { eq: 'foo' } } } } }, { isPublished: { eq: true } }] })
175
177
  })
178
+
179
+ it('eliminate back referencing predicate', () => {
180
+ const relation = acceptFieldVisitor(schema.model, schema.model.entities.Article, 'coverPhoto', {
181
+ visitColumn: () => {
182
+ throw new Error()
183
+ },
184
+ visitRelation: ctx => ctx,
185
+ })
186
+ const injected = injector.inject(schema.model.entities.ImageUse, {
187
+ articles: { id: { in: [testUuid(1)] } },
188
+ }, relation)
189
+
190
+ assert.deepStrictEqual(injected, {
191
+ and: [
192
+ {
193
+ articles: {
194
+ and: [
195
+ { id: { in: [testUuid(1)] } },
196
+ { id: { always: true } },
197
+ ],
198
+ },
199
+ },
200
+ {
201
+ articles: { id: { always: true } },
202
+ },
203
+ ],
204
+ })
205
+ })
176
206
  })
@@ -200,14 +200,15 @@ describe('where optimized', () => {
200
200
  describe('remove id predicates', () => {
201
201
 
202
202
  it('remove ID predicate when traversing from a relation - always', () => {
203
- assert.deepStrictEqual(whereOptimizer.optimize({
204
- image: { id: { isNull: false } },
205
- }, model.entities.Author, [acceptFieldVisitor(model, 'Image', 'authors', {
203
+ const relationPath = [acceptFieldVisitor(model, 'Image', 'authors', {
206
204
  visitColumn: () => {
207
205
  throw new Error()
208
206
  },
209
207
  visitRelation: context => context,
210
- })]), {
208
+ })]
209
+ assert.deepStrictEqual(whereOptimizer.optimize({
210
+ image: { id: { isNull: false } },
211
+ }, model.entities.Author, { relationPath }), {
211
212
  id: { always: true },
212
213
  })
213
214
  })
@@ -216,12 +217,12 @@ describe('where optimized', () => {
216
217
  it('remove ID predicate when traversing from a relation - never', () => {
217
218
  assert.deepStrictEqual(whereOptimizer.optimize({
218
219
  image: { id: { isNull: true } },
219
- }, model.entities.Author, [acceptFieldVisitor(model, 'Image', 'authors', {
220
+ }, model.entities.Author, { relationPath: [acceptFieldVisitor(model, 'Image', 'authors', {
220
221
  visitColumn: () => {
221
222
  throw new Error()
222
223
  },
223
224
  visitRelation: context => context,
224
- })]), {
225
+ })] }), {
225
226
  id: { never: true },
226
227
  })
227
228
  })
@@ -229,28 +230,27 @@ describe('where optimized', () => {
229
230
  it('remove ID predicate when traversing in where', () => {
230
231
  assert.deepStrictEqual(whereOptimizer.optimize({
231
232
  authors: { image: { id: { isNull: false } } },
232
- }, model.entities.Image, []), {
233
+ }, model.entities.Image), {
233
234
  id: { always: true },
234
235
  })
235
236
  })
236
237
 
237
238
  it('do not remove ID predicate when traversing from a has-many relation', () => {
238
- assert.deepStrictEqual(whereOptimizer.optimize({
239
- authors: { id: { isNull: false } },
240
- }, model.entities.Image, [acceptFieldVisitor(model, 'Author', 'image', {
239
+ const relationPath = [acceptFieldVisitor(model, 'Author', 'image', {
241
240
  visitColumn: () => {
242
241
  throw new Error()
243
242
  },
244
243
  visitRelation: context => context,
245
- })]), {
244
+ })]
245
+ assert.deepStrictEqual(whereOptimizer.optimize({
246
+ authors: { id: { isNull: false } },
247
+ }, model.entities.Image, { relationPath }), {
246
248
  authors: { id: { isNull: false } },
247
249
  })
248
250
  })
249
251
 
250
252
  it('do not remove ID predicate when traversing from a nested has-many relation', () => {
251
- assert.deepStrictEqual(whereOptimizer.optimize({
252
- articles: { author: { id: { isNull: false } } },
253
- }, model.entities.Image, [
253
+ const relationPath = [
254
254
  acceptFieldVisitor(model, 'Author', 'articles', {
255
255
  visitColumn: () => {
256
256
  throw new Error()
@@ -263,7 +263,10 @@ describe('where optimized', () => {
263
263
  },
264
264
  visitRelation: context => context,
265
265
  }),
266
- ]), {
266
+ ]
267
+ assert.deepStrictEqual(whereOptimizer.optimize({
268
+ articles: { author: { id: { isNull: false } } },
269
+ }, model.entities.Image, { relationPath }), {
267
270
  articles: { author: { id: { isNull: false } } },
268
271
  })
269
272
  })
@@ -271,7 +274,7 @@ describe('where optimized', () => {
271
274
  it('do not remove ID predicate when traversing in where over has-many relation', () => {
272
275
  assert.deepStrictEqual(whereOptimizer.optimize({
273
276
  image: { authors: { id: { isNull: false } } },
274
- }, model.entities.Author, []), {
277
+ }, model.entities.Author), {
275
278
  image: { authors: { id: { isNull: false } } },
276
279
  })
277
280
  })
@@ -280,7 +283,7 @@ describe('where optimized', () => {
280
283
  it('do not remove ID predicate when traversing in where over has-many relation - nested', () => {
281
284
  assert.deepStrictEqual(whereOptimizer.optimize({
282
285
  image: { authors: { image: { id: { isNull: false } } } },
283
- }, model.entities.Author, []), {
286
+ }, model.entities.Author), {
284
287
  image: { authors: { image: { id: { isNull: false } } } },
285
288
  })
286
289
  })