bmg 0.9.1 → 0.10.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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/lib/bmg/algebra.rb +2 -26
  3. data/lib/bmg/algebra/shortcuts.rb +14 -0
  4. data/lib/bmg/operator/autowrap.rb +32 -2
  5. data/lib/bmg/operator/constants.rb +12 -0
  6. data/lib/bmg/operator/image.rb +10 -0
  7. data/lib/bmg/operator/rename.rb +8 -0
  8. data/lib/bmg/relation/spied.rb +4 -9
  9. data/lib/bmg/sequel.rb +53 -2
  10. data/lib/bmg/sequel/relation.rb +24 -19
  11. data/lib/bmg/sequel/translator.rb +153 -0
  12. data/lib/bmg/sequel/type_inference.rb +42 -0
  13. data/lib/bmg/sql.rb +20 -0
  14. data/lib/bmg/sql/builder.rb +177 -0
  15. data/lib/bmg/sql/dialect.rb +15 -0
  16. data/lib/bmg/sql/ext/predicate.rb +23 -0
  17. data/lib/bmg/sql/ext/predicate/and.rb +9 -0
  18. data/lib/bmg/sql/ext/predicate/contradiction.rb +10 -0
  19. data/lib/bmg/sql/ext/predicate/dyadic_comp.rb +12 -0
  20. data/lib/bmg/sql/ext/predicate/eq.rb +9 -0
  21. data/lib/bmg/sql/ext/predicate/exists.rb +12 -0
  22. data/lib/bmg/sql/ext/predicate/expr.rb +18 -0
  23. data/lib/bmg/sql/ext/predicate/gt.rb +9 -0
  24. data/lib/bmg/sql/ext/predicate/gte.rb +9 -0
  25. data/lib/bmg/sql/ext/predicate/identifier.rb +10 -0
  26. data/lib/bmg/sql/ext/predicate/in.rb +29 -0
  27. data/lib/bmg/sql/ext/predicate/literal.rb +10 -0
  28. data/lib/bmg/sql/ext/predicate/lt.rb +9 -0
  29. data/lib/bmg/sql/ext/predicate/lte.rb +9 -0
  30. data/lib/bmg/sql/ext/predicate/nadic_bool.rb +16 -0
  31. data/lib/bmg/sql/ext/predicate/native.rb +9 -0
  32. data/lib/bmg/sql/ext/predicate/neq.rb +9 -0
  33. data/lib/bmg/sql/ext/predicate/not.rb +12 -0
  34. data/lib/bmg/sql/ext/predicate/or.rb +9 -0
  35. data/lib/bmg/sql/ext/predicate/qualified_identifier.rb +12 -0
  36. data/lib/bmg/sql/ext/predicate/tautology.rb +10 -0
  37. data/lib/bmg/sql/grammar.rb +45 -0
  38. data/lib/bmg/sql/grammar.sexp.yml +96 -0
  39. data/lib/bmg/sql/nodes/column_name.rb +25 -0
  40. data/lib/bmg/sql/nodes/cross_join.rb +28 -0
  41. data/lib/bmg/sql/nodes/except.rb +14 -0
  42. data/lib/bmg/sql/nodes/expr.rb +94 -0
  43. data/lib/bmg/sql/nodes/from_clause.rb +24 -0
  44. data/lib/bmg/sql/nodes/inner_join.rb +37 -0
  45. data/lib/bmg/sql/nodes/intersect.rb +14 -0
  46. data/lib/bmg/sql/nodes/limit_clause.rb +19 -0
  47. data/lib/bmg/sql/nodes/literal.rb +18 -0
  48. data/lib/bmg/sql/nodes/name_intro.rb +23 -0
  49. data/lib/bmg/sql/nodes/native_table_as.rb +31 -0
  50. data/lib/bmg/sql/nodes/offset_clause.rb +19 -0
  51. data/lib/bmg/sql/nodes/order_by_clause.rb +25 -0
  52. data/lib/bmg/sql/nodes/order_by_term.rb +30 -0
  53. data/lib/bmg/sql/nodes/qualified_name.rb +32 -0
  54. data/lib/bmg/sql/nodes/range_var_name.rb +17 -0
  55. data/lib/bmg/sql/nodes/select_exp.rb +109 -0
  56. data/lib/bmg/sql/nodes/select_item.rb +37 -0
  57. data/lib/bmg/sql/nodes/select_list.rb +35 -0
  58. data/lib/bmg/sql/nodes/select_star.rb +22 -0
  59. data/lib/bmg/sql/nodes/set_operator.rb +68 -0
  60. data/lib/bmg/sql/nodes/set_quantifier.rb +20 -0
  61. data/lib/bmg/sql/nodes/subquery_as.rb +28 -0
  62. data/lib/bmg/sql/nodes/table_as.rb +31 -0
  63. data/lib/bmg/sql/nodes/table_name.rb +17 -0
  64. data/lib/bmg/sql/nodes/union.rb +14 -0
  65. data/lib/bmg/sql/nodes/where_clause.rb +20 -0
  66. data/lib/bmg/sql/nodes/with_exp.rb +51 -0
  67. data/lib/bmg/sql/nodes/with_spec.rb +24 -0
  68. data/lib/bmg/sql/processor.rb +85 -0
  69. data/lib/bmg/sql/processor/all.rb +17 -0
  70. data/lib/bmg/sql/processor/clip.rb +57 -0
  71. data/lib/bmg/sql/processor/distinct.rb +17 -0
  72. data/lib/bmg/sql/processor/flatten.rb +24 -0
  73. data/lib/bmg/sql/processor/from_self.rb +29 -0
  74. data/lib/bmg/sql/processor/join.rb +80 -0
  75. data/lib/bmg/sql/processor/join_support.rb +28 -0
  76. data/lib/bmg/sql/processor/limit_offset.rb +30 -0
  77. data/lib/bmg/sql/processor/merge.rb +49 -0
  78. data/lib/bmg/sql/processor/order_by.rb +32 -0
  79. data/lib/bmg/sql/processor/rename.rb +25 -0
  80. data/lib/bmg/sql/processor/reorder.rb +21 -0
  81. data/lib/bmg/sql/processor/requalify.rb +24 -0
  82. data/lib/bmg/sql/processor/semi_join.rb +68 -0
  83. data/lib/bmg/sql/processor/star.rb +17 -0
  84. data/lib/bmg/sql/processor/where.rb +25 -0
  85. data/lib/bmg/sql/relation.rb +141 -0
  86. data/lib/bmg/sql/version.rb +16 -0
  87. data/lib/bmg/support.rb +1 -0
  88. data/lib/bmg/support/keys.rb +59 -0
  89. data/lib/bmg/type.rb +95 -14
  90. data/lib/bmg/version.rb +2 -2
  91. data/tasks/test.rake +9 -2
  92. metadata +97 -5
