zillabyte 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MWQyNzZkNTM0MTcyZGJjYTE2NGFkNzgyZGNlYTE2NWE2Y2EyY2JkOQ==
4
+ NDcwNWQ3NThlM2RmYTg4Yzc3OGM3NDhlMzQ4NWEzNzZmM2E2NDFhZQ==
5
5
  data.tar.gz: !binary |-
6
- MTViMmZiNjNkNGRiMDdkMTI2ZTdhZWJlOTJjNjBiY2Y2ODk2N2Y3Nw==
6
+ MDEzMGEzNmI3OTNhMzNjNTIwOWE4MzY5NmU1ZGQ1NmNlN2NjMDIzNg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZmZkODcyZGJhNTA4NTYyNzE2ZWUyNzdiNzU1N2QwODg4Nzc1NzA1MGNkNTA4
10
- OTM5OWJlMTBiMDBkMWUzZGUzNzljNTczNmUwZDE1ODZiNjI1M2YwZDRjMWYy
11
- YTRjZmY3OTBiNTUyMTI5NDc2MjIxMjdiODhiNmZiZjUxZDczYWI=
9
+ OTZiYzU5NzIyNTc3MjNlMGZkNmM5NDgxN2Q4ODkxYmZkNjVhZTkzZmUwNDI5
10
+ MTU4NGZmMjZhYmJhNDBlNmQ2MDI5OGFlMDkwNzU0N2Y1ZDdiYzI3MGNkNWM3
11
+ YTlmOTMyMGNhM2Q1YWFlMGNiMWJlNWY3MTNlNjBjMmE1ZDc4MDU=
12
12
  data.tar.gz: !binary |-
13
- YzFiYTg2OTlmZjk4MTRlNjRiOWExMWQ1OGYxMGE2NzEwMTI0OTVkY2ExMzY3
14
- OTc1MWZmODA4NzJmZGZkNTU0ODg1MTE3MTk2OTg0YWM3MTI3NTM2N2Q2ZWVi
15
- NjNhZmFlNzRkYTFhODFmY2RmMGFjYjkzNjliYzIxYzQwY2IzZDU=
13
+ MTg1OWEyMWQ4OGYwMmMyOGZmZTIxMjYyYzNkOTc5ZDFmMDNmNDA0NGVjM2Jj
14
+ NWRmMjQ0NDFiOWE5MTBjZDNiY2NiYWVjMDBkYzRlOGVhODY4MmY3OWE0NDcw
15
+ ZDNiNDY2NzViZjQxNzBiNWI5ZmY5OTMwZGExOGM5ZDg5OWRjYWU=
@@ -1,3 +1,4 @@
1
+ require "active_support/core_ext"
1
2
  require "zillabyte/harness"
2
3
  require "zillabyte/common/progress"
3
4
 
@@ -9,7 +9,7 @@ class Zillabyte::Harness::App
9
9
  h._streams = {}
10
10
  h._names = {}
11
11
  h._name = name
12
- Zillabyte::Harness::Helper.check_name("new", h._name, {})
12
+ Zillabyte::Harness::Helper.check_name("app", h._name, {})
13
13
  h._options = Zillabyte::Harness::Helper.opt_parser()
14
14
  if(h._options[:command] == :info)
15
15
  h._info_file = File.open(h._options[:file],"w+")
@@ -1,9 +1,10 @@
1
- class Zillabyte::Harness::Aggregate
1
+ class Zillabyte::Harness::GroupBy
2
2
  attr_accessor :_name, :_type, :_consumes, :_group_by, :_emits, :_begin_group, :_aggregate, :_end_group
3
3
 
4
- def initialize()
5
- @_name = "aggregate_"+Zillabyte::Harness::Counter.get()
6
- @_type = 'aggregate'
4
+ def initialize(*group_by_fields)
5
+ @_name = "group_by_"+Zillabyte::Harness::Counter.get()
6
+ @_type = 'group_by'
7
+ @_group_by = group_by_fields;
7
8
  end
8
9
 
9
10
  def name(v)
@@ -17,6 +18,14 @@ class Zillabyte::Harness::Aggregate
17
18
  def group_by(v)
18
19
  @_group_by = v
19
20
  end
