use of io.trino.spi.type.LongTimestamp in project trino by trinodb.
the class TupleDomainOrcPredicate method getDomain.
@VisibleForTesting
public static Domain getDomain(Type type, long rowCount, ColumnStatistics columnStatistics) {
if (rowCount == 0) {
return Domain.none(type);
}
if (columnStatistics == null) {
return Domain.all(type);
}
if (columnStatistics.hasNumberOfValues() && columnStatistics.getNumberOfValues() == 0) {
return Domain.onlyNull(type);
}
boolean hasNullValue = columnStatistics.getNumberOfValues() != rowCount;
if (type instanceof TimeType && columnStatistics.getIntegerStatistics() != null) {
// This is the representation of TIME used by Iceberg
return createDomain(type, hasNullValue, columnStatistics.getIntegerStatistics(), value -> ((long) value) * Timestamps.PICOSECONDS_PER_MICROSECOND);
}
if (type.getJavaType() == boolean.class && columnStatistics.getBooleanStatistics() != null) {
BooleanStatistics booleanStatistics = columnStatistics.getBooleanStatistics();
boolean hasTrueValues = (booleanStatistics.getTrueValueCount() != 0);
boolean hasFalseValues = (columnStatistics.getNumberOfValues() != booleanStatistics.getTrueValueCount());
if (hasTrueValues && hasFalseValues) {
return Domain.all(BOOLEAN);
}
if (hasTrueValues) {
return Domain.create(ValueSet.of(BOOLEAN, true), hasNullValue);
}
if (hasFalseValues) {
return Domain.create(ValueSet.of(BOOLEAN, false), hasNullValue);
}
} else if (isShortDecimal(type) && columnStatistics.getDecimalStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getDecimalStatistics(), value -> rescale(value, (DecimalType) type).unscaledValue().longValue());
} else if (isLongDecimal(type) && columnStatistics.getDecimalStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getDecimalStatistics(), value -> Int128.valueOf(rescale(value, (DecimalType) type).unscaledValue()));
} else if (type instanceof CharType && columnStatistics.getStringStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getStringStatistics(), value -> truncateToLengthAndTrimSpaces(value, type));
} else if (type instanceof VarcharType && columnStatistics.getStringStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getStringStatistics());
} else if (type instanceof DateType && columnStatistics.getDateStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getDateStatistics(), value -> (long) value);
} else if ((type.equals(TIMESTAMP_MILLIS) || type.equals(TIMESTAMP_MICROS)) && columnStatistics.getTimestampStatistics() != null) {
// upper bound of the domain we create must be adjusted accordingly, to includes the rounded timestamp.
return createDomain(type, hasNullValue, columnStatistics.getTimestampStatistics(), min -> min * MICROSECONDS_PER_MILLISECOND, max -> (max + 1) * MICROSECONDS_PER_MILLISECOND);
} else if (type.equals(TIMESTAMP_NANOS) && columnStatistics.getTimestampStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getTimestampStatistics(), min -> new LongTimestamp(min * MICROSECONDS_PER_MILLISECOND, 0), max -> new LongTimestamp((max + 1) * MICROSECONDS_PER_MILLISECOND, 0));
} else if (type.equals(TIMESTAMP_TZ_MILLIS) && columnStatistics.getTimestampStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getTimestampStatistics(), value -> packDateTimeWithZone(value, UTC_KEY));
} else if (type.equals(TIMESTAMP_TZ_MICROS) && (columnStatistics.getTimestampStatistics() != null)) {
return createDomain(type, hasNullValue, columnStatistics.getTimestampStatistics(), min -> LongTimestampWithTimeZone.fromEpochMillisAndFraction(min, 0, UTC_KEY), max -> LongTimestampWithTimeZone.fromEpochMillisAndFraction(max, 999_000_000, UTC_KEY));
} else if (type.equals(TIMESTAMP_TZ_NANOS) && columnStatistics.getTimestampStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getTimestampStatistics(), min -> LongTimestampWithTimeZone.fromEpochMillisAndFraction(min, 0, UTC_KEY), max -> LongTimestampWithTimeZone.fromEpochMillisAndFraction(max, 999_999_000, UTC_KEY));
} else if (type.getJavaType() == long.class && columnStatistics.getIntegerStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getIntegerStatistics());
} else if (type.getJavaType() == double.class && columnStatistics.getDoubleStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getDoubleStatistics());
} else if (REAL.equals(type) && columnStatistics.getDoubleStatistics() != null) {
return createDomain(type, hasNullValue, columnStatistics.getDoubleStatistics(), value -> (long) floatToRawIntBits(value.floatValue()));
}
return Domain.create(ValueSet.all(type), hasNullValue);
}
use of io.trino.spi.type.LongTimestamp in project trino by trinodb.
the class TimestampMicrosColumnReader method readValue.
@Override
protected void readValue(BlockBuilder blockBuilder, Type type) {
long epochMicros = valuesReader.readLong();
// TODO: specialize the class at creation time
if (type == TIMESTAMP_MILLIS) {
type.writeLong(blockBuilder, Timestamps.round(epochMicros, 3));
} else if (type == TIMESTAMP_MICROS) {
type.writeLong(blockBuilder, epochMicros);
} else if (type == TIMESTAMP_NANOS) {
type.writeObject(blockBuilder, new LongTimestamp(epochMicros, 0));
} else if (type == TIMESTAMP_TZ_MILLIS) {
long epochMillis = Timestamps.round(epochMicros, 3) / MICROSECONDS_PER_MILLISECOND;
type.writeLong(blockBuilder, packDateTimeWithZone(epochMillis, UTC_KEY));
} else if (type == TIMESTAMP_TZ_MICROS || type == TIMESTAMP_TZ_NANOS) {
long epochMillis = floorDiv(epochMicros, MICROSECONDS_PER_MILLISECOND);
int picosOfMillis = toIntExact(epochMicros % MICROSECONDS_PER_MILLISECOND) * PICOSECONDS_PER_MICROSECOND;
type.writeObject(blockBuilder, LongTimestampWithTimeZone.fromEpochMillisAndFraction(epochMillis, picosOfMillis, UTC_KEY));
} else if (type == BIGINT) {
type.writeLong(blockBuilder, epochMicros);
} else {
throw new TrinoException(NOT_SUPPORTED, format("Unsupported Trino column type (%s) for Parquet column (%s)", type, columnDescriptor));
}
}
use of io.trino.spi.type.LongTimestamp in project trino by trinodb.
the class LongTimestampEncoder method write.
@Override
public void write(DecodedTimestamp decodedTimestamp, BlockBuilder blockBuilder) {
LongTimestamp timestamp = getTimestamp(decodedTimestamp);
type.writeObject(blockBuilder, timestamp);
}
use of io.trino.spi.type.LongTimestamp in project trino by trinodb.
the class HiveWriteUtils method getHiveTimestamp.
private static Timestamp getHiveTimestamp(DateTimeZone localZone, TimestampType type, Block block, int position) {
verify(type.getPrecision() <= HiveTimestampPrecision.MAX.getPrecision(), "Timestamp precision too high for Hive");
long epochMicros;
int nanosOfMicro;
if (type.isShort()) {
epochMicros = type.getLong(block, position);
nanosOfMicro = 0;
} else {
LongTimestamp timestamp = (LongTimestamp) type.getObject(block, position);
epochMicros = timestamp.getEpochMicros();
nanosOfMicro = timestamp.getPicosOfMicro() / PICOSECONDS_PER_NANOSECOND;
}
long epochSeconds;
if (DateTimeZone.UTC.equals(localZone)) {
epochSeconds = floorDiv(epochMicros, MICROSECONDS_PER_SECOND);
} else {
long localEpochMillis = floorDiv(epochMicros, MICROSECONDS_PER_MILLISECOND);
long utcEpochMillis = localZone.convertLocalToUTC(localEpochMillis, false);
epochSeconds = floorDiv(utcEpochMillis, MILLISECONDS_PER_SECOND);
}
int microsOfSecond = floorMod(epochMicros, MICROSECONDS_PER_SECOND);
int nanosOfSecond = microsOfSecond * NANOSECONDS_PER_MICROSECOND + nanosOfMicro;
return Timestamp.ofEpochSecond(epochSeconds, nanosOfSecond);
}
use of io.trino.spi.type.LongTimestamp in project trino by trinodb.
the class SequenceIntervalYearToMonth method sequence.
@LiteralParameters("p")
@SqlType("array(timestamp(p))")
public static Block sequence(ConnectorSession session, @SqlType("timestamp(p)") LongTimestamp start, @SqlType("timestamp(p)") LongTimestamp stop, @SqlType(StandardTypes.INTERVAL_YEAR_TO_MONTH) long step) {
checkValidStep(start.getEpochMicros(), stop.getEpochMicros(), step);
int length = toIntExact(DateDiff.diff(MONTH, start, stop) / step + 1);
checkMaxEntry(length);
BlockBuilder blockBuilder = LONG_TYPE.createBlockBuilder(null, length);
int offset = 0;
for (int i = 0; i < length; ++i) {
LongTimestamp value = TimestampPlusIntervalYearToMonth.add(start, offset);
LONG_TYPE.writeObject(blockBuilder, value);
offset += step;
}
return blockBuilder.build();
}
Aggregations