Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,16 @@ public enum ColumnOrderName {
/**
* Type defined order meaning that the comparison order of the elements are based on its type.
*/
TYPE_DEFINED_ORDER
TYPE_DEFINED_ORDER,
/**
* The column order is defined by the IEEE 754 standard.
*/
IEEE_754_TOTAL_ORDER,
}

private static final ColumnOrder UNDEFINED_COLUMN_ORDER = new ColumnOrder(ColumnOrderName.UNDEFINED);
private static final ColumnOrder TYPE_DEFINED_COLUMN_ORDER = new ColumnOrder(ColumnOrderName.TYPE_DEFINED_ORDER);
private static final ColumnOrder IEEE_754_TOTAL_ORDER = new ColumnOrder(ColumnOrderName.IEEE_754_TOTAL_ORDER);

/**
* @return a {@link ColumnOrder} instance representing an undefined order
Expand All @@ -58,6 +63,14 @@ public static ColumnOrder typeDefined() {
return TYPE_DEFINED_COLUMN_ORDER;
}

/**
* @return a {@link ColumnOrder} instance representing an IEEE 754 total order
* @see ColumnOrderName#IEEE_754_TOTAL_ORDER
*/
public static ColumnOrder ieee754TotalOrder() {
return IEEE_754_TOTAL_ORDER;
}

private final ColumnOrderName columnOrderName;

private ColumnOrder(ColumnOrderName columnOrderName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import static java.util.Arrays.asList;
import static java.util.Optional.empty;
import static org.apache.parquet.schema.ColumnOrder.ColumnOrderName.IEEE_754_TOTAL_ORDER;
import static org.apache.parquet.schema.ColumnOrder.ColumnOrderName.TYPE_DEFINED_ORDER;
import static org.apache.parquet.schema.ColumnOrder.ColumnOrderName.UNDEFINED;
import static org.apache.parquet.schema.PrimitiveStringifier.TIMESTAMP_MICROS_STRINGIFIER;
Expand Down Expand Up @@ -1051,6 +1052,13 @@ LogicalTypeToken getType() {
PrimitiveStringifier valueStringifier(PrimitiveType primitiveType) {
return PrimitiveStringifier.FLOAT16_STRINGIFIER;
}

@Override
boolean isValidColumnOrder(ColumnOrder columnOrder) {
return columnOrder.getColumnOrderName() == UNDEFINED
|| columnOrder.getColumnOrderName() == TYPE_DEFINED_ORDER
|| columnOrder.getColumnOrderName() == IEEE_754_TOTAL_ORDER;
}
}

public static class UnknownLogicalTypeAnnotation extends LogicalTypeAnnotation {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,4 +293,65 @@ public String toString() {
return "BINARY_AS_FLOAT16_COMPARATOR";
}
};

static final PrimitiveComparator<Float> FLOAT_IEEE_754_TOTAL_ORDER_COMPARATOR = new PrimitiveComparator<Float>() {
@Override
int compareNotNulls(Float o1, Float o2) {
return compare(o1.floatValue(), o2.floatValue());
}

@Override
public int compare(float f1, float f2) {
int f1Int = Float.floatToRawIntBits(f1);
int f2Int = Float.floatToRawIntBits(f2);
f1Int ^= ((f1Int >> 31) >>> 1);
f2Int ^= ((f2Int >> 31) >>> 1);
return Integer.compare(f1Int, f2Int);
}

@Override
public String toString() {
return "FLOAT_IEEE_754_TOTAL_ORDER_COMPARATOR";
}
};

static final PrimitiveComparator<Double> DOUBLE_IEEE_754_TOTAL_ORDER_COMPARATOR =
new PrimitiveComparator<Double>() {
@Override
int compareNotNulls(Double o1, Double o2) {
return compare(o1.doubleValue(), o2.doubleValue());
}

@Override
public int compare(double d1, double d2) {
long d1Long = Double.doubleToRawLongBits(d1);
long d2Long = Double.doubleToRawLongBits(d2);
d1Long ^= ((d1Long >> 63) >>> 1);
d2Long ^= ((d2Long >> 63) >>> 1);
return Long.compare(d1Long, d2Long);
}

@Override
public String toString() {
return "DOUBLE_IEEE_754_TOTAL_ORDER_COMPARATOR";
}
};

static final PrimitiveComparator<Binary> BINARY_AS_FLOAT16_IEEE_754_TOTAL_ORDER_COMPARATOR =
new BinaryComparator() {

@Override
int compareBinary(Binary b1, Binary b2) {
int b1Short = b1.get2BytesLittleEndian();
int b2Short = b2.get2BytesLittleEndian();
b1Short ^= ((b1Short >> 15) >>> 1);
b2Short ^= ((b2Short >> 15) >>> 1);
return Integer.compare(b1Short, b2Short);
}

@Override
public String toString() {
return "BINARY_AS_FLOAT16_IEEE_754_TOTAL_ORDER_COMPARATOR";
}
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
if (logicalType == null) {
return PrimitiveComparator.SIGNED_INT64_COMPARATOR;
}
Expand Down Expand Up @@ -146,7 +146,7 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
if (logicalType == null) {
return PrimitiveComparator.SIGNED_INT32_COMPARATOR;
}
Expand Down Expand Up @@ -210,7 +210,7 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
return PrimitiveComparator.BOOLEAN_COMPARATOR;
}
},
Expand All @@ -236,7 +236,7 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
if (logicalType == null) {
return PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR;
}
Expand Down Expand Up @@ -310,8 +310,10 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
return PrimitiveComparator.FLOAT_COMPARATOR;
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
return columnOrder.getColumnOrderName() == ColumnOrderName.IEEE_754_TOTAL_ORDER
? PrimitiveComparator.FLOAT_IEEE_754_TOTAL_ORDER_COMPARATOR
: PrimitiveComparator.FLOAT_COMPARATOR;
}
},
DOUBLE("getDouble", Double.TYPE) {
Expand All @@ -336,8 +338,10 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
return PrimitiveComparator.DOUBLE_COMPARATOR;
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
return columnOrder.getColumnOrderName() == ColumnOrderName.IEEE_754_TOTAL_ORDER
? PrimitiveComparator.DOUBLE_IEEE_754_TOTAL_ORDER_COMPARATOR
: PrimitiveComparator.DOUBLE_COMPARATOR;
}
},
INT96("getBinary", Binary.class) {
Expand All @@ -362,7 +366,7 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
return PrimitiveComparator.BINARY_AS_SIGNED_INTEGER_COMPARATOR;
}
},
Expand All @@ -388,11 +392,16 @@ public <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> conve
}