@@ -0,0 +1,25 @@
1
+ module Bmg
2
+ module Sql
3
+ class Processor
4
+ class Where < Processor
5
+
6
+ def initialize(predicate, builder)
7
+ super(builder)
8
+ @predicate = predicate
9
+ end
10
+
11
+ def on_select_exp(sexpr)
12
+ pred = @predicate.rename(sexpr.desaliaser).sexpr
13
+ if sexpr.where_clause
14
+ anded = [:and, sexpr.where_clause.predicate, pred ]
15
+ anded = Predicate::Grammar.sexpr(anded)
16
+ sexpr.with_update(:where_clause, [ :where_clause, anded ])
17
+ else
18
+ sexpr.with_insert(4, [ :where_clause, pred ])
19
+ end
20
+ end
21
+
22
+ end # class Where
23
+ end # class Processor
24
+ end # module Sql
25
+ end # module Bmg
@@ -0,0 +1,141 @@
1
+ module Bmg
2
+ module Sql
3
+ class Relation
4
+ include Bmg::Relation
5
+
6
+ def initialize(type, builder, expr)
7
+ @type = type
8
+ @builder = builder
9
+ @expr = expr
10
+ end
11
+ attr_reader :type
12
+
13
+ protected
14
+
15
+ attr_reader :expr, :builder
16
+
17
+ public
18
+
19
+ def each(&bl)
20
+ raise NotImplementedError
21
+ end
22
+
23
+ def delete
24
+ raise NotImplementedError
25
+ end
26
+
27
+ def insert(arg)
28
+ raise NotImplementedError
29
+ end
30
+
31
+ def update(arg)
32
+ raise NotImplementedError
33
+ end
34
+
35
+ protected ## optimization
36
+
37
+ def _allbut(type, butlist)
38
+ preserved_key = self.type.knows_keys? && self.type.keys.find{|k|
39
+ (k & butlist).empty?
40
+ }
41
+ expr = before_use(self.expr)
42
+ expr = Processor::Clip.new(butlist, true, :is_table_dee, builder).call(expr)
43
+ expr = Processor::Distinct.new(builder).call(expr) unless preserved_key
44
+ _instance(type, builder, expr)
45
+ end
46
+
47
+ def _matching(type, right, on)
48
+ if right_expr = extract_compatible_sexpr(right)
49
+ expr = before_use(self.expr)
50
+ expr = Processor::SemiJoin.new(right_expr, on, builder).call(expr)
51
+ _instance(type, builder, expr)
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ def _page(type, ordering, page_index, options)
58
+ limit = options[:page_size] || Operator::Page::DEFAULT_OPTIONS[:page_size]
59
+ offset = (page_index - 1) * limit
60
+ expr = before_use(self.expr)
61
+ expr = Processor::OrderBy.new(ordering, builder).call(expr)
62
+ expr = Processor::LimitOffset.new(limit, offset, builder).call(expr)
63
+ _instance(type, builder, expr)
64
+ end
65
+
66
+ def _project(type, attrlist)
67
+ preserved_key = self.type.knows_keys? && self.type.keys.find{|k|
68
+ k.all?{|a| attrlist.include?(a) }
69
+ }
70
+ expr = before_use(self.expr)
71
+ expr = Processor::Clip.new(attrlist, false, :is_table_dee, builder).call(expr)
72
+ expr = Processor::Distinct.new(builder).call(expr) unless preserved_key
73
+ _instance(type, builder, expr)
74
+ end
75
+
76
+ def _rename(type, renaming)
77
+ expr = before_use(self.expr)
78
+ expr = Processor::Rename.new(renaming, builder).call(self.expr)
79
+ _instance(type, builder, expr)
80
+ end
81
+
82
+ def _restrict(type, predicate)
83
+ expr = before_use(self.expr)
84
+ expr = Processor::Where.new(predicate, builder).call(self.expr)
85
+ _instance(type, builder, expr)
86
+ end
87
+
88
+ def _union(type, right, options)
89
+ if right_expr = extract_compatible_sexpr(right)
90
+ expr = before_use(self.expr)
91
+ expr = Processor::Merge.new(:union, !!options[:all], right_expr, builder).call(self.expr)
92
+ puts expr.each.to_a.inspect
93
+ _instance(type, builder, expr)
94
+ else
95
+ super
96
+ end
97
+ end
98
+
99
+ # Build a new relation instance for some new type & expression
100
+ #
101
+ # This method can be overriden by subclasses to provide their
102
+ # own class instance
103
+ def _instance(type, builder, expr)
104
+ Relation.new(type, builder, expr)
105
+ end
106
+
107
+ # Provides subclasses with a chance to manipulate the expression
108
+ # before it is reused in another one, following an algebra method
109
+ # call
110
+ def before_use(expr)
111
+ expr
112
+ end
113
+
114
+ # Given a Relation operand (typically a right operand in a binary
115
+ # expression), extract the associated `expr` if it is compatible
116
+ # with self for optimization (e.g. same underlying engine).
117
+ #
118
+ # May return nil if operand should not be considered for further
119
+ # optimization
120
+ def extract_compatible_sexpr(operand)
121
+ nil
122
+ end
123
+
124
+ public
125
+
126
+ def to_sql
127
+ expr.to_sql("", Dialect.default)
128
+ end
129
+
130
+ def to_ast
131
+ [:sql, to_sql]
132
+ end
133
+
134
+ def to_s
135
+ "(sql #{to_sql})"
136
+ end
137
+ alias :inspect :to_s
138
+
139
+ end # class Relation
140
+ end # module Sql
141
+ end # module Bmg
@@ -0,0 +1,16 @@
1
+ module Bmg
2
+ module Sql
3
+ module Version
4
+
5
+ MAJOR = 0
6
+ MINOR = 17
7
+ TINY = 0
8
+
9
+ def self.to_s
10
+ [ MAJOR, MINOR, TINY ].join('.')
11
+ end
12
+
13
+ end
14
+ VERSION = Version.to_s
15
+ end
16
+ end
@@ -1 +1,2 @@
1
1
  require_relative 'support/tuple_algebra'
