embulk 0.7.11 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/README.md +1 -1
- data/build.gradle +2 -2
- data/embulk-core/build.gradle +2 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +11 -3
- data/embulk-core/src/main/java/org/embulk/config/YamlTagResolver.java +53 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +0 -1
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutorPlugin.java +479 -69
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +3 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnVisitor.java +2 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +12 -5
- data/embulk-core/src/main/java/org/embulk/spi/Page.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +26 -5
- data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +13 -0
- data/embulk-core/src/main/java/org/embulk/spi/json/JsonParseException.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/json/JsonParser.java +125 -0
- data/embulk-core/src/main/java/org/embulk/spi/json/RubyValueApi.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/JsonType.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +1 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +2 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/DynamicColumnSetterFactory.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +5 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/AbstractDynamicColumnSetter.java +3 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/BooleanColumnSetter.java +7 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DefaultValueSetter.java +2 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/DoubleColumnSetter.java +7 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/JsonColumnSetter.java +73 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/LongColumnSetter.java +11 -2
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/NullDefaultValueSetter.java +5 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/SkipColumnSetter.java +5 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/StringColumnSetter.java +7 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/TimestampColumnSetter.java +9 -1
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +7 -0
- data/embulk-docs/src/built-in.rst +40 -3
- data/embulk-docs/src/conf.py +2 -2
- data/embulk-docs/src/release.rst +1 -1
- data/embulk-docs/src/release/release-0.8.0.rst +68 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +12 -1
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +18 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +1 -1
- data/embulk.gemspec +1 -1
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +2 -2
- data/gradlew +3 -7
- data/lib/embulk/column.rb +2 -0
- data/lib/embulk/command/embulk_migrate_plugin.rb +76 -10
- data/lib/embulk/command/embulk_new_plugin.rb +2 -0
- data/lib/embulk/command/embulk_run.rb +17 -10
- data/lib/embulk/data/bundle/.ruby-version +1 -1
- data/lib/embulk/data/new/java/build.gradle.erb +21 -0
- data/lib/embulk/data/new/java/config/checkstyle/checkstyle.xml +128 -0
- data/lib/embulk/data/new/java/config/checkstyle/default.xml +108 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties +2 -2
- data/lib/embulk/data/new/java/gradlew +3 -7
- data/lib/embulk/data/new/ruby/.ruby-version +1 -1
- data/lib/embulk/guess/csv.rb +1 -1
- data/lib/embulk/guess/schema_guess.rb +6 -0
- data/lib/embulk/guess_plugin.rb +1 -1
- data/lib/embulk/java/imports.rb +4 -0
- data/lib/embulk/plugin_registry.rb +8 -12
- data/lib/embulk/schema.rb +6 -0
- data/lib/embulk/version.rb +1 -1
- data/test/guess/test_csv_guess.rb +170 -0
- data/test/helper.rb +2 -0
- metadata +19 -17
- data/embulk-core/src/main/java/org/embulk/exec/LocalThreadExecutor.java +0 -34
- data/embulk-core/src/main/java/org/embulk/guice/Bootstrap.java +0 -157
- data/embulk-core/src/main/java/org/embulk/guice/CloseableInjector.java +0 -22
- data/embulk-core/src/main/java/org/embulk/guice/InjectorProxy.java +0 -145
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjector.java +0 -26
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleInjectorProxy.java +0 -61
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleManager.java +0 -187
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethods.java +0 -89
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleMethodsMap.java +0 -38
- data/embulk-core/src/main/java/org/embulk/guice/LifeCycleModule.java +0 -97
- data/embulk-docs/src/release/release-0.7.11.rst +0 -13
@@ -9,6 +9,7 @@ import org.embulk.spi.type.DoubleType;
|
|
9
9
|
import org.embulk.spi.type.LongType;
|
10
10
|
import org.embulk.spi.type.TimestampType;
|
11
11
|
import org.embulk.spi.type.StringType;
|
12
|
+
import org.embulk.spi.type.JsonType;
|
12
13
|
|
13
14
|
public class Column
|
14
15
|
{
|
@@ -57,6 +58,8 @@ public class Column
|
|
57
58
|
visitor.stringColumn(this);
|
58
59
|
} else if (type instanceof TimestampType) {
|
59
60
|
visitor.timestampColumn(this);
|
61
|
+
} else if (type instanceof JsonType) {
|
62
|
+
visitor.jsonColumn(this);
|
60
63
|
} else {
|
61
64
|
assert(false);
|
62
65
|
}
|
@@ -47,6 +47,7 @@ public class ExecSession
|
|
47
47
|
public static class Builder
|
48
48
|
{
|
49
49
|
private final Injector injector;
|
50
|
+
private ILoggerFactory loggerFactory;
|
50
51
|
private Timestamp transactionTime;
|
51
52
|
|
52
53
|
public Builder(Injector injector)
|
@@ -60,6 +61,12 @@ public class ExecSession
|
|
60
61
|
return this;
|
61
62
|
}
|
62
63
|
|
64
|
+
public Builder setLoggerFactory(ILoggerFactory loggerFactory)
|
65
|
+
{
|
66
|
+
this.loggerFactory = loggerFactory;
|
67
|
+
return this;
|
68
|
+
}
|
69
|
+
|
63
70
|
public Builder setTransactionTime(Timestamp timestamp)
|
64
71
|
{
|
65
72
|
this.transactionTime = timestamp;
|
@@ -71,7 +78,7 @@ public class ExecSession
|
|
71
78
|
if (transactionTime == null) {
|
72
79
|
transactionTime = Timestamp.ofEpochMilli(System.currentTimeMillis()); // TODO get nanoseconds for default
|
73
80
|
}
|
74
|
-
return new ExecSession(injector, transactionTime);
|
81
|
+
return new ExecSession(injector, transactionTime, Optional.fromNullable(loggerFactory));
|
75
82
|
}
|
76
83
|
}
|
77
84
|
|
@@ -86,14 +93,14 @@ public class ExecSession
|
|
86
93
|
this(injector,
|
87
94
|
configSource.loadConfig(SessionTask.class).getTransactionTime().or(
|
88
95
|
Timestamp.ofEpochMilli(System.currentTimeMillis())
|
89
|
-
|
90
|
-
|
96
|
+
), // TODO get nanoseconds for default
|
97
|
+
null);
|
91
98
|
}
|
92
99
|
|
93
|
-
private ExecSession(Injector injector, Timestamp transactionTime)
|
100
|
+
private ExecSession(Injector injector, Timestamp transactionTime, Optional<ILoggerFactory> loggerFactory)
|
94
101
|
{
|
95
102
|
this.injector = injector;
|
96
|
-
this.loggerFactory = injector.getInstance(ILoggerFactory.class);
|
103
|
+
this.loggerFactory = loggerFactory.or(injector.getInstance(ILoggerFactory.class));
|
97
104
|
this.modelManager = injector.getInstance(ModelManager.class);
|
98
105
|
this.pluginManager = injector.getInstance(PluginManager.class);
|
99
106
|
this.bufferAllocator = injector.getInstance(BufferAllocator.class);
|
@@ -1,11 +1,13 @@
|
|
1
1
|
package org.embulk.spi;
|
2
2
|
|
3
3
|
import java.util.List;
|
4
|
+
import org.msgpack.value.ImmutableValue;
|
4
5
|
|
5
6
|
public class Page
|
6
7
|
{
|
7
8
|
private final Buffer buffer;
|
8
9
|
private List<String> stringReferences;
|
10
|
+
private List<ImmutableValue> valueReferences;
|
9
11
|
|
10
12
|
protected Page(Buffer buffer)
|
11
13
|
{
|
@@ -28,17 +30,34 @@ public class Page
|
|
28
30
|
return this;
|
29
31
|
}
|
30
32
|
|
33
|
+
public Page setValueReferences(List<ImmutableValue> values)
|
34
|
+
{
|
35
|
+
this.valueReferences = values;
|
36
|
+
return this;
|
37
|
+
}
|
38
|
+
|
31
39
|
public List<String> getStringReferences()
|
32
40
|
{
|
33
41
|
// TODO used by mapreduce executor
|
34
42
|
return stringReferences;
|
35
43
|
}
|
36
44
|
|
45
|
+
public List<ImmutableValue> getValueReferences()
|
46
|
+
{
|
47
|
+
// TODO used by mapreduce executor
|
48
|
+
return valueReferences;
|
49
|
+
}
|
50
|
+
|
37
51
|
public String getStringReference(int index)
|
38
52
|
{
|
39
53
|
return stringReferences.get(index);
|
40
54
|
}
|
41
55
|
|
56
|
+
public ImmutableValue getValueReference(int index)
|
57
|
+
{
|
58
|
+
return valueReferences.get(index);
|
59
|
+
}
|
60
|
+
|
42
61
|
public void release()
|
43
62
|
{
|
44
63
|
buffer.release();
|
@@ -11,6 +11,8 @@ import com.google.common.collect.BiMap;
|
|
11
11
|
import com.google.common.collect.HashBiMap;
|
12
12
|
import io.airlift.slice.Slice;
|
13
13
|
import io.airlift.slice.Slices;
|
14
|
+
import org.msgpack.value.Value;
|
15
|
+
import org.msgpack.value.ImmutableValue;
|
14
16
|
import org.embulk.spi.time.Timestamp;
|
15
17
|
|
16
18
|
public class PageBuilder
|
@@ -29,7 +31,8 @@ public class PageBuilder
|
|
29
31
|
private int position;
|
30
32
|
private final byte[] nullBitSet;
|
31
33
|
private final BiMap<String, Integer> stringReferences = HashBiMap.create();
|
32
|
-
private
|
34
|
+
private List<ImmutableValue> valueReferences = new ArrayList<>();
|
35
|
+
private int referenceSize;
|
33
36
|
private int nextVariableLengthDataOffset;
|
34
37
|
|
35
38
|
public PageBuilder(BufferAllocator allocator, Schema schema, PageOutput output)
|
@@ -52,7 +55,8 @@ public class PageBuilder
|
|
52
55
|
this.count = 0;
|
53
56
|
this.position = PageFormat.PAGE_HEADER_SIZE;
|
54
57
|
this.stringReferences.clear();
|
55
|
-
this.
|
58
|
+
this.valueReferences = new ArrayList<>();
|
59
|
+
this.referenceSize = 0;
|
56
60
|
}
|
57
61
|
|
58
62
|
public Schema getSchema()
|
@@ -126,11 +130,26 @@ public class PageBuilder
|
|
126
130
|
int index = stringReferences.size();
|
127
131
|
stringReferences.put(value, index);
|
128
132
|
bufferSlice.setInt(getOffset(columnIndex), index);
|
129
|
-
|
133
|
+
referenceSize += value.length() * 2 + 4; // assuming size of char = size of byte * 2 + length
|
130
134
|
}
|
131
135
|
clearNull(columnIndex);
|
132
136
|
}
|
133
137
|
|
138
|
+
public void setJson(Column column, Value value)
|
139
|
+
{
|
140
|
+
// TODO check type?
|
141
|
+
setJson(column.getIndex(), value);
|
142
|
+
}
|
143
|
+
|
144
|
+
public void setJson(int columnIndex, Value value)
|
145
|
+
{
|
146
|
+
int index = valueReferences.size();
|
147
|
+
valueReferences.add(value.immutableValue());
|
148
|
+
bufferSlice.setInt(getOffset(columnIndex), index);
|
149
|
+
referenceSize += 256; // TODO how to estimate size of the value?
|
150
|
+
clearNull(columnIndex);
|
151
|
+
}
|
152
|
+
|
134
153
|
public void setTimestamp(Column column, Timestamp value)
|
135
154
|
{
|
136
155
|
// TODO check type?
|
@@ -189,7 +208,7 @@ public class PageBuilder
|
|
189
208
|
Arrays.fill(nullBitSet, (byte) -1);
|
190
209
|
|
191
210
|
// flush if next record will not fit in this buffer
|
192
|
-
if (buffer.capacity() < position + nextVariableLengthDataOffset +
|
211
|
+
if (buffer.capacity() < position + nextVariableLengthDataOffset + referenceSize) {
|
193
212
|
flush();
|
194
213
|
}
|
195
214
|
}
|
@@ -202,7 +221,9 @@ public class PageBuilder
|
|
202
221
|
buffer.limit(position);
|
203
222
|
|
204
223
|
// flush page
|
205
|
-
Page page = Page.wrap(buffer)
|
224
|
+
Page page = Page.wrap(buffer)
|
225
|
+
.setStringReferences(getSortedStringReferences())
|
226
|
+
.setValueReferences(valueReferences);
|
206
227
|
buffer = null;
|
207
228
|
bufferSlice = null;
|
208
229
|
output.add(page);
|
@@ -2,6 +2,7 @@ package org.embulk.spi;
|
|
2
2
|
|
3
3
|
import io.airlift.slice.Slice;
|
4
4
|
import io.airlift.slice.Slices;
|
5
|
+
import org.msgpack.value.Value;
|
5
6
|
import org.embulk.spi.time.Timestamp;
|
6
7
|
|
7
8
|
public class PageReader
|
@@ -124,6 +125,18 @@ public class PageReader
|
|
124
125
|
return Timestamp.ofEpochSecond(sec, nsec);
|
125
126
|
}
|
126
127
|
|
128
|
+
public Value getJson(Column column)
|
129
|
+
{
|
130
|
+
// TODO check type?
|
131
|
+
return getJson(column.getIndex());
|
132
|
+
}
|
133
|
+
|
134
|
+
public Value getJson(int columnIndex)
|
135
|
+
{
|
136
|
+
int index = pageSlice.getInt(getOffset(columnIndex));
|
137
|
+
return page.getValueReference(index);
|
138
|
+
}
|
139
|
+
|
127
140
|
private int getOffset(int columnIndex)
|
128
141
|
{
|
129
142
|
return position + columnOffsets[columnIndex];
|
@@ -0,0 +1,17 @@
|
|
1
|
+
package org.embulk.spi.json;
|
2
|
+
|
3
|
+
import org.embulk.spi.DataException;
|
4
|
+
|
5
|
+
public class JsonParseException
|
6
|
+
extends DataException
|
7
|
+
{
|
8
|
+
public JsonParseException(String message)
|
9
|
+
{
|
10
|
+
super(message);
|
11
|
+
}
|
12
|
+
|
13
|
+
public JsonParseException(String message, Throwable cause)
|
14
|
+
{
|
15
|
+
super(message, cause);
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,125 @@
|
|
1
|
+
package org.embulk.spi.json;
|
2
|
+
|
3
|
+
import java.util.List;
|
4
|
+
import java.util.ArrayList;
|
5
|
+
import java.util.Map;
|
6
|
+
import java.util.HashMap;
|
7
|
+
import java.io.IOException;
|
8
|
+
import org.msgpack.value.Value;
|
9
|
+
import org.msgpack.value.ValueFactory;
|
10
|
+
import com.fasterxml.jackson.core.JsonFactory;
|
11
|
+
import com.fasterxml.jackson.core.JsonParser.Feature;
|
12
|
+
import com.fasterxml.jackson.core.JsonToken;
|
13
|
+
|
14
|
+
public class JsonParser
|
15
|
+
{
|
16
|
+
private final JsonFactory factory;
|
17
|
+
|
18
|
+
public JsonParser()
|
19
|
+
{
|
20
|
+
this.factory = new JsonFactory();
|
21
|
+
factory.enable(Feature.ALLOW_UNQUOTED_CONTROL_CHARS);
|
22
|
+
}
|
23
|
+
|
24
|
+
public Value parse(String json)
|
25
|
+
{
|
26
|
+
return new ParseContext(json).parse();
|
27
|
+
}
|
28
|
+
|
29
|
+
private class ParseContext
|
30
|
+
{
|
31
|
+
private final String json;
|
32
|
+
private final com.fasterxml.jackson.core.JsonParser parser;
|
33
|
+
|
34
|
+
public ParseContext(String json)
|
35
|
+
{
|
36
|
+
this.json = json;
|
37
|
+
try {
|
38
|
+
this.parser = factory.createParser(json);
|
39
|
+
}
|
40
|
+
catch (Exception ex) {
|
41
|
+
throw new JsonParseException("Failed to parse a JSON string: "+sampleJsonString(json), ex);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
public Value parse()
|
46
|
+
{
|
47
|
+
try {
|
48
|
+
JsonToken token = parser.nextToken();
|
49
|
+
return jsonTokenToValue(token);
|
50
|
+
}
|
51
|
+
catch (JsonParseException ex) {
|
52
|
+
throw ex;
|
53
|
+
}
|
54
|
+
catch (Exception ex) {
|
55
|
+
throw new JsonParseException("Failed to parse a JSON string: "+sampleJsonString(json), ex);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
private Value jsonTokenToValue(JsonToken token)
|
60
|
+
throws IOException
|
61
|
+
{
|
62
|
+
switch(token) {
|
63
|
+
case VALUE_NULL:
|
64
|
+
return ValueFactory.newNil();
|
65
|
+
case VALUE_TRUE:
|
66
|
+
return ValueFactory.newBoolean(true);
|
67
|
+
case VALUE_FALSE:
|
68
|
+
return ValueFactory.newBoolean(false);
|
69
|
+
case VALUE_NUMBER_FLOAT:
|
70
|
+
return ValueFactory.newFloat(parser.getDoubleValue());
|
71
|
+
case VALUE_NUMBER_INT:
|
72
|
+
try {
|
73
|
+
return ValueFactory.newInteger(parser.getLongValue());
|
74
|
+
}
|
75
|
+
catch (JsonParseException ex) {
|
76
|
+
return ValueFactory.newInteger(parser.getBigIntegerValue());
|
77
|
+
}
|
78
|
+
case VALUE_STRING:
|
79
|
+
return ValueFactory.newString(parser.getText());
|
80
|
+
case START_ARRAY: {
|
81
|
+
List<Value> list = new ArrayList<>();
|
82
|
+
while (true) {
|
83
|
+
token = parser.nextToken();
|
84
|
+
if(token == JsonToken.END_ARRAY) {
|
85
|
+
return ValueFactory.newArray(list);
|
86
|
+
}
|
87
|
+
list.add(jsonTokenToValue(token));
|
88
|
+
}
|
89
|
+
}
|
90
|
+
case START_OBJECT:
|
91
|
+
Map<Value, Value> map = new HashMap<>();
|
92
|
+
while (true) {
|
93
|
+
token = parser.nextToken();
|
94
|
+
if (token == JsonToken.END_OBJECT) {
|
95
|
+
return ValueFactory.newMap(map);
|
96
|
+
}
|
97
|
+
String key = parser.getCurrentName();
|
98
|
+
if (key == null) {
|
99
|
+
throw new JsonParseException("Unexpected token "+token+" at "+parser.getTokenLocation());
|
100
|
+
}
|
101
|
+
token = parser.nextToken();
|
102
|
+
Value value = jsonTokenToValue(token);
|
103
|
+
map.put(ValueFactory.newString(key), value);
|
104
|
+
}
|
105
|
+
case VALUE_EMBEDDED_OBJECT:
|
106
|
+
case FIELD_NAME:
|
107
|
+
case END_ARRAY:
|
108
|
+
case END_OBJECT:
|
109
|
+
case NOT_AVAILABLE:
|
110
|
+
default:
|
111
|
+
throw new JsonParseException("Unexpected token "+token+" at "+parser.getTokenLocation());
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
private static String sampleJsonString(String json)
|
117
|
+
{
|
118
|
+
if (json.length() < 100) {
|
119
|
+
return json;
|
120
|
+
}
|
121
|
+
else {
|
122
|
+
return json.substring(0, 97) + "...";
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
package org.embulk.spi.json;
|
2
|
+
|
3
|
+
import java.io.ByteArrayOutputStream;
|
4
|
+
import java.io.IOException;
|
5
|
+
import com.google.common.base.Throwables;
|
6
|
+
import org.msgpack.core.MessagePack;
|
7
|
+
import org.msgpack.core.MessageBufferPacker;
|
8
|
+
import org.msgpack.core.buffer.MessageBuffer;
|
9
|
+
import org.msgpack.value.Value;
|
10
|
+
import org.jruby.Ruby;
|
11
|
+
import org.jruby.RubyString;
|
12
|
+
import org.jruby.util.ByteList;
|
13
|
+
import org.jcodings.specific.ASCIIEncoding;
|
14
|
+
|
15
|
+
public class RubyValueApi
|
16
|
+
{
|
17
|
+
public static Value fromMessagePack(RubyString content)
|
18
|
+
{
|
19
|
+
ByteList list = content.getByteList();
|
20
|
+
try {
|
21
|
+
return MessagePack.newDefaultUnpacker(list.unsafeBytes(), list.begin(), list.length()).unpackValue();
|
22
|
+
}
|
23
|
+
catch (IOException ex) {
|
24
|
+
throw Throwables.propagate(ex);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
private static class OpenByteArrayOutputStream
|
29
|
+
extends ByteArrayOutputStream
|
30
|
+
{
|
31
|
+
public byte[] getBuffer()
|
32
|
+
{
|
33
|
+
return buf;
|
34
|
+
}
|
35
|
+
|
36
|
+
public int getCount()
|
37
|
+
{
|
38
|
+
return count;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
public static RubyString toMessagePack(Ruby runtime, Value value)
|
43
|
+
{
|
44
|
+
try {
|
45
|
+
MessageBufferPacker packer = MessagePack.newDefaultBufferPacker();
|
46
|
+
packer.packValue(value);
|
47
|
+
MessageBuffer mb = packer.toMessageBuffer();
|
48
|
+
ByteList list = new ByteList(mb.array(), mb.arrayOffset(), mb.size(), ASCIIEncoding.INSTANCE, false);
|
49
|
+
return RubyString.newString(runtime, list);
|
50
|
+
}
|
51
|
+
catch (IOException ex) {
|
52
|
+
throw Throwables.propagate(ex);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
@@ -20,6 +20,7 @@ public class TypeDeserializer
|
|
20
20
|
builder.put(DoubleType.DOUBLE.getName(), DoubleType.DOUBLE);
|
21
21
|
builder.put(StringType.STRING.getName(), StringType.STRING);
|
22
22
|
builder.put(TimestampType.TIMESTAMP.getName(), TimestampType.TIMESTAMP);
|
23
|
+
builder.put(JsonType.JSON.getName(), JsonType.JSON);
|
23
24
|
stringToTypeMap = builder.build();
|
24
25
|
}
|
25
26
|
|