21
+
22
+ def group_by
23
+ if @_group_by.is_a?(Array)
24
+ return @_group_by
25
+ else
26
+ return [@_group_by]
27
+ end
28
+ end
20
29
 
21
30
  def emits(v)
22
31
  @_emits = v
@@ -43,11 +43,11 @@ class Zillabyte::Harness::Helper
43
43
  ee = "Error in \"#{operation}\" at \"name\": \n\t "
44
44
 
45
45
  # \w matchs [a-zA-Z0-9_]
46
- if(!name.instance_of?(String) or (name =~ /^\w+$/).nil?)
46
+ if(!(name.is_a?(String) or name.is_a?(Symbol)) or (name =~ /^\w+$/).nil?)
47
47
  msg = "#{ee}\"Name\" must be a non-empty STRING with only alphanumeric and underscore characters at \"#{name}\". Apps and simple_apps must have names!"
48
48
  Zillabyte::Harness::Helper.print_error(msg)
49
49
  end
50
- if(names[name] and names[name] != "new" and names[name] != "sink" and operation != "new" and operation != "sink")
50
+ if(names[name] and names[name] != "app" and names[name] != "sink" and operation != "app" and operation != "sink")
51
51
  msg = "#{ee}The \"name\" \"#{name}\" was previously defined in a #{names[name]}!"
52
52
  Zillabyte::Harness::Helper.print_error(msg)
53
53
  end
@@ -61,17 +61,9 @@ class Zillabyte::Harness::Helper
61
61
 
62
62
  rm = !source._relation.nil?
63
63
  mm = !source._matches.nil?
64
- if( rm or mm )
65
- msg = "#{ee}"
66
- msg += "A custom \"source\" may not contain a \"matches\" clause. To source from a relation, see the following. #{pp}"
67
- Zillabyte::Harness::Helper.print_error(msg)
68
- end
69
-
70
64
  if(rm or mm)
71
- if source._begin_cycle or source._next_tuple
72
- msg = "#{ee}If \"source\" has a \"matches\\relation\" clause, it may not have a \"begin_cycle\" or \"next_tuple\" block. #{pp}"
73
- Zillabyte::Harness::Helper.print_error(msg)
74
- end
65
+ msg = "#{ee}A custom \"source\" may not contain a \"matches\" clause. To source from a relation, see the following. #{pp}"
66
+ Zillabyte::Harness::Helper.print_error(msg)
75
67
  end
76
68
 
77
69
  allowed_policies = [:null_emit, :explicit]
@@ -181,7 +173,7 @@ class Zillabyte::Harness::Helper
181
173
  ee = "Error in \"sink\" at \"column\": \n\t "
182
174
  pp = @@_print_check_sink
183
175
 
184
- if(!cname.instance_of?(String) or (cname =~ /^\w+$/).nil?)
176
+ if(!(cname.is_a?(String) or cname.is_a?(Symbol)) or (cname =~ /^\w+$/).nil?)
185
177
  msg = "#{ee}Field names must be non-empty STRINGS with only alphanumeric and underscore characters in relation \"#{relation_name}\". #{pp}"
186
178
  Zillabyte::Harness::Helper.print_error(msg)
187
179
  end
@@ -220,9 +212,6 @@ class Zillabyte::Harness::Helper
220
212
  - Field names must be non-empty STRINGS with only alphanumeric or underscore characters.
221
213
  - Field names cannot be "v[number]", "id", "confidence", "since" or "source" which are reserved Zillabyte names.
222
214
  - Field types must be SYMBOLS. The following types are allowed :string, :integer, :float, :double, and :boolean.
223
- - If there are multiple streams, "consumes" must be specified for each sink as a non-empty STRING!
224
- * "Consumes" is the name of a stream emitted by an "each" or a "source" which the "sink" should save as a table.
225
- * The columns specified in "sink" must match the fields emitted by the stream."
226
215
  OUTPUT
227
216
 
228
217
  @@_print_check_source = <<-OUTPUT
@@ -263,7 +252,7 @@ OUTPUT
263
252
 
264
253
  @@_print_check_aggregate = <<-OUTPUT
265
254
  \n\n"Aggregate" Syntax:
266
- stream.aggregate do
255
+ stream.group_by do
267
256
  name "name" => optional
268
257
  group_by ["field_1", "field_2", ...]
269
258
  emits emits
