td 0.10.31 → 0.10.32

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,10 @@
1
1
 
2
+ == 2012-07-03 version 0.10.32
3
+
4
+ * Added table:partial_delete subcommand
5
+ * query, sched:create and sched:update subcommands support -P, --priority option
6
+
7
+
2
8
  == 2012-06-27 version 0.10.31
3
9
 
4
10
  * table:tail supports -P option which enable pretty printing
@@ -5,6 +5,27 @@ module Command
5
5
  # TODO
6
6
  JOB_WAIT_MAX_RETRY_COUNT_ON_NETWORK_ERROR = 10
7
7
 
8
+ PRIORITY_FORMAT_MAP = {
9
+ -2 => 'VERY LOW',
10
+ -1 => 'LOW',
11
+ 0 => 'NORMAL',
12
+ 1 => 'HIGH',
13
+ 2 => 'VERY HIGH',
14
+ }
15
+
16
+ PRIORITY_PARSE_MAP = {
17
+ /\Avery[ _\-]?low\z/i => -2,
18
+ /\A-2\z/ => -2,
19
+ /\Alow\z/i => -1,
20
+ /\A-1\z/ => -1,
21
+ /\Anorm(?:al)?\z/i => 0,
22
+ /\A[\-\+]?0\z/ => 0,
23
+ /\Ahigh\z/i => 1,
24
+ /\A[\+]?1\z/ => 1,
25
+ /\Avery[ _\-]?high\z/i => 2,
26
+ /\A[\+]?2\z/ => 2,
27
+ }
28
+
8
29
  def job_list(op)
9
30
  page = 0
10
31
  skip = 0
@@ -41,10 +62,11 @@ module Command
41
62
  jobs.each {|job|
42
63
  start = job.start_at
43
64
  elapsed = cmd_format_elapsed(start, job.end_at)
44
- rows << {:JobID => job.job_id, :Status => job.status, :Type => job.type, :Query => job.query.to_s, :Start => (start ? start.localtime : ''), :Elapsed => elapsed, :Result => job.result_url}
65
+ priority = job_priority_name_of(job.priority)
66
+ rows << {:JobID => job.job_id, :Status => job.status, :Type => job.type, :Query => job.query.to_s, :Start => (start ? start.localtime : ''), :Elapsed => elapsed, :Priority => priority, :Result => job.result_url}
45
67
  }
46
68
 
47
- puts cmd_render_table(rows, :fields => [:JobID, :Status, :Start, :Elapsed,:Result, :Type, :Query])
69
+ puts cmd_render_table(rows, :fields => [:JobID, :Status, :Start, :Elapsed, :Priority, :Result, :Type, :Query])
48
70
  end
49
71
 
50
72
  def job_show(op)
@@ -79,8 +101,9 @@ module Command
79
101
  #puts "URL : #{job.url}"
80
102
  puts "Status : #{job.status}"
81
103
  puts "Type : #{job.type}"
104
+ puts "Priority : #{job_priority_name_of(job.priority)}"
105
+ puts "Result : #{job.result_url}"
82
106
  puts "Query : #{job.query}"
83
- puts "Result table : #{job.result_url}"
84
107
 
85
108
  if wait && !job.finished?
86
109
  wait_job(job)
@@ -248,6 +271,17 @@ module Command
248
271
 
249
272
  puts cmd_render_table(rows, opts)
250
273
  end
274
+
275
+ def job_priority_name_of(id)
276
+ PRIORITY_FORMAT_MAP[id] || 'NORMAL'
277
+ end
278
+
279
+ def job_priority_id_of(name)
280
+ PRIORITY_PARSE_MAP.each_pair {|pattern,id|
281
+ return id if pattern.match(name)
282
+ }
283
+ return nil
284
+ end
251
285
  end
252
286
  end
253
287
 
@@ -223,6 +223,7 @@ module List
223
223
  add_list 'table:import', %w[db table files_], 'Parse and import files to a table', 'table:import example_db table1 --apache access.log', 'table:import example_db table1 --json -t time - < test.json'
