alf-sql 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,9 @@
1
- # 0.15.0 / FIX ME
1
+ # 0.16.0 / 2014-02-18
2
+
3
+ * Fix SQL compilation of projections over set operators (union, intersect,
4
+ minus).
5
+
6
+ # 0.15.0 / 2013-11-01
2
7
 
3
8
  * Enhancements
4
9
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../alf-core
3
3
  specs:
4
- alf-core (0.15.0)
4
+ alf-core (0.16.0)
5
5
  domain (~> 1.0)
6
6
  myrrha (~> 3.0)
7
7
  path (~> 1.3)
@@ -1 +1 @@
1
- require_relative "alf/sql"
1
+ require_relative "alf/sql"
@@ -56,7 +56,13 @@ module Alf
56
56
  end
57
57
 
58
58
  def on_join(plan, expr, left, right)
59
- rewrite(plan, expr, left, Processor::Join, [right.sexpr])
59
+ if right.sexpr.is_table_dee?
60
+ rewrite(plan, expr, left, Processor::SemiJoin, [right.sexpr, false])
61
+ elsif left.sexpr.is_table_dee?
62
+ rewrite(plan, expr, right, Processor::SemiJoin, [left.sexpr, false])
63
+ else
64
+ rewrite(plan, expr, left, Processor::Join, [right.sexpr])
65
+ end
60
66
  end
61
67
 
62
68
  def on_matching(plan, expr, left, right)
@@ -1,2 +1,2 @@
1
- require "alf-core"
2
1
  require "sexpr"
2
+ require "alf-core"
@@ -15,6 +15,10 @@ module Alf
15
15
  false
16
16
  end
17
17
 
18
+ def is_table_dee?
19
+ from_clause.nil? && select_list.is_table_dee?
20
+ end
21
+
18
22
  def distinct?
19
23
  set_quantifier.distinct?
20
24
  end
@@ -10,6 +10,10 @@ module Alf
10
10
  }
11
11
  end
12
12
 
13
+ def is_table_dee?
14
+ Builder::IS_TABLE_DEE == self
15
+ end
16
+
13
17
  def knows?(as_name)
14
18
  find_child{|child| child.as_name == as_name }
15
19
  end
@@ -23,6 +23,10 @@ module Alf
23
23
  true
24
24
  end
25
25
 
26
+ def is_table_dee?
27
+ false
28
+ end
29
+
26
30
  def distinct?
27
31
  set_quantifier.distinct?
28
32
  end
@@ -33,7 +33,8 @@ module Alf
33
33
  :set_operator?,
34
34
  :limit_or_offset?,
35
35
  :join?,
36
- :should_be_reused?
36
+ :should_be_reused?,
37
+ :is_table_dee?
37
38
 
38
39
  # to_xxx
39
40
 
@@ -10,6 +10,13 @@ module Alf
10
10
  end
11
11
  attr_reader :attributes, :on_empty
12
12
 
13
+ def on_set_operator(sexpr)
14
+ apply(builder.from_self(sexpr))
15
+ end
16
+ alias :on_union :on_set_operator
17
+ alias :on_except :on_set_operator
18
+ alias :on_intersect :on_set_operator
19
+
13
20
  def on_select_exp(sexpr)
14
21
  catch(:empty){ return super(sexpr) }
15
22
  send("select_#{on_empty}", sexpr)
@@ -24,19 +24,27 @@ module Alf
24
24
  private
25
25
 
26
26
  def apply_join_strategy(left, right)
27
- commons = left.to_attr_list & right.to_attr_list
28
- subquery = Clip.new(commons, :star, builder).call(right)
29
- if commons.size == 0
30
- predicate = builder.exists(subquery)
31
- elsif commons.size == 1
32
- identifier = left.desaliaser[commons.to_a.first]
33
- predicate = Predicate::Factory.in(identifier, subquery)
27
+ predicate = build_semijoin_predicate(left, right)
28
+ expand_where_clause(left, negate ? !predicate : predicate)
29
+ end
30
+
31
+ def build_semijoin_predicate(left, right)
32
+ if right.is_table_dee?
33
+ right.where_clause.predicate
34
34
  else
35
- join_pre = join_predicate(left, subquery, commons)
36
- subquery = expand_where_clause(subquery, join_pre)
37
- predicate = builder.exists(subquery)
35
+ commons = left.to_attr_list & right.to_attr_list
36
+ subquery = Clip.new(commons, :star, builder).call(right)
37
+ if commons.size == 0
38
+ builder.exists(subquery)
39
+ elsif commons.size == 1
40
+ identifier = left.desaliaser[commons.to_a.first]
41
+ Predicate::Factory.in(identifier, subquery)
42
+ else
43
+ join_pre = join_predicate(left, subquery, commons)
44
+ subquery = expand_where_clause(subquery, join_pre)
45
+ builder.exists(subquery)
46
+ end
38
47
  end
