bmg 0.17.1 → 0.17.6
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/README.md +73 -5
- data/lib/bmg.rb +2 -0
- data/lib/bmg/algebra.rb +23 -0
- data/lib/bmg/algebra/shortcuts.rb +6 -0
- data/lib/bmg/operator.rb +1 -0
- data/lib/bmg/operator/join.rb +24 -4
- data/lib/bmg/operator/transform.rb +57 -0
- data/lib/bmg/relation.rb +13 -0
- data/lib/bmg/relation/proxy.rb +63 -0
- data/lib/bmg/sequel/translator.rb +37 -12
- data/lib/bmg/sql/grammar.rb +3 -0
- data/lib/bmg/sql/grammar.sexp.yml +10 -0
- data/lib/bmg/sql/nodes/column_name.rb +4 -0
- data/lib/bmg/sql/nodes/cross_join.rb +1 -12
- data/lib/bmg/sql/nodes/func_call.rb +27 -0
- data/lib/bmg/sql/nodes/inner_join.rb +3 -25
- data/lib/bmg/sql/nodes/join.rb +44 -0
- data/lib/bmg/sql/nodes/left_join.rb +15 -0
- data/lib/bmg/sql/nodes/literal.rb +4 -0
- data/lib/bmg/sql/nodes/qualified_name.rb +4 -0
- data/lib/bmg/sql/nodes/select_exp.rb +4 -0
- data/lib/bmg/sql/nodes/select_item.rb +4 -0
- data/lib/bmg/sql/nodes/select_list.rb +4 -0
- data/lib/bmg/sql/nodes/select_star.rb +4 -0
- data/lib/bmg/sql/nodes/summarizer.rb +4 -0
- data/lib/bmg/sql/processor/join.rb +33 -5
- data/lib/bmg/sql/processor/where.rb +3 -3
- data/lib/bmg/sql/relation.rb +15 -1
- data/lib/bmg/sql/support/from_clause_orderer.rb +41 -23
- data/lib/bmg/support.rb +1 -0
- data/lib/bmg/support/keys.rb +4 -0
- data/lib/bmg/support/tuple_transformer.rb +62 -0
- data/lib/bmg/type.rb +34 -0
- data/lib/bmg/version.rb +1 -1
- data/lib/bmg/writer.rb +1 -0
- data/lib/bmg/writer/csv.rb +31 -0
- metadata +28 -20
data/lib/bmg/support.rb
CHANGED
data/lib/bmg/support/keys.rb
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Bmg
|
2
|
+
class TupleTransformer
|
3
|
+
|
4
|
+
def initialize(transformation)
|
5
|
+
@transformation = transformation
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.new(arg)
|
9
|
+
return arg if arg.is_a?(TupleTransformer)
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(tuple)
|
14
|
+
transform_tuple(tuple, @transformation)
|
15
|
+
end
|
16
|
+
|
17
|
+
def knows_attrlist?
|
18
|
+
@transformation.is_a?(Hash)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_attrlist
|
22
|
+
@transformation.keys
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def transform_tuple(tuple, with)
|
28
|
+
case with
|
29
|
+
when Symbol
|
30
|
+
tuple.each_with_object({}){|(k,v),dup|
|
31
|
+
dup[k] = transform_attr(v, with)
|
32
|
+
}
|
33
|
+
when Proc
|
34
|
+
tuple.each_with_object({}){|(k,v),dup|
|
35
|
+
dup[k] = transform_attr(v, with)
|
36
|
+
}
|
37
|
+
when Hash
|
38
|
+
with.each_with_object(tuple.dup){|(k,v),dup|
|
39
|
+
dup[k] = transform_attr(dup[k], v)
|
40
|
+
}
|
41
|
+
when Array
|
42
|
+
with.inject(tuple){|dup,on|
|
43
|
+
transform_tuple(dup, on)
|
44
|
+
}
|
45
|
+
else
|
46
|
+
raise ArgumentError, "Unexpected transformation `#{with.inspect}`"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def transform_attr(value, with)
|
51
|
+
case with
|
52
|
+
when Symbol
|
53
|
+
value.send(with)
|
54
|
+
when Proc
|
55
|
+
with.call(value)
|
56
|
+
else
|
57
|
+
raise ArgumentError, "Unexpected transformation `#{with.inspect}`"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end # module TupleTransformer
|
62
|
+
end # module Bmg
|
data/lib/bmg/type.rb
CHANGED
@@ -175,6 +175,15 @@ module Bmg
|
|
175
175
|
}
|
176
176
|
end
|
177
177
|
|
178
|
+
def left_join(right, on, default_right_tuple)
|
179
|
+
join_compatible!(right, on) if typechecked? && knows_attrlist?
|
180
|
+
dup.tap{|x|
|
181
|
+
x.attrlist = (knows_attrlist? and right.knows_attrlist?) ? (self.attrlist + right.attrlist).uniq : nil
|
182
|
+
x.predicate = Predicate.tautology
|
183
|
+
x.keys = nil
|
184
|
+
}
|
185
|
+
end
|
186
|
+
|
178
187
|
def matching(right, on)
|
179
188
|
join_compatible!(right, on) if typechecked? && knows_attrlist?
|
180
189
|
self
|
@@ -232,6 +241,31 @@ module Bmg
|
|
232
241
|
}
|
233
242
|
end
|
234
243
|
|
244
|
+
def transform(transformation, options = {})
|
245
|
+
transformer = TupleTransformer.new(transformation)
|
246
|
+
if typechecked? && knows_attrlist? && transformer.knows_attrlist?
|
247
|
+
known_attributes!(transformer.to_attrlist)
|
248
|
+
end
|
249
|
+
keys = if options[:key_preserving]
|
250
|
+
self._keys
|
251
|
+
elsif transformer.knows_attrlist? && knows_keys?
|
252
|
+
touched_attrs = transformer.to_attrlist
|
253
|
+
keys = self._keys.select{|k| (k & touched_attrs).empty? }
|
254
|
+
else
|
255
|
+
nil
|
256
|
+
end
|
257
|
+
pred = if transformer.knows_attrlist?
|
258
|
+
attr_list = transformer.to_attrlist
|
259
|
+
predicate.and_split(attr_list).last
|
260
|
+
else
|
261
|
+
Predicate.tautology
|
262
|
+
end
|
263
|
+
dup.tap{|x|
|
264
|
+
x.keys = keys
|
265
|
+
x.predicate = pred
|
266
|
+
}
|
267
|
+
end
|
268
|
+
|
235
269
|
def union(other)
|
236
270
|
if typechecked? && knows_attrlist? && other.knows_attrlist?
|
237
271
|
missing = self.attrlist - other.attrlist
|
data/lib/bmg/version.rb
CHANGED
data/lib/bmg/writer.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'writer/csv'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Bmg
|
2
|
+
module Writer
|
3
|
+
class Csv
|
4
|
+
include Writer
|
5
|
+
|
6
|
+
DEFAULT_OPTIONS = {
|
7
|
+
}
|
8
|
+
|
9
|
+
def initialize(options)
|
10
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
11
|
+
end
|
12
|
+
attr_reader :options
|
13
|
+
|
14
|
+
def call(relation, string_or_io = nil)
|
15
|
+
require 'csv'
|
16
|
+
string_or_io, to_s = string_or_io.nil? ? [StringIO.new, true] : [string_or_io, false]
|
17
|
+
headers = relation.type.to_attrlist if relation.type.knows_attrlist?
|
18
|
+
csv = nil
|
19
|
+
relation.each do |tuple|
|
20
|
+
if csv.nil?
|
21
|
+
headers = tuple.keys if headers.nil?
|
22
|
+
csv = CSV.new(string_or_io, options.merge(headers: headers))
|
23
|
+
end
|
24
|
+
csv << headers.map{|h| tuple[h] }
|
25
|
+
end
|
26
|
+
to_s ? string_or_io.string : string_or_io
|
27
|
+
end
|
28
|
+
|
29
|
+
end # class Csv
|
30
|
+
end # module Writer
|
31
|
+
end # module Bmg
|
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.17.
|
4
|
+
version: 0.17.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: predicate
|
@@ -16,62 +16,62 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2.
|
19
|
+
version: '2.4'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 2.
|
22
|
+
version: 2.4.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '2.
|
29
|
+
version: '2.4'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 2.
|
32
|
+
version: 2.4.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: path
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
40
|
-
type: :
|
39
|
+
version: '1.3'
|
40
|
+
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
46
|
+
version: '1.3'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
48
|
+
name: rake
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '13'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
60
|
+
version: '13'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
62
|
+
name: rspec
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - "
|
65
|
+
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
67
|
+
version: '3.6'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
|
-
- - "
|
72
|
+
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '3.6'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: roo
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -149,6 +149,7 @@ files:
|
|
149
149
|
- lib/bmg/operator/shared/nary.rb
|
150
150
|
- lib/bmg/operator/shared/unary.rb
|
151
151
|
- lib/bmg/operator/summarize.rb
|
152
|
+
- lib/bmg/operator/transform.rb
|
152
153
|
- lib/bmg/operator/union.rb
|
153
154
|
- lib/bmg/reader.rb
|
154
155
|
- lib/bmg/reader/csv.rb
|
@@ -157,6 +158,7 @@ files:
|
|
157
158
|
- lib/bmg/relation/empty.rb
|
158
159
|
- lib/bmg/relation/in_memory.rb
|
159
160
|
- lib/bmg/relation/materialized.rb
|
161
|
+
- lib/bmg/relation/proxy.rb
|
160
162
|
- lib/bmg/relation/spied.rb
|
161
163
|
- lib/bmg/sequel.rb
|
162
164
|
- lib/bmg/sequel/ext.rb
|
@@ -194,9 +196,12 @@ files:
|
|
194
196
|
- lib/bmg/sql/nodes/except.rb
|
195
197
|
- lib/bmg/sql/nodes/expr.rb
|
196
198
|
- lib/bmg/sql/nodes/from_clause.rb
|
199
|
+
- lib/bmg/sql/nodes/func_call.rb
|
197
200
|
- lib/bmg/sql/nodes/group_by_clause.rb
|
198
201
|
- lib/bmg/sql/nodes/inner_join.rb
|
199
202
|
- lib/bmg/sql/nodes/intersect.rb
|
203
|
+
- lib/bmg/sql/nodes/join.rb
|
204
|
+
- lib/bmg/sql/nodes/left_join.rb
|
200
205
|
- lib/bmg/sql/nodes/limit_clause.rb
|
201
206
|
- lib/bmg/sql/nodes/literal.rb
|
202
207
|
- lib/bmg/sql/nodes/name_intro.rb
|
@@ -256,8 +261,11 @@ files:
|
|
256
261
|
- lib/bmg/support.rb
|
257
262
|
- lib/bmg/support/keys.rb
|
258
263
|
- lib/bmg/support/tuple_algebra.rb
|
264
|
+
- lib/bmg/support/tuple_transformer.rb
|
259
265
|
- lib/bmg/type.rb
|
260
266
|
- lib/bmg/version.rb
|
267
|
+
- lib/bmg/writer.rb
|
268
|
+
- lib/bmg/writer/csv.rb
|
261
269
|
- tasks/gem.rake
|
262
270
|
- tasks/test.rake
|
263
271
|
homepage: http://github.com/enspirit/bmg
|