2
+ require_relative 'support/keys'
@@ -0,0 +1,59 @@
1
+ module Bmg
2
+ class Keys
3
+
4
+ def initialize(keys, reduce = false)
5
+ @keys = reduce ? reduce(keys) : keys
6
+ end
7
+
8
+ public ## tools
9
+
10
+ public ## algebra
11
+
12
+ def allbut(oldtype, newtype, butlist)
13
+ keys = @keys.select{|k| (k & butlist).empty? }
14
+ keys = [newtype.attrlist] if keys.empty?
15
+ Keys.new(keys, false)
16
+ end
17
+
18
+ def group(oldtype, newtype, attrs, as)
19
+ keys = [ oldtype.attrlist - attrs ]
20
+ keys += @keys.map{|k| (k & attrs).empty? ? k : (k - attrs) + [as] }
21
+ Keys.new(keys, true)
22
+ end
23
+
24
+ def project(oldtype, newtype, attrlist)
25
+ keys = @keys.select{|k| k.all?{|a| attrlist.include?(a) } }
26
+ keys = [newtype.attrlist] if keys.empty?
27
+ Keys.new(keys, false)
28
+ end
29
+
30
+ def rename(oldtype, newtype, renaming)
31
+ keys = @keys.map{|k| k.map{|a| renaming[a] || a } }
32
+ Keys.new(keys, false)
33
+ end
34
+
35
+ def union(oldtype, newtype, right_type)
36
+ return nil unless rkeys = right_type.keys
37
+ return nil unless (oldtype.predicate & right_type.predicate).contradiction?
38
+ shared = @keys.select{|k| rkeys.include?(k) }
39
+ Keys.new(shared, false)
40
+ end
41
+
42
+ public ## usuals
43
+
44
+ def to_a
45
+ @keys
46
+ end
47
+
48
+ private
49
+
50
+ def reduce(keys)
51
+ reduced = []
52
+ keys.sort{|a,b| a.size <=> b.size}.each do |k|
53
+ reduced << k unless reduced.any?{|r| (r - k).empty? }
54
+ end
55
+ reduced
56
+ end
57
+
58
+ end
59
+ end
@@ -5,16 +5,69 @@ module Bmg
5
5
  @predicate = predicate
