Block actual = toBinaryBlock(rowType, innerStruct, getInspector(InnerStruct.class)); Block expected = rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 13, 14L); assertBlockEquals(actual, expected); outerRowValues.add("seven"); outerRowValues.add(new byte[] {'2'}); outerRowValues.add(arrayBlockOf(innerRowType, rowBlockOf(innerRowType.getTypeParameters(), 2, -5L), rowBlockOf(ImmutableList.of(INTEGER, BIGINT), -10, 0L))); outerRowValues.add(mapBlockOf( VARCHAR, innerRowType, new Object[] {utf8Slice("fifteen"), utf8Slice("twelve")}, new Object[] {rowBlockOf(innerRowType.getTypeParameters(), -5, -10L), rowBlockOf(innerRowType.getTypeParameters(), 0, 5L)})); outerRowValues.add(rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 18, 19L)); assertBlockEquals(actual, rowBlockOf(outerRowParameterTypes, outerRowValues.build().toArray()));
@Test public void testWindowMapAgg() { MaterializedResult actual = computeActual("" + "SELECT map_agg(orderkey, orderpriority) OVER(PARTITION BY orderstatus) FROM\n" + "(SELECT * FROM orders ORDER BY orderkey LIMIT 5) t"); MaterializedResult expected = resultBuilder(getSession(), mapType(BIGINT, VarcharType.createVarcharType(1))) .row(ImmutableMap.of(1L, "5-LOW", 2L, "1-URGENT", 4L, "5-LOW")) .row(ImmutableMap.of(1L, "5-LOW", 2L, "1-URGENT", 4L, "5-LOW")) .row(ImmutableMap.of(1L, "5-LOW", 2L, "1-URGENT", 4L, "5-LOW")) .row(ImmutableMap.of(3L, "5-LOW", 5L, "5-LOW")) .row(ImmutableMap.of(3L, "5-LOW", 5L, "5-LOW")) .build(); assertEqualsIgnoreOrder(actual.getMaterializedRows(), expected.getMaterializedRows()); }
@Test public void testMapBlock() { MapHolder holder = new MapHolder(); holder.map = new TreeMap<>(); holder.map.put("twelve", new InnerStruct(13, 14L)); holder.map.put("fifteen", new InnerStruct(16, 17L)); RowType rowType = RowType.anonymous(ImmutableList.of(INTEGER, BIGINT)); RowType rowOfMapOfVarcharRowType = RowType.anonymous(ImmutableList.of(mapType(VARCHAR, rowType))); Block actual = toBinaryBlock(rowOfMapOfVarcharRowType, holder, getInspector(MapHolder.class)); Block mapBlock = mapBlockOf( VARCHAR, rowType, new Object[] {utf8Slice("fifteen"), utf8Slice("twelve")}, new Object[] {rowBlockOf(rowType.getTypeParameters(), 16, 17L), rowBlockOf(rowType.getTypeParameters(), 13, 14L)}); Block expected = rowBlockOf(ImmutableList.of(mapType(VARCHAR, rowType)), mapBlock); assertBlockEquals(actual, expected); }
getStandardMapObjectInspector(javaStringObjectInspector, javaStringObjectInspector), ImmutableMap.of("test", "test"), mapBlockOf(createUnboundedVarcharType(), createUnboundedVarcharType(), "test", "test"))) .add(new TestColumn("t_map_tinyint", getStandardMapObjectInspector(javaByteObjectInspector, javaByteObjectInspector), ImmutableMap.of((byte) 1, (byte) 1), mapBlockOf(TINYINT, TINYINT, (byte) 1, (byte) 1))) .add(new TestColumn("t_map_varchar", getStandardMapObjectInspector(javaHiveVarcharObjectInspector, javaHiveVarcharObjectInspector), ImmutableMap.of(new HiveVarchar("test", HiveVarchar.MAX_VARCHAR_LENGTH), new HiveVarchar("test", HiveVarchar.MAX_VARCHAR_LENGTH)), mapBlockOf(createVarcharType(HiveVarchar.MAX_VARCHAR_LENGTH), createVarcharType(HiveVarchar.MAX_VARCHAR_LENGTH), "test", "test"))) .add(new TestColumn("t_map_char", getStandardMapObjectInspector(CHAR_INSPECTOR_LENGTH_10, CHAR_INSPECTOR_LENGTH_10), ImmutableMap.of(new HiveChar("test", 10), new HiveChar("test", 10)), mapBlockOf(createCharType(10), createCharType(10), "test", "test"))) .add(new TestColumn("t_map_smallint", getStandardMapObjectInspector(javaShortObjectInspector, javaShortObjectInspector), ImmutableMap.of((short) 2, (short) 2), mapBlockOf(SMALLINT, SMALLINT, (short) 2, (short) 2))) .add(new TestColumn("t_map_null_key", getStandardMapObjectInspector(javaLongObjectInspector, javaLongObjectInspector), asMap(new Long[] {null, 2L}, new Long[] {0L, 3L}), mapBlockOf(BIGINT, BIGINT, 2, 3))) .add(new TestColumn("t_map_int", getStandardMapObjectInspector(javaIntObjectInspector, javaIntObjectInspector), ImmutableMap.of(3, 3), mapBlockOf(INTEGER, INTEGER, 3, 3))) .add(new TestColumn("t_map_bigint", getStandardMapObjectInspector(javaLongObjectInspector, javaLongObjectInspector),
public static Block decimalMapBlockOf(DecimalType type, BigDecimal decimal) { if (type.isShort()) { long longDecimal = decimal.unscaledValue().longValue(); return mapBlockOf(type, type, longDecimal, longDecimal); } else { Slice sliceDecimal = Decimals.encodeUnscaledValue(decimal.unscaledValue()); return mapBlockOf(type, type, sliceDecimal, sliceDecimal); } }
arrayBlockOf(personType, rowBlockOf(ImmutableList.of(nameType, BIGINT, VARCHAR, new ArrayType(phoneType)), rowBlockOf(ImmutableList.of(VARCHAR, VARCHAR), "Bob", "Roberts"), 0, "bob.roberts@example.com", arrayBlockOf(phoneType, rowBlockOf(ImmutableList.of(VARCHAR, VARCHAR), "1234567890", null))
public static Block decimalArrayBlockOf(DecimalType type, BigDecimal decimal) { if (type.isShort()) { long longDecimal = decimal.unscaledValue().longValue(); return arrayBlockOf(type, longDecimal); } else { Slice sliceDecimal = Decimals.encodeUnscaledValue(decimal.unscaledValue()); return arrayBlockOf(type, sliceDecimal); } }
@Test public void testListBlock() { List<InnerStruct> array = new ArrayList<>(2); array.add(new InnerStruct(8, 9L)); array.add(new InnerStruct(10, 11L)); ListHolder listHolder = new ListHolder(); listHolder.array = array; com.facebook.presto.spi.type.Type rowType = RowType.anonymous(ImmutableList.of(INTEGER, BIGINT)); com.facebook.presto.spi.type.Type arrayOfRowType = RowType.anonymous(ImmutableList.of(new ArrayType(rowType))); Block actual = toBinaryBlock(arrayOfRowType, listHolder, getInspector(ListHolder.class)); BlockBuilder blockBuilder = rowType.createBlockBuilder(null, 1024); rowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 8, 9L)); rowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 10, 11L)); Block expected = rowBlockOf(ImmutableList.of(new ArrayType(rowType)), blockBuilder.build()); assertBlockEquals(actual, expected); }
getStandardMapObjectInspector(javaStringObjectInspector, javaStringObjectInspector), ImmutableMap.of("test", "test"), mapBlockOf(createUnboundedVarcharType(), createUnboundedVarcharType(), "test", "test"))) .add(new TestColumn("t_map_tinyint", getStandardMapObjectInspector(javaByteObjectInspector, javaByteObjectInspector), ImmutableMap.of((byte) 1, (byte) 1), mapBlockOf(TINYINT, TINYINT, (byte) 1, (byte) 1))) .add(new TestColumn("t_map_varchar", getStandardMapObjectInspector(javaHiveVarcharObjectInspector, javaHiveVarcharObjectInspector), ImmutableMap.of(new HiveVarchar("test", HiveVarchar.MAX_VARCHAR_LENGTH), new HiveVarchar("test", HiveVarchar.MAX_VARCHAR_LENGTH)), mapBlockOf(createVarcharType(HiveVarchar.MAX_VARCHAR_LENGTH), createVarcharType(HiveVarchar.MAX_VARCHAR_LENGTH), "test", "test"))) .add(new TestColumn("t_map_char", getStandardMapObjectInspector(CHAR_INSPECTOR_LENGTH_10, CHAR_INSPECTOR_LENGTH_10), ImmutableMap.of(new HiveChar("test", 10), new HiveChar("test", 10)), mapBlockOf(createCharType(10), createCharType(10), "test", "test"))) .add(new TestColumn("t_map_smallint", getStandardMapObjectInspector(javaShortObjectInspector, javaShortObjectInspector), ImmutableMap.of((short) 2, (short) 2), mapBlockOf(SMALLINT, SMALLINT, (short) 2, (short) 2))) .add(new TestColumn("t_map_null_key", getStandardMapObjectInspector(javaLongObjectInspector, javaLongObjectInspector), asMap(new Long[] {null, 2L}, new Long[] {0L, 3L}), mapBlockOf(BIGINT, BIGINT, 2, 3))) .add(new TestColumn("t_map_int", getStandardMapObjectInspector(javaIntObjectInspector, javaIntObjectInspector), ImmutableMap.of(3, 3), mapBlockOf(INTEGER, INTEGER, 3, 3))) .add(new TestColumn("t_map_bigint", getStandardMapObjectInspector(javaLongObjectInspector, javaLongObjectInspector),
private static Page getPage() { Type mapType = typeManager.getParameterizedType("map", ImmutableList.of(TypeSignatureParameter.of(parseTypeSignature(StandardTypes.BIGINT)), TypeSignatureParameter.of(parseTypeSignature(StandardTypes.DOUBLE)))); int datapoints = 100; RowPageBuilder builder = RowPageBuilder.rowPageBuilder(BIGINT, mapType, VarcharType.VARCHAR); Random rand = new Random(0); for (int i = 0; i < datapoints; i++) { long label = rand.nextDouble() < 0.5 ? 0 : 1; builder.row(label, mapBlockOf(BIGINT, DOUBLE, 0L, label + rand.nextGaussian()), "C=1"); } return builder.build(); } }
@Test public void testMapBlock() { MapHolder holder = new MapHolder(); holder.map = new TreeMap<>(); holder.map.put("twelve", new InnerStruct(13, 14L)); holder.map.put("fifteen", new InnerStruct(16, 17L)); RowType rowType = RowType.anonymous(ImmutableList.of(INTEGER, BIGINT)); RowType rowOfMapOfVarcharRowType = RowType.anonymous(ImmutableList.of(mapType(VARCHAR, rowType))); Block actual = toBinaryBlock(rowOfMapOfVarcharRowType, holder, getInspector(MapHolder.class)); Block mapBlock = mapBlockOf( VARCHAR, rowType, new Object[] {utf8Slice("fifteen"), utf8Slice("twelve")}, new Object[] {rowBlockOf(rowType.getTypeParameters(), 16, 17L), rowBlockOf(rowType.getTypeParameters(), 13, 14L)}); Block expected = rowBlockOf(ImmutableList.of(mapType(VARCHAR, rowType)), mapBlock); assertBlockEquals(actual, expected); }
Block actual = toBinaryBlock(rowType, innerStruct, getInspector(InnerStruct.class)); Block expected = rowBlockOf(ImmutableList.of(BIGINT, BIGINT), 13, 14L); assertBlockEquals(actual, expected); outerRowValues.add("seven"); outerRowValues.add(new byte[] {'2'}); outerRowValues.add(arrayBlockOf(innerRowType, rowBlockOf(ImmutableList.of(BIGINT, BIGINT), 2, -5L), rowBlockOf(ImmutableList.of(BIGINT, BIGINT), -10, 0))); BlockBuilder blockBuilder = new InterleavedBlockBuilder(ImmutableList.of(VARCHAR, innerRowType), new BlockBuilderStatus(), 1024); VARCHAR.writeString(blockBuilder, "fifteen"); innerRowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(BIGINT, BIGINT), -5, -10L)); VARCHAR.writeString(blockBuilder, "twelve"); innerRowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(BIGINT, BIGINT), 0, 5L)); outerRowValues.add(blockBuilder.build()); outerRowValues.add(rowBlockOf(ImmutableList.of(BIGINT, BIGINT), 18, 19L)); assertBlockEquals(actual, rowBlockOf(outerRowParameterTypes, outerRowValues.build().toArray()));
public static Block decimalArrayBlockOf(DecimalType type, BigDecimal decimal) { if (type.isShort()) { long longDecimal = decimal.unscaledValue().longValue(); return arrayBlockOf(type, longDecimal); } else { Slice sliceDecimal = Decimals.encodeUnscaledValue(decimal.unscaledValue()); return arrayBlockOf(type, sliceDecimal); } }
@Test public void testListBlock() { List<InnerStruct> array = new ArrayList<>(2); array.add(new InnerStruct(8, 9L)); array.add(new InnerStruct(10, 11L)); ListHolder listHolder = new ListHolder(); listHolder.array = array; com.facebook.presto.spi.type.Type rowType = RowType.anonymous(ImmutableList.of(INTEGER, BIGINT)); com.facebook.presto.spi.type.Type arrayOfRowType = RowType.anonymous(ImmutableList.of(new ArrayType(rowType))); Block actual = toBinaryBlock(arrayOfRowType, listHolder, getInspector(ListHolder.class)); BlockBuilder blockBuilder = rowType.createBlockBuilder(null, 1024); rowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 8, 9L)); rowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 10, 11L)); Block expected = rowBlockOf(ImmutableList.of(new ArrayType(rowType)), blockBuilder.build()); assertBlockEquals(actual, expected); }
Block actual = toBinaryBlock(rowType, innerStruct, getInspector(InnerStruct.class)); Block expected = rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 13, 14L); assertBlockEquals(actual, expected); outerRowValues.add("seven"); outerRowValues.add(new byte[] {'2'}); outerRowValues.add(arrayBlockOf(innerRowType, rowBlockOf(innerRowType.getTypeParameters(), 2, -5L), rowBlockOf(ImmutableList.of(INTEGER, BIGINT), -10, 0L))); outerRowValues.add(mapBlockOf( VARCHAR, innerRowType, new Object[] {utf8Slice("fifteen"), utf8Slice("twelve")}, new Object[] {rowBlockOf(innerRowType.getTypeParameters(), -5, -10L), rowBlockOf(innerRowType.getTypeParameters(), 0, 5L)})); outerRowValues.add(rowBlockOf(ImmutableList.of(INTEGER, BIGINT), 18, 19L)); assertBlockEquals(actual, rowBlockOf(outerRowParameterTypes, outerRowValues.build().toArray()));
@Test public void testReuse() { BytesWritable value = new BytesWritable(); byte[] first = "hello world".getBytes(UTF_8); value.set(first, 0, first.length); byte[] second = "bye".getBytes(UTF_8); value.set(second, 0, second.length); Type type = new TypeToken<Map<BytesWritable, Long>>() {}.getType(); ObjectInspector inspector = getInspector(type); Block actual = getBlockObject(mapType(createUnboundedVarcharType(), BIGINT), ImmutableMap.of(value, 0L), inspector); Block expected = mapBlockOf(createUnboundedVarcharType(), BIGINT, "bye", 0L); assertBlockEquals(actual, expected); }
public static Block mapBlockOf(Type keyType, Type valueType, Object[] keys, Object[] values) { checkArgument(keys.length == values.length, "keys/values must have the same length"); MapType mapType = mapType(keyType, valueType); BlockBuilder blockBuilder = mapType.createBlockBuilder(null, 10); BlockBuilder singleMapBlockWriter = blockBuilder.beginBlockEntry(); for (int i = 0; i < keys.length; i++) { Object key = keys[i]; Object value = values[i]; appendToBlockBuilder(keyType, key, singleMapBlockWriter); appendToBlockBuilder(valueType, value, singleMapBlockWriter); } blockBuilder.closeEntry(); return mapType.getObject(blockBuilder, 0); }
@Test public void testListBlock() { List<InnerStruct> array = new ArrayList<>(2); array.add(new InnerStruct(8, 9L)); array.add(new InnerStruct(10, 11L)); ListHolder listHolder = new ListHolder(); listHolder.array = array; com.facebook.presto.spi.type.Type rowType = new RowType(ImmutableList.of(BIGINT, BIGINT), Optional.empty()); com.facebook.presto.spi.type.Type arrayOfRowType = new RowType(ImmutableList.of(new ArrayType(rowType)), Optional.empty()); Block actual = toBinaryBlock(arrayOfRowType, listHolder, getInspector(ListHolder.class)); BlockBuilder blockBuilder = rowType.createBlockBuilder(new BlockBuilderStatus(), 1024); rowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(BIGINT, BIGINT), 8, 9L)); rowType.writeObject(blockBuilder, rowBlockOf(ImmutableList.of(BIGINT, BIGINT), 10, 11L)); Block expected = rowBlockOf(ImmutableList.of(new ArrayType(rowType)), blockBuilder.build()); assertBlockEquals(actual, expected); }
public static Block decimalMapBlockOf(DecimalType type, BigDecimal decimal) { if (type.isShort()) { long longDecimal = decimal.unscaledValue().longValue(); return mapBlockOf(type, type, longDecimal, longDecimal); } else { Slice sliceDecimal = Decimals.encodeUnscaledValue(decimal.unscaledValue()); return mapBlockOf(type, type, sliceDecimal, sliceDecimal); } }
public static Block mapBlockOf(Type keyType, Type valueType, Object key, Object value) { MapType mapType = mapType(keyType, valueType); BlockBuilder blockBuilder = mapType.createBlockBuilder(null, 10); BlockBuilder singleMapBlockWriter = blockBuilder.beginBlockEntry(); appendToBlockBuilder(keyType, key, singleMapBlockWriter); appendToBlockBuilder(valueType, value, singleMapBlockWriter); blockBuilder.closeEntry(); return mapType.getObject(blockBuilder, 0); }