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.
@@ -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