6
6
  raise ArgumentError if @predicate.nil?
7
7
  end
8
- attr_reader :predicate
9
8
 
10
9
  ANY = Type.new
11
10
 
11
+ public ## predicate
12
+
13
+ attr_accessor :predicate
14
+ protected :predicate=
15
+
16
+ public ## attrlist
17
+
18
+ attr_accessor :attrlist
19
+ protected :attrlist=
20
+
21
+ def with_attrlist(attrlist)
22
+ dup.tap{|x|
23
+ x.attrlist = attrlist
24
+ }
25
+ end
26
+
27
+ def knows_attrlist?
28
+ !self.attrlist.nil?
29
+ end
30
+
31
+ def to_attrlist
32
+ self.attrlist
33
+ end
34
+
35
+ public ## keys
36
+
37
+ attr_accessor :keys
38
+ alias :_keys :keys
39
+ protected :_keys, :keys=
40
+
41
+ def knows_keys?
42
+ !!@keys
43
+ end
44
+
45
+ def keys
46
+ return @keys.to_a if @keys
47
+ return [attrlist] if knows_attrlist?
48
+ nil
49
+ end
50
+
51
+ def with_keys(keys)
52
+ dup.tap{|x|
53
+ x.keys = Keys.new(keys)
54
+ }
55
+ end
56
+
57
+ public ## typing
58
+
12
59
  def [](attribute)
