@Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries) { return new RowBlockBuilder(getTypeParameters(), blockBuilderStatus, expectedEntries); }
@Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries, int expectedBytesPerEntry) { return new RowBlockBuilder(getTypeParameters(), blockBuilderStatus, expectedEntries); }
public static List<MethodHandle> resolveFieldEqualOperators(RowType rowType, FunctionRegistry functionRegistry) { return rowType.getTypeParameters().stream() .map(type -> resolveEqualOperator(type, functionRegistry)) .collect(toImmutableList()); }
protected List<MethodHandle> getMethodHandles(RowType type, FunctionRegistry functionRegistry, OperatorType operatorType) { ImmutableList.Builder<MethodHandle> argumentMethods = ImmutableList.builder(); for (Type parameterType : type.getTypeParameters()) { Signature signature = functionRegistry.resolveOperator(operatorType, ImmutableList.of(parameterType, parameterType)); argumentMethods.add(functionRegistry.getScalarFunctionImplementation(signature).getMethodHandle()); } return argumentMethods.build(); }
@Override protected Object visitRow(Row node, Object context) { RowType rowType = (RowType) type(node); List<Type> parameterTypes = rowType.getTypeParameters(); List<Expression> arguments = node.getItems(); int cardinality = arguments.size(); List<Object> values = new ArrayList<>(cardinality); for (Expression argument : arguments) { values.add(process(argument, context)); } if (hasUnresolvedValue(values)) { return new Row(toExpressions(values, parameterTypes)); } else { BlockBuilder blockBuilder = new RowBlockBuilder(parameterTypes, null, 1); BlockBuilder singleRowBlockWriter = blockBuilder.beginBlockEntry(); for (int i = 0; i < cardinality; ++i) { writeNativeValue(parameterTypes.get(i), singleRowBlockWriter, values.get(i)); } blockBuilder.closeEntry(); return rowType.getObject(blockBuilder, 0); } }
continue; Type fieldType = rowType.getTypeParameters().get(fieldIndex); Object leftField = readNativeValue(fieldType, leftRow, fieldIndex); Object rightField = readNativeValue(fieldType, rightRow, fieldIndex);
protected static int compare( RowType rowType, List<MethodHandle> comparisonFunctions, Block leftRow, Block rightRow) { for (int i = 0; i < leftRow.getPositionCount(); i++) { checkElementNotNull(leftRow.isNull(i), "null value at position " + i); checkElementNotNull(rightRow.isNull(i), "null value at position " + i); Type type = rowType.getTypeParameters().get(i); Object leftElement = readNativeValue(type, leftRow, i); Object rightElement = readNativeValue(type, rightRow, i); try { if ((boolean) comparisonFunctions.get(i).invoke(leftElement, rightElement)) { return 1; } if ((boolean) comparisonFunctions.get(i).invoke(rightElement, leftElement)) { return -1; } } catch (Throwable t) { throw internalError(t); } } return 0; } }
@SqlType("map(K,V)") Block block) verify(rowType.getTypeParameters().size() == 2); verify(block.getPositionCount() % 2 == 0); Type keyType = rowType.getTypeParameters().get(0); Type valueType = rowType.getTypeParameters().get(1); ArrayType arrayType = new ArrayType(rowType);
@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); }
List<Type> elementTypes = rowType.getTypeParameters(); Object[] elementNonNullValues = elementTypes.stream().map(AbstractTestType::getNonNullValueForType).toArray(Object[]::new); return toRow(elementTypes, elementNonNullValues);
@Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries) { return new RowBlockBuilder(getTypeParameters(), blockBuilderStatus, expectedEntries); }
@Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries, int expectedBytesPerEntry) { return new RowBlockBuilder(getTypeParameters(), blockBuilderStatus, expectedEntries); }
@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); }