@balena/abstract-sql-compiler 11.0.0-build-11-x-b2280608fff69d9959999c79db6245c4ad561bbc-1 → 11.0.0-build-11-x-7511b8ebe5a9461f20add0ed97d0670ed3b5a479-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 (53) hide show
  1. package/package.json +5 -2
  2. package/.github/workflows/flowzone.yml +0 -21
  3. package/.husky/pre-commit +0 -2
  4. package/.versionbot/CHANGELOG.yml +0 -10729
  5. package/CHANGELOG.md +0 -3515
  6. package/repo.yml +0 -12
  7. package/src/abstract-sql-compiler.ts +0 -1138
  8. package/src/abstract-sql-optimizer.ts +0 -1632
  9. package/src/abstract-sql-rules-to-sql.ts +0 -1730
  10. package/src/abstract-sql-schema-optimizer.ts +0 -172
  11. package/src/referenced-fields.ts +0 -600
  12. package/test/abstract-sql/aggregate-json.ts +0 -49
  13. package/test/abstract-sql/aggregate.ts +0 -161
  14. package/test/abstract-sql/and-or-boolean-optimisations.ts +0 -115
  15. package/test/abstract-sql/case-when-else.ts +0 -48
  16. package/test/abstract-sql/cast.ts +0 -25
  17. package/test/abstract-sql/coalesce.ts +0 -24
  18. package/test/abstract-sql/comparisons.ts +0 -360
  19. package/test/abstract-sql/dates.ts +0 -512
  20. package/test/abstract-sql/duration.ts +0 -56
  21. package/test/abstract-sql/empty-query-optimisations.ts +0 -54
  22. package/test/abstract-sql/functions-wrapper.ts +0 -70
  23. package/test/abstract-sql/get-referenced-fields.ts +0 -674
  24. package/test/abstract-sql/get-rule-referenced-fields.ts +0 -345
  25. package/test/abstract-sql/insert-query.ts +0 -22
  26. package/test/abstract-sql/is-distinct.ts +0 -102
  27. package/test/abstract-sql/joins.ts +0 -84
  28. package/test/abstract-sql/json.ts +0 -58
  29. package/test/abstract-sql/math.ts +0 -467
  30. package/test/abstract-sql/nested-in-optimisations.ts +0 -200
  31. package/test/abstract-sql/not-not-optimisations.ts +0 -15
  32. package/test/abstract-sql/schema-checks.ts +0 -168
  33. package/test/abstract-sql/schema-informative-reference.ts +0 -420
  34. package/test/abstract-sql/schema-rule-optimization.ts +0 -120
  35. package/test/abstract-sql/schema-rule-to-check.ts +0 -393
  36. package/test/abstract-sql/schema-views.ts +0 -73
  37. package/test/abstract-sql/test.ts +0 -192
  38. package/test/abstract-sql/text.ts +0 -168
  39. package/test/model.sbvr +0 -60
  40. package/test/odata/expand.ts +0 -674
  41. package/test/odata/fields.ts +0 -59
  42. package/test/odata/filterby.ts +0 -1517
  43. package/test/odata/orderby.ts +0 -96
  44. package/test/odata/paging.ts +0 -48
  45. package/test/odata/resource-parsing.ts +0 -568
  46. package/test/odata/select.ts +0 -119
  47. package/test/odata/stress.ts +0 -93
  48. package/test/odata/test.ts +0 -297
  49. package/test/sbvr/pilots.ts +0 -1097
  50. package/test/sbvr/reference-type.ts +0 -211
  51. package/test/sbvr/test.ts +0 -101
  52. package/tsconfig.build.json +0 -6
  53. package/tsconfig.json +0 -25
