td-client 0.8.4 → 0.8.5

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/ChangeLog CHANGED
@@ -1,4 +1,11 @@
1
1
 
2
+ == 2011-12-04 version 0.8.5
3
+
4
+ * added new feature: ResultSet
5
+ * added new feature: AggregationSchema
6
+ * added Job#rset and Schedule#rset to get associated ResultSet
7
+
8
+
2
9
  == 2011-11-11 version 0.8.4
3
10
 
4
11
  * Added Model#client
@@ -104,30 +104,33 @@ class Client
104
104
  end
105
105
 
106
106
  # => Job
107
- def query(db_name, q)
108
- job_id = @api.hive_query(q, db_name)
107
+ def query(db_name, q, rset=nil)
108
+ job_id = @api.hive_query(q, db_name, rset)
109
109
  Job.new(self, job_id, :hive, q) # TODO url
110
110
  end
111
111
 
112
112
  # => [Job]
113
113
  def jobs(from=nil, to=nil)
114
114
  result = @api.list_jobs(from, to)
115
- result.map {|job_id,type,status,query,start_at,end_at|
116
- Job.new(self, job_id, type, query, status, nil, nil, start_at, end_at)
115
+ result.map {|job_id,type,status,query,start_at,end_at,rset|
116
+ rset = ResultSet.new(self, rset) if rset
117
+ Job.new(self, job_id, type, query, status, nil, nil, start_at, end_at, nil, rset)
117
118
  }
118
119
  end
119
120
 
120
121
  # => Job
121
122
  def job(job_id)
122
123
  job_id = job_id.to_s
123
- type, query, status, url, debug, start_at, end_at = @api.show_job(job_id)
124
- Job.new(self, job_id, type, query, status, url, debug, start_at, end_at)
124
+ type, query, status, url, debug, start_at, end_at, rset = @api.show_job(job_id)
125
+ rset = ResultSet.new(self, rset) if rset
126
+ Job.new(self, job_id, type, query, status, url, debug, start_at, end_at, nil, rset)
125
127
  end
126
128
 
127
129
  # => type:Symbol, url:String
128
130
  def job_status(job_id)
129
- type, query, status, url, debug, start_at, end_at = @api.show_job(job_id)
130
- return query, status, url, debug, start_at, end_at
131
+ type, query, status, url, debug, start_at, end_at, rset = @api.show_job(job_id)
132
+ rset = ResultSet.new(self, rset) if rset
133
+ return query, status, url, debug, start_at, end_at, rset
131
134
  end
132
135
 
133
136
  # => result:[{column:String=>value:Object]
@@ -166,16 +169,18 @@ class Client
166
169
  # [Schedule]
167
170
  def schedules
168
171
  result = @api.list_schedules
169
- result.map {|name,cron,query,database|
170
- Schedule.new(self, name, cron, query, database)
172
+ result.map {|name,cron,query,database,rset|
173
+ rset = ResultSet.new(self, rset) if rset
174
+ Schedule.new(self, name, cron, query, database, rset)
171
175
  }
172
176
  end
173
177
 
174
178
  # [ScheduledJob]
175
179
  def history(name, from=nil, to=nil)
176
180
  result = @api.history(name, from, to)
177
- result.map {|scheduled_at,job_id,type,status,query,start_at,end_at|
178
- ScheduledJob.new(self, scheduled_at, job_id, type, query, status, nil, nil, start_at, end_at)
181
+ result.map {|scheduled_at,job_id,type,status,query,start_at,end_at,rset|
182
+ rset = ResultSet.new(self, rset) if rset
183
+ ScheduledJob.new(self, scheduled_at, job_id, type, query, status, nil, nil, start_at, end_at, nil, rset)
179
184
  }
180
185
  end
181
186
 
@@ -183,6 +188,86 @@ class Client
183
188
  def import(db_name, table_name, format, stream, size)
184
189
  @api.import(db_name, table_name, format, stream, size)
185
190
  end
191
+
192
+ # => [ResultSet]
193
+ def result_sets
194
+ info, names = @api.list_result_set
195
+ sets = names.map {|name|
196
+ ResultSet.new(self, name)
197
+ }
198
+ return sets
199
+ end
200
+
201
+ # => ResultSetInfo
202
+ def result_set_info
203
+ info, names = @api.list_result_set
204
+ info = ResultSetInfo.new(self, *info)
205
+ return info
206
+ end
207
+
208
+ # => true
209
+ def create_result_set(name)
210
+ @api.create_result_set(name)
211
+ end
212
+
213
+ # => true
214
+ def delete_result_set(name)
215
+ @api.delete_result_set(name)
216
+ end
217
+
218
+ # => [AggregationSchema]
219
+ def aggregation_schemas
220
+ list = @api.list_aggregation_schema
221
+ list.map {|name,relation_key|
222
+ AggregationSchema.new(self, name, relation_key)
223
+ }
224
+ end
225
+
226
+ # => true
227
+ def create_aggregation_schema(name, relation_key)
228
+ @api.create_aggregation_schema(name, relation_key)
229
+ end
230
+
231
+ # => true
232
+ def delete_aggregation_schema(name)
233
+ @api.delete_aggregation_schema(name)
234
+ end
235
+
236
+ # => AggregationSchema
237
+ def aggregation_schema(name)
238
+ relation_key, logs, attrs = @api.show_aggregation_schema(name)
239
+ logs.map! {|name,comment,database,table,okeys,value_key,count_key|
240
+ table = Table.new(self, database, table, 'log', nil, nil)
241
+ LogAggregationSchemaEntry.new(self, name, comment, table,
242
+ okeys, value_key, count_key)
243
+ }
244
+ attrs.map! {|name,comment,database,table,method_name,parameters|
245
+ table = Table.new(self, database, table, 'log', nil, nil)
246
+ AttributeAggregationSchemaEntry.new(self, name, comment, table,
247
+ method_name, parameters)
248
+ }
249
+ AggregationSchema.new(self, name, relation_key, logs, attrs)
250
+ end
251
+
252
+ # => true
253
+ def create_aggregation_log_entry(name, entry_name, comment, db, table, okeys, value_key, count_key)
254
+ @api.create_aggregation_log_entry(name, entry_name, comment, db, table, okeys, value_key, count_key)
255
+ end
256
+
257
+ # => true
258
+ def delete_aggregation_log_entry(name, entry_name)
259
+ @api.delete_aggregation_log_entry(name, entry_name)
260
+ end
261
+
262
+ # => true
263
+ def create_aggregation_attr_entry(name, entry_name, comment, db, table, method_name, parameters)
264
+ @api.create_aggregation_attr_entry(name, entry_name, comment, db, table, method_name, parameters)
265
+ end
266
+
267
+ # => true
268
+ def delete_aggregation_attr_entry(name, entry_name)
269
+ @api.delete_aggregation_attr_entry(name, entry_name)
270
+ end
186
271
  end
187
272
 
188
273
 
@@ -44,6 +44,10 @@ class API
44
44
  validate_database_name(name)
45
45
  end
46
46
 
47
+ def self.validate_result_set_name(name)
48
+ validate_database_name(name)
49
+ end
50
+
47
51
  def self.validate_column_name(name)
48
52
  name = name.to_s
49
53
  if name.empty?
@@ -204,7 +208,7 @@ class API
204
208
  ## Job API
205
209
  ##
206
210
 
207
- # => [(jobId:String, type:Symbol, status:String, start_at:String, end_at:String)]
211
+ # => [(jobId:String, type:Symbol, status:String, start_at:String, end_at:String, rset:String)]
208
212
  def list_jobs(from=0, to=nil)
209
213
  params = {}
210
214
  params['from'] = from.to_s if from
@@ -223,12 +227,13 @@ class API
223
227
  query = m['query']
224
228
  start_at = m['start_at']
225
229
  end_at = m['end_at']
226
- result << [job_id, type, status, query, start_at, end_at]
230
+ rset = m['result']
231
+ result << [job_id, type, status, query, start_at, end_at, rset]
227
232
  }
228
233
  return result
229
234
  end
230
235
 
231
- # => (type:Symbol, status:String, result:String, url:String)
236
+ # => (type:Symbol, status:String, result:String, url:String, result:String)
232
237
  def show_job(job_id)
233
238
  code, body, res = get("/v3/job/show/#{e job_id}")
234
239
  if code != "200"
@@ -244,7 +249,8 @@ class API
244
249
  url = js['url']
245
250
  start_at = js['start_at']
246
251
  end_at = js['end_at']
247
- return [type, query, status, url, debug, start_at, end_at]
252
+ result = js['result']
253
+ return [type, query, status, url, debug, start_at, end_at, result]
248
254
  end
249
255
 
250
256
  def job_result(job_id)
@@ -303,8 +309,10 @@ class API
303
309
  end
304
310
 
305
311
  # => jobId:String
306
- def hive_query(q, db=nil)
307
- code, body, res = post("/v3/job/issue/hive/#{e db}", {'query'=>q})
312
+ def hive_query(q, db=nil, rset=nil)
313
+ params = {'query' => q}
314
+ params['result'] = rset if rset
315
+ code, body, res = post("/v3/job/issue/hive/#{e db}", params)
308
316
  if code != "200"
309
317
  raise_error("Query failed", res)
310
318
  end
@@ -341,6 +349,7 @@ class API
341
349
  return js['cron'], js["query"]
342
350
  end
343
351
 
352
+ # => [(name:String, cron:String, query:String, database:String, rset:String)]
344
353
  def list_schedules
345
354
  code, body, res = get("/v3/schedule/list")
346
355
  if code != "200"
@@ -354,7 +363,8 @@ class API
354
363
  cron = m['cron']
355
364
  query = m['query']
356
365
  database = m['database']
357
- result << [name, cron, query, database]
366
+ rset = m['result']
367
+ result << [name, cron, query, database, rset]
358
368
  }
359
369
  return result
360
370
  end
@@ -378,7 +388,8 @@ class API
378
388
  start_at = m['start_at']
379
389
  end_at = m['end_at']
380
390
  scheduled_at = m['scheduled_at']
381
- result << [scheduled_at, job_id, type, status, query, start_at, end_at]
391
+ rset = m['result']
392
+ result << [scheduled_at, job_id, type, status, query, start_at, end_at, rset]
382
393
  }