@@ -0,0 +1,32 @@
1
+ class Zillabyte::Harness::Join
2
+ attr_accessor :_name, :_type, :_lhs_stream, :_rhs_stream, :_lhs_fields, :_rhs_fields, :_join_type, :_emits
3
+ #:_group_by, :_emits, :_begin_group, :_aggregate, :_end_group
4
+
5
+ def initialize(lhs_stream, rhs_stream, options = {})
6
+ @_name = "join_"+Zillabyte::Harness::Counter.get()
7
+ @_type = 'join'
8
+ @_lhs_stream = lhs_stream
9
+ @_rhs_stream = rhs_stream
10
+ @_join_type = :inner
11
+
12
+ options.symbolize_keys!
13
+
14
+ # Figure out which fields to join on..
15
+ if options[:on].is_a?(Array) and options[:on].size == 2
16
+ @_lhs_fields = options[:on][0]
17
+ @_rhs_fields = options[:on][1]
18
+
19
+ elsif options[:on]
20
+ @_lhs_fields = options[:on]
21
+ @_rhs_fields = options[:on]
22
+
23
+ end
24
+
25
+ # Different kind of join types...
26
+ if options[:type]
27
+ @_join_type = options[:type].to_sym
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -7,8 +7,14 @@ module Zillabyte
7
7
 
8
8
  class UserEndCycleException < Exception
9
9
  end
10
+
11
+ class ParentDeadException < Exception
12
+ end
10
13
 
11
14
  module Protocol
15
+
16
+ READ_SOFT_TIMEOUT = 20 # Amount of time to wait until we send a 'ping' to the parent
17
+ DEATH_TIMEOUT = READ_SOFT_TIMEOUT * 3 # If no activity from the parent (even response to a ping) time before we kill ourself.
12
18
 
13
19
  class << self
14
20
  attr_accessor :mode, :emits, :end_cycle_policy, :pending_commands, :pipe_name, :pipe_to_java, :pipe_from_java
@@ -32,12 +38,38 @@ module Zillabyte
32
38
  end
33
39
 
34
40
  def read_message
35
- msg = ""
41
+
42
+ @_last_activity ||= Time.now.utc
43
+ msg = []
44
+
36
45
  loop do
37
- line = Storm::Protocol.pipe_from_java.readline.chomp#STDIN.readline.chomp
46
+
47
+ # Read the next line.. The IO.select magic here is a way to minimize concurrency overhead
48
+ results = IO.select([Storm::Protocol.pipe_from_java], nil, nil, READ_SOFT_TIMEOUT)
49
+
50
+ # Process timeout...
51
+ if results.nil?
52
+
53
+ # Are we not getting any activity?
54
+ if @_last_activity + DEATH_TIMEOUT < Time.now.utc
55
+ # JVM is not responding.. they are probably dead. We should probably die too...
56
+ raise ParentDeadException
57
+ end
58
+
59
+ # Otherwise, let's ping JVM and see if they are still around...
60
+ send_msg_to_parent :ping => Time.now.utc.to_f
61
+ next
62
+ end
63
+
64
+ # Else, successful read line.
65
+
66
+ # Mark the activity...
67
+ @_last_activity = Time.now.utc
68
+
69
+ # String it together...
70
+ line = results[0][0].readline.chomp
38
71
  break if line == "end"
39
72
  msg << line
40
- msg << "\n"
41
73
  end
42
74
 
43
75
  encoding_options = {
@@ -45,17 +77,19 @@ module Zillabyte
45
77
  :undef => :replace, # Replace anything not defined in ASCII
46
78
  :replace => '' # Use a blank for those replacements
47
79
  }
48
- msg.encode! Encoding.find('ASCII'), encoding_options
80
+ json_s = msg.join("\n").chomp.encode(Encoding.find('ASCII'), encoding_options)
49
81
 
50
- JSON.parse msg.chomp
82
+ return JSON.parse(json_s)
83
+
51
84
  end
85
+
52
86
 
53
87
  def read_command
54
88
  Storm::Protocol.pending_commands.shift ||
55
89
  begin
56
90
  msg = read_message
57
- while msg.is_a? Array
58
- Storm::Protocol.pending_taskids.push(msg)
91
+ while msg.is_a?(Hash) && msg['pong']
92
+ # Ignore 'pong' commands (i.e. the response from our 'pings' above)
59
93
  msg = read_message