224
224
  add_list 'table:export', %w[db table], 'Dump logs in a table to the specified storage', 'table:export example_db table1 --s3-bucket mybucket -k KEY_ID -s SECRET_KEY'
225
225
  add_list 'table:tail', %w[db table], 'Get recently imported logs', 'table:tail example_db table1', 'table:tail example_db table1 -t "2011-01-02 03:04:05" -n 30'
226
+ add_list 'table:partial_delete', %w[db table], 'Delete logs from the table within the specified time range', 'table:partial_delete example_db table1 --from 1341000000 --to 1341003600'
226
227
 
227
228
  add_list 'bulk_import:list', %w[], 'List bulk import sessions', 'bulk_import:list'
228
229
  add_list 'bulk_import:show', %w[name], 'Show list of uploaded parts', 'bulk_import:show'
@@ -10,6 +10,7 @@ module Command
10
10
  result_url = nil
11
11
  result_user = nil
12
12
  result_ask_password = false
13
+ priority = nil
13
14
 
14
15
  op.on('-d', '--database DB_NAME', 'use the database (required)') {|s|
15
16
  db_name = s
@@ -35,6 +36,12 @@ module Command
35
36
  op.on('-p', '--password', 'ask password for the result URL') {|s|
36
37
  result_ask_password = true
37
38
  }
39
+ op.on('-P', '--priority PRIORITY', 'set priority') {|s|
40
+ priority = job_priority_id_of(s)
41
+ unless priority
42
+ raise "unknown priority #{s.inspect} should be -2 (very-low), -1 (low), 0 (normal), 1 (high) or 2 (very-high)"
43
+ end
44
+ }
38
45
 
39
46
  sql = op.cmd_parse
40
47
 
@@ -53,7 +60,7 @@ module Command
53
60
  # local existance check
54
61
  get_database(client, db_name)
55
62
 
56
- job = client.query(db_name, sql, result_url)
63
+ job = client.query(db_name, sql, result_url, priority)
57
64
 
58
65
  $stderr.puts "Job #{job.job_id} is queued."
59
66
  $stderr.puts "Use '#{$prog} job:show #{job.job_id}' to show the status."
@@ -69,7 +76,7 @@ module Command
69
76
  end
70
77
  end
71
78
 
72
- require 'td/command/job' # wait_job
79
+ require 'td/command/job' # wait_job, job_priority_id_of
73
80
  end
74
81
  end
75
82
 
@@ -3,6 +3,8 @@ module TreasureData
3
3
  module Command
4
4
 
5
5
  def sched_list(op)
6
+ require 'td/command/job' # job_priority_name_of
7
+
6
8
  op.cmd_parse
7
9
 
8
10
  client = get_client
@@ -11,13 +13,13 @@ module Command
11
13
 
12
14
  rows = []
13
15
  scheds.each {|sched|
14
- rows << {:Name => sched.name, :Cron => sched.cron, :Timezone => sched.timezone, :Delay => sched.delay, :Result => sched.result_url, :Database => sched.database, :Query => sched.query, :"Next schedule" => sched.next_time ? sched.next_time.localtime : nil }
16
+ rows << {:Name => sched.name, :Cron => sched.cron, :Timezone => sched.timezone, :Delay => sched.delay, :Priority => job_priority_name_of(sched.priority), :Result => sched.result_url, :Database => sched.database, :Query => sched.query, :"Next schedule" => sched.next_time ? sched.next_time.localtime : nil }
15
17
  }
16
18
  rows = rows.sort_by {|map|
17
19
  map[:Name]
18
20
  }
19
21
 
20
- puts cmd_render_table(rows, :fields => [:Name, :Cron, :Timezone, :"Next schedule", :Delay, :Result, :Database, :Query], :max_width=>500)
22
+ puts cmd_render_table(rows, :fields => [:Name, :Cron, :Timezone, :"Next schedule", :Delay, :Priority, :Result, :Database, :Query], :max_width=>500)
21
23
  end
22
24
 
23
25
  def sched_create(op)
@@ -27,6 +29,7 @@ module Command
27
29
  result_url = nil
28
30
  result_user = nil
29
31
  result_ask_password = false
32
+ priority = nil
30
33
 
31
34
  op.on('-d', '--database DB_NAME', 'use the database (required)') {|s|
32
35
  db_name = s
@@ -46,6 +49,12 @@ module Command
46
49
  op.on('-p', '--password', 'ask password for the result URL') {|s|
47
50
  result_ask_password = true
48
51
  }
52
+ op.on('-P', '--priority PRIORITY', 'set priority') {|s|
53
+ priority = job_priority_id_of(s)
54
+ unless priority
55
+ raise "unknown priority #{s.inspect} should be -2 (very-low), -1 (low), 0 (normal), 1 (high) or 2 (very-high)"
56
+ end
57
+ }
49
58
 
50
59
  name, cron, sql = op.cmd_parse
51
60
 
@@ -65,7 +74,7 @@ module Command
65
74
  get_database(client, db_name)
66
75
 
67
76
  begin
68
- first_time = client.create_schedule(name, :cron=>cron, :query=>sql, :database=>db_name, :result=>result_url, :timezone=>timezone, :delay=>delay)
77
+ first_time = client.create_schedule(name, :cron=>cron, :query=>sql, :database=>db_name, :result=>result_url, :timezone=>timezone, :delay=>delay, :priority=>priority)
69
78
  rescue AlreadyExistsError
70
79
  cmd_debug_error $!
71
80
  $stderr.puts "Schedule '#{name}' already exists."
@@ -99,6 +108,7 @@ module Command
99
108
  result = nil
100
109
  timezone = nil
101
110
  delay = nil
111
+ priority = nil
102
112
 
103
113
  op.on('-s', '--schedule CRON', 'change the schedule') {|s|
104
114
  cron = s
@@ -118,6 +128,12 @@ module Command
118
128
  op.on('-D', '--delay SECONDS', 'change the delay time of the schedule', Integer) {|i|
119
129
  delay = i
120
130
  }
131
+ op.on('-P', '--priority PRIORITY', 'set priority') {|s|
132
+ priority = job_priority_id_of(s)
133
+ unless priority
134
+ raise "unknown priority #{s.inspect} should be -2 (very-low), -1 (low), 0 (normal), 1 (high) or 2 (very-high)"
135
+ end
136
+ }
121
137
 
122
138
  name = op.cmd_parse
123
139
 
@@ -128,6 +144,7 @@ module Command
128
144
  params['result'] = result if result
129
145
  params['timezone'] = timezone if timezone
130
146
  params['delay'] = delay.to_s if delay
147
+ params['priority'] = priority.to_s if priority
131
148
 
132
149
  if params.empty?
133
150
  $stderr.puts op.to_s
@@ -149,6 +166,8 @@ module Command
149
166
  end
150
167
 
151
168
  def sched_history(op)
169
+ require 'td/command/job' # job_priority_name_of
170
+
152
171
  page = 0
153
172
  skip = 0
154
173
 
@@ -186,16 +205,17 @@ module Command
186
205
  puts "Delay : #{s.delay} sec"
187
206
  puts "Next : #{s.next_time}"
188
207
  puts "Result : #{s.result_url}"
208
+ puts "Priority : #{job_priority_name_of(s.priority)}"
189
209
  puts "Database : #{s.database}"
190
210
  puts "Query : #{s.query}"
191
211
  end
192
212
 
193
213
  rows = []
194
214
  history.each {|j|
195
- rows << {:Time => j.scheduled_at.localtime, :JobID => j.job_id, :Status => j.status, :Result=>j.result_url}
215
+ rows << {:Time => j.scheduled_at.localtime, :JobID => j.job_id, :Status => j.status, :Priority => job_priority_name_of(j.priority), :Result=>j.result_url}
196
216
  }
197
217
 
198
- puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Result])
218
+ puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Priority, :Result])
199
219
  end
