zillabyte 0.0.20 → 0.0.21

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 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