alf-sql 0.15.0 → 0.16.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,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