bmg 0.14.6 → 0.15.0

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