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 +4 -4
- data/lib/bmg/algebra.rb +1 -0
- data/lib/bmg/operator/extend.rb +63 -0
- data/lib/bmg/sql/processor/join.rb +3 -3
- data/lib/bmg/support/tuple_algebra.rb +8 -0
- data/lib/bmg/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9962e2754e1fc6f09c4f041e49ca8aa3d37281dd
|
4
|
+
data.tar.gz: 2533b9118e9cd1a5e5f79cabeb2570823b5c1c20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '097cf9919f5cdef7d1475be3006410796025fa1ac93e009011531816d55d5c6366eeb00bdebdeeb53bf02a1224286d5fb83a46d0fe3985d39d518ab93f50b86d'
|
7
|
+
data.tar.gz: b8a2d75c371e620ca9784decaacf872c687748ca2c6d19dafbd19eccde242c7c1cafa8d8d4053e60faa7cad0cc9e988edf2144ead579257af50742330813f868
|
data/lib/bmg/algebra.rb
CHANGED
data/lib/bmg/operator/extend.rb
CHANGED
@@ -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?
|
36
|
+
sexpr.set_operator? or sexpr.limit_or_offset?
|
37
37
|
end
|
38
38
|
|
39
39
|
def join_set_quantifiers(left, right)
|
data/lib/bmg/version.rb
CHANGED
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.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-
|
11
|
+
date: 2019-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: predicate
|