60
94
  end
61
95
  msg
@@ -83,7 +117,7 @@ module Zillabyte
83
117
 
84
118
  stream = nil
85
119
  tuple = nil
86
- meta = {}
120
+ meta = nil
87
121
 
88
122
  if (args.size == 1)
89
123
  tuple = args[0]
@@ -100,6 +134,11 @@ module Zillabyte
100
134
  tuple = args[1]
101
135
  meta = args[2]
102
136
  end
137
+
138
+ if tuple.is_a?(Tuple)
139
+ meta = meta || tuple.meta || {}
140
+ tuple = tuple.values
141
+ end
103
142
 
104
143
  if !stream.nil? and !Storm::Protocol.emits.member?(stream)
105
144
  fail "Exception in #{Storm::Protocol.mode}: " + "\"#{stream}\" is not a declared stream. Please either remove it from \"emit\" (if there's only one output stream) or declare it in an \"emits\" clause.\n"
@@ -146,9 +185,25 @@ module Zillabyte
146
185
  end
147
186
 
148
187
  def handshake
188
+
189
+ # Get the parent's message..
149
190
  setup_info = read_message
191
+
192
+ # Setup pid dir...
150
193
  send_pid setup_info['pidDir']
151
- [setup_info['conf'], setup_info['context']]
194
+
195
+ # Misc stuff
196
+ if setup_info['config']
197
+
198
+ # Testing hooks..
199
+ const_set('READ_SOFT_TIMEOUT', setup_info['config']['multilang.read.soft.timeout'].to_i)
200
+ const_set('DEATH_TIMEOUT', setup_info['config']['multilang.death.timeout'].to_i)
201
+
202
+ end
203
+
204
+ # Done
205
+ nil
206
+
152
207
  end
153
208
  end
154
209
 
@@ -186,6 +241,8 @@ module Zillabyte
186
241
  send_msg_to_parent m
187
242
  rescue SignalException => e
188
243
  raise
244
+ rescue ParentDeadException => e
245
+ raise
189
246
  rescue Exception => e
190
247
  fail 'Exception in source: ' + e.message + ' - ' + e.backtrace.join('\n')
191
248
  break
@@ -215,6 +272,8 @@ module Zillabyte
215
272
  execute t
216
273
  rescue SignalException => e
217
274
  raise
275
+ rescue ParentDeadException => e
276
+ raise
218
277
  rescue Exception => e
219
278
  fail 'Exception in each: ' + e.message + ' - ' + e.backtrace.join('\n')
220
279
  # We may recover from this, but let JVM decide
@@ -224,11 +283,11 @@ module Zillabyte
224
283
  end
225
284
  end
226
285
 
227
- class Aggregate
286
+ class GroupBy
228
287
  include Storm::Protocol
229
288
 
230
289
  def run(pipe_name)
231
- Storm::Protocol.mode = 'aggregation'
290
+ Storm::Protocol.mode = 'group_by'
232
291
  Storm::Protocol.pipe_name = pipe_name
233
292
  setup_pipes
234
293
  handshake
@@ -248,8 +307,10 @@ module Zillabyte
248
307
  end
249
308
  rescue SignalException => e
250
309
  raise
310
+ rescue ParentDeadException => e
311
+ raise
251
312
  rescue Exception => e
252
- fail "Exception in aggregate: " + e.message + ' - ' + e.backtrace.join('\n')
313
+ fail "Exception in group_by: " + e.message + ' - ' + e.backtrace.join('\n')
253
314
  break
254
315
  end
255
316
  done
@@ -297,7 +358,7 @@ module Zillabyte
297
358
 
298
359
  end
299
360
 
300
- class AggregateController < Storm::Aggregate
361
+ class GroupByController < Storm::GroupBy
301
362
 
302
363
  def initialize(harness, progress)
303
364
  @harness = harness
@@ -9,6 +9,10 @@ class Zillabyte::Harness::Stream
9
9
  @_previous_node_name = previous_node_name
10
10
  end
11
11
 
12
+ def name
13
+ @_name
14
+ end
15
+
12
16
  def each(&block)
13
17
  h = Zillabyte::Harness::Each.new()
