private static boolean convertibleToDoubleWithCast(Type type) { return type instanceof DecimalType || DoubleType.DOUBLE.equals(type) || RealType.REAL.equals(type) || BigintType.BIGINT.equals(type) || IntegerType.INTEGER.equals(type) || SmallintType.SMALLINT.equals(type) || TinyintType.TINYINT.equals(type) || BooleanType.BOOLEAN.equals(type); } }
@OutputFunction("map(real,real)") public static void output(@AggregationState DoubleHistogramAggregation.State state, BlockBuilder out) { if (state.get() == null) { out.appendNull(); } else { Map<Double, Double> value = state.get().getBuckets(); BlockBuilder entryBuilder = out.beginBlockEntry(); for (Map.Entry<Double, Double> entry : value.entrySet()) { REAL.writeLong(entryBuilder, floatToRawIntBits(entry.getKey().floatValue())); REAL.writeLong(entryBuilder, floatToRawIntBits(entry.getValue().floatValue())); } out.closeEntry(); } } }
private static Block createBlockOfReals(Iterable<Float> values) { BlockBuilder builder = REAL.createBlockBuilder(null, 100); for (Float value : values) { if (value == null) { builder.appendNull(); } else { REAL.writeLong(builder, floatToRawIntBits(value)); } } return builder.build(); }
@Override public Block[] getSequenceBlocks(int start, int length) { BlockBuilder blockBuilder = REAL.createBlockBuilder(null, length); for (int i = start; i < start + length; i++) { REAL.writeLong(blockBuilder, floatToRawIntBits((float) i)); } return new Block[] {blockBuilder.build()}; }
public static Block createSequenceBlockOfReal(int start, int end) { BlockBuilder builder = REAL.createFixedSizeBlockBuilder(end - start); for (int i = start; i < end; i++) { REAL.writeLong(builder, floatToRawIntBits((float) i)); } return builder.build(); }
private static void writeValue(Type type, BlockBuilder blockBuilder, Object value) blockBuilder.appendNull(); else if (BIGINT.equals(type)) { type.writeLong(blockBuilder, ((Number) value).longValue()); else if (INTEGER.equals(type)) { type.writeLong(blockBuilder, ((Number) value).intValue()); type.writeLong(blockBuilder, ((Number) value).shortValue()); else if (TINYINT.equals(type)) { type.writeLong(blockBuilder, ((Number) value).byteValue()); else if (REAL.equals(type)) { type.writeLong(blockBuilder, (long) floatToRawIntBits(((Number) value).floatValue())); else if (DOUBLE.equals(type)) { type.writeDouble(blockBuilder, ((Number) value).doubleValue()); else if (BOOLEAN.equals(type)) { type.writeBoolean(blockBuilder, (Boolean) value); type.writeSlice(blockBuilder, Slices.wrappedBuffer((byte[]) value)); blockBuilder.closeEntry();
private static void serializePrimitive(Type type, BlockBuilder builder, Object object) { requireNonNull(builder, "parent builder is null"); if (object == null) { builder.appendNull(); return; } if (BOOLEAN.equals(type)) { BOOLEAN.writeBoolean(builder, (Boolean) object); } else if (BIGINT.equals(type) || INTEGER.equals(type) || SMALLINT.equals(type) || TINYINT.equals(type) || REAL.equals(type) || DATE.equals(type) || TIMESTAMP.equals(type)) { type.writeLong(builder, getLongExpressedValue(object)); } else if (DOUBLE.equals(type)) { DOUBLE.writeDouble(builder, ((Number) object).doubleValue()); } else if (isVarcharType(type) || VARBINARY.equals(type) || isCharType(type)) { type.writeSlice(builder, getSliceExpressedValue(object, type)); } else { throw new UnsupportedOperationException("Unsupported primitive type: " + type); } }
blockBuilder.appendNull(); BlockBuilder subBlockBuilder = blockBuilder.beginBlockEntry(); for (Object subElement : (Iterable<?>) element) { appendToBlockBuilder(type.getTypeParameters().get(0), subElement, subBlockBuilder); blockBuilder.closeEntry(); type.writeLong(blockBuilder, ((SqlDecimal) element).getUnscaledValue().longValue()); else if (REAL.equals(type)) { type.writeLong(blockBuilder, floatToRawIntBits(((Number) element).floatValue()));
@Override public Block apply(Block block) { BlockBuilder blockBuilder = DOUBLE.createBlockBuilder(null, block.getPositionCount()); for (int i = 0; i < block.getPositionCount(); i++) { if (block.isNull(i)) { blockBuilder.appendNull(); continue; } DOUBLE.writeDouble(blockBuilder, intBitsToFloat((int) REAL.getLong(block, i))); } return blockBuilder.build(); } }
@Override public void append(JsonParser parser, BlockBuilder blockBuilder) throws IOException { Long result = currentTokenAsReal(parser); if (result == null) { blockBuilder.appendNull(); } else { REAL.writeLong(blockBuilder, result); } } }
builder.appendNull(); return; return; case INT: IntegerType.INTEGER.writeLong(builder, ((IntObjectInspector) inspector).get(object)); return; case LONG: BigintType.BIGINT.writeLong(builder, ((LongObjectInspector) inspector).get(object)); return; case FLOAT: RealType.REAL.writeLong(builder, floatToRawIntBits(((FloatObjectInspector) inspector).get(object))); return; case DOUBLE: DoubleType.DOUBLE.writeDouble(builder, ((DoubleObjectInspector) inspector).get(object)); return; case STRING: return; case DATE: DateType.DATE.writeLong(builder, formatDateAsLong(object, (DateObjectInspector) inspector)); return; case TIMESTAMP:
@ScalarFunction("values_at_quantiles") @Description("For each input q between [0, 1], find the value whose rank in the sorted sequence of the n values represented by the qdigest is qn.") @SqlType("array(real)") public static Block valuesAtQuantilesReal(@SqlType("qdigest(real)") Slice input, @SqlType("array(double)") Block percentilesArrayBlock) { QuantileDigest digest = new QuantileDigest(input); BlockBuilder output = REAL.createBlockBuilder(null, percentilesArrayBlock.getPositionCount()); for (int i = 0; i < percentilesArrayBlock.getPositionCount(); i++) { REAL.writeLong(output, floatToRawIntBits(sortableIntToFloat((int) digest.getQuantile(DOUBLE.getDouble(percentilesArrayBlock, i))))); } return output.build(); }
private static Page makeInput(int numberOfBuckets) { PageBuilder builder = new PageBuilder(ImmutableList.of(BIGINT, REAL, DOUBLE)); for (int i = 0; i < 100; i++) { builder.declarePosition(); BIGINT.writeLong(builder.getBlockBuilder(0), numberOfBuckets); REAL.writeLong(builder.getBlockBuilder(1), i); // value DOUBLE.writeDouble(builder.getBlockBuilder(2), 1); // weight } return builder.build(); } }
@Override protected String toSqlType(Type type) if (REAL.equals(type)) { return "float";
@Test public void testNaNHash() { BlockBuilder blockBuilder = new IntArrayBlockBuilder(null, 4); blockBuilder.writeInt(floatToIntBits(Float.NaN)); blockBuilder.writeInt(floatToRawIntBits(Float.NaN)); // the following two are the integer values of a float NaN blockBuilder.writeInt(-0x400000); blockBuilder.writeInt(0x7fc00000); assertEquals(REAL.hash(blockBuilder, 0), REAL.hash(blockBuilder, 1)); assertEquals(REAL.hash(blockBuilder, 0), REAL.hash(blockBuilder, 2)); assertEquals(REAL.hash(blockBuilder, 0), REAL.hash(blockBuilder, 3)); } }
@Override public void writeJsonValue(JsonGenerator jsonGenerator, Block block, int position, ConnectorSession session) throws IOException { if (block.isNull(position)) { jsonGenerator.writeNull(); } else { float value = intBitsToFloat((int) REAL.getLong(block, position)); jsonGenerator.writeNumber(value); } } }
@Override public long hash(Block block, int position) { // convert to canonical NaN if necessary return hash(floatToIntBits(intBitsToFloat(block.getInt(position, 0)))); }
private static void writeValue(Type type, BlockBuilder blockBuilder, Object value) blockBuilder.appendNull(); if (BOOLEAN.equals(type)) { type.writeBoolean(blockBuilder, (Boolean) value); else if (TINYINT.equals(type)) { type.writeLong(blockBuilder, ((Number) value).longValue()); type.writeLong(blockBuilder, ((Number) value).longValue()); else if (INTEGER.equals(type)) { type.writeLong(blockBuilder, ((Number) value).longValue()); else if (BIGINT.equals(type)) { type.writeLong(blockBuilder, ((Number) value).longValue()); type.writeSlice(blockBuilder, Decimals.encodeUnscaledValue(((SqlDecimal) value).toBigDecimal().unscaledValue())); else if (REAL.equals(type)) { type.writeLong(blockBuilder, Float.floatToIntBits((Float) value)); else if (DOUBLE.equals(type)) { type.writeDouble(blockBuilder, ((Number) value).doubleValue()); type.writeSlice(blockBuilder, Slices.wrappedBuffer(((SqlVarbinary) value).getBytes())); blockBuilder.closeEntry();
blockBuilder.appendNull(); BlockBuilder subBlockBuilder = blockBuilder.beginBlockEntry(); for (Object subElement : (Iterable<?>) element) { appendToBlockBuilder(type.getTypeParameters().get(0), subElement, subBlockBuilder); blockBuilder.closeEntry(); type.writeLong(blockBuilder, ((SqlDecimal) element).getUnscaledValue().longValue()); else if (REAL.equals(type)) { type.writeLong(blockBuilder, floatToRawIntBits(((Number) element).floatValue()));
public static void output(LongState count, DoubleState sum, BlockBuilder out) { if (count.getLong() == 0) { out.appendNull(); } else { REAL.writeLong(out, floatToIntBits((float) (sum.getDouble() / count.getLong()))); } } }