383
394
  return result
384
395
  end
@@ -401,6 +412,185 @@ class API
401
412
  end
402
413
 
403
414
 
415
+ ####
416
+ ## Result set API
417
+ ##
418
+
419
+ # => (
420
+ # info:(type:String, host:String, port:Integer, database:String, user:String, pass:String)
421
+ # entries:[name:String]
422
+ # )
423
+ def list_result_set
424
+ code, body, res = get("/v3/result/list")
425
+ if code != "200"
426
+ raise_error("List result set failed", res)
427
+ end
428
+ # TODO format check
429
+ js = JSON.load(body)
430
+ type = (js["type"] || 'unknown').to_s
431
+ host = js["host"].to_s
432
+ port = js["port"].to_i
433
+ database = js["database"].to_s
434
+ user = js["user"].to_s
435
+ pass = js["pass"].to_s
436
+ names = (js["results"] || []).map {|rsets|
437
+ rsets['name'].to_s
438
+ }
439
+ info = [type, host, port, database, user, pass]
440
+ return info, names
441
+ end
442
+
443
+ # => true
444
+ def create_result_set(db)
445
+ code, body, res = post("/v3/result/create/#{e db}")
446
+ if code != "200"
447
+ raise_error("Create result set failed", res)
448
+ end
449
+ return true
450
+ end
451
+
452
+ # => true
453
+ def delete_result_set(db)
454
+ code, body, res = post("/v3/result/delete/#{e db}")
455
+ if code != "200"
456
+ raise_error("Delete result set failed", res)
457
+ end
458
+ return true
459
+ end
460
+
461
+
462
+ ####
463
+ ## Aggregation Schema API
464
+ ##
465
+
466
+ # => [(name:String, relation_key:String)]
467
+ def list_aggregation_schema
468
+ code, body, res = get("/v3/aggr/list")
469
+ if code != "200"
470
+ raise_error("List aggregation schema failed", res)
471
+ end
472
+ # TODO format check
473
+ js = JSON.load(body)
474
+ result = js["aggrs"].map {|aggrinfo|
475
+ name = aggrinfo['name'].to_s
476
+ relation_key = aggrinfo['relation_key'].to_s
477
+ [name, relation_key]
478
+ }
479
+ return result
480
+ end
481
+
482
+ # => true
483
+ def create_aggregation_schema(name, relation_key)
484
+ params = {}
485
+ params['relation_key'] = relation_key if relation_key
486
+ code, body, res = post("/v3/aggr/create/#{e name}", params)
487
+ if code != "200"
488
+ raise_error("Create aggregation schema failed", res)
489
+ end
490
+ return true
491
+ end
492
+
493
+ # => true
494
+ def delete_aggregation_schema(name)
495
+ code, body, res = post("/v3/aggr/delete/#{e name}")
496
+ if code != "200"
497
+ raise_error("Delete aggregation schema failed", res)
498
+ end
499
+ return true
500
+ end
501
+
502
+ # => [
503
+ # {
504
+ # relation_key: String,
505
+ # logs: (entry_name:String, comment:String, database:String, table:String,
506
+ # os:Array[String], value_key:String?, count_key:String?),
507
+ # attrs: (entry_name:String, comment:String, database:String, table:String,
508
+ # method_name:String, parameters:Hash[String=>Object])
509
+ # }
510
+ # ]
511
+ def show_aggregation_schema(name)
512
+ code, body, res = get("/v3/aggr/show/#{e name}")
513
+ if code != "200"
514
+ raise_error("Show job failed", res)
515
+ end
516
+ # TODO format check
517
+ js = JSON.load(body)
518
+ relation_key = js['relation_key']
519
+ logs = js['logs'].map {|loginfo|
520
+ entry_name = loginfo['name'].to_s
521
+ comment = loginfo['comment'].to_s
522
+ database = loginfo['database'].to_s
523
+ table = loginfo['table'].to_s
524
+ os = loginfo['os']
525
+ value_key = loginfo['value_key'].to_s
526
+ count_key = loginfo['count_key'].to_s
527
+ value_key = nil if value_key.empty?
528
+ count_key = nil if count_key.empty?
529
+ [entry_name, comment, database, table, os, value_key, count_key]
530
+ }
531
+ attrs = js['attrs'].map {|attrinfo|
532
+ entry_name = attrinfo['name'].to_s
533
+ comment = attrinfo['comment'].to_s
534
+ database = attrinfo['database'].to_s
535
+ table = attrinfo['table'].to_s
536
+ method_name = attrinfo['method_name'].to_s
537
+ parameters = attrinfo['parameters'].to_s
538
+ parameters = "{}" if parameters.empty?
539
+ parameters = JSON.parse(parameters)
540
+ [entry_name, comment, database, table, method_name, parameters]
541
+ }
542
+ return [relation_key, logs, attrs]
543
+ end
544
+
545
+ # => true
546
+ def create_aggregation_log_entry(name, entry_name, comment, db, table, okeys, value_key, count_key)
547
+ params = {}
548
+ params['comment'] = comment if comment
549
+ okeys.each_with_index {|okey,i|
550
+ params["os[#{i}]"] = okey
551
+ }
552
+ params['value_key'] = value_key if value_key
553
+ params['count_key'] = count_key if count_key
554
+ code, body, res = post("/v3/aggr/entry/log/create/#{e name}/#{e entry_name}/#{e db}/#{e table}", params)
555
+ if code != "200"
556
+ raise_error("Create aggregation log entry failed", res)
557
+ end
558
+ return true
559
+ end
560
+
561
+ # => true
562
+ def delete_aggregation_log_entry(name, entry_name)
563
+ code, body, res = post("/v3/aggr/entry/log/delete/#{e name}/#{e entry_name}")
564
+ if code != "200"
565
+ raise_error("Delete aggregation log entry failed", res)
566
+ end
567
+ return true
568
+ end
569
+
570
+ # => true
571
+ def create_aggregation_attr_entry(name, entry_name, comment, db, table, method_name, parameters)
572
+ params = {}
573
+ parameters.each_pair {|k,v|
574
+ params["parameters[#{k}]"] = v.to_s
575
+ }
576
+ params['comment'] = comment if comment
577
+ code, body, res = post("/v3/aggr/entry/attr/create/#{e name}/#{e entry_name}/#{e db}/#{e table}/#{e method_name}", params)
578
+ if code != "200"
579
+ raise_error("Create aggregation attr entry failed", res)
580
+ end
581
+ return true
582
+ end
583
+
584
+ # => true
585
+ def delete_aggregation_attr_entry(name, entry_name)
586
+ code, body, res = post("/v3/aggr/entry/attr/delete/#{e name}/#{e entry_name}")
587
+ if code != "200"
588
+ raise_error("Delete aggregation attr entry failed", res)
589
+ end
590
+ return true
591
+ end
592
+
593
+
404
594
  ####
