use of org.apache.flink.table.types.logical.DecimalType in project flink by apache.
the class DecimalScale0TypeStrategy method inferType.
@Override
public Optional<DataType> inferType(CallContext callContext) {
final DataType argumentDataType = callContext.getArgumentDataTypes().get(0);
final LogicalType argumentType = argumentDataType.getLogicalType();
// a hack to make legacy types possible until we drop them
if (argumentType instanceof LegacyTypeInformationType) {
return Optional.of(argumentDataType);
}
if (argumentType.is(LogicalTypeRoot.DECIMAL)) {
if (hasScale(argumentType, 0)) {
return Optional.of(argumentDataType);
}
final LogicalType inferredType = new DecimalType(argumentType.isNullable(), getPrecision(argumentType), 0);
return Optional.of(fromLogicalToDataType(inferredType));
}
return Optional.empty();
}
use of org.apache.flink.table.types.logical.DecimalType in project flink by apache.
the class LogicalTypeJsonSerdeTest method testLogicalTypeSerde.
private static List<LogicalType> testLogicalTypeSerde() {
final List<LogicalType> types = Arrays.asList(new BooleanType(), new TinyIntType(), new SmallIntType(), new IntType(), new BigIntType(), new FloatType(), new DoubleType(), new DecimalType(10), new DecimalType(15, 5), CharType.ofEmptyLiteral(), new CharType(), new CharType(5), VarCharType.ofEmptyLiteral(), new VarCharType(), new VarCharType(5), BinaryType.ofEmptyLiteral(), new BinaryType(), new BinaryType(100), VarBinaryType.ofEmptyLiteral(), new VarBinaryType(), new VarBinaryType(100), new DateType(), new TimeType(), new TimeType(3), new TimestampType(), new TimestampType(3), new LocalZonedTimestampType(false, TimestampKind.PROCTIME, 3), new TimestampType(false, TimestampKind.ROWTIME, 3), new ZonedTimestampType(), new ZonedTimestampType(3), new ZonedTimestampType(false, TimestampKind.ROWTIME, 3), new LocalZonedTimestampType(), new LocalZonedTimestampType(3), new LocalZonedTimestampType(false, TimestampKind.PROCTIME, 3), new LocalZonedTimestampType(false, TimestampKind.ROWTIME, 3), new DayTimeIntervalType(DayTimeIntervalType.DayTimeResolution.DAY_TO_HOUR), new DayTimeIntervalType(false, DayTimeIntervalType.DayTimeResolution.DAY_TO_HOUR, 3, 6), new YearMonthIntervalType(YearMonthIntervalType.YearMonthResolution.YEAR_TO_MONTH), new YearMonthIntervalType(false, YearMonthIntervalType.YearMonthResolution.MONTH, 2), new ZonedTimestampType(), new LocalZonedTimestampType(), new LocalZonedTimestampType(false, TimestampKind.PROCTIME, 3), new SymbolType<>(), new ArrayType(new IntType(false)), new ArrayType(new LocalZonedTimestampType(false, TimestampKind.ROWTIME, 3)), new ArrayType(new ZonedTimestampType(false, TimestampKind.ROWTIME, 3)), new ArrayType(new TimestampType()), new ArrayType(CharType.ofEmptyLiteral()), new ArrayType(VarCharType.ofEmptyLiteral()), new ArrayType(BinaryType.ofEmptyLiteral()), new ArrayType(VarBinaryType.ofEmptyLiteral()), new MapType(new BigIntType(), new IntType(false)), new MapType(new TimestampType(false, TimestampKind.ROWTIME, 3), new ZonedTimestampType()), new MapType(CharType.ofEmptyLiteral(), CharType.ofEmptyLiteral()), new MapType(VarCharType.ofEmptyLiteral(), VarCharType.ofEmptyLiteral()), new MapType(BinaryType.ofEmptyLiteral(), BinaryType.ofEmptyLiteral()), new MapType(VarBinaryType.ofEmptyLiteral(), VarBinaryType.ofEmptyLiteral()), new MultisetType(new IntType(false)), new MultisetType(new TimestampType()), new MultisetType(new TimestampType(true, TimestampKind.ROWTIME, 3)), new MultisetType(CharType.ofEmptyLiteral()), new MultisetType(VarCharType.ofEmptyLiteral()), new MultisetType(BinaryType.ofEmptyLiteral()), new MultisetType(VarBinaryType.ofEmptyLiteral()), RowType.of(new BigIntType(), new IntType(false), new VarCharType(200)), RowType.of(new LogicalType[] { new BigIntType(), new IntType(false), new VarCharType(200) }, new String[] { "f1", "f2", "f3" }), RowType.of(new TimestampType(false, TimestampKind.ROWTIME, 3), new TimestampType(false, TimestampKind.REGULAR, 3), new ZonedTimestampType(false, TimestampKind.ROWTIME, 3), new ZonedTimestampType(false, TimestampKind.REGULAR, 3), new LocalZonedTimestampType(false, TimestampKind.ROWTIME, 3), new LocalZonedTimestampType(false, TimestampKind.PROCTIME, 3), new LocalZonedTimestampType(false, TimestampKind.REGULAR, 3)), RowType.of(CharType.ofEmptyLiteral(), VarCharType.ofEmptyLiteral(), BinaryType.ofEmptyLiteral(), VarBinaryType.ofEmptyLiteral()), // registered structured type
StructuredType.newBuilder(ObjectIdentifier.of("cat", "db", "structuredType"), PojoClass.class).attributes(Arrays.asList(new StructuredType.StructuredAttribute("f0", new IntType(true)), new StructuredType.StructuredAttribute("f1", new BigIntType(true)), new StructuredType.StructuredAttribute("f2", new VarCharType(200), "desc"))).comparison(StructuredType.StructuredComparison.FULL).setFinal(false).setInstantiable(false).superType(StructuredType.newBuilder(ObjectIdentifier.of("cat", "db", "structuredType2")).attributes(Collections.singletonList(new StructuredType.StructuredAttribute("f0", new BigIntType(false)))).build()).description("description for StructuredType").build(), // unregistered structured type
StructuredType.newBuilder(PojoClass.class).attributes(Arrays.asList(new StructuredType.StructuredAttribute("f0", new IntType(true)), new StructuredType.StructuredAttribute("f1", new BigIntType(true)), new StructuredType.StructuredAttribute("f2", new VarCharType(200), "desc"))).build(), // registered distinct type
DistinctType.newBuilder(ObjectIdentifier.of("cat", "db", "distinctType"), new VarCharType(5)).build(), DistinctType.newBuilder(ObjectIdentifier.of("cat", "db", "distinctType"), new VarCharType(false, 5)).build(), // custom RawType
new RawType<>(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE), // external RawType
new RawType<>(Row.class, ExternalSerializer.of(DataTypes.ROW(DataTypes.INT(), DataTypes.STRING()))));
final List<LogicalType> mutableTypes = new ArrayList<>(types);
// RawType for MapView
addRawTypesForMapView(mutableTypes, new VarCharType(100), new VarCharType(100));
addRawTypesForMapView(mutableTypes, new VarCharType(100), new BigIntType());
addRawTypesForMapView(mutableTypes, new BigIntType(), new VarCharType(100));
addRawTypesForMapView(mutableTypes, new BigIntType(), new BigIntType());
// RawType for ListView
addRawTypesForListView(mutableTypes, new VarCharType(100));
addRawTypesForListView(mutableTypes, new BigIntType());
// RawType for custom MapView
mutableTypes.add(DataViewUtils.adjustDataViews(MapView.newMapViewDataType(DataTypes.STRING().toInternal(), DataTypes.STRING().bridgedTo(byte[].class)), false).getLogicalType());
final List<LogicalType> allTypes = new ArrayList<>();
// consider nullable
for (LogicalType type : mutableTypes) {
allTypes.add(type.copy(true));
allTypes.add(type.copy(false));
}
// ignore nullable for NullType
allTypes.add(new NullType());
return allTypes;
}
use of org.apache.flink.table.types.logical.DecimalType in project flink by apache.
the class OverConvertRule method createBound.
private RexWindowBound createBound(ConvertContext context, Expression bound, SqlKind sqlKind) {
if (bound instanceof CallExpression) {
CallExpression callExpr = (CallExpression) bound;
FunctionDefinition func = callExpr.getFunctionDefinition();
if (BuiltInFunctionDefinitions.UNBOUNDED_ROW.equals(func) || BuiltInFunctionDefinitions.UNBOUNDED_RANGE.equals(func)) {
SqlNode unbounded = sqlKind.equals(SqlKind.PRECEDING) ? SqlWindow.createUnboundedPreceding(SqlParserPos.ZERO) : SqlWindow.createUnboundedFollowing(SqlParserPos.ZERO);
return RexWindowBound.create(unbounded, null);
} else if (BuiltInFunctionDefinitions.CURRENT_ROW.equals(func) || BuiltInFunctionDefinitions.CURRENT_RANGE.equals(func)) {
SqlNode currentRow = SqlWindow.createCurrentRow(SqlParserPos.ZERO);
return RexWindowBound.create(currentRow, null);
} else {
throw new IllegalArgumentException("Unexpected expression: " + bound);
}
} else if (bound instanceof ValueLiteralExpression) {
RelDataType returnType = context.getTypeFactory().createFieldTypeFromLogicalType(new DecimalType(true, 19, 0));
SqlOperator sqlOperator = new SqlPostfixOperator(sqlKind.name(), sqlKind, 2, new OrdinalReturnTypeInference(0), null, null);
SqlNode[] operands = new SqlNode[] { SqlLiteral.createExactNumeric("1", SqlParserPos.ZERO) };
SqlNode node = new SqlBasicCall(sqlOperator, operands, SqlParserPos.ZERO);
ValueLiteralExpression literalExpr = (ValueLiteralExpression) bound;
RexNode literalRexNode = literalExpr.getValueAs(BigDecimal.class).map(v -> context.getRelBuilder().literal(v)).orElse(context.getRelBuilder().literal(extractValue(literalExpr, Object.class)));
List<RexNode> expressions = new ArrayList<>();
expressions.add(literalRexNode);
RexNode rexNode = context.getRelBuilder().getRexBuilder().makeCall(returnType, sqlOperator, expressions);
return RexWindowBound.create(node, rexNode);
} else {
throw new TableException("Unexpected expression: " + bound);
}
}
use of org.apache.flink.table.types.logical.DecimalType in project flink by apache.
the class SortCodeGeneratorTest method value1.
private Object value1(LogicalType type, Random rnd) {
switch(type.getTypeRoot()) {
case BOOLEAN:
return false;
case TINYINT:
return Byte.MIN_VALUE;
case SMALLINT:
return Short.MIN_VALUE;
case INTEGER:
return Integer.MIN_VALUE;
case BIGINT:
return Long.MIN_VALUE;
case FLOAT:
return Float.MIN_VALUE;
case DOUBLE:
return Double.MIN_VALUE;
case VARCHAR:
return StringData.fromString("");
case DECIMAL:
DecimalType decimalType = (DecimalType) type;
return DecimalData.fromBigDecimal(new BigDecimal(Integer.MIN_VALUE), decimalType.getPrecision(), decimalType.getScale());
case TIMESTAMP_WITHOUT_TIME_ZONE:
return TimestampData.fromEpochMillis(Long.MIN_VALUE);
case ARRAY:
byte[] bytes = new byte[rnd.nextInt(7) + 1];
rnd.nextBytes(bytes);
BinaryArrayData array = BinaryArrayData.fromPrimitiveArray(bytes);
for (int i = 0; i < bytes.length; i++) {
array.setNullByte(i);
}
return array;
case VARBINARY:
byte[] bytes2 = new byte[rnd.nextInt(7) + 1];
rnd.nextBytes(bytes2);
return bytes2;
case ROW:
return GenericRowData.of(new Object[] { null });
case RAW:
return RawValueData.fromObject(rnd.nextInt());
default:
throw new RuntimeException("Not support!");
}
}
use of org.apache.flink.table.types.logical.DecimalType in project flink by apache.
the class SortCodeGeneratorTest method generateValues.
private Object[] generateValues(LogicalType type) {
Random rnd = new Random();
int seedNum = RECORD_NUM / 5;
Object[] seeds = new Object[seedNum];
seeds[0] = null;
seeds[1] = value1(type, rnd);
seeds[2] = value2(type, rnd);
seeds[3] = value3(type, rnd);
for (int i = 4; i < seeds.length; i++) {
switch(type.getTypeRoot()) {
case BOOLEAN:
seeds[i] = rnd.nextBoolean();
break;
case TINYINT:
seeds[i] = (byte) rnd.nextLong();
break;
case SMALLINT:
seeds[i] = (short) rnd.nextLong();
break;
case INTEGER:
seeds[i] = rnd.nextInt();
break;
case BIGINT:
seeds[i] = rnd.nextLong();
break;
case FLOAT:
seeds[i] = rnd.nextFloat() * rnd.nextLong();
break;
case DOUBLE:
seeds[i] = rnd.nextDouble() * rnd.nextLong();
break;
case VARCHAR:
seeds[i] = StringData.fromString(RandomStringUtils.random(rnd.nextInt(20)));
break;
case DECIMAL:
DecimalType decimalType = (DecimalType) type;
BigDecimal decimal = new BigDecimal(rnd.nextInt()).divide(new BigDecimal(ThreadLocalRandom.current().nextInt(1, 256)), ThreadLocalRandom.current().nextInt(1, 30), BigDecimal.ROUND_HALF_EVEN);
seeds[i] = DecimalData.fromBigDecimal(decimal, decimalType.getPrecision(), decimalType.getScale());
break;
case TIMESTAMP_WITHOUT_TIME_ZONE:
TimestampType timestampType = (TimestampType) type;
if (timestampType.getPrecision() <= 3) {
seeds[i] = TimestampData.fromEpochMillis(rnd.nextLong());
} else {
seeds[i] = TimestampData.fromEpochMillis(rnd.nextLong(), rnd.nextInt(1000000));
}
break;
case ARRAY:
case VARBINARY:
byte[] bytes = new byte[rnd.nextInt(16) + 1];
rnd.nextBytes(bytes);
seeds[i] = type instanceof VarBinaryType ? bytes : BinaryArrayData.fromPrimitiveArray(bytes);
break;
case ROW:
RowType rowType = (RowType) type;
if (rowType.getFields().get(0).getType().getTypeRoot() == INTEGER) {
seeds[i] = GenericRowData.of(rnd.nextInt());
} else {
seeds[i] = GenericRowData.of(GenericRowData.of(rnd.nextInt()));
}
break;
case RAW:
seeds[i] = RawValueData.fromObject(rnd.nextInt());
break;
default:
throw new RuntimeException("Not support!");
}
}
// result values
Object[] results = new Object[RECORD_NUM];
for (int i = 0; i < RECORD_NUM; i++) {
results[i] = seeds[rnd.nextInt(seedNum)];
}
return results;
}
Aggregations