use of com.facebook.presto.common.type.RowType in project presto by prestodb.
the class TestTypeConversions method testConvertOneLevelRecordColumn.
@Test
public void testConvertOneLevelRecordColumn() {
BigQueryColumnHandle column = new BigQueryColumnHandle("rec", BigQueryType.RECORD, NULLABLE, ImmutableList.of(new BigQueryColumnHandle("sub_s", BigQueryType.STRING, NULLABLE, ImmutableList.of(), null), new BigQueryColumnHandle("sub_i", BigQueryType.INTEGER, NULLABLE, ImmutableList.of(), null)), null);
ColumnMetadata metadata = column.getColumnMetadata();
RowType targetType = RowType.from(ImmutableList.of(RowType.field("sub_s", VarcharType.VARCHAR), RowType.field("sub_i", BigintType.BIGINT)));
assertThat(metadata.getType()).isEqualTo(targetType);
}
use of com.facebook.presto.common.type.RowType in project presto by prestodb.
the class ParquetPageSourceFactory method checkSchemaMatch.
public static boolean checkSchemaMatch(org.apache.parquet.schema.Type parquetType, Type type) {
String prestoType = type.getTypeSignature().getBase();
if (parquetType instanceof GroupType) {
GroupType groupType = parquetType.asGroupType();
switch(prestoType) {
case ROW:
RowType rowType = (RowType) type;
Map<String, Type> prestoFieldMap = rowType.getFields().stream().collect(Collectors.toMap(field -> field.getName().get().toLowerCase(Locale.ENGLISH), field -> field.getType()));
for (int i = 0; i < groupType.getFields().size(); i++) {
org.apache.parquet.schema.Type parquetFieldType = groupType.getFields().get(i);
String fieldName = parquetFieldType.getName().toLowerCase(Locale.ENGLISH);
Type prestoFieldType = prestoFieldMap.get(fieldName);
if (prestoFieldType != null && !checkSchemaMatch(parquetFieldType, prestoFieldType)) {
return false;
}
}
return true;
case MAP:
if (groupType.getFields().size() != 1) {
return false;
}
org.apache.parquet.schema.Type mapKeyType = groupType.getFields().get(0);
if (mapKeyType instanceof GroupType) {
GroupType mapGroupType = mapKeyType.asGroupType();
return mapGroupType.getFields().size() == 2 && checkSchemaMatch(mapGroupType.getFields().get(0), type.getTypeParameters().get(0)) && checkSchemaMatch(mapGroupType.getFields().get(1), type.getTypeParameters().get(1));
}
return false;
case ARRAY:
/* array has a standard 3-level structure with middle level repeated group with a single field:
* optional group my_list (LIST) {
* repeated group element {
* required type field;
* };
* }
* Backward-compatibility support for 2-level arrays:
* optional group my_list (LIST) {
* repeated type field;
* }
* field itself could be primitive or group
*/
if (groupType.getFields().size() != 1) {
return false;
}
org.apache.parquet.schema.Type bagType = groupType.getFields().get(0);
if (bagType.isPrimitive()) {
return checkSchemaMatch(bagType.asPrimitiveType(), type.getTypeParameters().get(0));
}
GroupType bagGroupType = bagType.asGroupType();
return checkSchemaMatch(bagGroupType, type.getTypeParameters().get(0)) || (bagGroupType.getFields().size() == 1 && checkSchemaMatch(bagGroupType.getFields().get(0), type.getTypeParameters().get(0)));
default:
return false;
}
}
checkArgument(parquetType.isPrimitive(), "Unexpected parquet type for column: %s " + parquetType.getName());
PrimitiveTypeName parquetTypeName = parquetType.asPrimitiveType().getPrimitiveTypeName();
switch(parquetTypeName) {
case INT64:
return prestoType.equals(BIGINT) || prestoType.equals(DECIMAL) || prestoType.equals(TIMESTAMP);
case INT32:
return prestoType.equals(INTEGER) || prestoType.equals(BIGINT) || prestoType.equals(SMALLINT) || prestoType.equals(DATE) || prestoType.equals(DECIMAL) || prestoType.equals(TINYINT);
case BOOLEAN:
return prestoType.equals(StandardTypes.BOOLEAN);
case FLOAT:
return prestoType.equals(REAL);
case DOUBLE:
return prestoType.equals(StandardTypes.DOUBLE);
case BINARY:
return prestoType.equals(VARBINARY) || prestoType.equals(VARCHAR) || prestoType.startsWith(CHAR) || prestoType.equals(DECIMAL);
case INT96:
return prestoType.equals(TIMESTAMP);
case FIXED_LEN_BYTE_ARRAY:
return prestoType.equals(DECIMAL);
default:
throw new IllegalArgumentException("Unexpected parquet type name: " + parquetTypeName);
}
}
use of com.facebook.presto.common.type.RowType in project presto by prestodb.
the class OrcTester method testStructRoundTrip.
private void testStructRoundTrip(Type type, List<?> values) throws Exception {
Type rowType = rowType(type, type, type);
// values in simple struct
testRoundTripType(rowType, values.stream().map(OrcTester::toHiveStruct).collect(toList()));
if (structuralNullTestsEnabled) {
// values and nulls in simple struct
testRoundTripType(rowType, insertNullEvery(5, values).stream().map(OrcTester::toHiveStruct).collect(toList()));
// all null values in simple struct
testRoundTripType(rowType, values.stream().map(value -> toHiveStruct(null)).collect(toList()));
}
if (missingStructFieldsTestsEnabled) {
Type readType = rowType(type, type, type, type, type, type);
Type writeType = rowType(type, type, type);
List writeValues = values.stream().map(OrcTester::toHiveStruct).collect(toList());
List readValues = values.stream().map(OrcTester::toHiveStructWithNull).collect(toList());
assertRoundTrip(writeType, readType, writeValues, readValues, true, ImmutableList.of());
}
}
use of com.facebook.presto.common.type.RowType in project presto by prestodb.
the class OrcTester method testSubfieldValue.
private static boolean testSubfieldValue(Type type, Object value, Subfield subfield, TupleDomainFilter filter) {
Type nestedType = type;
Object nestedValue = value;
for (Subfield.PathElement pathElement : subfield.getPath()) {
if (nestedType instanceof ArrayType) {
assertTrue(pathElement instanceof Subfield.LongSubscript);
if (nestedValue == null) {
return filter.testNull();
}
int index = toIntExact(((Subfield.LongSubscript) pathElement).getIndex()) - 1;
nestedType = ((ArrayType) nestedType).getElementType();
if (index >= ((List) nestedValue).size()) {
return true;
}
nestedValue = ((List) nestedValue).get(index);
} else if (nestedType instanceof RowType) {
assertTrue(pathElement instanceof Subfield.NestedField);
if (nestedValue == null) {
return filter.testNull();
}
String fieldName = ((Subfield.NestedField) pathElement).getName();
int index = -1;
List<RowType.Field> fields = ((RowType) nestedType).getFields();
for (int i = 0; i < fields.size(); i++) {
if (fieldName.equalsIgnoreCase(fields.get(i).getName().get())) {
index = i;
nestedType = fields.get(i).getType();
break;
}
}
assertTrue(index >= 0, "Struct field not found: " + fieldName);
nestedValue = ((List) nestedValue).get(index);
} else {
fail("Unsupported type: " + type);
}
}
return testValue(nestedType, nestedValue, filter);
}
use of com.facebook.presto.common.type.RowType in project presto by prestodb.
the class JsonToRowCast method specialize.
@Override
public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, FunctionAndTypeManager functionAndTypeManager) {
checkArgument(arity == 1, "Expected arity to be 1");
RowType rowType = (RowType) boundVariables.getTypeVariable("T");
checkCondition(canCastFromJson(rowType), INVALID_CAST_ARGUMENT, "Cannot cast JSON to %s", rowType);
List<Field> rowFields = rowType.getFields();
BlockBuilderAppender[] fieldAppenders = rowFields.stream().map(rowField -> createBlockBuilderAppender(rowField.getType())).toArray(BlockBuilderAppender[]::new);
MethodHandle methodHandle = METHOD_HANDLE.bindTo(rowType).bindTo(fieldAppenders).bindTo(getFieldNameToIndex(rowFields));
return new BuiltInScalarFunctionImplementation(true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle);
}
Aggregations