Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Introduce type visitors for logical types, and address code review co…
…mment related to byte-int casting
  • Loading branch information
nkollar committed Apr 24, 2018
commit 047feb92f855e1854ab637a8c1e07340e4c604e2
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package org.apache.parquet.schema;

import org.apache.parquet.Preconditions;
import org.apache.parquet.format.BsonType;
import org.apache.parquet.format.ConvertedType;
import org.apache.parquet.format.DateType;
Expand Down Expand Up @@ -60,6 +61,13 @@ public interface LogicalTypeAnnotation {
*/
OriginalType toOriginalType();

/**
* Visits this logical type with the given visitor
*
* @param logicalTypeAnnotationVisitor the visitor to visit this type
*/
void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor);

/**
* Helper method to convert the old representation of logical types (OriginalType) to new logical type.
*/
Expand Down Expand Up @@ -91,21 +99,21 @@ static LogicalTypeAnnotation fromOriginalType(OriginalType originalType, Decimal
case TIME_MICROS:
return TimeLogicalTypeAnnotation.create(true, LogicalTypeAnnotation.TimeUnit.MICROS);
case UINT_8:
return IntLogicalTypeAnnotation.create((byte) 8, false);
return IntLogicalTypeAnnotation.create(8, false);
case UINT_16:
return IntLogicalTypeAnnotation.create((byte) 16, false);
return IntLogicalTypeAnnotation.create(16, false);
case UINT_32:
return IntLogicalTypeAnnotation.create((byte) 32, false);
return IntLogicalTypeAnnotation.create(32, false);
case UINT_64:
return IntLogicalTypeAnnotation.create((byte) 64, false);
return IntLogicalTypeAnnotation.create(64, false);
case INT_8:
return IntLogicalTypeAnnotation.create((byte) 8, true);
return IntLogicalTypeAnnotation.create(8, true);
case INT_16:
return IntLogicalTypeAnnotation.create((byte) 16, true);
return IntLogicalTypeAnnotation.create(16, true);
case INT_32:
return IntLogicalTypeAnnotation.create((byte) 32, true);
return IntLogicalTypeAnnotation.create(32, true);
case INT_64:
return IntLogicalTypeAnnotation.create((byte) 64, true);
return IntLogicalTypeAnnotation.create(64, true);
case ENUM:
return EnumLogicalTypeAnnotation.create();
case JSON:
Expand Down Expand Up @@ -144,6 +152,11 @@ public OriginalType toOriginalType() {
return OriginalType.UTF8;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof StringLogicalTypeAnnotation;
Expand Down Expand Up @@ -181,6 +194,11 @@ public OriginalType toOriginalType() {
return OriginalType.MAP;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof MapLogicalTypeAnnotation;
Expand Down Expand Up @@ -218,6 +236,11 @@ public OriginalType toOriginalType() {
return OriginalType.LIST;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof ListLogicalTypeAnnotation;
Expand Down Expand Up @@ -255,6 +278,11 @@ public OriginalType toOriginalType() {
return OriginalType.ENUM;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof EnumLogicalTypeAnnotation;
Expand Down Expand Up @@ -303,6 +331,11 @@ public OriginalType toOriginalType() {
return OriginalType.DECIMAL;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof DecimalLogicalTypeAnnotation)) {
Expand Down Expand Up @@ -343,6 +376,11 @@ public OriginalType toOriginalType() {
return OriginalType.DATE;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof DateLogicalTypeAnnotation;
Expand Down Expand Up @@ -413,6 +451,19 @@ public OriginalType toOriginalType() {
}
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

public TimeUnit getUnit() {
return unit;
}

public boolean isAdjustedToUTC() {
return isAdjustedToUTC;
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof TimeLogicalTypeAnnotation)) {
Expand Down Expand Up @@ -470,6 +521,19 @@ public OriginalType toOriginalType() {
}
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

public TimeUnit getUnit() {
return unit;
}

public boolean isAdjustedToUTC() {
return isAdjustedToUTC;
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof TimestampLogicalTypeAnnotation)) {
Expand All @@ -486,21 +550,25 @@ public int hashCode() {
}

class IntLogicalTypeAnnotation implements LogicalTypeAnnotation {
private final byte bitWidth;
private final int bitWidth;
private final boolean isSigned;

public static LogicalTypeAnnotation create(byte bitWidth, boolean isSigned) {
public static LogicalTypeAnnotation create(int bitWidth, boolean isSigned) {
Preconditions.checkArgument(
bitWidth == 8 || bitWidth == 16 || bitWidth == 32 || bitWidth == 64,
"Invalid bit width for integer logical type, " + bitWidth + " is not allowed, " +
"valid bit width values: 8, 16, 32, 64");
return new IntLogicalTypeAnnotation(bitWidth, isSigned);
}

private IntLogicalTypeAnnotation(byte bitWidth, boolean isSigned) {
private IntLogicalTypeAnnotation(int bitWidth, boolean isSigned) {
this.bitWidth = bitWidth;
this.isSigned = isSigned;
}

@Override
public LogicalType toLogicalType() {
return LogicalType.INTEGER(new IntType(bitWidth, isSigned));
return LogicalType.INTEGER(new IntType((byte) bitWidth, isSigned));
}

@Override
Expand Down Expand Up @@ -543,6 +611,19 @@ public OriginalType toOriginalType() {
}
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

public int getBitWidth() {
return bitWidth;
}

public boolean isSigned() {
return isSigned;
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof IntLogicalTypeAnnotation)) {
Expand Down Expand Up @@ -583,6 +664,11 @@ public OriginalType toOriginalType() {
return OriginalType.JSON;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof JsonLogicalTypeAnnotation;
Expand Down Expand Up @@ -620,6 +706,11 @@ public OriginalType toOriginalType() {
return OriginalType.BSON;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof BsonLogicalTypeAnnotation;
Expand Down Expand Up @@ -660,6 +751,11 @@ public OriginalType toOriginalType() {
return OriginalType.INTERVAL;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof IntervalLogicalTypeAnnotation;
Expand Down Expand Up @@ -700,6 +796,11 @@ public OriginalType toOriginalType() {
return OriginalType.MAP_KEY_VALUE;
}

@Override
public void accept(LogicalTypeAnnotationVisitor logicalTypeAnnotationVisitor) {
logicalTypeAnnotationVisitor.visit(this);
}

@Override
public boolean equals(Object obj) {
return obj instanceof MapKeyValueTypeAnnotation;
Expand All @@ -711,4 +812,51 @@ public int hashCode() {
return getClass().hashCode();
}
}

/**
* Implement this interface to visit a logical type annotation in the schema.
* The default implementation for each logical type specific visitor method is empty.
*
* Example usage: logicalTypeAnnotation.accept(new LogicalTypeAnnotationVisitor() { ... });
*/
interface LogicalTypeAnnotationVisitor {
default void visit(StringLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(MapLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(ListLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(EnumLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(DecimalLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(DateLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(TimeLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(TimestampLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(IntLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(JsonLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(BsonLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(IntervalLogicalTypeAnnotation logicalTypeAnnotation) {
}

default void visit(MapKeyValueTypeAnnotation logicalTypeAnnotation) {
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ public PrimitiveType(Repetition repetition, PrimitiveTypeName primitive, int len
* @param name the name of the type
* @param originalType (optional) the original type to help with cross schema convertion (LIST, MAP, ...)
*
* @deprecated will be removed in 2.0.0; use {@link #PrimitiveType(Repetition, PrimitiveTypeName, String, LogicalTypeAnnotation)} instead
* @deprecated will be removed in 2.0.0; use builders in {@link Types} instead
*/
@Deprecated
public PrimitiveType(Repetition repetition, PrimitiveTypeName primitive,
Expand Down Expand Up @@ -439,7 +439,7 @@ public PrimitiveType(Repetition repetition, PrimitiveTypeName primitive,
* @param decimalMeta (optional) metadata about the decimal type
* @param id the id of the field
*
* @deprecated will be removed in 2.0.0; use {@link #PrimitiveType(Repetition, PrimitiveTypeName, int, String, LogicalTypeAnnotation, ID)} instead
* @deprecated will be removed in 2.0.0; use builders in {@link Types} instead
*/
@Deprecated
public PrimitiveType(Repetition repetition, PrimitiveTypeName primitive,
Expand All @@ -464,7 +464,7 @@ public PrimitiveType(Repetition repetition, PrimitiveTypeName primitive,
this.columnOrder = requireValidColumnOrder(columnOrder);
}

public PrimitiveType(Repetition repetition, PrimitiveTypeName primitive,
PrimitiveType(Repetition repetition, PrimitiveTypeName primitive,
String name, LogicalTypeAnnotation logicalTypeAnnotation) {
this(repetition, primitive, 0, name, logicalTypeAnnotation, null, null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public Type(String name, Repetition repetition, OriginalType originalType) {
this.id = id;
}

public Type(String name, Repetition repetition, LogicalTypeAnnotation logicalTypeAnnotation) {
Type(String name, Repetition repetition, LogicalTypeAnnotation logicalTypeAnnotation) {
this(name, repetition, logicalTypeAnnotation, null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -624,21 +624,21 @@ LogicalTypeAnnotation getOriginalType(ConvertedType type, SchemaElement schemaEl
case INTERVAL:
return LogicalTypeAnnotation.IntervalLogicalTypeAnnotation.create();
case INT_8:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 8, true);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(8, true);
case INT_16:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 16, true);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(16, true);
case INT_32:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 32, true);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(32, true);
case INT_64:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 64, true);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(64, true);
case UINT_8:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 8, false);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(8, false);
case UINT_16:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 16, false);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(16, false);
case UINT_32:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 32, false);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(32, false);
case UINT_64:
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create((byte) 64, false);
return LogicalTypeAnnotation.IntLogicalTypeAnnotation.create(64, false);
case JSON:
return LogicalTypeAnnotation.JsonLogicalTypeAnnotation.create();
case BSON:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import java.util.Arrays;
import java.util.List;

import org.apache.parquet.schema.LogicalTypeAnnotation;
import org.apache.pig.LoadPushDown.RequiredField;
import org.apache.pig.LoadPushDown.RequiredFieldList;
import org.apache.pig.data.DataType;
Expand Down Expand Up @@ -413,7 +412,7 @@ private Type primitive(String name, PrimitiveTypeName primitive, OriginalType or
}

private PrimitiveType primitive(String name, PrimitiveTypeName primitive) {
return new PrimitiveType(Repetition.OPTIONAL, primitive, name, (LogicalTypeAnnotation) null);
return new PrimitiveType(Repetition.OPTIONAL, primitive, name, null);
}

/**
Expand Down