@Override
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType) {
PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder) {
if (logicalType == null) {
return PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR;
}

if (logicalType.getType() == LogicalTypeAnnotation.LogicalTypeToken.FLOAT16
&& columnOrder.getColumnOrderName() == ColumnOrderName.IEEE_754_TOTAL_ORDER) {
return PrimitiveComparator.UNSIGNED_LEXICOGRAPHICAL_BINARY_COMPARATOR;
}

return logicalType
.accept(new LogicalTypeAnnotation.LogicalTypeAnnotationVisitor<PrimitiveComparator>() {
@Override
Expand Down Expand Up @@ -453,7 +462,7 @@ public abstract void addValueToPrimitiveConverter(

public abstract <T, E extends Exception> T convert(PrimitiveTypeNameConverter<T, E> converter) throws E;

abstract PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType);
abstract PrimitiveComparator<?> comparator(LogicalTypeAnnotation logicalType, ColumnOrder columnOrder);
}

private final PrimitiveTypeName primitive;
Expand Down Expand Up @@ -545,6 +554,12 @@ public PrimitiveType(
columnOrder = primitive == PrimitiveTypeName.INT96 || originalType == OriginalType.INTERVAL
? ColumnOrder.undefined()
: ColumnOrder.typeDefined();
} else if (columnOrder.getColumnOrderName() == ColumnOrderName.IEEE_754_TOTAL_ORDER) {
Preconditions.checkArgument(
primitive == PrimitiveTypeName.FLOAT || primitive == PrimitiveTypeName.DOUBLE,
"The column order %s is not supported by type %s",
columnOrder,
primitive);
}
this.columnOrder = requireValidColumnOrder(columnOrder);
}
Expand Down Expand Up @@ -591,6 +606,17 @@ public PrimitiveType(
|| logicalTypeAnnotation instanceof LogicalTypeAnnotation.IntervalLogicalTypeAnnotation
? ColumnOrder.undefined()
: ColumnOrder.typeDefined();
} else if (columnOrder.getColumnOrderName() == ColumnOrderName.IEEE_754_TOTAL_ORDER) {
Preconditions.checkArgument(
primitive == PrimitiveTypeName.FLOAT
|| primitive == PrimitiveTypeName.DOUBLE
|| (logicalTypeAnnotation != null
&& logicalTypeAnnotation.getType()
== LogicalTypeAnnotation.LogicalTypeToken.FLOAT16),
"The column order %s is not supported by type %s logical type %s",
columnOrder,
primitive,
logicalTypeAnnotation);
}
this.columnOrder = requireValidColumnOrder(columnOrder);
}
Expand Down Expand Up @@ -631,6 +657,15 @@ public PrimitiveType withLogicalTypeAnnotation(LogicalTypeAnnotation logicalType
return new PrimitiveType(getRepetition(), primitive, length, getName(), logicalType, getId());
}

/**
* @param columnOrder the column order
* @return the same type with the column order set
*/
public Type withColumnOrder(ColumnOrder columnOrder) {
return new PrimitiveType(
getRepetition(), primitive, length, getName(), getLogicalTypeAnnotation(), getId(), columnOrder);
}

/**
* @return the primitive type
*/
Expand Down Expand Up @@ -845,7 +880,7 @@ protected Type union(Type toMerge, boolean strict) {
*/
@SuppressWarnings("unchecked")
public <T> PrimitiveComparator<T> comparator() {
return (PrimitiveComparator<T>) getPrimitiveTypeName().comparator(getLogicalTypeAnnotation());
return (PrimitiveComparator<T>) getPrimitiveTypeName().comparator(getLogicalTypeAnnotation(), columnOrder());
}

/**
Expand Down
Loading
Loading