200
220
 
201
221
  def sched_run(op)
@@ -134,7 +134,7 @@ module Command
134
134
 
135
135
  op.on('-t', '--to TIME', 'end time of logs to get') {|s|
136
136
  if s.to_i.to_s == s
137
- to = s
137
+ to = s.to_i
138
138
  else
139
139
  require 'time'
140
140
  to = Time.parse(s).to_i
@@ -142,7 +142,7 @@ module Command
142
142
  }
143
143
  op.on('-f', '--from TIME', 'start time of logs to get') {|s|
144
144
  if s.to_i.to_s == s
145
- from = s
145
+ from = s.to_i
146
146
  else
147
147
  require 'time'
148
148
  from = Time.parse(s).to_i
@@ -193,7 +193,6 @@ module Command
193
193
  puts row.to_json
194
194
  }
195
195
  end
196
-
197
196
  end
198
197
 
199
198
  def table_export(op)
@@ -254,6 +253,64 @@ module Command
254
253
  end
255
254
  end
256
255
 
256
+ def table_partial_delete(op)
257
+ from = nil
258
+ to = nil
259
+ wait = false
260
+
261
+ op.on('-t', '--to TIME', 'end time of logs to delete') {|s|
262
+ if s.to_i.to_s == s
263
+ # UNIX time
264
+ to = s.to_i
265
+ else
266
+ require 'time'
267
+ to = Time.parse(s).to_i
268
+ end
269
+ }
270
+ op.on('-f', '--from TIME', 'start time of logs to delete') {|s|
271
+ if s.to_i.to_s == s
272
+ from = s.to_i
273
+ else
274
+ require 'time'
275
+ from = Time.parse(s).to_i
276
+ end
277
+ }
278
+ op.on('-w', '--wait', 'wait for finishing the job', TrueClass) {|b|
279
+ wait = b
280
+ }
281
+
282
+ db_name, table_name = op.cmd_parse
283
+
284
+ unless from
285
+ $stderr.puts "-f, --from TIME option is required"
286
+ exit 1
287
+ end
288
+
289
+ unless to
290
+ $stderr.puts "-t, --to TIME option is required"
291
+ exit 1
292
+ end
293
+
294
+ if from % 3600 != 0 || to % 3600 != 0
295
+ $stderr.puts "time must be a multiple of 3600 (1 hour)"
296
+ exit 1
297
+ end
298
+
299
+ client = get_client
300
+
301
+ table = get_table(client, db_name, table_name)
302
+
303
+ job = client.partial_delete(db_name, table_name, to, from)
304
+
305
+ $stderr.puts "Partial delete job #{job.job_id} is queued."
306
+ $stderr.puts "Use '#{$prog} job:show #{job.job_id}' to show the status."
307
+
308
+ if wait && !job.finished?
309
+ wait_job(job)
310
+ puts "Status : #{job.status}"
311
+ end
312
+ end
313
+
257
314
  require 'td/command/import' # table:import
