td-client 0.8.4 → 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
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: []