alf 0.14.0 → 0.15.0
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.
- data/Gemfile +6 -3
- data/Gemfile.lock +65 -19
- data/README.md +77 -183
- data/Rakefile +25 -0
- data/alf.gemspec +5 -3
- data/alf.noespec +8 -6
- data/lib/alf/loader.rb +1 -0
- data/lib/alf/version.rb +1 -1
- data/spec/facade/test_query.rb +12 -0
- data/spec/key-inference/queries.yml +10 -0
- data/spec/key-inference/test_all.rb +21 -0
- data/{test → spec}/migrations/test_folder_migration.rb +0 -0
- data/{test → spec}/migrations/test_sequel_migration.rb +1 -1
- data/spec/operators/ungroup/grouped.json +3 -0
- data/spec/operators/ungroup/test_on_json_content.rb +11 -0
- data/spec/operators/unwrap/test_on_json_content.rb +11 -0
- data/spec/operators/unwrap/wrapped.json +3 -0
- data/spec/optimizer/project/extend.yml +20 -0
- data/spec/optimizer/project/intersect.yml +10 -0
- data/spec/optimizer/project/join.yml +20 -0
- data/spec/optimizer/project/matching.yml +21 -0
- data/spec/optimizer/project/minus.yml +9 -0
- data/spec/optimizer/project/not_matching.yml +21 -0
- data/spec/optimizer/project/project.yml +88 -0
- data/spec/optimizer/project/rename.yml +30 -0
- data/spec/optimizer/project/sort.yml +45 -0
- data/spec/optimizer/project/union.yml +8 -0
- data/spec/optimizer/restrict/clip.yml +4 -0
- data/spec/optimizer/restrict/compact.yml +4 -0
- data/spec/optimizer/restrict/generator.yml +4 -0
- data/spec/optimizer/restrict/intersect.yml +4 -0
- data/spec/optimizer/restrict/leaf_operand.yml +4 -0
- data/spec/optimizer/restrict/minus.yml +4 -0
- data/spec/optimizer/restrict/page.yml +12 -0
- data/spec/optimizer/restrict/project.yml +4 -0
- data/spec/optimizer/restrict/sort.yml +4 -0
- data/spec/optimizer/restrict/union.yml +4 -0
- data/spec/optimizer/test_all.rb +34 -0
- data/spec/sql/helpers.rb +25 -0
- data/spec/sql/queries/01-leaf-operand.yml +5 -0
- data/spec/sql/queries/02-clip.yml +12 -0
- data/spec/sql/queries/03-sort.yml +58 -0
- data/spec/sql/queries/04-frame.yml +57 -0
- data/spec/sql/queries/05-intersect.yml +23 -0
- data/spec/sql/queries/06-join.yml +207 -0
- data/spec/sql/queries/07-matching.yml +76 -0
- data/spec/sql/queries/08-minus.yml +23 -0
- data/spec/sql/queries/09-not-matching.yml +57 -0
- data/spec/sql/queries/10-page.yml +31 -0
- data/spec/sql/queries/11-project.yml +48 -0
- data/spec/sql/queries/12-rename.yml +24 -0
- data/spec/sql/queries/13-restrict.yml +114 -0
- data/spec/sql/queries/15-union.yml +90 -0
- data/spec/sql/queries/16-wrap.yml +3 -0
- data/spec/sql/queries/91-reuse.yml +28 -0
- data/spec/sql/test_sequel_compiler.rb +41 -0
- data/spec/sql/test_sql_compiler.rb +52 -0
- data/{test → spec}/test_alf.rb +0 -0
- data/spec/test_helpers.rb +54 -0
- data/tasks/doc.rake +10 -0
- data/tasks/fixtures.rake +52 -0
- data/tasks/mod.rake +50 -0
- data/tasks/release.rake +34 -0
- data/tasks/test.rake +2 -2
- metadata +150 -19
- data/test/seeding/test_seeding.rb +0 -49
- data/test/test_helpers.rb +0 -24
@@ -0,0 +1,76 @@
|
|
1
|
+
# matching with no attribute
|
2
|
+
- alf: |-
|
3
|
+
matching(suppliers, project(supplies, [:qty]))
|
4
|
+
sql:
|
5
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
6
|
+
FROM suppliers AS t1
|
7
|
+
WHERE EXISTS(SELECT * FROM supplies AS t2)
|
8
|
+
# matching on one single attribute
|
9
|
+
- alf: |-
|
10
|
+
matching(suppliers, supplies)
|
11
|
+
sql:
|
12
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
13
|
+
FROM suppliers AS t1
|
14
|
+
WHERE t1.sid IN (SELECT t2.sid FROM supplies AS t2)
|
15
|
+
# matching on multiple attributes
|
16
|
+
- alf: |-
|
17
|
+
matching(suppliers, parts)
|
18
|
+
sql:
|
19
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
20
|
+
FROM suppliers AS t1
|
21
|
+
WHERE EXISTS(
|
22
|
+
SELECT t2.name, t2.city
|
23
|
+
FROM parts AS t2
|
24
|
+
WHERE t1.name = t2.name
|
25
|
+
AND t1.city = t2.city)
|
26
|
+
# matching when a with_exp at right
|
27
|
+
- alf: |-
|
28
|
+
matching(suppliers, sort(sort(suppliers, [:sid, :asc]), [:sid, :desc]))
|
29
|
+
sql:
|
30
|
+
WITH t3 AS (
|
31
|
+
SELECT t2.sid, t2.name, t2.status, t2.city
|
32
|
+
FROM suppliers AS t2
|
33
|
+
ORDER BY t2.sid ASC
|
34
|
+
)
|
35
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
36
|
+
FROM suppliers AS t1
|
37
|
+
WHERE EXISTS(
|
38
|
+
SELECT t3.sid, t3.name, t3.status, t3.city
|
39
|
+
FROM t3 AS t3
|
40
|
+
WHERE t1.sid = t3.sid
|
41
|
+
AND t1.name = t3.name
|
42
|
+
AND t1.status = t3.status
|
43
|
+
AND t1.city = t3.city
|
44
|
+
ORDER BY t3.sid DESC)
|
45
|
+
# matching with a union at left
|
46
|
+
- alf: |-
|
47
|
+
matching(union(suppliers_in_london, suppliers_in_paris), supplies)
|
48
|
+
sql: |-
|
49
|
+
WITH t4 AS (
|
50
|
+
(SELECT t1.sid, t1.name, t1.status, t1.city
|
51
|
+
FROM suppliers AS t1
|
52
|
+
WHERE t1.city = 'London')
|
53
|
+
UNION
|
54
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
55
|
+
FROM suppliers AS t2
|
56
|
+
WHERE t2.city = 'Paris')
|
57
|
+
)
|
58
|
+
SELECT t4.sid, t4.name, t4.status, t4.city
|
59
|
+
FROM t4 AS t4
|
60
|
+
WHERE t4.sid IN (SELECT t3.sid FROM supplies AS t3)
|
61
|
+
# matching with a union at right
|
62
|
+
- alf: |-
|
63
|
+
matching(supplies, union(suppliers_in_london, suppliers_in_paris))
|
64
|
+
sql: |-
|
65
|
+
WITH t4 AS (
|
66
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
67
|
+
FROM suppliers AS t2
|
68
|
+
WHERE t2.city = 'London')
|
69
|
+
UNION
|
70
|
+
(SELECT t3.sid, t3.name, t3.status, t3.city
|
71
|
+
FROM suppliers AS t3
|
72
|
+
WHERE t3.city = 'Paris')
|
73
|
+
)
|
74
|
+
SELECT t1.sid, t1.pid, t1.qty
|
75
|
+
FROM supplies AS t1
|
76
|
+
WHERE t1.sid IN (SELECT t4.sid FROM t4 AS t4)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
- alf: |-
|
2
|
+
minus(suppliers_in_london, suppliers_in_paris)
|
3
|
+
sql:
|
4
|
+
(SELECT t1.sid, t1.name, t1.status, t1.city
|
5
|
+
FROM suppliers AS t1
|
6
|
+
WHERE t1.city = 'London')
|
7
|
+
EXCEPT
|
8
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
9
|
+
FROM suppliers AS t2
|
10
|
+
WHERE t2.city = 'Paris')
|
11
|
+
- alf: |-
|
12
|
+
minus(minus(suppliers_in_london, suppliers_in_paris), suppliers)
|
13
|
+
sql:
|
14
|
+
((SELECT t1.sid, t1.name, t1.status, t1.city
|
15
|
+
FROM suppliers AS t1
|
16
|
+
WHERE t1.city = 'London')
|
17
|
+
EXCEPT
|
18
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
19
|
+
FROM suppliers AS t2
|
20
|
+
WHERE t2.city = 'Paris'))
|
21
|
+
EXCEPT
|
22
|
+
(SELECT t3.sid, t3.name, t3.status, t3.city
|
23
|
+
FROM suppliers AS t3)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# not_matching with no attribute
|
2
|
+
- alf: |-
|
3
|
+
not_matching(suppliers, project(supplies, [:qty]))
|
4
|
+
sql:
|
5
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
6
|
+
FROM suppliers AS t1
|
7
|
+
WHERE NOT(EXISTS(SELECT * FROM supplies AS t2))
|
8
|
+
# not matching on one single attribute
|
9
|
+
- alf: |-
|
10
|
+
not_matching(suppliers, supplies)
|
11
|
+
sql:
|
12
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
13
|
+
FROM suppliers AS t1
|
14
|
+
WHERE NOT(t1.sid IN (SELECT t2.sid FROM supplies AS t2))
|
15
|
+
# not_matching on multiple attributes
|
16
|
+
- alf: |-
|
17
|
+
not_matching(suppliers, parts)
|
18
|
+
sql:
|
19
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
20
|
+
FROM suppliers AS t1
|
21
|
+
WHERE NOT(EXISTS(
|
22
|
+
SELECT t2.name, t2.city
|
23
|
+
FROM parts AS t2
|
24
|
+
WHERE t1.name = t2.name
|
25
|
+
AND t1.city = t2.city))
|
26
|
+
# not_matching with a union at left
|
27
|
+
- alf: |-
|
28
|
+
not_matching(union(suppliers_in_london, suppliers_in_paris), supplies)
|
29
|
+
sql: |-
|
30
|
+
WITH t4 AS (
|
31
|
+
(SELECT t1.sid, t1.name, t1.status, t1.city
|
32
|
+
FROM suppliers AS t1
|
33
|
+
WHERE t1.city = 'London')
|
34
|
+
UNION
|
35
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
36
|
+
FROM suppliers AS t2
|
37
|
+
WHERE t2.city = 'Paris')
|
38
|
+
)
|
39
|
+
SELECT t4.sid, t4.name, t4.status, t4.city
|
40
|
+
FROM t4 AS t4
|
41
|
+
WHERE NOT(t4.sid IN (SELECT t3.sid FROM supplies AS t3))
|
42
|
+
# not_matching with a union at right
|
43
|
+
- alf: |-
|
44
|
+
not_matching(supplies, union(suppliers_in_london, suppliers_in_paris))
|
45
|
+
sql: |-
|
46
|
+
WITH t4 AS (
|
47
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
48
|
+
FROM suppliers AS t2
|
49
|
+
WHERE t2.city = 'London')
|
50
|
+
UNION
|
51
|
+
(SELECT t3.sid, t3.name, t3.status, t3.city
|
52
|
+
FROM suppliers AS t3
|
53
|
+
WHERE t3.city = 'Paris')
|
54
|
+
)
|
55
|
+
SELECT t1.sid, t1.pid, t1.qty
|
56
|
+
FROM supplies AS t1
|
57
|
+
WHERE NOT(t1.sid IN (SELECT t4.sid FROM t4 AS t4))
|
@@ -0,0 +1,31 @@
|
|
1
|
+
- alf: |-
|
2
|
+
page(suppliers, [[:city, :desc], [:sid, :asc]], 1, page_size: 10)
|
3
|
+
sql: |-
|
4
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
5
|
+
FROM suppliers AS t1
|
6
|
+
ORDER BY t1.city DESC, t1.sid ASC
|
7
|
+
LIMIT 10 OFFSET 0
|
8
|
+
#
|
9
|
+
- alf: |-
|
10
|
+
page(suppliers, [[:city, :desc], [:sid, :asc]], -1, page_size: 10)
|
11
|
+
sql: |-
|
12
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
13
|
+
FROM suppliers AS t1
|
14
|
+
ORDER BY t1.city ASC, t1.sid DESC
|
15
|
+
LIMIT 10 OFFSET 0
|
16
|
+
#
|
17
|
+
- alf: |-
|
18
|
+
page(suppliers, [[:city, :desc], [:sid, :asc]], 2, page_size: 10)
|
19
|
+
sql: |-
|
20
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
21
|
+
FROM suppliers AS t1
|
22
|
+
ORDER BY t1.city DESC, t1.sid ASC
|
23
|
+
LIMIT 10 OFFSET 10
|
24
|
+
#
|
25
|
+
- alf: |-
|
26
|
+
page(suppliers, [[:city, :desc]], 2, page_size: 10)
|
27
|
+
sql: |-
|
28
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
29
|
+
FROM suppliers AS t1
|
30
|
+
ORDER BY t1.city DESC, t1.sid ASC
|
31
|
+
LIMIT 10 OFFSET 10
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# normal case
|
2
|
+
- alf: |-
|
3
|
+
project(suppliers, [:sid])
|
4
|
+
sql: |-
|
5
|
+
SELECT t1.sid
|
6
|
+
FROM suppliers AS t1
|
7
|
+
# allbut case
|
8
|
+
- alf: |-
|
9
|
+
project(suppliers, [:sid], allbut: true)
|
10
|
+
sql: |-
|
11
|
+
SELECT t1.name, t1.status, t1.city
|
12
|
+
FROM suppliers AS t1
|
13
|
+
# unique, non primary key
|
14
|
+
- alf: |-
|
15
|
+
project(suppliers, [:name])
|
16
|
+
sql: |-
|
17
|
+
SELECT t1.name
|
18
|
+
FROM suppliers AS t1
|
19
|
+
# requiring distinct
|
20
|
+
- alf: |-
|
21
|
+
project(suppliers, [:status])
|
22
|
+
sql: |-
|
23
|
+
SELECT DISTINCT t1.status
|
24
|
+
FROM suppliers AS t1
|
25
|
+
# a special case where attributes are taken in another order
|
26
|
+
- alf: |-
|
27
|
+
project(suppliers, [:status, :city, :name])
|
28
|
+
sql: |-
|
29
|
+
SELECT t1.name, t1.status, t1.city
|
30
|
+
FROM suppliers AS t1
|
31
|
+
comment: |-
|
32
|
+
The projection applies to the heading, that keeps its own order. The
|
33
|
+
ordering of fields therefore differs from what could be expected. It's
|
34
|
+
not a semantics issue, though.
|
35
|
+
# empty projection
|
36
|
+
- alf: |-
|
37
|
+
project(suppliers, [])
|
38
|
+
sql: |-
|
39
|
+
SELECT TRUE AS is_table_dee
|
40
|
+
WHERE EXISTS(SELECT * FROM suppliers AS t1)
|
41
|
+
# empty projection or empty projection
|
42
|
+
- alf: |-
|
43
|
+
project(project(suppliers, []), [])
|
44
|
+
sql: |-
|
45
|
+
SELECT TRUE AS is_table_dee
|
46
|
+
WHERE EXISTS(
|
47
|
+
SELECT TRUE AS is_table_dee
|
48
|
+
WHERE EXISTS(SELECT * FROM suppliers AS t1))
|
@@ -0,0 +1,24 @@
|
|
1
|
+
- alf: |-
|
2
|
+
rename(suppliers, :sid => :id)
|
3
|
+
sql: |-
|
4
|
+
SELECT t1.sid AS id, t1.name, t1.status, t1.city
|
5
|
+
FROM suppliers AS t1
|
6
|
+
#
|
7
|
+
- alf: |-
|
8
|
+
project(rename(suppliers, :sid => :id), [:id, :name])
|
9
|
+
sql: |-
|
10
|
+
SELECT t1.sid AS id, t1.name
|
11
|
+
FROM suppliers AS t1
|
12
|
+
#
|
13
|
+
- alf: |-
|
14
|
+
sort(rename(suppliers, :sid => :id), [[:id, :asc], [:city, :desc]])
|
15
|
+
sql: |-
|
16
|
+
SELECT t1.sid AS id, t1.name, t1.status, t1.city
|
17
|
+
FROM suppliers AS t1
|
18
|
+
ORDER BY t1.sid ASC, t1.city DESC
|
19
|
+
#
|
20
|
+
- alf: |-
|
21
|
+
rename(cities, country: :name)
|
22
|
+
sql: |-
|
23
|
+
SELECT t1.city, t1.country AS name
|
24
|
+
FROM cities AS t1
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# base case
|
2
|
+
- alf: |-
|
3
|
+
restrict(suppliers, sid: 'S1')
|
4
|
+
sql: |-
|
5
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
6
|
+
FROM suppliers AS t1
|
7
|
+
WHERE t1.sid = 'S1'
|
8
|
+
# when renamed: desalisation required
|
9
|
+
- alf: |-
|
10
|
+
restrict(rename(suppliers, sid: :id), id: 'S1')
|
11
|
+
sql: |-
|
12
|
+
SELECT t1.sid AS id, t1.name, t1.status, t1.city
|
13
|
+
FROM suppliers AS t1
|
14
|
+
WHERE t1.sid = 'S1'
|
15
|
+
# TRUE
|
16
|
+
- alf: |-
|
17
|
+
restrict(suppliers, true)
|
18
|
+
sql: |-
|
19
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
20
|
+
FROM suppliers AS t1
|
21
|
+
WHERE TRUE
|
22
|
+
# FALSE
|
23
|
+
- alf: |-
|
24
|
+
restrict(suppliers, false)
|
25
|
+
sql: |-
|
26
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
27
|
+
FROM suppliers AS t1
|
28
|
+
WHERE FALSE
|
29
|
+
# AND
|
30
|
+
- alf: |-
|
31
|
+
restrict(suppliers, sid: 'S1', city: 'London')
|
32
|
+
sql: |-
|
33
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
34
|
+
FROM suppliers AS t1
|
35
|
+
WHERE t1.sid = 'S1' AND t1.city = 'London'
|
36
|
+
# OR
|
37
|
+
- alf: |-
|
38
|
+
restrict(suppliers, Alf::Predicate.or(eq(:sid, 'S1'), eq(:sid, 'S2')))
|
39
|
+
sql: |-
|
40
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
41
|
+
FROM suppliers AS t1
|
42
|
+
WHERE t1.sid = 'S1' OR t1.sid = 'S2'
|
43
|
+
# NOT =
|
44
|
+
- alf: |-
|
45
|
+
restrict(suppliers, !eq(:sid, 'S1'))
|
46
|
+
sql: |-
|
47
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
48
|
+
FROM suppliers AS t1
|
49
|
+
WHERE t1.sid <> 'S1'
|
50
|
+
# NOT AND
|
51
|
+
- alf: |-
|
52
|
+
restrict(suppliers, !(eq(:sid, 'S1') & eq(:status, 20)))
|
53
|
+
sql: |-
|
54
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
55
|
+
FROM suppliers AS t1
|
56
|
+
WHERE NOT(t1.sid = 'S1' AND t1.status = 20)
|
57
|
+
# NOT EQUAL
|
58
|
+
- alf: |-
|
59
|
+
restrict(suppliers, neq(:sid, 'S1'))
|
60
|
+
sql: |-
|
61
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
62
|
+
FROM suppliers AS t1
|
63
|
+
WHERE t1.sid <> 'S1'
|
64
|
+
# GREATER
|
65
|
+
- alf: |-
|
66
|
+
restrict(suppliers, gt(:status, 10))
|
67
|
+
sql: |-
|
68
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
69
|
+
FROM suppliers AS t1
|
70
|
+
WHERE t1.status > 10
|
71
|
+
# GREATER OR EQUAL
|
72
|
+
- alf: |-
|
73
|
+
restrict(suppliers, gte(:status, 10))
|
74
|
+
sql: |-
|
75
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
76
|
+
FROM suppliers AS t1
|
77
|
+
WHERE t1.status >= 10
|
78
|
+
# LESS THAN
|
79
|
+
- alf: |-
|
80
|
+
restrict(suppliers, lt(:status, 10))
|
81
|
+
sql: |-
|
82
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
83
|
+
FROM suppliers AS t1
|
84
|
+
WHERE t1.status < 10
|
85
|
+
# LESS THAN OR EQUAL
|
86
|
+
- alf: |-
|
87
|
+
restrict(suppliers, lte(:status, 10))
|
88
|
+
sql: |-
|
89
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
90
|
+
FROM suppliers AS t1
|
91
|
+
WHERE t1.status <= 10
|
92
|
+
# IN
|
93
|
+
- alf: |-
|
94
|
+
restrict(suppliers, Alf::Predicate.in(:sid, ['S1', 'S2']))
|
95
|
+
sql: |-
|
96
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
97
|
+
FROM suppliers AS t1
|
98
|
+
WHERE t1.sid IN ('S1', 'S2')
|
99
|
+
# restrict(restrict)
|
100
|
+
- alf: |-
|
101
|
+
restrict(restrict(suppliers, sid: 'S1'), status: 20)
|
102
|
+
sql:
|
103
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
104
|
+
FROM suppliers AS t1
|
105
|
+
WHERE t1.sid = 'S1' AND t1.status = 20
|
106
|
+
# restrict(join)
|
107
|
+
- alf: |-
|
108
|
+
restrict(join(suppliers, supplies), sid: 'S2', qty: 300)
|
109
|
+
sql:
|
110
|
+
SELECT t1.sid, t1.name, t1.status, t1.city, t2.pid, t2.qty
|
111
|
+
FROM suppliers AS t1
|
112
|
+
JOIN supplies AS t2 ON t1.sid = t2.sid
|
113
|
+
WHERE t1.sid = 'S2'
|
114
|
+
AND t2.qty = 300
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# A base union case
|
2
|
+
- alf: |-
|
3
|
+
union(suppliers_in_london, suppliers_in_paris)
|
4
|
+
sql:
|
5
|
+
(SELECT t1.sid, t1.name, t1.status, t1.city
|
6
|
+
FROM suppliers AS t1
|
7
|
+
WHERE t1.city = 'London')
|
8
|
+
UNION
|
9
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
10
|
+
FROM suppliers AS t2
|
11
|
+
WHERE t2.city = 'Paris')
|
12
|
+
# union requiring a reordering
|
13
|
+
- alf: |-
|
14
|
+
union(project(suppliers, [:name, :city]), rename(cities, country: :name))
|
15
|
+
sql: |-
|
16
|
+
(SELECT t1.name, t1.city
|
17
|
+
FROM suppliers AS t1)
|
18
|
+
UNION
|
19
|
+
(SELECT t2.country AS name, t2.city
|
20
|
+
FROM cities AS t2)
|
21
|
+
# union of union
|
22
|
+
- alf: |-
|
23
|
+
union(union(suppliers_in_london, suppliers_in_paris), suppliers)
|
24
|
+
sql:
|
25
|
+
((SELECT t1.sid, t1.name, t1.status, t1.city
|
26
|
+
FROM suppliers AS t1
|
27
|
+
WHERE t1.city = 'London')
|
28
|
+
UNION
|
29
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
30
|
+
FROM suppliers AS t2
|
31
|
+
WHERE t2.city = 'Paris'))
|
32
|
+
UNION
|
33
|
+
(SELECT t3.sid, t3.name, t3.status, t3.city
|
34
|
+
FROM suppliers AS t3)
|
35
|
+
# union with a with_exp at left
|
36
|
+
- alf: |-
|
37
|
+
union(sort(sort(suppliers_in_london, [:sid, :asc]), [:sid, :desc]), suppliers_in_paris)
|
38
|
+
sql:
|
39
|
+
WITH t2 AS (
|
40
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
41
|
+
FROM suppliers AS t1
|
42
|
+
WHERE t1.city = 'London'
|
43
|
+
ORDER BY t1.sid ASC
|
44
|
+
)
|
45
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
46
|
+
FROM t2 AS t2
|
47
|
+
ORDER BY t2.sid DESC)
|
48
|
+
UNION
|
49
|
+
(SELECT t3.sid, t3.name, t3.status, t3.city
|
50
|
+
FROM suppliers AS t3
|
51
|
+
WHERE t3.city = 'Paris')
|
52
|
+
# union with a with_exp at right
|
53
|
+
- alf: |-
|
54
|
+
union(suppliers_in_london, sort(sort(suppliers_in_paris, [:sid, :asc]), [:sid, :desc]))
|
55
|
+
sql:
|
56
|
+
WITH t3 AS (
|
57
|
+
SELECT t2.sid, t2.name, t2.status, t2.city
|
58
|
+
FROM suppliers AS t2
|
59
|
+
WHERE t2.city = 'Paris'
|
60
|
+
ORDER BY t2.sid ASC
|
61
|
+
)
|
62
|
+
(SELECT t1.sid, t1.name, t1.status, t1.city
|
63
|
+
FROM suppliers AS t1
|
64
|
+
WHERE t1.city = 'London')
|
65
|
+
UNION
|
66
|
+
(SELECT t3.sid, t3.name, t3.status, t3.city
|
67
|
+
FROM t3 AS t3
|
68
|
+
ORDER BY t3.sid DESC)
|
69
|
+
# union of two with_exps
|
70
|
+
- alf: |-
|
71
|
+
union(sort(sort(suppliers_in_london, [:sid, :asc]), [:sid, :desc]),
|
72
|
+
sort(sort(suppliers_in_paris, [:sid, :asc]), [:sid, :desc]))
|
73
|
+
sql:
|
74
|
+
WITH t2 AS (
|
75
|
+
SELECT t1.sid, t1.name, t1.status, t1.city
|
76
|
+
FROM suppliers AS t1
|
77
|
+
WHERE t1.city = 'London'
|
78
|
+
ORDER BY t1.sid ASC),
|
79
|
+
t4 AS (
|
80
|
+
SELECT t3.sid, t3.name, t3.status, t3.city
|
81
|
+
FROM suppliers AS t3
|
82
|
+
WHERE t3.city = 'Paris'
|
83
|
+
ORDER BY t3.sid ASC)
|
84
|
+
(SELECT t2.sid, t2.name, t2.status, t2.city
|
85
|
+
FROM t2 AS t2
|
86
|
+
ORDER BY t2.sid DESC)
|
87
|
+
UNION
|
88
|
+
(SELECT t4.sid, t4.name, t4.status, t4.city
|
89
|
+
FROM t4 AS t4
|
90
|
+
ORDER BY t4.sid DESC)
|