Search in sources :

Example 1 with DuplicateMapKeyException

use of com.facebook.presto.common.block.DuplicateMapKeyException in project presto by prestodb.

the class MapConstructor method createMap.

@UsedByGeneratedCode
public static Block createMap(MapType mapType, Type keyType, Type valueType, MethodHandle keyBlockEqual, MethodHandle keyBlockHashCode, MethodHandle keyIndeterminate, SqlFunctionProperties properties, Block keyBlock, Block valueBlock) {
    checkCondition(keyBlock.getPositionCount() == valueBlock.getPositionCount(), INVALID_FUNCTION_ARGUMENT, "Key and value arrays must be the same length");
    MapBlockBuilder mapBlockBuilder = (MapBlockBuilder) mapType.createBlockBuilder(null, keyBlock.getPositionCount() * 2);
    BlockBuilder blockBuilder = mapBlockBuilder.beginBlockEntry();
    for (int i = 0; i < keyBlock.getPositionCount(); i++) {
        if (keyBlock.isNull(i)) {
            throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "map key cannot be null");
        }
        if (keyType.getJavaType() == Block.class) {
            // If it's nto primitive or string, we need to look for nulls in the block.
            Object keyObject = readNativeValue(mapType.getKeyType(), keyBlock, i);
            try {
                if ((boolean) keyIndeterminate.invoke(keyObject, false)) {
                    throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "map key cannot be indeterminate: " + mapType.getKeyType().getObjectValue(properties, keyBlock, i));
                }
            } catch (Throwable t) {
                throw internalError(t);
            }
        }
        keyType.appendTo(keyBlock, i, blockBuilder);
        valueType.appendTo(valueBlock, i, blockBuilder);
    }
    try {
        mapBlockBuilder.closeEntryStrict(keyBlockEqual, keyBlockHashCode);
    } catch (DuplicateMapKeyException e) {
        throw new PrestoException(INVALID_FUNCTION_ARGUMENT, e.getDetailedMessage(mapType.getKeyType(), properties), e);
    } catch (NotSupportedException e) {
        throw new PrestoException(NOT_SUPPORTED, e.getMessage(), e);
    }
    return mapType.getObject(mapBlockBuilder, mapBlockBuilder.getPositionCount() - 1);
}
Also used : MapBlockBuilder(com.facebook.presto.common.block.MapBlockBuilder) DuplicateMapKeyException(com.facebook.presto.common.block.DuplicateMapKeyException) PrestoException(com.facebook.presto.spi.PrestoException) NotSupportedException(com.facebook.presto.common.NotSupportedException) MapBlockBuilder(com.facebook.presto.common.block.MapBlockBuilder) BlockBuilder(com.facebook.presto.common.block.BlockBuilder) UsedByGeneratedCode(com.facebook.presto.annotation.UsedByGeneratedCode)

Aggregations

UsedByGeneratedCode (com.facebook.presto.annotation.UsedByGeneratedCode)1 NotSupportedException (com.facebook.presto.common.NotSupportedException)1 BlockBuilder (com.facebook.presto.common.block.BlockBuilder)1 DuplicateMapKeyException (com.facebook.presto.common.block.DuplicateMapKeyException)1 MapBlockBuilder (com.facebook.presto.common.block.MapBlockBuilder)1 PrestoException (com.facebook.presto.spi.PrestoException)1