Add nested fields support for MOR tables
This commit is contained in:
@@ -113,4 +113,9 @@ public class SchemaTestUtil {
|
||||
throws IOException, URISyntaxException {
|
||||
return toRecords(getSimpleSchema(), getEvolvedSchema(), from, limit);
|
||||
}
|
||||
|
||||
public static Schema getComplexEvolvedSchema() throws IOException {
|
||||
return new Schema.Parser()
|
||||
.parse(SchemaTestUtil.class.getResourceAsStream("/complex-test-evolved.avro"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (c) 2016,2017 Uber Technologies, Inc. (hoodie-dev-group@uber.com)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.uber.hoodie.common.util;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import org.codehaus.jackson.annotate.JsonAutoDetect;
|
||||
import org.codehaus.jackson.annotate.JsonMethod;
|
||||
import org.codehaus.jackson.map.ObjectMapper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@SuppressWarnings({"unused", "FieldCanBeLocal", "MismatchedQueryAndUpdateOfCollection"})
|
||||
public class TestRecord implements Serializable {
|
||||
class TestMapItemRecord implements Serializable {
|
||||
private String item1;
|
||||
private String item2;
|
||||
|
||||
TestMapItemRecord(String item1, String item2) {
|
||||
this.item1 = item1;
|
||||
this.item2 = item2;
|
||||
}
|
||||
}
|
||||
|
||||
class TestNestedRecord implements Serializable {
|
||||
private boolean isAdmin;
|
||||
private String userId;
|
||||
|
||||
TestNestedRecord(boolean isAdmin, String userId) {
|
||||
this.isAdmin = isAdmin;
|
||||
this.userId = userId;
|
||||
}
|
||||
}
|
||||
|
||||
private String _hoodie_commit_time;
|
||||
private String _hoodie_record_key;
|
||||
private String _hoodie_partition_path;
|
||||
private String _hoodie_file_name;
|
||||
private String _hoodie_commit_seqno;
|
||||
|
||||
private String field1;
|
||||
private String field2;
|
||||
private String name;
|
||||
private Integer favoriteIntNumber;
|
||||
private Long favoriteNumber;
|
||||
private Float favoriteFloatNumber;
|
||||
private Double favoriteDoubleNumber;
|
||||
private Map<String, TestMapItemRecord> tags;
|
||||
private TestNestedRecord testNestedRecord;
|
||||
private String[] stringArray;
|
||||
|
||||
public TestRecord(String commitTime, int recordNumber, String fileId) {
|
||||
this._hoodie_commit_time = commitTime;
|
||||
this._hoodie_record_key = "key" + recordNumber;
|
||||
this._hoodie_partition_path = commitTime;
|
||||
this._hoodie_file_name = fileId;
|
||||
this._hoodie_commit_seqno = commitTime + recordNumber;
|
||||
|
||||
String commitTimeSuffix = "@" + commitTime;
|
||||
int commitHashCode = commitTime.hashCode();
|
||||
|
||||
this.field1 = "field" + recordNumber;
|
||||
this.field2 = "field" + recordNumber + commitTimeSuffix;
|
||||
this.name = "name" + recordNumber;
|
||||
this.favoriteIntNumber = recordNumber + commitHashCode;
|
||||
this.favoriteNumber = (long)(recordNumber + commitHashCode);
|
||||
this.favoriteFloatNumber = (float)((recordNumber + commitHashCode) / 1024.0);
|
||||
this.favoriteDoubleNumber = (recordNumber + commitHashCode) / 1024.0;
|
||||
this.tags = new HashMap<>();
|
||||
this.tags.put("mapItem1", new TestMapItemRecord("item" + recordNumber, "item" + recordNumber + commitTimeSuffix));
|
||||
this.tags.put("mapItem2", new TestMapItemRecord("item2" + recordNumber, "item2" + recordNumber + commitTimeSuffix));
|
||||
this.testNestedRecord = new TestNestedRecord(false, "UserId" + recordNumber + commitTimeSuffix);
|
||||
this.stringArray = new String[]{"stringArray0" + commitTimeSuffix, "stringArray1" + commitTimeSuffix};
|
||||
}
|
||||
|
||||
public String toJsonString() throws IOException {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY);
|
||||
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
|
||||
}
|
||||
}
|
||||
17
hoodie-common/src/test/resources/complex-test-evolved.avro
Normal file
17
hoodie-common/src/test/resources/complex-test-evolved.avro
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"namespace": "example.avro",
|
||||
"type": "record",
|
||||
"name": "User",
|
||||
"fields": [
|
||||
{"name": "field1", "type": ["null", "string"], "default": null},
|
||||
{"name": "field2", "type": ["null", "string"], "default": null},
|
||||
{"name": "name", "type": ["null", "string"], "default": null},
|
||||
{"name": "favoriteIntNumber", "type": ["null", "int"], "default": null},
|
||||
{"name": "favoriteNumber", "type": ["null", "long"], "default": null},
|
||||
{"name": "favoriteFloatNumber", "type": ["null", "float"], "default": null},
|
||||
{"name": "favoriteDoubleNumber", "type": ["null", "double"], "default": null},
|
||||
{"name": "tags", "type": ["null", {"values": ["null", {"fields": [{"default": null, "type": ["null", "string"], "name": "item1"}, {"default": null, "type": ["null", "string"], "name": "item2"} ], "type": "record", "name": "tagsMapItems"} ], "type": "map"} ], "default": null},
|
||||
{"default": null, "name": "testNestedRecord", "type": ["null", {"fields": [{"default": null, "name": "isAdmin", "type": ["null", "boolean"] }, {"default": null, "name": "userId", "type": ["null", "string"] } ], "name": "notes", "type": "record"}]},
|
||||
{"default": null, "name": "stringArray", "type": ["null", {"items": "string", "type": "array"}]}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user