bud 0.0.8 → 0.1.0.pre1
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.
- data/README +4 -10
- data/bin/budplot +1 -2
- data/docs/cheat.md +2 -15
- data/examples/basics/paths.rb +7 -7
- data/lib/bud/aggs.rb +15 -19
- data/lib/bud/bud_meta.rb +165 -77
- data/lib/bud/bust/bust.rb +11 -4
- data/lib/bud/collections.rb +643 -280
- data/lib/bud/depanalysis.rb +50 -25
- data/lib/bud/executor/elements.rb +592 -0
- data/lib/bud/executor/group.rb +104 -0
- data/lib/bud/executor/join.rb +638 -0
- data/lib/bud/graphs.rb +12 -11
- data/lib/bud/joins.rb +2 -1
- data/lib/bud/meta_algebra.rb +5 -4
- data/lib/bud/metrics.rb +9 -3
- data/lib/bud/monkeypatch.rb +131 -23
- data/lib/bud/rebl.rb +41 -28
- data/lib/bud/rewrite.rb +112 -440
- data/lib/bud/server.rb +3 -2
- data/lib/bud/source.rb +109 -0
- data/lib/bud/state.rb +16 -9
- data/lib/bud/storage/dbm.rb +62 -16
- data/lib/bud/storage/zookeeper.rb +2 -2
- data/lib/bud/viz.rb +8 -4
- data/lib/bud/viz_util.rb +10 -9
- data/lib/bud.rb +413 -199
- metadata +40 -55
- data/examples/deploy/tokenring-ec2.rb +0 -26
- data/examples/deploy/tokenring-fork.rb +0 -15
- data/examples/deploy/tokenring-thread.rb +0 -15
- data/examples/deploy/tokenring.rb +0 -47
- data/lib/bud/deploy/deployer.rb +0 -67
- data/lib/bud/deploy/ec2deploy.rb +0 -199
- data/lib/bud/deploy/forkdeploy.rb +0 -90
- data/lib/bud/deploy/threaddeploy.rb +0 -38
- data/lib/bud/storage/tokyocabinet.rb +0 -190
- data/lib/bud/stratify.rb +0 -85
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'bud/executor/elements'
|
2
|
+
|
3
|
+
module Bud
|
4
|
+
class PushGroup < PushStatefulElement
|
5
|
+
def initialize(elem_name, bud_instance, collection_name, keys_in, aggpairs_in, schema_in, &blk)
|
6
|
+
@groups = {}
|
7
|
+
if keys_in.nil?
|
8
|
+
@keys = []
|
9
|
+
else
|
10
|
+
@keys = keys_in.map{|k| k[1]}
|
11
|
+
end
|
12
|
+
# ap[1] is nil for Count
|
13
|
+
@aggpairs = aggpairs_in.map{|ap| ap[1].nil? ? [ap[0]] : [ap[0], ap[1][1]]}
|
14
|
+
super(elem_name, bud_instance, collection_name, schema_in, &blk)
|
15
|
+
end
|
16
|
+
|
17
|
+
def insert(item, source)
|
18
|
+
key = @keys.map{|k| item[k]}
|
19
|
+
@aggpairs.each_with_index do |ap, agg_ix|
|
20
|
+
agg_input = ap[1].nil? ? item : item[ap[1]]
|
21
|
+
agg = (@groups[key].nil? or @groups[key][agg_ix].nil?) ? ap[0].send(:init, agg_input) : ap[0].send(:trans, @groups[key][agg_ix], agg_input)[0]
|
22
|
+
@groups[key] ||= Array.new(@aggpairs.length)
|
23
|
+
@groups[key][agg_ix] = agg
|
24
|
+
push_out(nil)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def invalidate_cache
|
29
|
+
puts "Group #{qualified_tabname} invalidated" if $BUD_DEBUG
|
30
|
+
@groups.clear
|
31
|
+
end
|
32
|
+
|
33
|
+
def flush
|
34
|
+
@groups.each do |g, grps|
|
35
|
+
grp = @keys == $EMPTY ? [[]] : [g]
|
36
|
+
@aggpairs.each_with_index do |ap, agg_ix|
|
37
|
+
grp << ap[0].send(:final, grps[agg_ix])
|
38
|
+
end
|
39
|
+
outval = grp[0].flatten
|
40
|
+
(1..grp.length-1).each {|i| outval << grp[i]}
|
41
|
+
push_out(outval)
|
42
|
+
end
|
43
|
+
#@groups = {}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class PushArgAgg < PushGroup
|
48
|
+
def initialize(elem_name, bud_instance, collection_name, keys_in, aggpairs_in, schema_in, &blk)
|
49
|
+
raise "Multiple aggpairs #{aggpairs_in.map{|a| a.class.name}} in ArgAgg; only one allowed" if aggpairs_in.length > 1
|
50
|
+
super(elem_name, bud_instance, collection_name, keys_in, aggpairs_in, schema_in, &blk)
|
51
|
+
@agg = @aggpairs[0][0]
|
52
|
+
@aggcol = @aggpairs[0][1]
|
53
|
+
@winners = {}
|
54
|
+
end
|
55
|
+
|
56
|
+
public
|
57
|
+
def invalidate_cache
|
58
|
+
puts "#{self.class}/#{self.tabname} invalidated" if $BUD_DEBUG
|
59
|
+
@groups.clear
|
60
|
+
@winners.clear
|
61
|
+
end
|
62
|
+
|
63
|
+
def insert(item, source)
|
64
|
+
key = @keys.map{|k| item[k]}
|
65
|
+
@aggpairs.each_with_index do |ap, agg_ix|
|
66
|
+
agg_input = item[ap[1]]
|
67
|
+
if @groups[key].nil?
|
68
|
+
agg = ap[0].send(:init, agg_input)
|
69
|
+
@winners[key] = [item]
|
70
|
+
else
|
71
|
+
agg_result = ap[0].send(:trans, @groups[key][agg_ix], agg_input)
|
72
|
+
agg = agg_result[0]
|
73
|
+
case agg_result[1]
|
74
|
+
when :ignore
|
75
|
+
# do nothing
|
76
|
+
when :replace
|
77
|
+
@winners[key] = [item]
|
78
|
+
when :keep
|
79
|
+
@winners[key] << item
|
80
|
+
when :delete
|
81
|
+
agg_result[2..-1].each do |t|
|
82
|
+
@winners[key].delete t unless @winners[key].empty?
|
83
|
+
end
|
84
|
+
else
|
85
|
+
raise "strange result from argagg finalizer"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
@groups[key] ||= Array.new(@aggpairs.length)
|
89
|
+
@groups[key][agg_ix] = agg
|
90
|
+
#push_out(nil)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def flush
|
95
|
+
@groups.keys.each {|g|
|
96
|
+
@winners[g].each{|t|
|
97
|
+
push_out(t, false)
|
98
|
+
}
|
99
|
+
}
|
100
|
+
#@groups = {}
|
101
|
+
#@winners = {}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|