405
595
  ## User API
406
596
  ##
@@ -148,7 +148,7 @@ class Job < Model
148
148
  STATUS_KILLED = "killed"
149
149
  FINISHED_STATUS = [STATUS_SUCCESS, STATUS_ERROR, STATUS_KILLED]
150
150
 
151
- def initialize(client, job_id, type, query, status=nil, url=nil, debug=nil, start_at=nil, end_at=nil, result=nil)
151
+ def initialize(client, job_id, type, query, status=nil, url=nil, debug=nil, start_at=nil, end_at=nil, result=nil, rset=nil)
152
152
  super(client)
153
153
  @job_id = job_id
154
154
  @type = type
@@ -159,9 +159,10 @@ class Job < Model
159
159
  @start_at = start_at
160
160
  @end_at = end_at
161
161
  @result = result
162
+ @rset = rset
162
163
  end
163
164
 
164
- attr_reader :job_id, :type
165
+ attr_reader :job_id, :type, :rset
165
166
 
166
167
  def wait(timeout=nil)
167
168
  # TODO
@@ -201,6 +202,10 @@ class Job < Model
201
202
  @end_at && !@end_at.empty? ? Time.parse(@end_at) : nil
202
203
  end
203
204
 
205
+ def rset_name
206
+ @rset ? @rset.name : nil
207
+ end
208
+
204
209
  def result
