bmg 0.14.6 → 0.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3742e9ea9283de5fe4df772ef02969a91ee0b3b4
4
- data.tar.gz: 2e6f9c1a33f8d220937d47f867ba88f53b1f0bba
3
+ metadata.gz: 9962e2754e1fc6f09c4f041e49ca8aa3d37281dd
4
+ data.tar.gz: 2533b9118e9cd1a5e5f79cabeb2570823b5c1c20
5
5
  SHA512:
6
- metadata.gz: fae75db6c9b264f53dc76bb0fcd7e978b56647e225544c5e0cf2f40e1932e82ab3070ff34e32edad8203975a6fc721cca0e0f71af8b6dd21a82a61efda3cd9a5
7
- data.tar.gz: 40a759212f4261da1bfbf5cecc15dce5be3ee215aae5e4fcc15e7447a17846d3e53f98b00cc62553ab3acba74565ce4a3845e7034cfda45cb5e24f497d7ef86f
6
+ metadata.gz: '097cf9919f5cdef7d1475be3006410796025fa1ac93e009011531816d55d5c6366eeb00bdebdeeb53bf02a1224286d5fb83a46d0fe3985d39d518ab93f50b86d'
7
+ data.tar.gz: b8a2d75c371e620ca9784decaacf872c687748ca2c6d19dafbd19eccde242c7c1cafa8d8d4053e60faa7cad0cc9e988edf2144ead579257af50742330813f868
@@ -39,6 +39,7 @@ module Bmg
39
39
  protected :_constants
40
40
 
41
41
  def extend(extension = {})
42
+ return self if extension.empty?
42
43
  _extend self.type.extend(extension), extension
43
44
  end
44
45
 
@@ -55,6 +55,54 @@ module Bmg
55
55
 
56
56
  protected ### optimization
57
57
 
58
+ def _allbut(type, butlist)
59
+ ext_keys = extension.keys
60
+ if (ext_keys & butlist).empty?
61
+ # extension not touched, fully kept
62
+ # as it might use butlist attributes, we can't push anything down
63
+ super
64
+ else
65
+ # extension partly stripped away, simplify them
66
+ new_ext = TupleAlgebra.allbut(extension, butlist)
67
+ new_but = butlist - ext_keys
68
+ operand.extend(new_ext).allbut(new_but)
69
+ end
70
+ end
71
+
72
+ def _join(type, right, on)
73
+ ext_keys = extension.keys
74
+ if (ext_keys & on).empty?
75
+ operand.join(right, on).extend(extension)
76
+ else
77
+ super
78
+ end
79
+ end
80
+
81
+ def _matching(type, right, on = [])
82
+ ext_keys = extension.keys
83
+ if (ext_keys & on).empty?
84
+ operand.matching(right, on).extend(extension)
85
+ else
86
+ super
87
+ end
88
+ end
89
+
90
+ def _not_matching(type, right, on = [])
91
+ ext_keys = extension.keys
92
+ if (ext_keys & on).empty?
93
+ operand.not_matching(right, on).extend(extension)
94
+ else
95
+ super
96
+ end
97
+ end
98
+
99
+ def _rename(type, renaming)
100
+ shared = renaming.keys & extension.keys
101
+ new_ext = TupleAlgebra.rename(extension, renaming)
102
+ new_ren = TupleAlgebra.allbut(renaming, shared)
103
+ operand.rename(new_ren).extend(new_ext)
104
+ end
105
+
58
106
  def _restrict(type, predicate)
59
107
  top, bottom = predicate.and_split(extension.keys)
60
108
  if top == predicate
@@ -80,6 +128,21 @@ module Bmg
80
128
  end
81
129
  end
82
130
 
131
+ def _project(type, attrlist)
132
+ ext_keys = extension.keys
133
+ if (ext_keys - attrlist).empty?
134
+ # extension fully kept, no optimization
135
+ # (we can't push anything down, because the extension itself might
136
+ # use all attributes)
137
+ super
138
+ else
139
+ # extension partly or fully stripped away, simplify it
140
+ new_ext = TupleAlgebra.project(extension, attrlist)
141
+ operand.extend(new_ext).project(attrlist)
142
+ end
143
+ end
144
+
145
+
83
146
  protected ### inspect
84
147
 
85
148
  def args
@@ -14,8 +14,8 @@ module Bmg
14
14
  def call(sexpr)
15
15
  if unjoinable?(sexpr)
16
16
  call(builder.from_self(sexpr))
17
- elsif unjoinable?(right)
18
- Join.new(builder.from_self(right), builder).call(sexpr)
17
+ elsif unjoinable?(right) or right.join?
18
+ Join.new(builder.from_self(right), on, builder).call(sexpr)
19
19
  else
20
20
  super(sexpr)
21
21
  end
@@ -33,7 +33,7 @@ module Bmg
33
33
  end
34
34
 
35
35
  def unjoinable?(sexpr)
36
- sexpr.set_operator? or sexpr.limit_or_offset? or sexpr.join?
36
+ sexpr.set_operator? or sexpr.limit_or_offset?
37
37
  end
38
38
 
39
39
  def join_set_quantifiers(left, right)
@@ -11,5 +11,13 @@ module Bmg
11
11
  end
12
12
  module_function :project
13
13
 
14
+ def rename(tuple, renaming)
15
+ tuple.each_with_object({}){|(k,v),m|
16
+ m[renaming[k] || k] = v
17
+ m
18
+ }
19
+ end
20
+ module_function :rename
21
+
14
22
  end # module TupleAlgebra
15
23
  end # module Bmg
@@ -1,8 +1,8 @@
1
1
  module Bmg
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 14
5
- TINY = 6
4
+ MINOR = 15
5
+ TINY = 0
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
8
8
  end
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.14.6
4
+ version: 0.15.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: 2019-01-29 00:00:00.000000000 Z
11
+ date: 2019-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: predicate