13
60
  ANY
14
61
  end
15
62
 
63
+ public ### algebra
64
+
16
65
  def allbut(butlist)
17
- ANY
66
+ dup.tap{|x|
67
+ x.attrlist = self.attrlist - butlist if knows_attrlist?
68
+ x.predicate = Predicate.tautology
69
+ x.keys = self._keys.allbut(self, x, butlist) if knows_keys?
70
+ }
18
71
  end
19
72
 
20
73
  def autowrap(options)
@@ -26,19 +79,35 @@ module Bmg
26
79
  end
27
80
 
28
81
  def constants(cs)
29
- Type.new(@predicate & Predicate.eq(cs))
82
+ dup.tap{|x|
83
+ x.attrlist = self.attrlist + cs.keys if knows_attrlist?
84
+ x.predicate = self.predicate & Predicate.eq(cs)
85
+ ### keys stay the same
86
+ }
30
87
  end
31
88
 
32
89
  def extend(extension)
33
- ANY
90
+ dup.tap{|x|
91
+ x.attrlist = self.attrlist + extension.keys if knows_attrlist?
92
+ x.predicate = Predicate.tautology
93
+ ### keys stay the same (?)
94
+ }
34
95
  end
35
96
 
36
97
  def group(attrs, as)
37
- ANY
98
+ dup.tap{|x|
99
+ x.attrlist = self.attrlist - attrs + [as] if knows_attrlist?
100
+ x.predicate = Predicate.tautology
101
+ x.keys = self._keys.group(self, x, attrs, as) if knows_keys?
102
+ }
38
103
  end
39
104
 
40
105
  def image(right, as, on, options)
41
- ANY
106
+ dup.tap{|x|
107
+ x.attrlist = self.attrlist + [as] if knows_attrlist?
108
+ x.predicate = Predicate.tautology
109
+ x.keys = self._keys
110
+ }
42
111
  end
43
112
 
44
113
  def matching(right, on)
@@ -50,23 +119,35 @@ module Bmg
50
119
  end
51
120
 
52
121
  def project(attrlist)
53
- ANY
122
+ dup.tap{|x|
123
+ x.attrlist = attrlist
124
+ x.predicate = Predicate.tautology
125
+ x.keys = self._keys.project(self, x, attrlist) if knows_keys?
126
+ }
54
127
  end
55
128
 
56
129
  def rename(renaming)
57
- Type.new(@predicate.rename(renaming))
130
+ dup.tap{|x|
131
+ x.attrlist = self.attrlist.map{|a| renaming[a] || a } if knows_attrlist?
132
+ x.predicate = self.predicate.rename(renaming)
133
+ x.keys = self._keys.rename(self, x, renaming) if knows_keys?
134
+ }
58
135
  end
59
136
 
60
137
  def restrict(predicate)
61
- Type.new(@predicate & predicate)
62
- end
63
-
64
- def rxmatch(attrs, matcher, options)
65
- self
138
+ dup.tap{|x|
139
+ ### attrlist stays the same
140
+ x.predicate = self.predicate & predicate
141
+ x.keys = self._keys if knows_keys?
142
+ }
66
143
  end
67
144
 
68
145
  def union(other)
