typed_dag 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- def harmonize_string(string)
8
- string.squish.gsub('( ', '(').gsub(' )', ')')
9
- end
10
-
11
- if ActiveRecord::Base.connection.adapter_name == 'Mysql2'
12
- it 'produces the correct sql for mysql' do
13
- expected_sql = <<-SQL
14
- DELETE
15
- deletion_table
16
- FROM
17
- relations deletion_table
18
- INNER JOIN
19
- (SELECT id
20
- FROM (
21
- SELECT COUNT(*) count, ancestor_id, descendant_id, hierarchy, invalidate
22
- FROM (
23
- SELECT
24
- r1.ancestor_id,
25
- r2.descendant_id,
26
- CASE
27
- WHEN r1.descendant_id = r2.ancestor_id AND (r1.hierarchy > 0 OR r2.hierarchy > 0)
28
- THEN r1.hierarchy + r2.hierarchy
29
- WHEN r1.descendant_id != r2.ancestor_id
30
- THEN r1.hierarchy + r2.hierarchy + 0
31
- ELSE 0
32
- END AS hierarchy ,
33
- CASE
34
- WHEN r1.descendant_id = r2.ancestor_id AND (r1.invalidate > 0 OR r2.invalidate > 0)
35
- THEN r1.invalidate + r2.invalidate
36
- WHEN r1.descendant_id != r2.ancestor_id
37
- THEN r1.invalidate + r2.invalidate + 1
38
- ELSE 0
39
- END AS invalidate
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
- (SELECT
51
- id,
52
- ancestor_id,
53
- descendant_id,
54
- hierarchy,
55
- invalidate,
56
- greatest(@cur_count := IF(@cur_ancestor_id = ancestor_id AND @cur_descendant_id = descendant_id AND @cur_hierarchy = hierarchy AND @cur_invalidate = invalidate,
57
- @cur_count + 1, 1),
58
- least(0, @cur_ancestor_id := ancestor_id, @cur_descendant_id := descendant_id, @cur_hierarchy := hierarchy, @cur_invalidate := invalidate)) AS row_number
59
- FROM relations
60
- CROSS JOIN (SELECT @cur_count := NULL, @cur_ancestor_id := NULL, @cur_descendant_id := NULL, @cur_hierarchy := NULL, @cur_invalidate := NULL) params_initialization
61
- WHERE
62
- ancestor_id IN (SELECT ancestor_id FROM relations WHERE descendant_id = 4) OR ancestor_id = 4
63
- AND
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
- DELETE
60
+ UPDATE
61
+ relations
62
+ SET
63
+ count = relations.count - removed_relations.count
83
64
  FROM
84
- relations deletion_table
85
- USING
86
- (SELECT id
87
- FROM (
88
- SELECT COUNT(*) count, ancestor_id, descendant_id, hierarchy, invalidate
89
- FROM (
90
- SELECT
91
- r1.ancestor_id,
92
- r2.descendant_id,
93
- CASE
94
- WHEN r1.descendant_id = r2.ancestor_id AND (r1.hierarchy > 0 OR r2.hierarchy > 0)
95
- THEN r1.hierarchy + r2.hierarchy
96
- WHEN r1.descendant_id != r2.ancestor_id
97
- THEN r1.hierarchy + r2.hierarchy + 0
98
- ELSE 0
99
- END AS hierarchy ,
100
- CASE
101
- WHEN r1.descendant_id = r2.ancestor_id AND (r1.invalidate > 0 OR r2.invalidate > 0)
102
- THEN r1.invalidate + r2.invalidate
103
- WHEN r1.descendant_id != r2.ancestor_id
104
- THEN r1.invalidate + r2.invalidate + 1
105
- ELSE 0
106
- END AS invalidate
107
-
108
- FROM
109
- relations r1
110
- JOIN
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
- (SELECT *, ROW_NUMBER() OVER(
118
- PARTITION BY ancestor_id, descendant_id, hierarchy, invalidate
119
- )
120
- FROM
121
- relations
122
- WHERE
123
- ancestor_id IN (SELECT ancestor_id FROM relations WHERE descendant_id = 4) OR ancestor_id = 4
124
- AND
125
- descendant_id IN (SELECT descendant_id FROM relations WHERE ancestor_id = 4)) ranked
126
- ON ranked.ancestor_id = criteria.ancestor_id
127
- AND ranked.descendant_id = criteria.descendant_id
128
- AND ranked.hierarchy = criteria.hierarchy
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: 1.0.1
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: 2017-12-04 00:00:00.000000000 Z
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