Skip to content

Commit e9b1c03

Browse files
Merge pull request #168 from p-eye/fix_string_to_time_converter
add TIME type conversion to string converter
2 parents ee1b21d + 3c0744f commit e9b1c03

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

lib/embulk/output/bigquery/value_converter_factory.rb

+13
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ def string_converter
224224
val # Users must care of BQ timestamp format
225225
}
226226
end
227+
when 'TIME'
228+
# TimeWithZone doesn't affect any change to the time value
229+
Proc.new {|val|
230+
next nil if val.nil?
231+
with_typecast_error(val) do |val|
232+
TimeWithZone.set_zone_offset(Time.parse(val), zone_offset).strftime("%H:%M:%S.%6N")
233+
end
234+
}
227235
when 'RECORD'
228236
Proc.new {|val|
229237
next nil if val.nil?
@@ -271,6 +279,11 @@ def timestamp_converter
271279
next nil if val.nil?
272280
val.localtime(zone_offset).strftime("%Y-%m-%d %H:%M:%S.%6N")
273281
}
282+
when 'TIME'
283+
Proc.new {|val|
284+
next nil if val.nil?
285+
val.localtime(zone_offset).strftime("%H:%M:%S.%6N")
286+
}
274287
else
275288
raise NotSupportedType, "cannot take column type #{type} for timestamp column"
276289
end

test/test_value_converter_factory.rb

+35
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,23 @@ def test_datetime
262262
assert_equal "2016-02-26 00:00:00", converter.call("2016-02-26 00:00:00")
263263
end
264264

265+
def test_time
266+
converter = ValueConverterFactory.new(SCHEMA_TYPE, 'TIME').create_converter
267+
assert_equal nil, converter.call(nil)
268+
assert_equal "00:03:22.000000", converter.call("00:03:22")
269+
assert_equal "15:22:00.000000", converter.call("3:22 PM")
270+
assert_equal "03:22:00.000000", converter.call("3:22 AM")
271+
assert_equal "00:00:00.000000", converter.call("2016-02-26 00:00:00")
272+
273+
# TimeWithZone doesn't affect any change to the time value
274+
converter = ValueConverterFactory.new(
275+
SCHEMA_TYPE, 'TIME', timezone: 'Asia/Tokyo'
276+
).create_converter
277+
assert_equal "15:00:01.000000", converter.call("15:00:01")
278+
279+
assert_raise { converter.call('foo') }
280+
end
281+
265282
def test_record
266283
converter = ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter
267284
assert_equal({'foo'=>'foo'}, converter.call(%Q[{"foo":"foo"}]))
@@ -350,6 +367,24 @@ def test_datetime
350367
assert_raise { converter.call('foo') }
351368
end
352369

370+
def test_time
371+
converter = ValueConverterFactory.new(SCHEMA_TYPE, 'TIME').create_converter
372+
assert_equal nil, converter.call(nil)
373+
timestamp = Time.parse("2016-02-26 00:00:00.500000 +00:00")
374+
expected = "00:00:00.500000"
375+
assert_equal expected, converter.call(timestamp)
376+
377+
converter = ValueConverterFactory.new(
378+
SCHEMA_TYPE, 'TIME', timezone: 'Asia/Tokyo'
379+
).create_converter
380+
assert_equal nil, converter.call(nil)
381+
timestamp = Time.parse("2016-02-25 15:00:00.500000 +00:00")
382+
expected = "00:00:00.500000"
383+
assert_equal expected, converter.call(timestamp)
384+
385+
assert_raise { converter.call('foo') }
386+
end
387+
353388
def test_record
354389
assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter }
355390
end

0 commit comments

Comments
 (0)