blob: d34ef42a9794cb613e98affcf7c3405dba45f7d2 [file] [log] [blame]
/*
* 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.parquet.thrift;
import java.util.ArrayList;
import java.util.List;
import org.apache.parquet.schema.LogicalTypeAnnotation;
import org.apache.parquet.schema.LogicalTypeAnnotation.TimeUnit;
import org.apache.parquet.schema.MessageType;
import org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName;
import org.apache.parquet.schema.Types;
import org.apache.parquet.schema.Type;
import org.apache.parquet.thrift.projection.FieldProjectionFilter;
import org.apache.parquet.thrift.struct.ThriftField;
import org.apache.parquet.thrift.struct.ThriftType;
import org.apache.parquet.thrift.struct.ThriftType.StructType;
import org.apache.parquet.thrift.struct.ThriftType.StructType.StructOrUnionType;
import org.junit.Test;
import static org.apache.parquet.schema.Type.Repetition;
import static org.apache.parquet.thrift.struct.ThriftField.Requirement;
import static org.junit.Assert.assertEquals;
public class TestThriftSchemaConvertVisitor {
private MessageType buildOneFieldParquetMessage(Type expectedParquetField) {
return Types.buildMessage()
.addFields(expectedParquetField)
.named("ParquetSchema");
}
private StructType buildOneFieldThriftStructType(String fieldName, Short fieldId, ThriftType thriftType) {
ThriftField inputThriftField = new ThriftField(fieldName, fieldId, Requirement.REQUIRED, thriftType);
List<ThriftField> fields = new ArrayList<ThriftField>(1);
fields.add(inputThriftField);
return new StructType(fields, StructOrUnionType.STRUCT);
}
@Test
public void testConvertBasicI32Type() {
String fieldName = "i32Type";
Short fieldId = 0;
ThriftType i32Type = new ThriftType.I32Type();
StructType thriftStruct = buildOneFieldThriftStructType(fieldName, fieldId, i32Type);
MessageType actual = ThriftSchemaConvertVisitor.convert(thriftStruct, FieldProjectionFilter.ALL_COLUMNS);
Type expectedParquetField = Types.primitive(PrimitiveTypeName.INT32, Repetition.REQUIRED)
.named(fieldName)
.withId(fieldId);
MessageType expected = buildOneFieldParquetMessage(expectedParquetField);
assertEquals(expected, actual);
}
@Test
public void testConvertLogicalI32Type() {
LogicalTypeAnnotation timeLogicalType = LogicalTypeAnnotation.timeType(true, TimeUnit.MILLIS);
String fieldName = "timeI32Type";
Short fieldId = 0;
ThriftType timeI32Type = new ThriftType.I32Type();
timeI32Type.setLogicalTypeAnnotation(timeLogicalType);
StructType thriftStruct = buildOneFieldThriftStructType(fieldName, fieldId, timeI32Type);
MessageType actual = ThriftSchemaConvertVisitor.convert(thriftStruct, FieldProjectionFilter.ALL_COLUMNS);
Type expectedParquetField = Types.primitive(PrimitiveTypeName.INT32, Repetition.REQUIRED)
.as(timeLogicalType)
.named(fieldName)
.withId(fieldId);
MessageType expected = buildOneFieldParquetMessage(expectedParquetField);
assertEquals(expected, actual);
}
@Test
public void testConvertBasicI64Type() {
String fieldName = "i64Type";
Short fieldId = 0;
ThriftType i64Type = new ThriftType.I64Type();
StructType thriftStruct = buildOneFieldThriftStructType(fieldName, fieldId, i64Type);
MessageType actual = ThriftSchemaConvertVisitor.convert(thriftStruct, FieldProjectionFilter.ALL_COLUMNS);
Type expectedParquetField = Types.primitive(PrimitiveTypeName.INT64, Repetition.REQUIRED)
.named(fieldName)
.withId(fieldId);
MessageType expected = buildOneFieldParquetMessage(expectedParquetField);
assertEquals(expected, actual);
}
@Test
public void testConvertLogicalI64Type() {
LogicalTypeAnnotation timestampLogicalType = LogicalTypeAnnotation.timestampType(true, TimeUnit.MILLIS);
String fieldName = "logicalI64Type";
Short fieldId = 0;
ThriftType timestampI64Type = new ThriftType.I64Type();
timestampI64Type.setLogicalTypeAnnotation(timestampLogicalType);
StructType thriftStruct = buildOneFieldThriftStructType(fieldName, fieldId, timestampI64Type);
MessageType actual = ThriftSchemaConvertVisitor.convert(thriftStruct, FieldProjectionFilter.ALL_COLUMNS);
Type expectedParquetField = Types.primitive(PrimitiveTypeName.INT64, Repetition.REQUIRED)
.as(timestampLogicalType)
.named(fieldName)
.withId(fieldId);
MessageType expected = buildOneFieldParquetMessage(expectedParquetField);
assertEquals(expected, actual);
}
@Test
public void testConvertStringType() {
LogicalTypeAnnotation stringLogicalType = LogicalTypeAnnotation.stringType();
String fieldName = "stringType";
Short fieldId = 0;
ThriftType stringType = new ThriftType.StringType();
StructType thriftStruct = buildOneFieldThriftStructType(fieldName, fieldId, stringType);
MessageType actual = ThriftSchemaConvertVisitor.convert(thriftStruct, FieldProjectionFilter.ALL_COLUMNS);
Type expectedParquetField = Types.primitive(PrimitiveTypeName.BINARY, Repetition.REQUIRED)
.as(stringLogicalType)
.named(fieldName)
.withId(fieldId);
MessageType expected = buildOneFieldParquetMessage(expectedParquetField);
assertEquals(expected, actual);
}
@Test
public void testConvertLogicalBinaryType() {
LogicalTypeAnnotation jsonLogicalType = LogicalTypeAnnotation.jsonType();
String fieldName = "logicalBinaryType";
Short fieldId = 0;
ThriftType.StringType jsonBinaryType = new ThriftType.StringType();
jsonBinaryType.setBinary(true);
jsonBinaryType.setLogicalTypeAnnotation(jsonLogicalType);
StructType thriftStruct = buildOneFieldThriftStructType(fieldName, fieldId, jsonBinaryType);
MessageType actual = ThriftSchemaConvertVisitor.convert(thriftStruct, FieldProjectionFilter.ALL_COLUMNS);
Type expectedParquetField = Types.primitive(PrimitiveTypeName.BINARY, Repetition.REQUIRED)
.as(jsonLogicalType)
.named(fieldName)
.withId(fieldId);
MessageType expected = buildOneFieldParquetMessage(expectedParquetField);
assertEquals(expected, actual);
}
}