69
- Type.new(@predicate | other.predicate)
146
+ dup.tap{|x|
147
+ ### attrlist stays the same
148
+ x.predicate = self.predicate | predicate
149
+ x.keys = self._keys.union(self, x, other) if knows_keys?
150
+ }
70
151
  end
71
152
 
72
153
  end # class Type
@@ -1,8 +1,8 @@
1
1
  module Bmg
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 9
5
- TINY = 1
4
+ MINOR = 10
5
+ TINY = 0
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
8
8
  end
@@ -3,13 +3,20 @@ namespace :test do
3
3
 
4
4
  tests = []
5
5
 
6
- desc "Runs unit tests on the library itself"
6
+ desc "Runs unit tests"
7
7
  RSpec::Core::RakeTask.new(:unit) do |t|
8
8
  t.pattern = "spec/unit/**/test_*.rb"
9
- t.rspec_opts = ["-Ilib", "-Ispec/unit", "--color", "--backtrace", "--format=progress"]
9
+ t.rspec_opts = ["-Ilib", "-Ispec/unit", "--fail-fast", "--color", "--backtrace", "--format=progress"]
10
10
  end
11
11
  tests << :unit
12
12
 
13
+ desc "Runs integration tests"
14
+ RSpec::Core::RakeTask.new(:integration) do |t|
15
+ t.pattern = "spec/integration/**/test_*.rb"
16
+ t.rspec_opts = ["-Ilib", "-Ispec/integration", "--fail-fast", "--color", "--backtrace", "--format=progress"]
17
+ end
18
+ tests << :integration
19
+
13
20
  task :all => tests
14
21
  end
15
22
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bmg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernard Lambeau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-20 00:00:00.000000000 Z
11
+ date: 2018-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: predicate
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: roo
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '2.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '2.7'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: sequel
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +121,7 @@ files:
107
121
  - Rakefile
108
122
  - lib/bmg.rb
109
123
  - lib/bmg/algebra.rb
124
+ - lib/bmg/algebra/shortcuts.rb
110
125
  - lib/bmg/error.rb
111
126
  - lib/bmg/operator.rb
112
127
  - lib/bmg/operator/allbut.rb
@@ -132,7 +147,84 @@ files:
132
147
  - lib/bmg/relation/spied.rb
133
148
  - lib/bmg/sequel.rb
134
149
  - lib/bmg/sequel/relation.rb
