bmg 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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.