@@ -1,1097 +0,0 @@
1
- import fs from 'node:fs';
2
- const typeVocab = fs.readFileSync(
3
- new URL(import.meta.resolve('@balena/sbvr-types/Type.sbvr')),
4
- 'utf8',
5
- );
6
- import { getTestHelpers } from './test.js';
7
- const test = getTestHelpers(typeVocab);
8
-
9
- const modifiedAtTrigger = (tableName: string) => `\
10
- DO
11
- $$
12
- BEGIN
13
- IF NOT EXISTS(
14
- SELECT 1
15
- FROM "information_schema"."triggers"
16
- WHERE "event_object_table" = '${tableName}'
17
- AND "trigger_name" = '${tableName}_trigger_update_modified_at'
18
- ) THEN
19
- CREATE TRIGGER "${tableName}_trigger_update_modified_at"
20
- BEFORE UPDATE ON "${tableName}"
21
- FOR EACH ROW
22
- EXECUTE PROCEDURE "trigger_update_modified_at"();
23
- END IF;
24
- END;
25
- $$;`;
26
-
27
- describe('pilots', function () {
28
- test(
29
- `\
30
- Term: name
31
- Concept Type: Short Text (Type)
32
- Term: years of experience
33
- Concept Type: Integer (Type)
34
- Term: person
35
- Term: pilot
36
- Concept Type: person
37
- Reference Scheme: name
38
- Term: plane
39
- Reference Scheme: name
40
- Fact Type: pilot has name
41
- Necessity: each pilot has exactly one name
42
- Fact Type: pilot has years of experience
43
- Necessity: each pilot has exactly one years of experience
44
- Fact Type: plane has name
45
- Necessity: each plane has exactly one name
46
- Definition: "planeA" or "planeB" or "planeC"
47
- Fact Type: pilot can fly plane
48
- Synonymous Form: plane can be flown by pilot
49
- Fact Type: pilot is experienced
50
- Term: veteran pilot
51
- Definition: pilot that can fly at least 2 planes
52
-
53
- -- Test circular dependency
54
- Term: licence
55
- Fact type: pilot has licence
56
- Necessity: each pilot has exactly one licence
57
- Fact type: licence was granted by pilot
58
- Necessity: each licence was granted by exactly one pilot`,
59
- [
60
- `\
61
- DO $$
62
- BEGIN
63
- CREATE FUNCTION "trigger_update_modified_at"()
64
- RETURNS TRIGGER AS $fn$
65
- BEGIN
66
- NEW."modified at" = NOW();
67
- RETURN NEW;
68
- END;
69
- $fn$ LANGUAGE plpgsql;
70
- EXCEPTION WHEN duplicate_function THEN
71
- NULL;
72
- END;
73
- $$;`,
74
- `\
75
- CREATE TABLE IF NOT EXISTS "person" (
76
- "created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
77
- , "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
78
- , "id" SERIAL NOT NULL PRIMARY KEY
79
- );`,
80
- modifiedAtTrigger('person'),
81
- `\
82
- CREATE TABLE IF NOT EXISTS "plane" (
83
- "created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
84
- , "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
85
- , "id" SERIAL NOT NULL PRIMARY KEY
86
- , "name" VARCHAR(255) NOT NULL CHECK ("name" IN ('planeA', 'planeB', 'planeC'))
87
- );`,
88
- modifiedAtTrigger('plane'),
89
- `\
90
- CREATE TABLE IF NOT EXISTS "veteran pilot" (
91
- "created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
92
- , "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
93
- , "id" SERIAL NOT NULL PRIMARY KEY
94
- );`,
95
- modifiedAtTrigger('veteran pilot'),
96
- `\
97
- CREATE TABLE IF NOT EXISTS "licence" (
98
- "created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
99
- , "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
100
- , "id" SERIAL NOT NULL PRIMARY KEY
101
- , "was granted by-pilot" INTEGER NOT NULL
102
- );`,
103
- modifiedAtTrigger('licence'),
104
- `\
105
- CREATE TABLE IF NOT EXISTS "pilot" (
106
- "created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
107
- , "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
108
- , "id" SERIAL NOT NULL PRIMARY KEY
109
- , "person" INTEGER NOT NULL
110
- , "name" VARCHAR(255) NOT NULL
111
- , "years of experience" INTEGER NOT NULL
112
- , "is experienced" BOOLEAN DEFAULT FALSE NOT NULL
113
- , "licence" INTEGER NOT NULL
114
- , FOREIGN KEY ("person") REFERENCES "person" ("id")
115
- , FOREIGN KEY ("licence") REFERENCES "licence" ("id")
116
- );`,
117
- modifiedAtTrigger('pilot'),
118
- `\
119
- CREATE TABLE IF NOT EXISTS "pilot-can fly-plane" (
120
- "created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
121
- , "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
122
- , "pilot" INTEGER NOT NULL
123
- , "can fly-plane" INTEGER NOT NULL
124
- , "id" SERIAL NOT NULL PRIMARY KEY
125
- , FOREIGN KEY ("pilot") REFERENCES "pilot" ("id")
126
- , FOREIGN KEY ("can fly-plane") REFERENCES "plane" ("id")
127
- , UNIQUE("pilot", "can fly-plane")
128
- );`,
129
- modifiedAtTrigger('pilot-can fly-plane'),
130
- `\
131
- DO $$
132
- BEGIN
133
- IF NOT EXISTS (
134
- SELECT 1
135
- FROM information_schema.table_constraints tc
136
- JOIN information_schema.key_column_usage kcu USING (constraint_catalog, constraint_schema, constraint_name)
137
- JOIN information_schema.constraint_column_usage ccu USING (constraint_catalog, constraint_schema, constraint_name)
138
- WHERE constraint_type = 'FOREIGN KEY'
139
- AND tc.table_schema = CURRENT_SCHEMA()
140
- AND tc.table_name = 'licence'
141
- AND kcu.column_name = 'was granted by-pilot'
142
- AND ccu.table_schema = CURRENT_SCHEMA()
143
- AND ccu.table_name = 'pilot'
144
- AND ccu.column_name = 'id'
145
- ) THEN
146
- ALTER TABLE "licence"
147
- ADD CONSTRAINT "licence_was granted by-pilot_fkey"
148
- FOREIGN KEY ("was granted by-pilot") REFERENCES "pilot" ("id");
149
- END IF;
150
- END;
151
- $$;`,
152
- ],
153
- );
154
-
155
- test.rule(
156
- 'It is necessary that each pilot can fly at least 1 plane',
157
- `\
158
- SELECT (
159
- SELECT COUNT(*)
160
- FROM "pilot" AS "pilot.0"
161
- WHERE NOT EXISTS (
162
- SELECT 1
163
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
164
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
165
- )
166
- AND ($1 = '{}'
167
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
168
- ) = 0 AS "result";`,
169
- );
170
-
171
- test.rule(
172
- 'It is necessary that each pilot that is experienced, can fly at least 2 planes',
173
- `\
174
- SELECT (
175
- SELECT COUNT(*)
176
- FROM "pilot" AS "pilot.0"
177
- WHERE "pilot.0"."is experienced" = TRUE
178
- AND NOT (
179
- (
180
- SELECT COUNT(*)
181
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
182
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
183
- ) >= 2
184
- )
185
- AND ($1 = '{}'
186
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
187
- ) = 0 AS "result";`,
188
- );
189
-
190
- test.rule(
191
- 'It is necessary that each pilot that is not experienced, can fly at most 2 planes',
192
- `\
193
- SELECT (
194
- SELECT COUNT(*)
195
- FROM "pilot" AS "pilot.0"
196
- WHERE "pilot.0"."is experienced" = FALSE
197
- AND (
198
- SELECT COUNT(*)
199
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
200
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
201
- ) >= 3
202
- AND ($1 = '{}'
203
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
204
- ) = 0 AS "result";`,
205
- );
206
-
207
- test.rule(
208
- 'It is necessary that each pilot that can fly at most 2 planes, is not experienced',
209
- `\
210
- SELECT (
211
- SELECT COUNT(*)
212
- FROM "pilot" AS "pilot.0"
213
- WHERE NOT (
214
- (
215
- SELECT COUNT(*)
216
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
217
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
218
- ) >= 3
219
- )
220
- AND "pilot.0"."is experienced" != FALSE
221
- AND ($1 = '{}'
222
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
223
- ) = 0 AS "result";`,
224
- );
225
-
226
- test.rule(
227
- 'It is necessary that each plane that at least 3 pilots can fly, has a name',
228
- `\
229
- SELECT (
230
- SELECT COUNT(*)
231
- FROM "plane" AS "plane.0"
232
- WHERE (
233
- SELECT COUNT(*)
234
- FROM "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
235
- WHERE "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
236
- ) >= 3
237
- AND "plane.0"."name" IS NULL
238
- AND ($1 = '{}'
239
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
240
- ) = 0 AS "result";`,
241
- );
242
-
243
- test.rule(
244
- 'It is necessary that each plane that at least 3 pilots that are experienced can fly, has a name',
245
- `\
246
- SELECT (
247
- SELECT COUNT(*)
248
- FROM "plane" AS "plane.0"
249
- WHERE (
250
- SELECT COUNT(*)
251
- FROM "pilot" AS "pilot.1",
252
- "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
253
- WHERE "pilot.1"."is experienced" = TRUE
254
- AND "pilot.1-can fly-plane.0"."pilot" = "pilot.1"."id"
255
- AND "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
256
- ) >= 3
257
- AND "plane.0"."name" IS NULL
258
- AND ($1 = '{}'
259
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
260
- ) = 0 AS "result";`,
261
- );
262
-
263
- (function () {
264
- const sql = `\
265
- SELECT (
266
- SELECT COUNT(*)
267
- FROM "plane" AS "plane.0"
268
- WHERE (
269
- SELECT COUNT(*)
270
- FROM "pilot" AS "pilot.1",
271
- "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
272
- WHERE "pilot.1"."is experienced" = FALSE
273
- AND "pilot.1-can fly-plane.0"."pilot" = "pilot.1"."id"
274
- AND "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
275
- ) >= 3
276
- AND "plane.0"."name" IS NULL
277
- AND ($1 = '{}'
278
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
279
- ) = 0 AS "result";`;
280
- test.rule(
281
- 'It is necessary that each plane that at least 3 pilots that are not experienced can fly, has a name',
282
- sql,
283
- );
284
- test.rule(
285
- "It is necessary that each plane that at least 3 pilots that aren't experienced can fly, has a name",
286
- sql,
287
- );
288
- })();
289
-
290
- test.rule(
291
- 'It is necessary that each plane that at least 3 pilot that is experienced, can fly, has a name.',
292
- `\
293
- SELECT (
294
- SELECT COUNT(*)
295
- FROM "plane" AS "plane.0"
296
- WHERE (
297
- SELECT COUNT(*)
298
- FROM "pilot" AS "pilot.1",
299
- "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
300
- WHERE "pilot.1"."is experienced" = TRUE
301
- AND "pilot.1-can fly-plane.0"."pilot" = "pilot.1"."id"
302
- AND "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
303
- ) >= 3
304
- AND "plane.0"."name" IS NULL
305
- AND ($1 = '{}'
306
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
307
- ) = 0 AS "result";`,
308
- );
309
-
310
- test.rule(
311
- 'It is necessary that each plane that at least 3 pilots that a name is of can fly, has a name',
312
- `\
313
- SELECT (
314
- SELECT COUNT(*)
315
- FROM "plane" AS "plane.0"
316
- WHERE (
317
- SELECT COUNT(*)
318
- FROM "pilot" AS "pilot.1",
319
- "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
320
- WHERE "pilot.1"."name" IS NOT NULL
321
- AND "pilot.1-can fly-plane.0"."pilot" = "pilot.1"."id"
322
- AND "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
323
- ) >= 3
324
- AND "plane.0"."name" IS NULL
325
- AND ($1 = '{}'
326
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
327
- ) = 0 AS "result";`,
328
- );
329
-
330
- test.rule(
331
- 'It is necessary that each pilot has a years of experience that is greater than 0',
332
- `\
333
- SELECT (
334
- SELECT COUNT(*)
335
- FROM "pilot" AS "pilot.0"
336
- WHERE NOT (
337
- 0 < "pilot.0"."years of experience"
338
- AND "pilot.0"."years of experience" IS NOT NULL
339
- )
340
- AND ($1 = '{}'
341
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
342
- ) = 0 AS "result";`,
343
- );
344
-
345
- test.rule(
346
- 'It is necessary that each plane can be flown by at least 1 pilot',
347
- `\
348
- SELECT (
349
- SELECT COUNT(*)
350
- FROM "plane" AS "plane.0"
351
- WHERE NOT EXISTS (
352
- SELECT 1
353
- FROM "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
354
- WHERE "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
355
- )
356
- AND ($1 = '{}'
357
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
358
- ) = 0 AS "result";`,
359
- );
360
-
361
- // OR
362
- test.rule(
363
- 'It is necessary that each pilot that is experienced, can fly at least 2 planes or has a years of experience that is greater than 5',
364
- `\
365
- SELECT (
366
- SELECT COUNT(*)
367
- FROM "pilot" AS "pilot.0"
368
- WHERE "pilot.0"."is experienced" = TRUE
369
- AND NOT (
370
- ((
371
- SELECT COUNT(*)
372
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
373
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
374
- ) >= 2
375
- OR 5 < "pilot.0"."years of experience"
376
- AND "pilot.0"."years of experience" IS NOT NULL)
377
- )
378
- AND ($1 = '{}'
379
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
380
- ) = 0 AS "result";`,
381
- );
382
-
383
- test.rule(
384
- 'It is necessary that each pilot that is experienced or can fly at least 2 planes, has a years of experience that is greater than 5',
385
- `\
386
- SELECT (
387
- SELECT COUNT(*)
388
- FROM "pilot" AS "pilot.0"
389
- WHERE ("pilot.0"."is experienced" = TRUE
390
- OR (
391
- SELECT COUNT(*)
392
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
393
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
394
- ) >= 2)
395
- AND NOT (
396
- 5 < "pilot.0"."years of experience"
397
- AND "pilot.0"."years of experience" IS NOT NULL
398
- )
399
- AND ($1 = '{}'
400
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
401
- ) = 0 AS "result";`,
402
- );
403
-
404
- test.rule(
405
- 'It is necessary that each pilot that is experienced or can fly at least 3 planes or can fly exactly one plane, has a years of experience that is greater than 5',
406
- `\
407
- SELECT (
408
- SELECT COUNT(*)
409
- FROM "pilot" AS "pilot.0"
410
- WHERE ("pilot.0"."is experienced" = TRUE
411
- OR (
412
- SELECT COUNT(*)
413
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
414
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
415
- ) >= 3
416
- OR (
417
- SELECT COUNT(*)
418
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
419
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
420
- ) = 1)
421
- AND NOT (
422
- 5 < "pilot.0"."years of experience"
423
- AND "pilot.0"."years of experience" IS NOT NULL
424
- )
425
- AND ($1 = '{}'
426
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
427
- ) = 0 AS "result";`,
428
- );
429
-
430
- test.rule(
431
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes or exactly one plane',
432
- `\
433
- SELECT (
434
- SELECT COUNT(*)
435
- FROM "pilot" AS "pilot.0"
436
- WHERE "pilot.0"."is experienced" = TRUE
437
- AND NOT (
438
- ((
439
- SELECT COUNT(*)
440
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
441
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
442
- ) >= 3
443
- OR (
444
- SELECT COUNT(*)
445
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
446
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
447
- ) = 1)
448
- )
449
- AND ($1 = '{}'
450
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
451
- ) = 0 AS "result";`,
452
- );
453
-
454
- test.rule(
455
- 'It is necessary that each pilot that can fly at least 3 planes or exactly one plane, is experienced',
456
- `\
457
- SELECT (
458
- SELECT COUNT(*)
459
- FROM "pilot" AS "pilot.0"
460
- WHERE ((
461
- SELECT COUNT(*)
462
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
463
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
464
- ) >= 3
465
- OR (
466
- SELECT COUNT(*)
467
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
468
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
469
- ) = 1)
470
- AND "pilot.0"."is experienced" != TRUE
471
- AND ($1 = '{}'
472
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
473
- ) = 0 AS "result";`,
474
- );
475
-
476
- test.rule(
477
- 'It is necessary that each pilot can fly at least one plane or a pilot can fly at least 10 planes',
478
- `\
479
- SELECT ((
480
- SELECT COUNT(*)
481
- FROM "pilot" AS "pilot.0"
482
- WHERE NOT EXISTS (
483
- SELECT 1
484
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
485
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
486
- )
487
- ) = 0
488
- OR EXISTS (
489
- SELECT 1
490
- FROM "pilot" AS "pilot.2"
491
- WHERE (
492
- SELECT COUNT(*)
493
- FROM "pilot-can fly-plane" AS "pilot.2-can fly-plane.3"
494
- WHERE "pilot.2-can fly-plane.3"."pilot" = "pilot.2"."id"
495
- ) >= 10
496
- )) AS "result";`,
497
- );
498
-
499
- test.rule(
500
- 'It is necessary that each plane that at least 3 pilots can fly or exactly one pilot can fly, has a name',
501
- `\
502
- SELECT (
503
- SELECT COUNT(*)
504
- FROM "plane" AS "plane.0"
505
- WHERE ((
506
- SELECT COUNT(*)
507
- FROM "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
508
- WHERE "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
509
- ) >= 3
510
- OR (
511
- SELECT COUNT(*)
512
- FROM "pilot-can fly-plane" AS "pilot.2-can fly-plane.0"
513
- WHERE "pilot.2-can fly-plane.0"."can fly-plane" = "plane.0"."id"
514
- ) = 1)
515
- AND "plane.0"."name" IS NULL
516
- AND ($1 = '{}'
517
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
518
- ) = 0 AS "result";`,
519
- );
520
-
521
- // AND
522
- test.rule(
523
- 'It is necessary that each pilot that is experienced, can fly at least 2 planes and has a years of experience that is greater than 5',
524
- `\
525
- SELECT (
526
- SELECT COUNT(*)
527
- FROM "pilot" AS "pilot.0"
528
- WHERE "pilot.0"."is experienced" = TRUE
529
- AND NOT (
530
- (
531
- SELECT COUNT(*)
532
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
533
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
534
- ) >= 2
535
- AND 5 < "pilot.0"."years of experience"
536
- AND "pilot.0"."years of experience" IS NOT NULL
537
- )
538
- AND ($1 = '{}'
539
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
540
- ) = 0 AS "result";`,
541
- );
542
-
543
- test.rule(
544
- 'It is necessary that each pilot that is experienced and can fly at least 2 planes, has a years of experience that is greater than 5',
545
- `\
546
- SELECT (
547
- SELECT COUNT(*)
548
- FROM "pilot" AS "pilot.0"
549
- WHERE "pilot.0"."is experienced" = TRUE
550
- AND (
551
- SELECT COUNT(*)
552
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
553
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
554
- ) >= 2
555
- AND NOT (
556
- 5 < "pilot.0"."years of experience"
557
- AND "pilot.0"."years of experience" IS NOT NULL
558
- )
559
- AND ($1 = '{}'
560
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
561
- ) = 0 AS "result";`,
562
- );
563
-
564
- test.rule(
565
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes and exactly one plane',
566
- `\
567
- SELECT (
568
- SELECT COUNT(*)
569
- FROM "pilot" AS "pilot.0"
570
- WHERE "pilot.0"."is experienced" = TRUE
571
- AND NOT (
572
- (
573
- SELECT COUNT(*)
574
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
575
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
576
- ) >= 3
577
- AND (
578
- SELECT COUNT(*)
579
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
580
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
581
- ) = 1
582
- )
583
- AND ($1 = '{}'
584
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
585
- ) = 0 AS "result";`,
586
- );
587
-
588
- test.rule(
589
- 'It is necessary that each pilot that can fly at least 3 planes and exactly one plane, is experienced',
590
- `\
591
- SELECT (
592
- SELECT COUNT(*)
593
- FROM "pilot" AS "pilot.0"
594
- WHERE (
595
- SELECT COUNT(*)
596
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
597
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
598
- ) >= 3
599
- AND (
600
- SELECT COUNT(*)
601
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
602
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
603
- ) = 1
604
- AND "pilot.0"."is experienced" != TRUE
605
- AND ($1 = '{}'
606
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
607
- ) = 0 AS "result";`,
608
- );
609
-
610
- test.rule(
611
- 'It is necessary that each pilot can fly at least one plane and a pilot can fly at least 10 planes',
612
- `\
613
- SELECT (
614
- SELECT COUNT(*)
615
- FROM "pilot" AS "pilot.0"
616
- WHERE NOT EXISTS (
617
- SELECT 1
618
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
619
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
620
- )
621
- ) = 0
622
- AND EXISTS (
623
- SELECT 1
624
- FROM "pilot" AS "pilot.2"
625
- WHERE (
626
- SELECT COUNT(*)
627
- FROM "pilot-can fly-plane" AS "pilot.2-can fly-plane.3"
628
- WHERE "pilot.2-can fly-plane.3"."pilot" = "pilot.2"."id"
629
- ) >= 10
630
- ) AS "result";`,
631
- );
632
-
633
- test.rule(
634
- 'It is necessary that each plane that at least 3 pilots can fly and exactly one pilot can fly, has a name',
635
- `\
636
- SELECT (
637
- SELECT COUNT(*)
638
- FROM "plane" AS "plane.0"
639
- WHERE (
640
- SELECT COUNT(*)
641
- FROM "pilot-can fly-plane" AS "pilot.1-can fly-plane.0"
642
- WHERE "pilot.1-can fly-plane.0"."can fly-plane" = "plane.0"."id"
643
- ) >= 3
644
- AND (
645
- SELECT COUNT(*)
646
- FROM "pilot-can fly-plane" AS "pilot.2-can fly-plane.0"
647
- WHERE "pilot.2-can fly-plane.0"."can fly-plane" = "plane.0"."id"
648
- ) = 1
649
- AND "plane.0"."name" IS NULL
650
- AND ($1 = '{}'
651
- OR "plane.0"."id" = ANY(CAST($1 AS INTEGER[])))
652
- ) = 0 AS "result";`,
653
- );
654
-
655
- // AND / OR
656
- test.rule(
657
- 'It is necessary that each pilot that is experienced and can fly at least 3 planes or can fly exactly one plane, has a years of experience that is greater than 5',
658
- `\
659
- SELECT (
660
- SELECT COUNT(*)
661
- FROM "pilot" AS "pilot.0"
662
- WHERE "pilot.0"."is experienced" = TRUE
663
- AND ((
664
- SELECT COUNT(*)
665
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
666
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
667
- ) >= 3
668
- OR (
669
- SELECT COUNT(*)
670
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
671
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
672
- ) = 1)
673
- AND NOT (
674
- 5 < "pilot.0"."years of experience"
675
- AND "pilot.0"."years of experience" IS NOT NULL
676
- )
677
- AND ($1 = '{}'
678
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
679
- ) = 0 AS "result";`,
680
- );
681
-
682
- test.rule(
683
- 'It is necessary that each pilot that can fly at least 3 planes or can fly exactly one plane and is experienced, has a years of experience that is greater than 5',
684
- `\
685
- SELECT (
686
- SELECT COUNT(*)
687
- FROM "pilot" AS "pilot.0"
688
- WHERE ((
689
- SELECT COUNT(*)
690
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
691
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
692
- ) >= 3
693
- OR (
694
- SELECT COUNT(*)
695
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
696
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
697
- ) = 1
698
- AND "pilot.0"."is experienced" = TRUE)
699
- AND NOT (
700
- 5 < "pilot.0"."years of experience"
701
- AND "pilot.0"."years of experience" IS NOT NULL
702
- )
703
- AND ($1 = '{}'
704
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
705
- ) = 0 AS "result";`,
706
- );
707
-
708
- // Commas
709
- test.rule(
710
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes, and can fly at most 10 planes, has a years of experience that is greater than 5',
711
- `\
712
- SELECT (
713
- SELECT COUNT(*)
714
- FROM "pilot" AS "pilot.0"
715
- WHERE "pilot.0"."is experienced" = TRUE
716
- AND (
717
- SELECT COUNT(*)
718
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
719
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
720
- ) >= 3
721
- AND NOT (
722
- (
723
- SELECT COUNT(*)
724
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
725
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
726
- ) >= 11
727
- )
728
- AND NOT (
729
- 5 < "pilot.0"."years of experience"
730
- AND "pilot.0"."years of experience" IS NOT NULL
731
- )
732
- AND ($1 = '{}'
733
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
734
- ) = 0 AS "result";`,
735
- );
736
-
737
- test.rule(
738
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes, or can fly exactly one plane, has a years of experience that is greater than 5',
739
- `\
740
- SELECT (
741
- SELECT COUNT(*)
742
- FROM "pilot" AS "pilot.0"
743
- WHERE ("pilot.0"."is experienced" = TRUE
744
- OR (
745
- SELECT COUNT(*)
746
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
747
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
748
- ) >= 3
749
- OR (
750
- SELECT COUNT(*)
751
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
752
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
753
- ) = 1)
754
- AND NOT (
755
- 5 < "pilot.0"."years of experience"
756
- AND "pilot.0"."years of experience" IS NOT NULL
757
- )
758
- AND ($1 = '{}'
759
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
760
- ) = 0 AS "result";`,
761
- );
762
-
763
- test.rule(
764
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes, and can fly at most 10 planes or has a name that has a Length (Type) that is greater than 10, has a years of experience that is greater than 5',
765
- `\
766
- SELECT (
767
- SELECT COUNT(*)
768
- FROM "pilot" AS "pilot.0"
769
- WHERE "pilot.0"."is experienced" = TRUE
770
- AND (
771
- SELECT COUNT(*)
772
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
773
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
774
- ) >= 3
775
- AND (NOT (
776
- (
777
- SELECT COUNT(*)
778
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
779
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
780
- ) >= 11
781
- )
782
- OR 10 < LENGTH("pilot.0"."name")
783
- AND LENGTH("pilot.0"."name") IS NOT NULL
784
- AND "pilot.0"."name" IS NOT NULL)
785
- AND NOT (
786
- 5 < "pilot.0"."years of experience"
787
- AND "pilot.0"."years of experience" IS NOT NULL
788
- )
789
- AND ($1 = '{}'
790
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
791
- ) = 0 AS "result";`,
792
- );
793
-
794
- test.rule(
795
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes, or can fly exactly one plane and has a name that has a Length (Type) that is greater than 10, has a years of experience that is greater than 5',
796
- `\
797
- SELECT (
798
- SELECT COUNT(*)
799
- FROM "pilot" AS "pilot.0"
800
- WHERE ("pilot.0"."is experienced" = TRUE
801
- OR (
802
- SELECT COUNT(*)
803
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
804
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
805
- ) >= 3
806
- OR (
807
- SELECT COUNT(*)
808
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
809
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
810
- ) = 1
811
- AND 10 < LENGTH("pilot.0"."name")
812
- AND LENGTH("pilot.0"."name") IS NOT NULL
813
- AND "pilot.0"."name" IS NOT NULL)
814
- AND NOT (
815
- 5 < "pilot.0"."years of experience"
816
- AND "pilot.0"."years of experience" IS NOT NULL
817
- )
818
- AND ($1 = '{}'
819
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
820
- ) = 0 AS "result";`,
821
- );
822
-
823
- test.rule(
824
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes, or can fly exactly one plane and has a name that has a Length (Type) that is greater than 10, has a years of experience that is greater than 5',
825
- `\
826
- SELECT (
827
- SELECT COUNT(*)
828
- FROM "pilot" AS "pilot.0"
829
- WHERE ("pilot.0"."is experienced" = TRUE
830
- OR (
831
- SELECT COUNT(*)
832
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
833
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
834
- ) >= 3
835
- OR (
836
- SELECT COUNT(*)
837
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
838
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
839
- ) = 1
840
- AND 10 < LENGTH("pilot.0"."name")
841
- AND LENGTH("pilot.0"."name") IS NOT NULL
842
- AND "pilot.0"."name" IS NOT NULL)
843
- AND NOT (
844
- 5 < "pilot.0"."years of experience"
845
- AND "pilot.0"."years of experience" IS NOT NULL
846
- )
847
- AND ($1 = '{}'
848
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
849
- ) = 0 AS "result";`,
850
- );
851
-
852
- test.rule(
853
- 'It is necessary that each pilot that is experienced, can fly at least 3 planes, or can fly exactly one plane and has a name that has a Length (Type) that is greater than 10, has a years of experience that is greater than 5',
854
- `\
855
- SELECT (
856
- SELECT COUNT(*)
857
- FROM "pilot" AS "pilot.0"
858
- WHERE ("pilot.0"."is experienced" = TRUE
859
- OR (
860
- SELECT COUNT(*)
861
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
862
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
863
- ) >= 3
864
- OR (
865
- SELECT COUNT(*)
866
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
867
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
868
- ) = 1
869
- AND 10 < LENGTH("pilot.0"."name")
870
- AND LENGTH("pilot.0"."name") IS NOT NULL
871
- AND "pilot.0"."name" IS NOT NULL)
872
- AND NOT (
873
- 5 < "pilot.0"."years of experience"
874
- AND "pilot.0"."years of experience" IS NOT NULL
875
- )
876
- AND ($1 = '{}'
877
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
878
- ) = 0 AS "result";`,
879
- );
880
-
881
- test.rule(
882
- 'It is necessary that each pilot that is experienced, can fly exactly one plane or can fly at least 5 planes, and can fly at least 3 planes, has a years of experience that is greater than 5',
883
- `\
884
- SELECT (
885
- SELECT COUNT(*)
886
- FROM "pilot" AS "pilot.0"
887
- WHERE "pilot.0"."is experienced" = TRUE
888
- AND ((
889
- SELECT COUNT(*)
890
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
891
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
892
- ) = 1
893
- OR (
894
- SELECT COUNT(*)
895
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
896
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
897
- ) >= 5)
898
- AND (
899
- SELECT COUNT(*)
900
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.3"
901
- WHERE "pilot.0-can fly-plane.3"."pilot" = "pilot.0"."id"
902
- ) >= 3
903
- AND NOT (
904
- 5 < "pilot.0"."years of experience"
905
- AND "pilot.0"."years of experience" IS NOT NULL
906
- )
907
- AND ($1 = '{}'
908
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
909
- ) = 0 AS "result";`,
910
- );
911
-
912
- test.rule(
913
- 'It is necessary that each pilot that is experienced, can fly at least one plane and can fly at most 5 planes, or can fly at least 3 planes, has a years of experience that is greater than 5',
914
- `\
915
- SELECT (
916
- SELECT COUNT(*)
917
- FROM "pilot" AS "pilot.0"
918
- WHERE ("pilot.0"."is experienced" = TRUE
919
- OR EXISTS (
920
- SELECT 1
921
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
922
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
923
- )
924
- AND NOT (
925
- (
926
- SELECT COUNT(*)
927
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
928
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
929
- ) >= 6
930
- )
931
- OR (
932
- SELECT COUNT(*)
933
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.3"
934
- WHERE "pilot.0-can fly-plane.3"."pilot" = "pilot.0"."id"
935
- ) >= 3)
936
- AND NOT (
937
- 5 < "pilot.0"."years of experience"
938
- AND "pilot.0"."years of experience" IS NOT NULL
939
- )
940
- AND ($1 = '{}'
941
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
942
- ) = 0 AS "result";`,
943
- );
944
-
945
- test.rule(
946
- 'It is necessary that each pilot that is experienced, can fly at most 10 planes or has a name that has a Length (Type) that is greater than 10, and can fly at least 3 planes, has a years of experience that is greater than 5',
947
- `\
948
- SELECT (
949
- SELECT COUNT(*)
950
- FROM "pilot" AS "pilot.0"
951
- WHERE "pilot.0"."is experienced" = TRUE
952
- AND (NOT (
953
- (
954
- SELECT COUNT(*)
955
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
956
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
957
- ) >= 11
958
- )
959
- OR 10 < LENGTH("pilot.0"."name")
960
- AND LENGTH("pilot.0"."name") IS NOT NULL
961
- AND "pilot.0"."name" IS NOT NULL)
962
- AND (
963
- SELECT COUNT(*)
964
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.4"
965
- WHERE "pilot.0-can fly-plane.4"."pilot" = "pilot.0"."id"
966
- ) >= 3
967
- AND NOT (
968
- 5 < "pilot.0"."years of experience"
969
- AND "pilot.0"."years of experience" IS NOT NULL
970
- )
971
- AND ($1 = '{}'
972
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
973
- ) = 0 AS "result";`,
974
- );
975
-
976
- test.rule(
977
- 'It is necessary that each pilot that is experienced, can fly exactly one plane and has a name that has a Length (Type) that is greater than 10, or can fly at least 3 planes, has a years of experience that is greater than 5',
978
- `\
979
- SELECT (
980
- SELECT COUNT(*)
981
- FROM "pilot" AS "pilot.0"
982
- WHERE ("pilot.0"."is experienced" = TRUE
983
- OR (
984
- SELECT COUNT(*)
985
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
986
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
987
- ) = 1
988
- AND 10 < LENGTH("pilot.0"."name")
989
- AND LENGTH("pilot.0"."name") IS NOT NULL
990
- AND "pilot.0"."name" IS NOT NULL
991
- OR (
992
- SELECT COUNT(*)
993
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.4"
994
- WHERE "pilot.0-can fly-plane.4"."pilot" = "pilot.0"."id"
995
- ) >= 3)
996
- AND NOT (
997
- 5 < "pilot.0"."years of experience"
998
- AND "pilot.0"."years of experience" IS NOT NULL
999
- )
1000
- AND ($1 = '{}'
1001
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
1002
- ) = 0 AS "result";`,
1003
- );
1004
-
1005
- test.rule(
1006
- 'It is necessary that each pilot that can fly at most 10 planes or can fly at least 15 planes, and is experienced and can fly at least 3 planes, has a years of experience that is greater than 5',
1007
- `\
1008
- SELECT (
1009
- SELECT COUNT(*)
1010
- FROM "pilot" AS "pilot.0"
1011
- WHERE (NOT (
1012
- (
1013
- SELECT COUNT(*)
1014
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
1015
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
1016
- ) >= 11
1017
- )
1018
- OR (
1019
- SELECT COUNT(*)
1020
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
1021
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
1022
- ) >= 15)
1023
- AND "pilot.0"."is experienced" = TRUE
1024
- AND (
1025
- SELECT COUNT(*)
1026
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.3"
1027
- WHERE "pilot.0-can fly-plane.3"."pilot" = "pilot.0"."id"
1028
- ) >= 3
1029
- AND NOT (
1030
- 5 < "pilot.0"."years of experience"
1031
- AND "pilot.0"."years of experience" IS NOT NULL
1032
- )
1033
- AND ($1 = '{}'
1034
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
1035
- ) = 0 AS "result";`,
1036
- );
1037
-
1038
- test.rule(
1039
- 'It is necessary that each pilot that can fly at least one plane and at most 10 planes, or is experienced or can fly at least 3 planes, has a years of experience that is greater than 5',
1040
- `\
1041
- SELECT (
1042
- SELECT COUNT(*)
1043
- FROM "pilot" AS "pilot.0"
1044
- WHERE (EXISTS (
1045
- SELECT 1
1046
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
1047
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
1048
- )
1049
- AND NOT (
1050
- (
1051
- SELECT COUNT(*)
1052
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
1053
- WHERE "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
1054
- ) >= 11
1055
- )
1056
- OR "pilot.0"."is experienced" = TRUE
1057
- OR (
1058
- SELECT COUNT(*)
1059
- FROM "pilot-can fly-plane" AS "pilot.0-can fly-plane.3"
1060
- WHERE "pilot.0-can fly-plane.3"."pilot" = "pilot.0"."id"
1061
- ) >= 3)
1062
- AND NOT (
1063
- 5 < "pilot.0"."years of experience"
1064
- AND "pilot.0"."years of experience" IS NOT NULL
1065
- )
1066
- AND ($1 = '{}'
1067
- OR "pilot.0"."id" = ANY(CAST($1 AS INTEGER[])))
1068
- ) = 0 AS "result";`,
1069
- );
1070
-
1071
- test.rule(
1072
- 'It is necessary that each pilot0 that can fly a plane0, can fly a plane1 that can be flown by a pilot1 that can fly the plane0',
1073
- `\
1074
- SELECT (
1075
- SELECT COUNT(*)
1076
- FROM "pilot" AS "pilot.0",
1077
- "plane" AS "plane.1",
1078
- "pilot-can fly-plane" AS "pilot.0-can fly-plane.1"
1079
- WHERE "pilot.0-can fly-plane.1"."pilot" = "pilot.0"."id"
1080
- AND "pilot.0-can fly-plane.1"."can fly-plane" = "plane.1"."id"
1081
- AND NOT EXISTS (
1082
- SELECT 1
1083
- FROM "plane" AS "plane.2",
1084
- "pilot" AS "pilot.3",
1085
- "pilot-can fly-plane" AS "pilot.3-can fly-plane.1",
1086
- "pilot-can fly-plane" AS "pilot.3-can fly-plane.2",
1087
- "pilot-can fly-plane" AS "pilot.0-can fly-plane.2"
1088
- WHERE "pilot.3-can fly-plane.1"."pilot" = "pilot.3"."id"
1089
- AND "pilot.3-can fly-plane.1"."can fly-plane" = "plane.1"."id"
1090
- AND "pilot.3-can fly-plane.2"."pilot" = "pilot.3"."id"
1091
- AND "pilot.3-can fly-plane.2"."can fly-plane" = "plane.2"."id"
1092
- AND "pilot.0-can fly-plane.2"."pilot" = "pilot.0"."id"
1093
- AND "pilot.0-can fly-plane.2"."can fly-plane" = "plane.2"."id"
1094
- )
1095
- ) = 0 AS "result";`,
1096
- );
1097
- });