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.
- checksums.yaml +4 -4
- data/lib/bmg/algebra.rb +2 -26
- data/lib/bmg/algebra/shortcuts.rb +14 -0
- data/lib/bmg/operator/autowrap.rb +32 -2
- data/lib/bmg/operator/constants.rb +12 -0
- data/lib/bmg/operator/image.rb +10 -0
- data/lib/bmg/operator/rename.rb +8 -0
- data/lib/bmg/relation/spied.rb +4 -9
- data/lib/bmg/sequel.rb +53 -2
- data/lib/bmg/sequel/relation.rb +24 -19
- data/lib/bmg/sequel/translator.rb +153 -0
- data/lib/bmg/sequel/type_inference.rb +42 -0
- data/lib/bmg/sql.rb +20 -0
- data/lib/bmg/sql/builder.rb +177 -0
- data/lib/bmg/sql/dialect.rb +15 -0
- data/lib/bmg/sql/ext/predicate.rb +23 -0
- data/lib/bmg/sql/ext/predicate/and.rb +9 -0
- data/lib/bmg/sql/ext/predicate/contradiction.rb +10 -0
- data/lib/bmg/sql/ext/predicate/dyadic_comp.rb +12 -0
- data/lib/bmg/sql/ext/predicate/eq.rb +9 -0
- data/lib/bmg/sql/ext/predicate/exists.rb +12 -0
- data/lib/bmg/sql/ext/predicate/expr.rb +18 -0
- data/lib/bmg/sql/ext/predicate/gt.rb +9 -0
- data/lib/bmg/sql/ext/predicate/gte.rb +9 -0
- data/lib/bmg/sql/ext/predicate/identifier.rb +10 -0
- data/lib/bmg/sql/ext/predicate/in.rb +29 -0
- data/lib/bmg/sql/ext/predicate/literal.rb +10 -0
- data/lib/bmg/sql/ext/predicate/lt.rb +9 -0
- data/lib/bmg/sql/ext/predicate/lte.rb +9 -0
- data/lib/bmg/sql/ext/predicate/nadic_bool.rb +16 -0
- data/lib/bmg/sql/ext/predicate/native.rb +9 -0
- data/lib/bmg/sql/ext/predicate/neq.rb +9 -0
- data/lib/bmg/sql/ext/predicate/not.rb +12 -0
- data/lib/bmg/sql/ext/predicate/or.rb +9 -0
- data/lib/bmg/sql/ext/predicate/qualified_identifier.rb +12 -0
- data/lib/bmg/sql/ext/predicate/tautology.rb +10 -0
- data/lib/bmg/sql/grammar.rb +45 -0
- data/lib/bmg/sql/grammar.sexp.yml +96 -0
- data/lib/bmg/sql/nodes/column_name.rb +25 -0
- data/lib/bmg/sql/nodes/cross_join.rb +28 -0
- data/lib/bmg/sql/nodes/except.rb +14 -0
- data/lib/bmg/sql/nodes/expr.rb +94 -0
- data/lib/bmg/sql/nodes/from_clause.rb +24 -0
- data/lib/bmg/sql/nodes/inner_join.rb +37 -0
- data/lib/bmg/sql/nodes/intersect.rb +14 -0
- data/lib/bmg/sql/nodes/limit_clause.rb +19 -0
- data/lib/bmg/sql/nodes/literal.rb +18 -0
- data/lib/bmg/sql/nodes/name_intro.rb +23 -0
- data/lib/bmg/sql/nodes/native_table_as.rb +31 -0
- data/lib/bmg/sql/nodes/offset_clause.rb +19 -0
- data/lib/bmg/sql/nodes/order_by_clause.rb +25 -0
- data/lib/bmg/sql/nodes/order_by_term.rb +30 -0
- data/lib/bmg/sql/nodes/qualified_name.rb +32 -0
- data/lib/bmg/sql/nodes/range_var_name.rb +17 -0
- data/lib/bmg/sql/nodes/select_exp.rb +109 -0
- data/lib/bmg/sql/nodes/select_item.rb +37 -0
- data/lib/bmg/sql/nodes/select_list.rb +35 -0
- data/lib/bmg/sql/nodes/select_star.rb +22 -0
- data/lib/bmg/sql/nodes/set_operator.rb +68 -0
- data/lib/bmg/sql/nodes/set_quantifier.rb +20 -0
- data/lib/bmg/sql/nodes/subquery_as.rb +28 -0
- data/lib/bmg/sql/nodes/table_as.rb +31 -0
- data/lib/bmg/sql/nodes/table_name.rb +17 -0
- data/lib/bmg/sql/nodes/union.rb +14 -0
- data/lib/bmg/sql/nodes/where_clause.rb +20 -0
- data/lib/bmg/sql/nodes/with_exp.rb +51 -0
- data/lib/bmg/sql/nodes/with_spec.rb +24 -0
- data/lib/bmg/sql/processor.rb +85 -0
- data/lib/bmg/sql/processor/all.rb +17 -0
- data/lib/bmg/sql/processor/clip.rb +57 -0
- data/lib/bmg/sql/processor/distinct.rb +17 -0
- data/lib/bmg/sql/processor/flatten.rb +24 -0
- data/lib/bmg/sql/processor/from_self.rb +29 -0
- data/lib/bmg/sql/processor/join.rb +80 -0
- data/lib/bmg/sql/processor/join_support.rb +28 -0
- data/lib/bmg/sql/processor/limit_offset.rb +30 -0
- data/lib/bmg/sql/processor/merge.rb +49 -0
- data/lib/bmg/sql/processor/order_by.rb +32 -0
- data/lib/bmg/sql/processor/rename.rb +25 -0
- data/lib/bmg/sql/processor/reorder.rb +21 -0
- data/lib/bmg/sql/processor/requalify.rb +24 -0
- data/lib/bmg/sql/processor/semi_join.rb +68 -0
- data/lib/bmg/sql/processor/star.rb +17 -0
- data/lib/bmg/sql/processor/where.rb +25 -0
- data/lib/bmg/sql/relation.rb +141 -0
- data/lib/bmg/sql/version.rb +16 -0
- data/lib/bmg/support.rb +1 -0
- data/lib/bmg/support/keys.rb +59 -0
- data/lib/bmg/type.rb +95 -14
- data/lib/bmg/version.rb +2 -2
- data/tasks/test.rake +9 -2
- 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
|
data/lib/bmg/support.rb
CHANGED
@@ -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
|
data/lib/bmg/type.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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
|
-
|
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
|
data/lib/bmg/version.rb
CHANGED
data/tasks/test.rake
CHANGED
@@ -3,13 +3,20 @@ namespace :test do
|
|
3
3
|
|
4
4
|
tests = []
|
5
5
|
|
6
|
-
desc "Runs unit tests
|
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.
|
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:
|
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: '
|
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: '
|
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.
|
253
|
+
rubygems_version: 2.6.14
|
162
254
|
signing_key:
|
163
255
|
specification_version: 4
|
164
256
|
summary: Bmg is Alf's successor.
|