@Override public InternalAggregationFunction specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionRegistry functionRegistry) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); Type outputType = typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(new ArrayType(valueType).getTypeSignature()))); return generateAggregation(keyType, valueType, outputType); }
@Override public List<Type> getTypeParameters() { return singletonList(getElementType()); }
@ScalarFunction(hidden = true) @SqlType("array(unknown)") public static Block arrayConstructor() { BlockBuilder blockBuilder = new ArrayType(UNKNOWN).createBlockBuilder(null, 0); return blockBuilder.build(); } }
public static TypedKeyValueHeap deserialize(Block block, Type keyType, Type valueType, BlockComparator blockComparator) { int capacity = toIntExact(BIGINT.getLong(block, 0)); Block keysBlock = new ArrayType(keyType).getObject(block, 1); Block valuesBlock = new ArrayType(valueType).getObject(block, 2); TypedKeyValueHeap heap = new TypedKeyValueHeap(blockComparator, keyType, valueType, capacity); heap.addAll(keysBlock, valuesBlock); return heap; }
@Override public Block[] getSequenceBlocks(int start, int length) { ArrayType arrayType = new ArrayType(BIGINT); BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, length); for (int i = start; i < start + length; i++) { arrayType.writeObject(blockBuilder, arrayBlockOf(BIGINT, i)); } return new Block[] {blockBuilder.build()}; }
public ArrayAggregationStateSerializer(Type elementType) { this.elementType = elementType; this.arrayType = new ArrayType(elementType); }
private static Block createChannel(int positionCount, int arraySize) { ArrayType arrayType = new ArrayType(BIGINT); BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, positionCount); for (int position = 0; position < positionCount; position++) { BlockBuilder entryBuilder = blockBuilder.beginBlockEntry(); for (int i = 0; i < arraySize; i++) { arrayType.getElementType().writeLong(entryBuilder, ThreadLocalRandom.current().nextLong()); } blockBuilder.closeEntry(); } return blockBuilder.build(); }
private static Block createChannel(int positionCount, int arraySize, ArrayType arrayType) { BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, positionCount); for (int position = 0; position < positionCount; position++) { BlockBuilder entryBuilder = blockBuilder.beginBlockEntry(); for (int i = 0; i < arraySize; i++) { if (arrayType.getElementType().getJavaType() == long.class) { arrayType.getElementType().writeLong(entryBuilder, ThreadLocalRandom.current().nextLong()); } else if (arrayType.getElementType().equals(VARCHAR)) { arrayType.getElementType().writeSlice(entryBuilder, Slices.utf8Slice("test_string")); } else { throw new UnsupportedOperationException(); } } blockBuilder.closeEntry(); } return blockBuilder.build(); }
private void assertArrayHashOperator(String inputArray, Type elementType, List<Object> elements) { ArrayType arrayType = new ArrayType(elementType); BlockBuilder arrayArrayBuilder = arrayType.createBlockBuilder(null, 1); BlockBuilder arrayBuilder = elementType.createBlockBuilder(null, elements.size()); for (Object element : elements) { appendToBlockBuilder(elementType, element, arrayBuilder); } arrayType.writeObject(arrayArrayBuilder, arrayBuilder.build()); assertOperator(HASH_CODE, inputArray, BIGINT, arrayType.hash(arrayArrayBuilder.build(), 0)); }
@Override public long hash(Block block, int position) { Block array = getObject(block, position); long hash = 0; for (int i = 0; i < array.getPositionCount(); i++) { hash = 31 * hash + hashPosition(elementType, array, i); } return hash; }
@Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries) { return createBlockBuilder(blockBuilderStatus, expectedEntries, 100); }
@Override public int compareTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { if (!elementType.isOrderable()) { throw new UnsupportedOperationException(getTypeSignature() + " type is not orderable"); } Block leftArray = leftBlock.getObject(leftPosition, Block.class); Block rightArray = rightBlock.getObject(rightPosition, Block.class); int len = Math.min(leftArray.getPositionCount(), rightArray.getPositionCount()); int index = 0; while (index < len) { checkElementNotNull(leftArray.isNull(index), ARRAY_NULL_ELEMENT_MSG); checkElementNotNull(rightArray.isNull(index), ARRAY_NULL_ELEMENT_MSG); int comparison = elementType.compareTo(leftArray, index, rightArray, index); if (comparison != 0) { return comparison; } index++; } if (index == len) { return leftArray.getPositionCount() - rightArray.getPositionCount(); } return 0; }
public MinMaxNStateSerializer(BlockComparator blockComparator, Type elementType) { this.blockComparator = blockComparator; this.elementType = elementType; this.arrayType = new ArrayType(elementType); this.serializedType = RowType.anonymous(ImmutableList.of(BIGINT, arrayType)); }
@Override public Block[] getSequenceBlocks(int start, int length) { ArrayType arrayType = new ArrayType(BIGINT); BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, length); for (int i = start; i < start + length; i++) { arrayType.writeObject(blockBuilder, arrayBlockOf(BIGINT, i)); } return new Block[] {blockBuilder.build()}; }
private static Block createChannel(int positionCount, int arraySize) { ArrayType arrayType = new ArrayType(BIGINT); BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, positionCount); for (int position = 0; position < positionCount; position++) { BlockBuilder entryBuilder = blockBuilder.beginBlockEntry(); for (int i = 0; i < arraySize; i++) { arrayType.getElementType().writeLong(entryBuilder, ThreadLocalRandom.current().nextLong()); } blockBuilder.closeEntry(); } return blockBuilder.build(); }
private static Block createChannel(int positionCount, int arraySize, ArrayType arrayType) { BlockBuilder blockBuilder = arrayType.createBlockBuilder(null, positionCount); for (int position = 0; position < positionCount; position++) { BlockBuilder entryBuilder = blockBuilder.beginBlockEntry(); for (int i = 0; i < arraySize; i++) { if (arrayType.getElementType().getJavaType() == long.class) { arrayType.getElementType().writeLong(entryBuilder, ThreadLocalRandom.current().nextLong()); } else { throw new UnsupportedOperationException(); } } blockBuilder.closeEntry(); } return blockBuilder.build(); }
private void assertArrayHashOperator(String inputArray, Type elementType, List<Object> elements) { ArrayType arrayType = new ArrayType(elementType); BlockBuilder arrayArrayBuilder = arrayType.createBlockBuilder(null, 1); BlockBuilder arrayBuilder = elementType.createBlockBuilder(null, elements.size()); for (Object element : elements) { appendToBlockBuilder(elementType, element, arrayBuilder); } arrayType.writeObject(arrayArrayBuilder, arrayBuilder.build()); assertOperator(HASH_CODE, inputArray, BIGINT, arrayType.hash(arrayArrayBuilder.build(), 0)); }
public static TypedKeyValueHeap deserialize(Block block, Type keyType, Type valueType, BlockComparator blockComparator) { int capacity = toIntExact(BIGINT.getLong(block, 0)); Block keysBlock = new ArrayType(keyType).getObject(block, 1); Block valuesBlock = new ArrayType(valueType).getObject(block, 2); TypedKeyValueHeap heap = new TypedKeyValueHeap(blockComparator, keyType, valueType, capacity); heap.addAll(keysBlock, valuesBlock); return heap; }
@Override public void writeJsonValue(JsonGenerator jsonGenerator, Block block, int position, ConnectorSession session) throws IOException { if (block.isNull(position)) { jsonGenerator.writeNull(); } else { Block arrayBlock = type.getObject(block, position); jsonGenerator.writeStartArray(); for (int i = 0; i < arrayBlock.getPositionCount(); i++) { elementWriter.writeJsonValue(jsonGenerator, arrayBlock, i, session); } jsonGenerator.writeEndArray(); } } }
@Override public InternalAggregationFunction specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionRegistry functionRegistry) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); Type outputType = typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(new ArrayType(valueType).getTypeSignature()))); return generateAggregation(keyType, valueType, outputType); }