14
18
  # Does the block take 0 arguments? If so it's not just an execute block.
@@ -45,36 +49,115 @@ class Zillabyte::Harness::Stream
45
49
  output_streams
46
50
  end
47
51
 
48
- def aggregate(&block)
49
- h = Zillabyte::Harness::Aggregate.new()
50
- #yield(h)
52
+
53
+ def group_by(*args, &block)
54
+
55
+ # Init
56
+ h = Zillabyte::Harness::GroupBy.new(*args)
57
+
58
+ # Yield
51
59
  h.instance_eval(&block)
52
- Zillabyte::Harness::Helper.check_name("aggregate", h._name, @_names)
53
- if(@_branched)
54
- Zillabyte::Harness::Helper.check_consumes(h, @_streams)
60
+ Zillabyte::Harness::Helper.check_name("group_by", h._name, @_app._names)
61
+
62
+ # Sanity checks
63
+ # Zillabyte::Harness::Helper.check_group_by("aggregate", h, @_nodes, @_streams)
64
+ # @_branched = Zillabyte::Harness::Helper.check_emits("aggregate", h._emits, @_streams) || @_branched
65
+
66
+ # Multiple emits?
67
+ if h._emits
68
+ Zillabyte::Harness::Helper.check_emits("group_by", h._emits, @_app._streams)
55
69
  else
56
- if(h._consumes)
57
- h._consumes = nil
58
- end
70
+ h._emits = ["stream_"+Zillabyte::Harness::Counter.get()]
59
71
  end
60
- Zillabyte::Harness::Helper.check_group_by("aggregate", h, @_nodes, @_streams)
61
- @_branched = Zillabyte::Harness::Helper.check_emits("aggregate", h._emits, @_streams) || @_branched
62
- @_nodes << h
63
- if(@_options[:command] == :info)
64
- info_hash = {"name" => h._name, "type" => h._type, "group_by" => h._group_by, "emits" => h._emits}
65
- if(h._consumes)
66
- info_hash["consumes"] = h._consumes
67
- end
68
- Zillabyte::Harness::Helper.write_hash_to_file(info_hash, @_info_file)
69
- elsif(@_options[:command] == :execute)
70
- pipe_name = @_options[:pipe]
71
- if(@_options[:name] == h._name)
72
- c = Zillabyte::Harness::AggregateController.new(h, Zillabyte::Common::Progress.new)
73
- c.run(pipe_name)
74
- end
72
+
73
+ # Add this node the list
74
+ @_app._nodes << h
75
+
76
+ # Handle incoming command..
77
+ if(@_app._options[:command] == :info)
78
+
79
+ # Info..
80
+ info_hash = {"name" => h._name, "type" => h._type, "group_by" => h.group_by, "emits" => h._emits, "consumes" => @_name}
81
+ Zillabyte::Harness::Helper.write_hash_to_file(info_hash, @_app._info_file)
82
+
83
+ elsif(@_app._options[:command] == :execute and @_app._options[:name] == h._name)
84
+
85
+ # Execute..
86
+ pipe_name = @_app._options[:pipe]
87
+ c = Zillabyte::Harness::GroupByController.new(h, Zillabyte::Common::Progress.new)
88
+ c.run(pipe_name)
89
+
90
+ end
91
+
92
+
93
+
94
+ # Return the stream
95
+ output_streams = []
96
+ h._emits.each do |stream|
97
+ output_streams << Zillabyte::Harness::Stream.new(stream, @_app, h._name)
75
98
  end
99
+ output_streams = output_streams[0] if output_streams.size == 1
100
+ output_streams
101
+
76
102
  end
77
103
 