150
+ - lib/bmg/sequel/translator.rb
151
+ - lib/bmg/sequel/type_inference.rb
152
+ - lib/bmg/sql.rb
153
+ - lib/bmg/sql/builder.rb
154
+ - lib/bmg/sql/dialect.rb
155
+ - lib/bmg/sql/ext/predicate.rb
156
+ - lib/bmg/sql/ext/predicate/and.rb
157
+ - lib/bmg/sql/ext/predicate/contradiction.rb
158
+ - lib/bmg/sql/ext/predicate/dyadic_comp.rb
159
+ - lib/bmg/sql/ext/predicate/eq.rb
160
+ - lib/bmg/sql/ext/predicate/exists.rb
161
+ - lib/bmg/sql/ext/predicate/expr.rb
162
+ - lib/bmg/sql/ext/predicate/gt.rb
163
+ - lib/bmg/sql/ext/predicate/gte.rb
164
+ - lib/bmg/sql/ext/predicate/identifier.rb
165
+ - lib/bmg/sql/ext/predicate/in.rb
166
+ - lib/bmg/sql/ext/predicate/literal.rb
167
+ - lib/bmg/sql/ext/predicate/lt.rb
168
+ - lib/bmg/sql/ext/predicate/lte.rb
169
+ - lib/bmg/sql/ext/predicate/nadic_bool.rb
170
+ - lib/bmg/sql/ext/predicate/native.rb
171
+ - lib/bmg/sql/ext/predicate/neq.rb
172
+ - lib/bmg/sql/ext/predicate/not.rb
173
+ - lib/bmg/sql/ext/predicate/or.rb
174
+ - lib/bmg/sql/ext/predicate/qualified_identifier.rb
175
+ - lib/bmg/sql/ext/predicate/tautology.rb
176
+ - lib/bmg/sql/grammar.rb
177
+ - lib/bmg/sql/grammar.sexp.yml
178
+ - lib/bmg/sql/nodes/column_name.rb
179
+ - lib/bmg/sql/nodes/cross_join.rb
180
+ - lib/bmg/sql/nodes/except.rb
181
+ - lib/bmg/sql/nodes/expr.rb
182
+ - lib/bmg/sql/nodes/from_clause.rb
183
+ - lib/bmg/sql/nodes/inner_join.rb
184
+ - lib/bmg/sql/nodes/intersect.rb
185
+ - lib/bmg/sql/nodes/limit_clause.rb
186
+ - lib/bmg/sql/nodes/literal.rb
187
+ - lib/bmg/sql/nodes/name_intro.rb
188
+ - lib/bmg/sql/nodes/native_table_as.rb
189
+ - lib/bmg/sql/nodes/offset_clause.rb
190
+ - lib/bmg/sql/nodes/order_by_clause.rb
191
+ - lib/bmg/sql/nodes/order_by_term.rb
192
+ - lib/bmg/sql/nodes/qualified_name.rb
193
+ - lib/bmg/sql/nodes/range_var_name.rb
194
+ - lib/bmg/sql/nodes/select_exp.rb
195
+ - lib/bmg/sql/nodes/select_item.rb
196
+ - lib/bmg/sql/nodes/select_list.rb
197
+ - lib/bmg/sql/nodes/select_star.rb
198
+ - lib/bmg/sql/nodes/set_operator.rb
199
+ - lib/bmg/sql/nodes/set_quantifier.rb
200
+ - lib/bmg/sql/nodes/subquery_as.rb
201
+ - lib/bmg/sql/nodes/table_as.rb
202
+ - lib/bmg/sql/nodes/table_name.rb
203
+ - lib/bmg/sql/nodes/union.rb
204
+ - lib/bmg/sql/nodes/where_clause.rb
205
+ - lib/bmg/sql/nodes/with_exp.rb
206
+ - lib/bmg/sql/nodes/with_spec.rb
207
+ - lib/bmg/sql/processor.rb
208
+ - lib/bmg/sql/processor/all.rb
209
+ - lib/bmg/sql/processor/clip.rb
210
+ - lib/bmg/sql/processor/distinct.rb
211
+ - lib/bmg/sql/processor/flatten.rb
212
+ - lib/bmg/sql/processor/from_self.rb
213
+ - lib/bmg/sql/processor/join.rb
214
+ - lib/bmg/sql/processor/join_support.rb
215
+ - lib/bmg/sql/processor/limit_offset.rb
216
+ - lib/bmg/sql/processor/merge.rb
217
+ - lib/bmg/sql/processor/order_by.rb
218
+ - lib/bmg/sql/processor/rename.rb
219
+ - lib/bmg/sql/processor/reorder.rb
220
+ - lib/bmg/sql/processor/requalify.rb
221
+ - lib/bmg/sql/processor/semi_join.rb
222
+ - lib/bmg/sql/processor/star.rb
223
+ - lib/bmg/sql/processor/where.rb
224
+ - lib/bmg/sql/relation.rb
225
+ - lib/bmg/sql/version.rb
135
226
  - lib/bmg/support.rb
227
+ - lib/bmg/support/keys.rb
136
228
  - lib/bmg/support/tuple_algebra.rb
137
229
  - lib/bmg/type.rb
138
230
  - lib/bmg/version.rb
@@ -158,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
250
  version: '0'
159
251
  requirements: []
160
252
  rubyforge_project:
161
- rubygems_version: 2.5.2
253
+ rubygems_version: 2.6.14
162
254
  signing_key:
163
255
  specification_version: 4
164
256
  summary: Bmg is Alf's successor.