258
315
  require 'td/command/export' # table:export
259
316
  require 'td/command/job' # wait_job
data/lib/td/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.10.31'
3
+ VERSION = '0.10.32'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.31
4
+ version: 0.10.32
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: 2012-06-27 00:00:00.000000000Z
12
+ date: 2012-07-03 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
16
- requirement: &70192621206960 !ruby/object:Gem::Requirement
16
+ requirement: &70143943515280 !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: *70192621206960
24
+ version_requirements: *70143943515280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70192621206320 !ruby/object:Gem::Requirement
27
+ requirement: &70143943514700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.4.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70192621206320
35
+ version_requirements: *70143943514700
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: hirb
38
- requirement: &70192621205780 !ruby/object:Gem::Requirement
38
+ requirement: &70143943514000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,21 +43,21 @@ dependencies:
43
43
  version: 0.4.5
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70192621205780
46
+ version_requirements: *70143943514000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: td-client
49
- requirement: &70192621205060 !ruby/object:Gem::Requirement
49
+ requirement: &70143943509200 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.8.18
54
+ version: 0.8.19
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70192621205060
57
+ version_requirements: *70143943509200
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: td-logger
60
- requirement: &70192621204380 !ruby/object:Gem::Requirement
60
+ requirement: &70143943508660 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 0.3.12
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70192621204380
68
+ version_requirements: *70143943508660
69
69
  description: CLI to manage data on Treasure Data, the Hadoop-based cloud data warehousing
70
70
  email: support@treasure-data.com
71
71
  executables: