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.
@@ -1,2 +1,3 @@
1
1
  require_relative 'support/tuple_algebra'
2
+ require_relative 'support/tuple_transformer'
2
3
  require_relative 'support/keys'
@@ -7,6 +7,10 @@ module Bmg
7
7
 
8
8
  public ## tools
9
9
 
10
+ def select(&bl)
11
+ Keys.new(@keys.select(&bl), false)
12
+ end
13
+
10
14
  public ## algebra
11
15
 
12
16
  def allbut(oldtype, newtype, butlist)
@@ -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
@@ -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
@@ -2,7 +2,7 @@ module Bmg
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 17
5
- TINY = 1
5
+ TINY = 6
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
8
8
  end
@@ -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.1
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-04-29 00:00:00.000000000 Z
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.3'
19
+ version: '2.4'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 2.3.1
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.3'
29
+ version: '2.4'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 2.3.1
32
+ version: 2.4.0
33
33
  - !ruby/object:Gem::Dependency
34
- name: rake
34
+ name: path
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '10'
40
- type: :development
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: '10'
46
+ version: '1.3'
47
47
  - !ruby/object:Gem::Dependency
48
- name: rspec
48
+ name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '3.6'
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: '3.6'
60
+ version: '13'
61
61
  - !ruby/object:Gem::Dependency
62
- name: path
62
+ name: rspec
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.3'
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: '1.3'
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