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
         
     |