205
210
  unless @result
206
211
  return nil unless finished?
@@ -252,7 +257,7 @@ class Job < Model
252
257
  end
253
258
 
254
259
  def update_status!
255
- query, status, url, debug, start_at, end_at = @client.job_status(@job_id)
260
+ query, status, url, debug, start_at, end_at, rset = @client.job_status(@job_id)
256
261
  @query = query
257
262
  @status = status
258
263
  @url = url
@@ -277,15 +282,107 @@ end
277
282
 
278
283
 
279
284
  class Schedule < Model
280
- def initialize(client, name, cron, query, database=nil)
285
+ def initialize(client, name, cron, query, database=nil, rset=nil)
281
286
  super(client)
282
287
  @name = name
283
288
  @cron = cron
284
289
  @query = query
285
290
  @database = database
291
+ @rset = rset
292
+ end
293
+
294
+ def rset_name
295
+ @rset ? @rset.name : nil
296
+ end
297
+
298
+ attr_reader :name, :cron, :query, :database, :rset
299
+ end
300
+
301
+
302
+ class ResultSetInfo < Model
303
+ def initialize(client, type, host, port, database, user, password)
304
+ super(client)
305
+ @type = type
306
+ @host = host
307
+ @port = port
308
+ @database = database
309
+ @user = user
310
+ @password = password
311
+ end
312
+
313
+ attr_reader :type, :host, :port, :database, :user, :password
314
+ end
315
+
316
+
317
+ class ResultSet < Model
318
+ def initialize(client, name)
319
+ super(client)
320
+ @name = name
321
+ end
322
+
323
+ attr_reader :name
324
+ end
325
+
326
+
327
+ class AggregationSchema < Model
328
+ def initialize(client, name, relation_key, logs=nil, attributes=nil)
329
+ super(client)
330
+ @name = name
331
+ @relation_key = relation_key
332
+ @logs = logs
333
+ @attributes = attributes
334
+ end
335
+
336
+ attr_reader :name, :relation_key
337
+
338
+ def logs
339
+ update_entries! unless @logs
340
+ @logs
341
+ end
342
+
343
+ def attributes
344
+ update_entries! unless @attributes
345
+ @attributes
346
+ end
347
+
348
+ def update_entries!
349
+ sc = @client.aggregation_schema(@name)
350
+ @relation_key = sc.relation_key
351
+ @logs = sc.logs
352
+ @attributes = sc.attributes
353
+ self
354
+ end
355
+ end
356
+
357
+
358
+ class LogAggregationSchemaEntry < Model
359
+ def initialize(client, name, comment, table, okeys, value_key, count_key)
360
+ super(client)
361
+ @name = name
362
+ @comment = comment
363
+ @table = table
364
+ @okeys = okeys
365
+ @value_key = value_key
366
+ @count_key = count_key
367
+ end
368
+
369
+ attr_reader :name, :comment, :table
370
+ attr_reader :okeys, :value_key, :count_key
371
+ end
372
+
373
+
374
+ class AttributeAggregationSchemaEntry < Model
375
+ def initialize(client, name, comment, table, method_name, parameters)
376
+ super(client)
377
+ @name = name
378
+ @comment = comment
379
+ @table = table
380
+ @method_name = method_name
381
+ @parameters = parameters
286
382
  end
287
383
 
288
- attr_reader :name, :cron, :query, :database
384
+ attr_reader :name, :comment, :table
385
+ attr_reader :method_name, :parameters
289
386
  end
290
387
 
291
388
 
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.8.4'
3
+ VERSION = '0.8.5'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.8.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-10 00:00:00.000000000Z
12
+ date: 2011-12-04 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
16
- requirement: &70306417282560 !ruby/object:Gem::Requirement
16
+ requirement: &70311656540280 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70306417282560
24
+ version_requirements: *70311656540280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70306417281540 !ruby/object:Gem::Requirement
27
+ requirement: &70311656539740 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 1.4.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70306417281540
35
+ version_requirements: *70311656539740
36
36
  description:
37
37
  email:
38
38
  executables: []