fluent-plugin-bigquery 0.0.1 → 0.0.2

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 793b3fbd0189044538497bcef9dc244adf987d86
4
- data.tar.gz: 115ff35e20bf3e3fe58e54978f7e659678e14a17
3
+ metadata.gz: caee66954ca996b43797e050825d5115dcd132f8
4
+ data.tar.gz: 040afb42fa0fe48f61a90d11e9ea5684d170974c
5
5
  SHA512:
6
- metadata.gz: d230732372df108fbcdf59aec5485f2837028531fb1cb9edf0582dfc31654a747bb35494e9de646067e295960709e778d9e69f41f80f1a8810e122b952c971e4
7
- data.tar.gz: fc7dbd59a34a44f9f8f2aef3829fc352636c58a5fad3d8ddbf661368c912d8a2ba5d6f2080c66fc85c32f615916c3ad980f3e4e3a9b6e967bc8bfc1fc5712e2c
6
+ metadata.gz: 15aed88d76491c467ff6e865381d1d78884d632f998c71569e53faadb1acf18d572e4459b55d4ff5a3e57121365cf1ec90c4c292726e492bcfdac6a52ab7f815
7
+ data.tar.gz: a5ed1a27a117a6f54a2931741c2ffdf37b856e54074af94e2740e70ed361fa21f4790a20e926d675019d1280574497303825562be0b75097200b5e58dd49646c
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # fluent-plugin-webhdfs
1
+ # fluent-plugin-bigquery
2
2
 
3
3
  Fluentd output plugin to load/insert data into Google BigQuery.
4
4
 
@@ -131,8 +131,7 @@ With this configuration, flushing will be done in 0.25 seconds after record inpu
131
131
 
132
132
  * support Load API
133
133
  * with automatically configured flush/buffer options
134
- * support RECORD field
135
- * and support optional data fields
134
+ * support optional data fields
136
135
  * support NULLABLE/REQUIRED/REPEATED field options
137
136
  * OAuth installed application credentials support
138
137
  * Google API discovery expiration
@@ -1,6 +1,6 @@
1
1
  module Fluent
2
2
  module BigQueryPlugin
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
6
6
 
@@ -126,25 +126,25 @@ module Fluent
126
126
 
127
127
  @tablelist = @tables ? @tables.split(',') : [@table]
128
128
 
129
- @fields = {}
129
+ @fields = RecordSchema.new
130
130
  if @field_string
131
131
  @field_string.split(',').each do |fieldname|
132
- @fields[fieldname] = :string
132
+ @fields.register_field fieldname, :string
133
133
  end
134
134
  end
135
135
  if @field_integer
136
136
  @field_integer.split(',').each do |fieldname|
137
- @fields[fieldname] = :integer
137
+ @fields.register_field fieldname, :integer
138
138
  end
139
139
  end
140
140
  if @field_float
141
141
  @field_float.split(',').each do |fieldname|
142
- @fields[fieldname] = :float
142
+ @fields.register_field fieldname, :float
143
143
  end
144
144
  end
145
145
  if @field_boolean
146
146
  @field_boolean.split(',').each do |fieldname|
147
- @fields[fieldname] = :boolean
147
+ @fields.register_field fieldname, :boolean
148
148
  end
149
149
  end
150
150
 
@@ -204,7 +204,7 @@ module Fluent
204
204
  "rows" => rows
205
205
  }
206
206
  )
207
- if res.status != 200
207
+ unless res.success?
208
208
  # api_error? -> client cache clear
209
209
  @cached_client = nil
210
210
 
@@ -227,32 +227,14 @@ module Fluent
227
227
  raise NotImplementedError # TODO
228
228
  end
229
229
 
230
- def format_record(record)
231
- out = {}
232
- @fields.each do |key, type|
233
- value = record[key]
234
- next if value.nil? # field does not exists, or null value
235
- out[key] = case type
236
- when :string then record[key].to_s
237
- when :integer then record[key].to_i
238
- when :float then record[key].to_f
239
- when :boolean then !!record[key]
240
- # when :record
241
- else
242
- raise "BUG: unknown field type #{type}"
243
- end
244
- end
245
- out
246
- end
247
-
248
230
  def format_stream(tag, es)
249
231
  super
250
232
  buf = ''
251
233
  es.each do |time, record|
252
234
  row = if @time_field
253
- format_record(record.merge({@time_field => @timef.format(time)}))
235
+ @fields.format(record.merge({@time_field => @timef.format(time)}))
254
236
  else
255
- format_record(record)
237
+ @fields.format(record)
256
238
  end
257
239
  buf << {"json" => row}.to_msgpack unless row.empty?
258
240
  end
@@ -292,5 +274,107 @@ module Fluent
292
274
  # client.authorization = flow.authorize # browser authentication !
293
275
  # client
294
276
  # end
277
+
278
+ class FieldSchema
279
+ def format(value)
280
+ raise NotImplementedError, "Must implement in a subclass"
281
+ end
282
+ end
283
+
284
+ class StringFieldSchema < FieldSchema
285
+ def type
286
+ :string
287
+ end
288
+
289
+ def format(value)
290
+ value.to_s
291
+ end
292
+ end
293
+
294
+ class IntegerFieldSchema < FieldSchema
295
+ def type
296
+ :integer
297
+ end
298
+
299
+ def format(value)
300
+ value.to_i
301
+ end
302
+ end
303
+
304
+ class FloatFieldSchema < FieldSchema
305
+ def type
306
+ :float
307
+ end
308
+
309
+ def format(value)
310
+ value.to_f
311
+ end
312
+ end
313
+
314
+ class BooleanFieldSchema < FieldSchema
315
+ def type
316
+ :boolean
317
+ end
318
+
319
+ def format(value)
320
+ !!value
321
+ end
322
+ end
323
+
324
+ class RecordSchema < FieldSchema
325
+ FIELD_TYPES = {
326
+ :string => StringFieldSchema,
327
+ :integer => IntegerFieldSchema,
328
+ :float => FloatFieldSchema,
329
+ :boolean => BooleanFieldSchema
330
+ }.freeze
331
+
332
+ def initialize
333
+ @fields = {}
334
+ end
335
+
336
+ def type
337
+ :record
338
+ end
339
+
340
+ def [](name)
341
+ @fields[name]
342
+ end
343
+
344
+ def register_field(name, type)
345
+ raise ConfigError, "field #{name} is registered twice" if @fields.key?(name)
346
+ if name[/\./]
347
+ recordname = $`
348
+ fieldname = $'
349
+ register_record_field(recordname)
350
+ @fields[recordname].register_field(fieldname, type)
351
+ else
352
+ schema = FIELD_TYPES[type]
353
+ raise ConfigError, "[Bug] Invalid field type #{type}" unless schema
354
+ @fields[name] = schema.new
355
+ end
356
+ end
357
+
358
+ def format(record)
359
+ out = {}
360
+ @fields.each do |key, schema|
361
+ value = record[key]
362
+ next if value.nil? # field does not exists, or null value
363
+ out[key] = schema.format(value)
364
+ end
365
+ out
366
+ end
367
+
368
+ private
369
+ def register_record_field(name)
370
+ if !@fields.key?(name)
371
+ @fields[name] = RecordSchema.new
372
+ else
373
+ unless @fields[name].kind_of?(RecordSchema)
374
+ raise ConfigError, "field #{name} is required to be a record but already registered as #{@field[name]}"
375
+ end
376
+ end
377
+ end
378
+ end
295
379
  end
296
380
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-bigquery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - TAGOMORI Satoshi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-23 00:00:00.000000000 Z
11
+ date: 2014-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake