Java tutorial
/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.prestosql.type; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import io.prestosql.spi.block.Block; import io.prestosql.spi.block.BlockBuilder; import io.prestosql.spi.block.BlockBuilderStatus; import io.prestosql.spi.connector.ConnectorSession; import io.prestosql.spi.type.Type; import io.prestosql.spi.type.TypeSignature; import io.prestosql.spi.type.TypeSignatureParameter; import java.util.List; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.util.Objects.requireNonNull; public class FunctionType implements Type { public static final String NAME = "function"; private final TypeSignature signature; private final Type returnType; private final List<Type> argumentTypes; public FunctionType(List<Type> argumentTypes, Type returnType) { this.signature = new TypeSignature(NAME, typeParameters(argumentTypes, returnType)); this.returnType = requireNonNull(returnType, "returnType is null"); this.argumentTypes = ImmutableList.copyOf(requireNonNull(argumentTypes, "argumentTypes is null")); } private static List<TypeSignatureParameter> typeParameters(List<Type> argumentTypes, Type returnType) { requireNonNull(returnType, "returnType is null"); requireNonNull(argumentTypes, "argumentTypes is null"); ImmutableList.Builder<TypeSignatureParameter> builder = ImmutableList.builder(); argumentTypes.stream().map(Type::getTypeSignature).map(TypeSignatureParameter::of).forEach(builder::add); builder.add(TypeSignatureParameter.of(returnType.getTypeSignature())); return builder.build(); } public Type getReturnType() { return returnType; } public List<Type> getArgumentTypes() { return argumentTypes; } @Override public List<Type> getTypeParameters() { return ImmutableList.<Type>builder().addAll(argumentTypes).add(returnType).build(); } @Override public final TypeSignature getTypeSignature() { return signature; } @Override public String getDisplayName() { ImmutableList<String> names = getTypeParameters().stream().map(Type::getDisplayName) .collect(toImmutableList()); return "function<" + Joiner.on(",").join(names) + ">"; } @Override public final Class<?> getJavaType() { throw new UnsupportedOperationException(getTypeSignature() + " type does not have Java type"); } @Override public boolean isComparable() { return false; } @Override public boolean isOrderable() { return false; } @Override public long hash(Block block, int position) { throw new UnsupportedOperationException(getTypeSignature() + " type is not comparable"); } @Override public boolean equalTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { throw new UnsupportedOperationException(getTypeSignature() + " type is not comparable"); } @Override public int compareTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { throw new UnsupportedOperationException(getTypeSignature() + " type is not orderable"); } @Override public boolean getBoolean(Block block, int position) { throw new UnsupportedOperationException(getClass().getName()); } @Override public void writeBoolean(BlockBuilder blockBuilder, boolean value) { throw new UnsupportedOperationException(getClass().getName()); } @Override public long getLong(Block block, int position) { throw new UnsupportedOperationException(getClass().getName()); } @Override public void writeLong(BlockBuilder blockBuilder, long value) { throw new UnsupportedOperationException(getClass().getName()); } @Override public double getDouble(Block block, int position) { throw new UnsupportedOperationException(getClass().getName()); } @Override public void writeDouble(BlockBuilder blockBuilder, double value) { throw new UnsupportedOperationException(getClass().getName()); } @Override public Slice getSlice(Block block, int position) { throw new UnsupportedOperationException(getClass().getName()); } @Override public void writeSlice(BlockBuilder blockBuilder, Slice value) { throw new UnsupportedOperationException(getClass().getName()); } @Override public void writeSlice(BlockBuilder blockBuilder, Slice value, int offset, int length) { throw new UnsupportedOperationException(getClass().getName()); } @Override public Object getObject(Block block, int position) { throw new UnsupportedOperationException(getClass().getName()); } @Override public void writeObject(BlockBuilder blockBuilder, Object value) { throw new UnsupportedOperationException(getClass().getName()); } @Override public Object getObjectValue(ConnectorSession session, Block block, int position) { throw new UnsupportedOperationException(); } @Override public void appendTo(Block block, int position, BlockBuilder blockBuilder) { throw new UnsupportedOperationException(); } @Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries, int expectedBytesPerEntry) { throw new UnsupportedOperationException(); } @Override public BlockBuilder createBlockBuilder(BlockBuilderStatus blockBuilderStatus, int expectedEntries) { throw new UnsupportedOperationException(); } }