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 +8 -8
- data/ruby/lib/zillabyte.rb +1 -0
- data/ruby/lib/zillabyte/harness/app.rb +1 -1
- data/ruby/lib/zillabyte/harness/{aggregate.rb → group_by.rb} +13 -4
- data/ruby/lib/zillabyte/harness/helper.rb +6 -17
- data/ruby/lib/zillabyte/harness/join.rb +32 -0
- data/ruby/lib/zillabyte/harness/live_delegator.rb +74 -13
- data/ruby/lib/zillabyte/harness/stream.rb +107 -24
- data/ruby/lib/zillabyte/harness/tuple.rb +15 -3
- data/ruby/lib/zillabyte/version.rb +1 -1
- metadata +6 -6
- data/ruby/lib/zillabyte/harness/groupby.rb +0 -9
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDcwNWQ3NThlM2RmYTg4Yzc3OGM3NDhlMzQ4NWEzNzZmM2E2NDFhZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MDEzMGEzNmI3OTNhMzNjNTIwOWE4MzY5NmU1ZGQ1NmNlN2NjMDIzNg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OTZiYzU5NzIyNTc3MjNlMGZkNmM5NDgxN2Q4ODkxYmZkNjVhZTkzZmUwNDI5
|
10
|
+
MTU4NGZmMjZhYmJhNDBlNmQ2MDI5OGFlMDkwNzU0N2Y1ZDdiYzI3MGNkNWM3
|
11
|
+
YTlmOTMyMGNhM2Q1YWFlMGNiMWJlNWY3MTNlNjBjMmE1ZDc4MDU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTg1OWEyMWQ4OGYwMmMyOGZmZTIxMjYyYzNkOTc5ZDFmMDNmNDA0NGVjM2Jj
|
14
|
+
NWRmMjQ0NDFiOWE5MTBjZDNiY2NiYWVjMDBkYzRlOGVhODY4MmY3OWE0NDcw
|
15
|
+
ZDNiNDY2NzViZjQxNzBiNWI5ZmY5OTMwZGExOGM5ZDg5OWRjYWU=
|
data/ruby/lib/zillabyte.rb
CHANGED
@@ -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("
|
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::
|
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 = "
|
6
|
-
@_type = '
|
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.
|
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] != "
|
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
|
-
|
72
|
-
|
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.
|
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.
|
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
|
-
|
41
|
+
|
42
|
+
@_last_activity ||= Time.now.utc
|
43
|
+
msg = []
|
44
|
+
|
36
45
|
loop do
|
37
|
-
|
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
|
80
|
+
json_s = msg.join("\n").chomp.encode(Encoding.find('ASCII'), encoding_options)
|
49
81
|
|
50
|
-
JSON.parse
|
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?
|
58
|
-
|
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
|
-
|
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
|
286
|
+
class GroupBy
|
228
287
|
include Storm::Protocol
|
229
288
|
|
230
289
|
def run(pipe_name)
|
231
|
-
Storm::Protocol.mode = '
|
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
|
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
|
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
|
-
|
49
|
-
|
50
|
-
|
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("
|
53
|
-
|
54
|
-
|
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
|
-
|
57
|
-
h._consumes = nil
|
58
|
-
end
|
70
|
+
h._emits = ["stream_"+Zillabyte::Harness::Counter.get()]
|
59
71
|
end
|
60
|
-
|
61
|
-
|
62
|
-
@_nodes << h
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
11
|
-
|
12
|
-
|
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'] || []
|
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.
|
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-
|
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.
|
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.
|
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/
|
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
|