/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.hadoop.hive.serde2.avro;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.apache.hadoop.hive.serde2.SerDeException;
import org.junit.Test;
public class TestSchemaReEncoder {
@Test
public void schemasCanAddFields() throws SerDeException {
String original = "{\n" +
" \"namespace\": \"org.apache.hadoop.hive\",\n" +
" \"name\": \"Line\",\n" +
" \"type\": \"record\",\n" +
" \"fields\": [\n" +
" {\n" +
" \"name\":\"text\",\n" +
" \"type\":\"string\"\n" +
" }\n" +
" ]\n" +
"}";
String evolved = "{\n" +
" \"namespace\": \"org.apache.hadoop.hive\",\n" +
" \"name\": \"Line\",\n" +
" \"type\": \"record\",\n" +
" \"fields\": [\n" +
" {\n" +
" \"name\":\"text\",\n" +
" \"type\":\"string\"\n" +
" },\n" +
" {\n" +
" \"name\":\"new_kid\",\n" +
" \"type\":\"string\",\n" +
" \"default\":\"Hi!\"\n" +
" }\n" +
" ]\n" +
"}";
Schema originalSchema = AvroSerdeUtils.getSchemaFor(original);
Schema evolvedSchema = AvroSerdeUtils.getSchemaFor(evolved);
GenericRecord record = new GenericData.Record(originalSchema);
record.put("text", "it is a far better thing I do, yadda, yadda");
assertTrue(GenericData.get().validate(originalSchema, record));
AvroDeserializer.SchemaReEncoder schemaReEncoder = new AvroDeserializer.SchemaReEncoder(record.getSchema(), evolvedSchema);
GenericRecord r2 = schemaReEncoder.reencode(record);
assertTrue(GenericData.get().validate(evolvedSchema, r2));
assertEquals("Hi!", r2.get("new_kid").toString());
// Now make sure that we can re-use the re-encoder against a completely
// different record to save resources
String original2 = "{\n" +
" \"namespace\": \"somebody.else\",\n" +
" \"name\": \"something_else\",\n" +
" \"type\": \"record\",\n" +
" \"fields\": [\n" +
" {\n" +
" \"name\":\"a\",\n" +
" \"type\":\"int\"\n" +
" }\n" +
" ]\n" +
"}";
String evolved2 = "{\n" +
" \"namespace\": \"somebody.else\",\n" +
" \"name\": \"something_else\",\n" +
" \"type\": \"record\",\n" +
" \"fields\": [\n" +
" {\n" +
" \"name\":\"a\",\n" +
" \"type\":\"int\"\n" +
" },\n" +
" {\n" +
" \"name\":\"b\",\n" +
" \"type\":\"long\",\n" +
" \"default\":42\n" +
" }\n" +
" ]\n" +
"}";
Schema originalSchema2 = AvroSerdeUtils.getSchemaFor(original2);
Schema evolvedSchema2 = AvroSerdeUtils.getSchemaFor(evolved2);
record = new GenericData.Record(originalSchema2);
record.put("a", 19);
assertTrue(GenericData.get().validate(originalSchema2, record));
schemaReEncoder = new AvroDeserializer.SchemaReEncoder(record.getSchema(), evolvedSchema2);
r2 = schemaReEncoder.reencode(record);
assertTrue(GenericData.get().validate(evolvedSchema2, r2));
assertEquals(42l, r2.get("b"));
}
}