104
+
105
+
106
+ def join_with(rhs_stream, *args, &block)
107
+
108
+ # Init
109
+ h = Zillabyte::Harness::Join.new(self, rhs_stream, *args)
110
+
111
+ # Yield
112
+ throw "programmable joins are not supported at this time" unless block.nil?
113
+ # h.instance_eval(&block)
114
+
115
+ # Sanity
116
+ Zillabyte::Harness::Helper.check_name("join", h._name, @_app._names)
117
+ case h._join_type
118
+ when :inner,:left,:right
119
+ when :outer
120
+ Zillabyte::Harness::Helper.print_error("Outer joins are currently not supported")
121
+ else
122
+ Zillabyte::Harness::Helper.print_error("Unknown join type: #{h._join_type}")
123
+ end
124
+
125
+ # Build the node
126
+ emit_stream_name = "stream_"+Zillabyte::Harness::Counter.get()
127
+ h._emits = [emit_stream_name]
128
+ @_app._nodes << h
129
+
130
+ # Handle incoming command..
131
+ if(@_app._options[:command] == :info)
132
+ # Info..
133
+ info_hash = {
134
+ "name" => h._name,
135
+ "type" => h._type,
136
+ "consumes_lhs" => h._lhs_stream._name,
137
+ "consumes_rhs" => h._rhs_stream._name,
138
+ "lhs_fields" => h._lhs_fields,
139
+ "rhs_fields" => h._rhs_fields,
140
+ "join_type" => h._join_type,
141
+ "emits" => h._emits,
142
+ }
143
+ Zillabyte::Harness::Helper.write_hash_to_file(info_hash, @_app._info_file)
144
+
145
+ elsif(@_app._options[:command] == :execute and @_app._options[:name] == h._name)
146
+
147
+ # There's a problem, because joins should be not be executed in multilang
148
+ throw "unsupported: joins should be executed here"
149
+
150
+ end
151
+
152
+ # Return the stream
153
+ output_stream = Zillabyte::Harness::Stream.new(emit_stream_name, @_app, h._name)
154
+ return output_stream
155
+
156
+ end
157
+
158
+
159
+
160
+
78
161
  def sink(&block)
79
162
  h = Zillabyte::Harness::Sink.new()
80
163
  h.instance_eval(&block)
@@ -7,15 +7,27 @@ class Tuple
7
7
 
8
8
  def [](name)
9
9
  maybe_build_alias_hash()
10
- v = values[ @_alias_hash[name] || name ]
11
- raise ArgumentError, "The requested tuple value \"#{name}\" does not exist." if v.nil?
12
- return v
10
+ key = (@_alias_hash[name] || name).to_s
11
+ if values.has_key?( key )
12
+ return values[key]
13
+ else
14
+ raise ArgumentError, "The requested tuple does not contain the key: \"#{name}\". Current Tuple: #{values.to_s}"
15
+ end
13
16
  end
14
17
 
15
18
  def values
16
19
  @hash["tuple"]
17
20
  end
18
21
 
22
+ def meta
23
+ @hash["meta"]
24
+ end
25
+
26
+
27
+ def to_s
28
+ values.to_s
29
+ end
30
+
19
31
 
20
32
  def column_aliases
21
33
  @hash['column_aliases'] || []
@@ -1,3 +1,3 @@
1
1
  module Zillabyte
2
- VERSION = "0.0.20" unless defined?(VERSION)
2
+ VERSION = "0.0.21" unless defined?(VERSION)
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zillabyte
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.20
4
+ version: 0.0.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - zillabyte
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-23 00:00:00.000000000 Z
11
+ date: 2014-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 0.0.20
47
+ version: 0.0.21
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.0.20
54
+ version: 0.0.21
55
55
  description: The Official Zillabyte Gem
56
56
  email:
57
57
  - gem@zillabyte.com
@@ -60,12 +60,12 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - ruby/lib/zillabyte/common/progress.rb
63
- - ruby/lib/zillabyte/harness/aggregate.rb
64
63
  - ruby/lib/zillabyte/harness/app.rb
65
64
  - ruby/lib/zillabyte/harness/counter.rb
66
65
  - ruby/lib/zillabyte/harness/each.rb
67
- - ruby/lib/zillabyte/harness/groupby.rb
66
+ - ruby/lib/zillabyte/harness/group_by.rb
68
67
  - ruby/lib/zillabyte/harness/helper.rb
68
+ - ruby/lib/zillabyte/harness/join.rb
69
69
  - ruby/lib/zillabyte/harness/live_delegator.rb
70
70
  - ruby/lib/zillabyte/harness/sink.rb
71
71
  - ruby/lib/zillabyte/harness/source.rb
@@ -1,9 +0,0 @@
1
- class Zillabyte::Harness::GroupBy
2
- attr_accessor :_type, :_fields
3
-
4
- def initialize(fields)
5
- @_type = 'group_by'
6
- @_fields = fields
7
- end
8
-
9
- end