6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/embulk/schema.rb', line 6
def initialize(columns)
columns = columns.map.with_index {|c,index|
if c.index && c.index != index
raise "Index of column '#{c.name}' is #{c.index} but it is at column #{index}."
end
Column.new(index, c.name, c.type, c.format)
}
super(columns)
record_reader_script =
"lambda do |reader|\n" <<
"record = []\n"
each do |column|
idx = column.index
column_script =
"if reader.isNull(#{idx})\n" <<
"record << nil\n" <<
"else\n" <<
case column.type
when :boolean
"record << reader.getBoolean(#{idx})"
when :long
"record << reader.getLong(#{idx})"
when :double
"record << reader.getDouble(#{idx})"
when :string
"record << reader.getString(#{idx})"
when :timestamp
"record << reader.getTimestamp(#{idx}).getRubyTime(JRuby.runtime)"
else
raise "Unknown type #{column.type.inspect}"
end <<
"end\n"
record_reader_script << column_script << "\n"
end
record_reader_script << "record\n"
record_reader_script << "end"
@record_reader = eval(record_reader_script)
record_writer_script = "lambda do |builder,record|\n"
record_writer_script << "java_timestamp_class = ::Embulk::Java::Timestamp\n"
each do |column|
idx = column.index
column_script =
"if record[#{idx}].nil?\n" <<
"builder.setNull(#{idx})\n" <<
"else\n" <<
case column.type
when :boolean
"builder.setBoolean(#{idx}, record[#{idx}])"
when :long
"builder.setLong(#{idx}, record[#{idx}])"
when :double
"builder.setDouble(#{idx}, record[#{idx}])"
when :string
"builder.setString(#{idx}, record[#{idx}])"
when :timestamp
"builder.setTimestamp(#{idx}, java_timestamp_class.fromRubyTime(record[#{idx}]))"
else
raise "Unknown type #{column.type.inspect}"
end <<
"end\n"
record_writer_script << column_script << "\n"
end
record_writer_script << "builder.addRecord\n"
record_writer_script << "end"
@record_writer = eval(record_writer_script)
@names = map {|c| c.name }
@types = map {|c| c.type }
freeze
end
|