39
- expand_where_clause(left, negate ? !predicate : predicate)
40
48
  end
41
49
 
42
50
  def expand_where_clause(sexpr, predicate)
@@ -3,7 +3,7 @@ module Alf
3
3
  module Version
4
4
 
5
5
  MAJOR = 0
6
- MINOR = 15
6
+ MINOR = 16
7
7
  TINY = 0
8
8
 
9
9
  def self.to_s
@@ -13,4 +13,4 @@ module Alf
13
13
  end
14
14
  VERSION = Version.to_s
15
15
  end
16
- end
16
+ end
@@ -28,7 +28,7 @@ module Helpers
28
28
  sexpr [:intersect, distinct, left, right]
29
29
  end
30
30
 
31
- def select_is_table_dee(where)
31
+ def select_is_table_dee(where = nil)
32
32
  exists = Alf::Predicate::Grammar.sexpr([:exists, where])
33
33
  sexpr [:select_exp, all,
34
34
  [:select_list,
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ module Sql
4
+ describe SelectExp, "is_table_dee?" do
5
+
6
+ subject{ expr.is_table_dee? }
7
+
8
+ context 'when normal select' do
9
+ let(:expr){ select_all }
10
+
11
+ it{ should be_false }
12
+ end
13
+
14
+ context 'when a select is table dee' do
15
+ let(:expr){ select_is_table_dee }
16
+
17
+ it{ should be_true }
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ module Sql
4
+ describe SelectList, "is_table_dee" do
5
+
6
+ subject{ expr.is_table_dee? }
7
+
8
+ context 'on a normal select list' do
9
+ let(:expr){ select_list }
10
+
11
+ it{ should be_false }
12
+ end
13
+
14
+ context 'on a is_table_dee select list' do
15
+ let(:expr){ Builder::IS_TABLE_DEE.dup }
16
+
17
+ it{ should be_true }
18
+ end
19
+
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alf-sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-31 00:00:00.000000000 Z
12
+ date: 2014-02-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -44,13 +44,13 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  version: '2.14'
46
46
  - !ruby/object:Gem::Dependency
47
- name: alf-core
47
+ name: sexpr
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 0.15.0
53
+ version: 0.6.0
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,23 +58,23 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 0.15.0
61
+ version: 0.6.0
62
62
  - !ruby/object:Gem::Dependency
63
- name: sexpr
63
+ name: alf-core
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
- - - ~>
67
+ - - '='
68
68
  - !ruby/object:Gem::Version
69
- version: 0.6.0
69
+ version: 0.16.0
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
- - - ~>
75
+ - - '='
76
76
  - !ruby/object:Gem::Version
77
- version: 0.6.0
77
+ version: 0.16.0
78
78
  description: This project implements an abstract SQL compiler for Alf expressions
79
79
  email:
80
80
  - blambeau at gmail.com
@@ -175,8 +175,10 @@ files:
175
175
  - spec/nodes/order_by_term/test_as_name.rb
176
176
  - spec/nodes/order_by_term/test_direction.rb
177
177
  - spec/nodes/order_by_term/test_qualifier.rb
178
+ - spec/nodes/select_exp/test_is_table_dee.rb
178
179
  - spec/nodes/select_exp/test_order_by_clause.rb
179
180
  - spec/nodes/select_item/test_as_name.rb
181
+ - spec/nodes/select_list/test_is_table_dee.rb
180
182
  - spec/predicate/nodes/exists/test_not.rb
181
183
  - spec/processor/clip/test_on_select_exp.rb
182
184
  - spec/processor/clip/test_on_select_list.rb
@@ -216,7 +218,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
218
  version: '0'
217
219
  segments:
218
220
  - 0
219
- hash: 3696231494975203070
221
+ hash: -2896068443355263749
220
222
  required_rubygems_version: !ruby/object:Gem::Requirement
221
223
  none: false
222
224
  requirements:
@@ -225,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
227
  version: '0'
226
228
  segments:
227
229
  - 0
228
- hash: 3696231494975203070
230
+ hash: -2896068443355263749
229
231
  requirements: []
230
232
  rubyforge_project:
231
233
  rubygems_version: 1.8.25