typed_dag 1.0.1 → 2.0.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.
- checksums.yaml +4 -4
- data/README.md +20 -5
- data/lib/typed_dag/configuration.rb +4 -0
- data/lib/typed_dag/edge/closure_maintenance.rb +16 -2
- data/lib/typed_dag/sql.rb +1 -0
- data/lib/typed_dag/sql/add_closure.rb +36 -5
- data/lib/typed_dag/sql/delete_zero_count.rb +22 -0
- data/lib/typed_dag/sql/get_circular.rb +4 -2
- data/lib/typed_dag/sql/helper.rb +15 -1
- data/lib/typed_dag/sql/insert_closure_of_depth.rb +44 -5
- data/lib/typed_dag/sql/insert_reflexive.rb +3 -2
- data/lib/typed_dag/sql/relation_access.rb +1 -0
- data/lib/typed_dag/sql/select_closure.rb +20 -9
- data/lib/typed_dag/sql/truncate_closure.rb +23 -128
- data/lib/typed_dag/version.rb +1 -1
- data/spec/support/helpers.rb +10 -1
- data/spec/test_app/config/database.yml +1 -3
- data/spec/test_app/db/migrate/20170831093433_create_nodes_and_endges.rb +3 -4
- data/spec/test_app/db/schema.rb +7 -6
- data/spec/test_app/log/test.log +0 -0
- data/spec/typed_dag/edge_spec.rb +33 -33
- data/spec/typed_dag/node_spec.rb +43 -50
- data/spec/typed_dag/sql/add_closure_spec.rb +103 -37
- data/spec/typed_dag/sql/truncate_closure_spec.rb +93 -121
- metadata +3 -2
@@ -1,135 +1,107 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe TypedDag::Sql::TruncateClosure do
|
4
|
+
include TypedDag::Specs::Helpers
|
5
|
+
|
4
6
|
describe '.sql' do
|
5
7
|
let(:relation) { Relation.new ancestor_id: 4, descendant_id: 6, invalidate: 1 }
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
r1.ancestor_id
|
25
|
-
r2.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
FROM
|
42
|
-
relations r1
|
43
|
-
JOIN
|
44
|
-
relations r2
|
45
|
-
ON
|
46
|
-
(r1.descendant_id = 4 AND r2.ancestor_id = 6 AND NOT (r1.ancestor_id = 4 AND r2.descendant_id = 6))
|
47
|
-
) aggregation
|
48
|
-
GROUP BY ancestor_id, descendant_id, hierarchy, invalidate) criteria
|
9
|
+
it 'produces the correct sql' do
|
10
|
+
expected_sql = if mysql_db?
|
11
|
+
<<-SQL
|
12
|
+
UPDATE
|
13
|
+
relations
|
14
|
+
JOIN
|
15
|
+
(SELECT
|
16
|
+
ancestor_id,
|
17
|
+
descendant_id,
|
18
|
+
hierarchy,
|
19
|
+
invalidate,
|
20
|
+
SUM(count) AS count
|
21
|
+
FROM
|
22
|
+
(SELECT
|
23
|
+
r1.ancestor_id,
|
24
|
+
r2.descendant_id,
|
25
|
+
CASE
|
26
|
+
WHEN r1.descendant_id = r2.ancestor_id AND (r1.hierarchy > 0 OR r2.hierarchy > 0)
|
27
|
+
THEN r1.hierarchy + r2.hierarchy
|
28
|
+
WHEN r1.descendant_id != r2.ancestor_id
|
29
|
+
THEN r1.hierarchy + r2.hierarchy + 0
|
30
|
+
ELSE 0
|
31
|
+
END AS hierarchy,
|
32
|
+
CASE
|
33
|
+
WHEN r1.descendant_id = r2.ancestor_id AND (r1.invalidate > 0 OR r2.invalidate > 0)
|
34
|
+
THEN r1.invalidate + r2.invalidate
|
35
|
+
WHEN r1.descendant_id != r2.ancestor_id
|
36
|
+
THEN r1.invalidate + r2.invalidate + 1
|
37
|
+
ELSE 0
|
38
|
+
END AS invalidate,
|
39
|
+
r1.count * r2.count AS count
|
40
|
+
FROM
|
41
|
+
relations r1
|
49
42
|
JOIN
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
descendant_id IN (SELECT descendant_id FROM relations WHERE ancestor_id = 4)
|
65
|
-
ORDER BY ancestor_id, descendant_id, hierarchy, invalidate) ranked
|
66
|
-
ON ranked.ancestor_id = criteria.ancestor_id
|
67
|
-
AND ranked.descendant_id = criteria.descendant_id
|
68
|
-
AND ranked.hierarchy = criteria.hierarchy
|
69
|
-
AND ranked.invalidate = criteria.invalidate
|
70
|
-
AND count >= row_number) selection_table
|
71
|
-
ON
|
72
|
-
deletion_table.id = selection_table.id
|
43
|
+
relations r2
|
44
|
+
ON
|
45
|
+
(r1.descendant_id = 4 AND r2.ancestor_id = 6 AND NOT (r1.ancestor_id = 4 AND r2.descendant_id = 6))) unique_rows
|
46
|
+
GROUP BY
|
47
|
+
ancestor_id,
|
48
|
+
descendant_id,
|
49
|
+
hierarchy,
|
50
|
+
invalidate) removed_relations
|
51
|
+
ON relations.ancestor_id = removed_relations.ancestor_id
|
52
|
+
AND relations.descendant_id = removed_relations.descendant_id
|
53
|
+
AND relations.hierarchy = removed_relations.hierarchy
|
54
|
+
AND relations.invalidate = removed_relations.invalidate
|
55
|
+
SET
|
56
|
+
relations.count = relations.count - removed_relations.count
|
73
57
|
SQL
|
74
|
-
|
75
|
-
expect(harmonize_string(described_class.sql(relation)))
|
76
|
-
.to eql harmonize_string(expected_sql)
|
77
|
-
end
|
78
|
-
else
|
79
|
-
it 'produces the correct sql for postgresql' do
|
58
|
+
else
|
80
59
|
expected_sql = <<-SQL
|
81
|
-
|
82
|
-
|
60
|
+
UPDATE
|
61
|
+
relations
|
62
|
+
SET
|
63
|
+
count = relations.count - removed_relations.count
|
83
64
|
FROM
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
relations r2
|
112
|
-
ON
|
113
|
-
(r1.descendant_id = 4 AND r2.ancestor_id = 6 AND NOT (r1.ancestor_id = 4 AND r2.descendant_id = 6))
|
114
|
-
) aggregation
|
115
|
-
GROUP BY ancestor_id, descendant_id, hierarchy, invalidate) criteria
|
65
|
+
(SELECT
|
66
|
+
ancestor_id,
|
67
|
+
descendant_id,
|
68
|
+
hierarchy,
|
69
|
+
invalidate,
|
70
|
+
SUM(count) AS count
|
71
|
+
FROM
|
72
|
+
(SELECT
|
73
|
+
r1.ancestor_id,
|
74
|
+
r2.descendant_id,
|
75
|
+
CASE
|
76
|
+
WHEN r1.descendant_id = r2.ancestor_id AND (r1.hierarchy > 0 OR r2.hierarchy > 0)
|
77
|
+
THEN r1.hierarchy + r2.hierarchy
|
78
|
+
WHEN r1.descendant_id != r2.ancestor_id
|
79
|
+
THEN r1.hierarchy + r2.hierarchy + 0
|
80
|
+
ELSE 0
|
81
|
+
END AS hierarchy,
|
82
|
+
CASE
|
83
|
+
WHEN r1.descendant_id = r2.ancestor_id AND (r1.invalidate > 0 OR r2.invalidate > 0)
|
84
|
+
THEN r1.invalidate + r2.invalidate
|
85
|
+
WHEN r1.descendant_id != r2.ancestor_id
|
86
|
+
THEN r1.invalidate + r2.invalidate + 1
|
87
|
+
ELSE 0
|
88
|
+
END AS invalidate,
|
89
|
+
r1.count * r2.count AS count
|
90
|
+
FROM
|
91
|
+
relations r1
|
116
92
|
JOIN
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
AND ranked.invalidate = criteria.invalidate
|
130
|
-
AND count >= row_number) selection_table
|
131
|
-
WHERE
|
132
|
-
deletion_table.id = selection_table.id
|
93
|
+
relations r2
|
94
|
+
ON
|
95
|
+
(r1.descendant_id = 4 AND r2.ancestor_id = 6 AND NOT (r1.ancestor_id = 4 AND r2.descendant_id = 6))) unique_rows
|
96
|
+
GROUP BY
|
97
|
+
ancestor_id,
|
98
|
+
descendant_id,
|
99
|
+
hierarchy,
|
100
|
+
invalidate) removed_relations
|
101
|
+
WHERE relations.ancestor_id = removed_relations.ancestor_id
|
102
|
+
AND relations.descendant_id = removed_relations.descendant_id
|
103
|
+
AND relations.hierarchy = removed_relations.hierarchy
|
104
|
+
AND relations.invalidate = removed_relations.invalidate
|
133
105
|
SQL
|
134
106
|
|
135
107
|
expect(harmonize_string(described_class.sql(relation)))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typed_dag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenProject GmbH
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- lib/typed_dag/rebuild_dag.rb
|
97
97
|
- lib/typed_dag/sql.rb
|
98
98
|
- lib/typed_dag/sql/add_closure.rb
|
99
|
+
- lib/typed_dag/sql/delete_zero_count.rb
|
99
100
|
- lib/typed_dag/sql/get_circular.rb
|
100
101
|
- lib/typed_dag/sql/helper.rb
|
101
102
|
- lib/typed_dag/sql/insert_closure_of_depth.rb
|