axiom-optimizer 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +2 -1
- data/.rubocop.yml +6 -0
- data/.travis.yml +16 -20
- data/CONTRIBUTING.md +1 -2
- data/Gemfile +3 -1
- data/Gemfile.devtools +28 -18
- data/README.md +7 -13
- data/TODO +6 -5
- data/axiom-optimizer.gemspec +3 -3
- data/config/flay.yml +1 -1
- data/config/reek.yml +5 -29
- data/config/rubocop.yml +16 -10
- data/lib/axiom/optimizer.rb +3 -7
- data/lib/axiom/optimizer/algebra/difference.rb +2 -2
- data/lib/axiom/optimizer/algebra/extension.rb +6 -6
- data/lib/axiom/optimizer/algebra/intersection.rb +2 -2
- data/lib/axiom/optimizer/algebra/join.rb +4 -4
- data/lib/axiom/optimizer/algebra/product.rb +4 -4
- data/lib/axiom/optimizer/algebra/projection.rb +5 -5
- data/lib/axiom/optimizer/algebra/rename.rb +10 -10
- data/lib/axiom/optimizer/algebra/restriction.rb +8 -9
- data/lib/axiom/optimizer/algebra/summarization.rb +7 -7
- data/lib/axiom/optimizer/algebra/union.rb +2 -2
- data/lib/axiom/optimizer/function.rb +4 -6
- data/lib/axiom/optimizer/function/binary.rb +2 -2
- data/lib/axiom/optimizer/function/connective/binary.rb +1 -1
- data/lib/axiom/optimizer/function/connective/negation.rb +1 -1
- data/lib/axiom/optimizer/function/predicate.rb +1 -1
- data/lib/axiom/optimizer/function/predicate/comparable.rb +8 -6
- data/lib/axiom/optimizer/function/predicate/enumerable.rb +2 -2
- data/lib/axiom/optimizer/function/unary.rb +1 -1
- data/lib/axiom/optimizer/relation/operation/binary.rb +12 -12
- data/lib/axiom/optimizer/relation/operation/reverse.rb +9 -9
- data/lib/axiom/optimizer/relation/operation/{order.rb → sorted.rb} +15 -15
- data/lib/axiom/optimizer/relation/operation/unary.rb +7 -7
- data/lib/axiom/optimizer/support/predicate_partition.rb +11 -13
- data/lib/axiom/optimizer/version.rb +1 -1
- data/spec/integration/axiom/algebra/difference/optimize_spec.rb +12 -12
- data/spec/integration/axiom/algebra/intersection/optimize_spec.rb +12 -12
- data/spec/integration/axiom/algebra/join/optimize_spec.rb +6 -6
- data/spec/integration/axiom/algebra/product/optimize_spec.rb +10 -10
- data/spec/integration/axiom/algebra/projection/optimize_spec.rb +14 -14
- data/spec/integration/axiom/algebra/rename/optimize_spec.rb +38 -38
- data/spec/integration/axiom/algebra/restriction/optimize_spec.rb +12 -12
- data/spec/integration/axiom/algebra/summarization/optimize_spec.rb +2 -2
- data/spec/integration/axiom/algebra/union/optimize_spec.rb +16 -16
- data/spec/integration/axiom/function/optimize_spec.rb +1 -1
- data/spec/integration/axiom/relation/operation/limit/optimize_spec.rb +20 -20
- data/spec/integration/axiom/relation/operation/offset/optimize_spec.rb +14 -14
- data/spec/integration/axiom/relation/operation/reverse/optimize_spec.rb +15 -15
- data/spec/integration/axiom/relation/operation/{order → sorted}/optimize_spec.rb +6 -6
- data/spec/integration/axiom/relation/optimize_spec.rb +1 -1
- data/spec/shared/function_connective_binary_optimize_behavior.rb +8 -2
- data/spec/shared/optimize_method_behavior.rb +0 -11
- data/spec/spec_helper.rb +9 -9
- data/spec/support/config_alias.rb +2 -0
- data/spec/unit/axiom/optimizer/algebra/extension/{order_operand → sorted_operand}/optimizable_predicate_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/algebra/extension/{order_operand → sorted_operand}/optimize_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimize_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimize_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/algebra/rename/{order_operand → sorted_operand}/optimizable_predicate_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/algebra/rename/{order_operand → sorted_operand}/optimize_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimize_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/algebra/restriction/predicate_spec.rb +5 -4
- data/spec/unit/axiom/optimizer/algebra/restriction/{order_operand → sorted_operand}/optimizable_predicate_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/algebra/restriction/{order_operand → sorted_operand}/optimize_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/class_methods/extension_default_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/algebra/summarization/{order_operand → sorted_operand}/optimizable_predicate_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/algebra/summarization/{order_operand → sorted_operand}/optimize_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/algebra/summarization/summarize_per_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimizable_predicate_spec.rb +4 -4
- data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimizable_predicate_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimizable_predicate_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimizable_predicate_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/function/util/class_methods/max_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/function/util/class_methods/min_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/optimizable/optimize_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/optimizable_predicate_spec.rb +1 -5
- data/spec/unit/axiom/optimizer/optimize_spec.rb +1 -5
- data/spec/unit/axiom/optimizer/relation/operation/binary/{order_left → sorted_left}/optimizable_predicate_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/relation/operation/binary/{order_left → sorted_left}/optimize_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/relation/operation/binary/{order_right → sorted_right}/optimizable_predicate_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/relation/operation/binary/{order_right → sorted_right}/optimize_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +4 -4
- data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/relation/operation/reverse/{order_operand → sorted_operand}/optimizable_predicate_spec.rb +3 -3
- data/spec/unit/axiom/optimizer/relation/operation/reverse/{order_operand → sorted_operand}/optimize_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +4 -4
- data/spec/unit/axiom/optimizer/relation/operation/{order → sorted}/one_limit_operand/optimizable_predicate_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/relation/operation/{order → sorted}/one_limit_operand/optimize_spec.rb +1 -1
- data/spec/unit/axiom/optimizer/relation/operation/{order/order_operand → sorted/sorted_operand}/optimizable_predicate_spec.rb +4 -4
- data/spec/unit/axiom/optimizer/relation/operation/{order/order_operand → sorted/sorted_operand}/optimize_spec.rb +5 -5
- data/spec/unit/axiom/optimizer/relation/operation/{order → sorted}/unoptimized_operand/optimizable_predicate_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/relation/operation/{order → sorted}/unoptimized_operand/optimize_spec.rb +2 -2
- data/spec/unit/axiom/optimizer/relation/operation/unary/{order_operand → sorted_operand}/optimizable_predicate_spec.rb +4 -4
- data/spec/unit/axiom/optimizer/relation/operation/unary/{order_operand → sorted_operand}/optimize_spec.rb +2 -2
- metadata +291 -47
- data/spec/support/ice_nine_config.rb +0 -6
@@ -15,7 +15,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
15
15
|
it { should be(relation) }
|
16
16
|
|
17
17
|
it 'does not execute body#each' do
|
18
|
-
body.
|
18
|
+
expect(body).not_to receive(:each)
|
19
19
|
subject
|
20
20
|
end
|
21
21
|
|
@@ -32,7 +32,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'does not execute body#each' do
|
35
|
-
body.
|
35
|
+
expect(body).not_to receive(:each)
|
36
36
|
subject
|
37
37
|
end
|
38
38
|
|
@@ -45,7 +45,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
45
45
|
it { should be(object) }
|
46
46
|
|
47
47
|
it 'does not execute body#each' do
|
48
|
-
body.
|
48
|
+
expect(body).not_to receive(:each)
|
49
49
|
subject
|
50
50
|
end
|
51
51
|
|
@@ -68,7 +68,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'does not execute body#each' do
|
71
|
-
body.
|
71
|
+
expect(body).not_to receive(:each)
|
72
72
|
subject
|
73
73
|
end
|
74
74
|
|
@@ -92,7 +92,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'does not execute body#each' do
|
95
|
-
body.
|
95
|
+
expect(body).not_to receive(:each)
|
96
96
|
subject
|
97
97
|
end
|
98
98
|
|
@@ -110,7 +110,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
110
110
|
end
|
111
111
|
|
112
112
|
it 'does not execute body#each' do
|
113
|
-
body.
|
113
|
+
expect(body).not_to receive(:each)
|
114
114
|
subject
|
115
115
|
end
|
116
116
|
|
@@ -128,7 +128,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
128
128
|
end
|
129
129
|
|
130
130
|
it 'does not execute body#each' do
|
131
|
-
body.
|
131
|
+
expect(body).not_to receive(:each)
|
132
132
|
subject
|
133
133
|
end
|
134
134
|
|
@@ -153,7 +153,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
153
153
|
end
|
154
154
|
|
155
155
|
it 'does not execute body#each' do
|
156
|
-
body.
|
156
|
+
expect(body).not_to receive(:each)
|
157
157
|
subject
|
158
158
|
end
|
159
159
|
|
@@ -175,18 +175,18 @@ describe Algebra::Restriction, '#optimize' do
|
|
175
175
|
end
|
176
176
|
|
177
177
|
it 'does not execute body#each' do
|
178
|
-
body.
|
178
|
+
expect(body).not_to receive(:each)
|
179
179
|
subject
|
180
180
|
end
|
181
181
|
|
182
182
|
it_should_behave_like 'an optimize method'
|
183
183
|
end
|
184
184
|
|
185
|
-
context 'with
|
185
|
+
context 'with a sorted operation' do
|
186
186
|
let(:operand) { relation.sort_by { |r| r.id } }
|
187
187
|
let(:predicate) { operand[:id].gte(1) }
|
188
188
|
|
189
|
-
it 'cancels out the
|
189
|
+
it 'cancels out the sorted' do
|
190
190
|
should eql(relation.restrict { predicate })
|
191
191
|
end
|
192
192
|
|
@@ -195,7 +195,7 @@ describe Algebra::Restriction, '#optimize' do
|
|
195
195
|
end
|
196
196
|
|
197
197
|
it 'does not execute body#each' do
|
198
|
-
body.
|
198
|
+
expect(body).not_to receive(:each)
|
199
199
|
subject
|
200
200
|
end
|
201
201
|
|
@@ -23,7 +23,7 @@ describe Algebra::Summarization, '#optimize' do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'does not execute body#each' do
|
26
|
-
body.
|
26
|
+
expect(body).not_to receive(:each)
|
27
27
|
subject
|
28
28
|
end
|
29
29
|
|
@@ -40,7 +40,7 @@ describe Algebra::Summarization, '#optimize' do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'does not execute body#each' do
|
43
|
-
body.
|
43
|
+
expect(body).not_to receive(:each)
|
44
44
|
subject
|
45
45
|
end
|
46
46
|
|
@@ -14,8 +14,8 @@ describe Algebra::Union, '#optimize' do
|
|
14
14
|
|
15
15
|
before do
|
16
16
|
# skip dup of the left and right body to avoid clearing the method stubs
|
17
|
-
left_body.
|
18
|
-
right_body.
|
17
|
+
allow(left_body).to receive(:frozen?).and_return(true)
|
18
|
+
allow(right_body).to receive(:frozen?).and_return(true)
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'left is an empty relation' do
|
@@ -29,12 +29,12 @@ describe Algebra::Union, '#optimize' do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'does not execute left_body#each' do
|
32
|
-
left_body.
|
32
|
+
expect(left_body).not_to receive(:each)
|
33
33
|
subject
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'does not execute right_body#each' do
|
37
|
-
right_body.
|
37
|
+
expect(right_body).not_to receive(:each)
|
38
38
|
subject
|
39
39
|
end
|
40
40
|
|
@@ -52,12 +52,12 @@ describe Algebra::Union, '#optimize' do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'does not execute left_body#each' do
|
55
|
-
left_body.
|
55
|
+
expect(left_body).not_to receive(:each)
|
56
56
|
subject
|
57
57
|
end
|
58
58
|
|
59
59
|
it 'does not execute right_body#each' do
|
60
|
-
right_body.
|
60
|
+
expect(right_body).not_to receive(:each)
|
61
61
|
subject
|
62
62
|
end
|
63
63
|
|
@@ -75,12 +75,12 @@ describe Algebra::Union, '#optimize' do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
it 'does not execute left_body#each' do
|
78
|
-
left_body.
|
78
|
+
expect(left_body).not_to receive(:each)
|
79
79
|
subject
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'does not execute right_body#each' do
|
83
|
-
right_body.
|
83
|
+
expect(right_body).not_to receive(:each)
|
84
84
|
subject
|
85
85
|
end
|
86
86
|
|
@@ -98,12 +98,12 @@ describe Algebra::Union, '#optimize' do
|
|
98
98
|
end
|
99
99
|
|
100
100
|
it 'does not execute left_body#each' do
|
101
|
-
left_body.
|
101
|
+
expect(left_body).not_to receive(:each)
|
102
102
|
subject
|
103
103
|
end
|
104
104
|
|
105
105
|
it 'does not execute right_body#each' do
|
106
|
-
right_body.
|
106
|
+
expect(right_body).not_to receive(:each)
|
107
107
|
subject
|
108
108
|
end
|
109
109
|
|
@@ -124,14 +124,14 @@ describe Algebra::Union, '#optimize' do
|
|
124
124
|
|
125
125
|
it 'does not execute left_body#each' do
|
126
126
|
pending 'TODO: should only compare left and right with #eql? if they are materialized' do
|
127
|
-
left_body.
|
127
|
+
expect(left_body).to_not receive(:each)
|
128
128
|
subject
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
132
|
it 'does not execute right_body#each' do
|
133
133
|
pending 'TODO: should only compare left and right with #eql? if they are materialized' do
|
134
|
-
right_body.
|
134
|
+
expect(right_body).to_not receive(:each)
|
135
135
|
subject
|
136
136
|
end
|
137
137
|
end
|
@@ -153,13 +153,13 @@ describe Algebra::Union, '#optimize' do
|
|
153
153
|
|
154
154
|
it 'executes left_body#each' do
|
155
155
|
pending 'only receive #each once'
|
156
|
-
left_body.
|
156
|
+
expect(left_body).to receive(:each)
|
157
157
|
subject
|
158
158
|
end
|
159
159
|
|
160
160
|
it 'executes right_body#each' do
|
161
161
|
pending 'only receive #each once'
|
162
|
-
right_body.
|
162
|
+
expect(right_body).to receive(:each)
|
163
163
|
subject
|
164
164
|
end
|
165
165
|
|
@@ -173,12 +173,12 @@ describe Algebra::Union, '#optimize' do
|
|
173
173
|
it { should be(object) }
|
174
174
|
|
175
175
|
it 'executes left_body#each' do
|
176
|
-
left_body.
|
176
|
+
expect(left_body).to receive(:each)
|
177
177
|
subject
|
178
178
|
end
|
179
179
|
|
180
180
|
it 'executes right_body#each' do
|
181
|
-
right_body.
|
181
|
+
expect(right_body).to receive(:each)
|
182
182
|
subject
|
183
183
|
end
|
184
184
|
|
@@ -8,8 +8,8 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
8
8
|
let(:body) { LazyEnumerable.new([[1], [2], [3]]) }
|
9
9
|
let(:relation) { Relation.new([[:id, Integer]], body) }
|
10
10
|
let(:directions) { [relation[:id]] }
|
11
|
-
let(:
|
12
|
-
let(:operand) {
|
11
|
+
let(:sorted) { relation.sort_by { directions } }
|
12
|
+
let(:operand) { sorted }
|
13
13
|
let(:limit) { 1 }
|
14
14
|
let(:object) { described_class.new(operand, limit) }
|
15
15
|
|
@@ -23,30 +23,30 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'does not execute body#each' do
|
26
|
-
body.
|
26
|
+
expect(body).not_to receive(:each)
|
27
27
|
subject
|
28
28
|
end
|
29
29
|
|
30
30
|
it_should_behave_like 'an optimize method'
|
31
31
|
end
|
32
32
|
|
33
|
-
context 'containing
|
33
|
+
context 'containing a sorted operation' do
|
34
34
|
it { should be(object) }
|
35
35
|
|
36
36
|
it 'does not execute body#each' do
|
37
|
-
body.
|
37
|
+
expect(body).not_to receive(:each)
|
38
38
|
subject
|
39
39
|
end
|
40
40
|
|
41
41
|
it_should_behave_like 'an optimize method'
|
42
42
|
end
|
43
43
|
|
44
|
-
context 'containing an optimizable
|
45
|
-
let(:operand) {
|
44
|
+
context 'containing an optimizable sorted operation' do
|
45
|
+
let(:operand) { sorted.rename({}) }
|
46
46
|
|
47
47
|
it { should be_kind_of(described_class) }
|
48
48
|
|
49
|
-
its(:operand) { should be(
|
49
|
+
its(:operand) { should be(sorted) }
|
50
50
|
|
51
51
|
its(:limit) { should == 1 }
|
52
52
|
|
@@ -55,7 +55,7 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'does not execute body#each' do
|
58
|
-
body.
|
58
|
+
expect(body).not_to receive(:each)
|
59
59
|
subject
|
60
60
|
end
|
61
61
|
|
@@ -63,12 +63,12 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
context 'containing a more restrictive object operation' do
|
66
|
-
let(:operand) {
|
67
|
-
let(:limit) { 10
|
66
|
+
let(:operand) { sorted.take(5) }
|
67
|
+
let(:limit) { 10 }
|
68
68
|
|
69
69
|
it { should be_kind_of(described_class) }
|
70
70
|
|
71
|
-
its(:operand) { should be(
|
71
|
+
its(:operand) { should be(sorted) }
|
72
72
|
|
73
73
|
it 'uses the more restrictive object' do
|
74
74
|
expect(subject.limit).to be(5)
|
@@ -79,7 +79,7 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'does not execute body#each' do
|
82
|
-
body.
|
82
|
+
expect(body).not_to receive(:each)
|
83
83
|
subject
|
84
84
|
end
|
85
85
|
|
@@ -87,12 +87,12 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
87
87
|
end
|
88
88
|
|
89
89
|
context 'containing a less restrictive object operation' do
|
90
|
-
let(:operand) {
|
91
|
-
let(:limit) { 5
|
90
|
+
let(:operand) { sorted.take(10) }
|
91
|
+
let(:limit) { 5 }
|
92
92
|
|
93
93
|
it { should be_kind_of(described_class) }
|
94
94
|
|
95
|
-
its(:operand) { should be(
|
95
|
+
its(:operand) { should be(sorted) }
|
96
96
|
|
97
97
|
it 'uses the more restrictive object' do
|
98
98
|
expect(subject.limit).to be(5)
|
@@ -103,7 +103,7 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
103
103
|
end
|
104
104
|
|
105
105
|
it 'does not execute body#each' do
|
106
|
-
body.
|
106
|
+
expect(body).not_to receive(:each)
|
107
107
|
subject
|
108
108
|
end
|
109
109
|
|
@@ -111,8 +111,8 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
111
111
|
end
|
112
112
|
|
113
113
|
context 'containing a similar object operation' do
|
114
|
-
let(:operand) {
|
115
|
-
let(:limit) { 10
|
114
|
+
let(:operand) { sorted.take(10) }
|
115
|
+
let(:limit) { 10 }
|
116
116
|
|
117
117
|
it { should be(operand) }
|
118
118
|
|
@@ -121,7 +121,7 @@ describe Relation::Operation::Limit, '#optimize' do
|
|
121
121
|
end
|
122
122
|
|
123
123
|
it 'does not execute body#each' do
|
124
|
-
body.
|
124
|
+
expect(body).not_to receive(:each)
|
125
125
|
subject
|
126
126
|
end
|
127
127
|
|
@@ -8,45 +8,45 @@ describe Relation::Operation::Offset, '#optimize' do
|
|
8
8
|
let(:body) { LazyEnumerable.new([[1], [2], [3]]) }
|
9
9
|
let(:relation) { Relation.new([[:id, Integer]], body) }
|
10
10
|
let(:directions) { [relation[:id]] }
|
11
|
-
let(:
|
12
|
-
let(:operand) {
|
11
|
+
let(:sorted) { relation.sort_by { directions } }
|
12
|
+
let(:operand) { sorted }
|
13
13
|
let(:offset) { 1 }
|
14
14
|
let(:object) { described_class.new(operand, offset) }
|
15
15
|
|
16
16
|
context 'with an object of 0' do
|
17
17
|
let(:offset) { 0 }
|
18
18
|
|
19
|
-
it { should be(
|
19
|
+
it { should be(sorted) }
|
20
20
|
|
21
21
|
it 'returns an equivalent relation to the unoptimized operation' do
|
22
22
|
should == object
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'does not execute body#each' do
|
26
|
-
body.
|
26
|
+
expect(body).not_to receive(:each)
|
27
27
|
subject
|
28
28
|
end
|
29
29
|
|
30
30
|
it_should_behave_like 'an optimize method'
|
31
31
|
end
|
32
32
|
|
33
|
-
context 'containing
|
33
|
+
context 'containing a sorted operation' do
|
34
34
|
it { should be(object) }
|
35
35
|
|
36
36
|
it 'does not execute body#each' do
|
37
|
-
body.
|
37
|
+
expect(body).not_to receive(:each)
|
38
38
|
subject
|
39
39
|
end
|
40
40
|
|
41
41
|
it_should_behave_like 'an optimize method'
|
42
42
|
end
|
43
43
|
|
44
|
-
context 'containing an optimizable
|
45
|
-
let(:operand) {
|
44
|
+
context 'containing an optimizable sorted operation' do
|
45
|
+
let(:operand) { sorted.rename({}) }
|
46
46
|
|
47
47
|
it { should be_kind_of(described_class) }
|
48
48
|
|
49
|
-
its(:operand) { should be(
|
49
|
+
its(:operand) { should be(sorted) }
|
50
50
|
|
51
51
|
its(:offset) { should == 1 }
|
52
52
|
|
@@ -55,7 +55,7 @@ describe Relation::Operation::Offset, '#optimize' do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'does not execute body#each' do
|
58
|
-
body.
|
58
|
+
expect(body).not_to receive(:each)
|
59
59
|
subject
|
60
60
|
end
|
61
61
|
|
@@ -63,12 +63,12 @@ describe Relation::Operation::Offset, '#optimize' do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
context 'containing an object operation' do
|
66
|
-
let(:operand) {
|
67
|
-
let(:offset) { 10
|
66
|
+
let(:operand) { sorted.drop(5) }
|
67
|
+
let(:offset) { 10 }
|
68
68
|
|
69
69
|
it { should be_kind_of(described_class) }
|
70
70
|
|
71
|
-
its(:operand) { should be(
|
71
|
+
its(:operand) { should be(sorted) }
|
72
72
|
|
73
73
|
it 'adds the object of the operations' do
|
74
74
|
expect(subject.offset).to be(15)
|
@@ -79,7 +79,7 @@ describe Relation::Operation::Offset, '#optimize' do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'does not execute body#each' do
|
82
|
-
body.
|
82
|
+
expect(body).not_to receive(:each)
|
83
83
|
subject
|
84
84
|
end
|
85
85
|
|