diff --git a/presto-client/src/test/java/com/facebook/presto/client/TestIntervalDayTime.java b/presto-client/src/test/java/com/facebook/presto/client/TestIntervalDayTime.java index 533cc715f3a4b..57c91d6c203b2 100644 --- a/presto-client/src/test/java/com/facebook/presto/client/TestIntervalDayTime.java +++ b/presto-client/src/test/java/com/facebook/presto/client/TestIntervalDayTime.java @@ -15,9 +15,9 @@ import org.testng.annotations.Test; -import static com.facebook.presto.client.IntervalDayTime.formatMillis; -import static com.facebook.presto.client.IntervalDayTime.parseMillis; -import static com.facebook.presto.client.IntervalDayTime.toMillis; +import static com.facebook.presto.common.type.IntervalDayTime.formatMillis; +import static com.facebook.presto.common.type.IntervalDayTime.parseMillis; +import static com.facebook.presto.common.type.IntervalDayTime.toMillis; import static java.util.concurrent.TimeUnit.DAYS; import static org.testng.Assert.assertEquals; diff --git a/presto-client/src/test/java/com/facebook/presto/client/TestIntervalYearMonth.java b/presto-client/src/test/java/com/facebook/presto/client/TestIntervalYearMonth.java index 6bea7c4bd0ff0..1e95d087117df 100644 --- a/presto-client/src/test/java/com/facebook/presto/client/TestIntervalYearMonth.java +++ b/presto-client/src/test/java/com/facebook/presto/client/TestIntervalYearMonth.java @@ -15,9 +15,9 @@ import org.testng.annotations.Test; -import static com.facebook.presto.client.IntervalYearMonth.formatMonths; -import static com.facebook.presto.client.IntervalYearMonth.parseMonths; -import static com.facebook.presto.client.IntervalYearMonth.toMonths; +import static com.facebook.presto.common.type.IntervalYearMonth.formatMonths; +import static com.facebook.presto.common.type.IntervalYearMonth.parseMonths; +import static com.facebook.presto.common.type.IntervalYearMonth.toMonths; import static org.testng.Assert.assertEquals; public class TestIntervalYearMonth diff --git a/presto-main/src/main/java/com/facebook/presto/type/ArrayParametricType.java b/presto-common/src/main/java/com/facebook/presto/common/type/ArrayParametricType.java similarity index 64% rename from presto-main/src/main/java/com/facebook/presto/type/ArrayParametricType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/ArrayParametricType.java index 249b18f9e3c42..085701e0131b8 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/ArrayParametricType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/ArrayParametricType.java @@ -11,18 +11,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; - -import com.facebook.presto.common.type.ArrayType; -import com.facebook.presto.common.type.ParameterKind; -import com.facebook.presto.common.type.ParametricType; -import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.common.type.Type; -import com.facebook.presto.common.type.TypeParameter; +package com.facebook.presto.common.type; import java.util.List; -import static com.google.common.base.Preconditions.checkArgument; +import static com.facebook.presto.common.Utils.checkArgument; +import static java.lang.String.format; public final class ArrayParametricType implements ParametricType @@ -42,11 +36,11 @@ public String getName() @Override public Type createType(List parameters) { - checkArgument(parameters.size() == 1, "Array type expects exactly one type as a parameter, got %s", parameters); + checkArgument(parameters.size() == 1, + format("Array type expects exactly one type as a parameter, got %s", parameters)); checkArgument( parameters.get(0).getKind() == ParameterKind.TYPE, - "Array expects type as a parameter, got %s", - parameters); + format("Array expects type as a parameter, got %s", parameters)); return new ArrayType(parameters.get(0).getType()); } } diff --git a/presto-main/src/main/java/com/facebook/presto/type/DecimalParametricType.java b/presto-common/src/main/java/com/facebook/presto/common/type/DecimalParametricType.java similarity index 76% rename from presto-main/src/main/java/com/facebook/presto/type/DecimalParametricType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/DecimalParametricType.java index aafc8c610f68e..04cf5d03e3976 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/DecimalParametricType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/DecimalParametricType.java @@ -11,20 +11,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.common.type; import com.facebook.presto.common.InvalidFunctionArgumentException; -import com.facebook.presto.common.type.DecimalType; -import com.facebook.presto.common.type.ParametricType; -import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.common.type.Type; -import com.facebook.presto.common.type.TypeParameter; -import com.facebook.presto.spi.PrestoException; import java.util.List; -import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; - public class DecimalParametricType implements ParametricType { @@ -52,7 +44,7 @@ public Type createType(List parameters) } } catch (InvalidFunctionArgumentException e) { - throw new PrestoException(INVALID_FUNCTION_ARGUMENT, e.getMessage(), e); + throw new InvalidFunctionArgumentException(e); } } } diff --git a/presto-main/src/main/java/com/facebook/presto/type/FunctionParametricType.java b/presto-common/src/main/java/com/facebook/presto/common/type/FunctionParametricType.java similarity index 71% rename from presto-main/src/main/java/com/facebook/presto/type/FunctionParametricType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/FunctionParametricType.java index 4607b2327f177..e843f8e62fb57 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/FunctionParametricType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/FunctionParametricType.java @@ -11,18 +11,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; - -import com.facebook.presto.common.type.FunctionType; -import com.facebook.presto.common.type.ParameterKind; -import com.facebook.presto.common.type.ParametricType; -import com.facebook.presto.common.type.Type; -import com.facebook.presto.common.type.TypeParameter; +package com.facebook.presto.common.type; import java.util.List; +import static com.facebook.presto.common.Utils.checkArgument; import static com.facebook.presto.common.type.FunctionType.NAME; -import static com.google.common.base.Preconditions.checkArgument; +import static java.lang.String.format; import static java.util.stream.Collectors.toList; public final class FunctionParametricType @@ -43,11 +38,10 @@ public String getName() @Override public Type createType(List parameters) { - checkArgument(parameters.size() >= 1, "Function type must have at least one parameter, got %s", parameters); + checkArgument(parameters.size() >= 1, format("Function type must have at least one parameter, got %s", parameters)); checkArgument( parameters.stream().allMatch(parameter -> parameter.getKind() == ParameterKind.TYPE), - "Expected only types as a parameters, got %s", - parameters); + format("Expected only types as a parameters, got %s", parameters)); List types = parameters.stream().map(TypeParameter::getType).collect(toList()); return new FunctionType(types.subList(0, types.size() - 1), types.get(types.size() - 1)); diff --git a/presto-client/src/main/java/com/facebook/presto/client/IntervalDayTime.java b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalDayTime.java similarity index 98% rename from presto-client/src/main/java/com/facebook/presto/client/IntervalDayTime.java rename to presto-common/src/main/java/com/facebook/presto/common/type/IntervalDayTime.java index 68ef8fa8923aa..8cf63009cf5c2 100644 --- a/presto-client/src/main/java/com/facebook/presto/client/IntervalDayTime.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalDayTime.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.client; +package com.facebook.presto.common.type; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/presto-main/src/main/java/com/facebook/presto/type/IntervalDayTimeType.java b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalDayTimeType.java similarity index 91% rename from presto-main/src/main/java/com/facebook/presto/type/IntervalDayTimeType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/IntervalDayTimeType.java index 8c5cf96446b24..6fe37791996ca 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IntervalDayTimeType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalDayTimeType.java @@ -11,12 +11,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.common.type; import com.facebook.presto.common.block.Block; import com.facebook.presto.common.function.SqlFunctionProperties; -import com.facebook.presto.common.type.AbstractLongType; -import com.facebook.presto.common.type.StandardTypes; import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature; diff --git a/presto-client/src/main/java/com/facebook/presto/client/IntervalYearMonth.java b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalYearMonth.java similarity index 98% rename from presto-client/src/main/java/com/facebook/presto/client/IntervalYearMonth.java rename to presto-common/src/main/java/com/facebook/presto/common/type/IntervalYearMonth.java index 8d75658500332..254dac0f326db 100644 --- a/presto-client/src/main/java/com/facebook/presto/client/IntervalYearMonth.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalYearMonth.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.client; +package com.facebook.presto.common.type; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/presto-main/src/main/java/com/facebook/presto/type/IntervalYearMonthType.java b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalYearMonthType.java similarity index 91% rename from presto-main/src/main/java/com/facebook/presto/type/IntervalYearMonthType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/IntervalYearMonthType.java index 1adf53ffa4459..63160bd2c4187 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IntervalYearMonthType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/IntervalYearMonthType.java @@ -11,12 +11,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.common.type; import com.facebook.presto.common.block.Block; import com.facebook.presto.common.function.SqlFunctionProperties; -import com.facebook.presto.common.type.AbstractIntType; -import com.facebook.presto.common.type.StandardTypes; import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/type/IpAddressType.java b/presto-common/src/main/java/com/facebook/presto/common/type/IpAddressType.java similarity index 93% rename from presto-main/src/main/java/com/facebook/presto/type/IpAddressType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/IpAddressType.java index dbcc9d46ee587..291baeb78765b 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IpAddressType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/IpAddressType.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.common.type; import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; @@ -19,10 +19,6 @@ import com.facebook.presto.common.block.Int128ArrayBlockBuilder; import com.facebook.presto.common.block.PageBuilderStatus; import com.facebook.presto.common.function.SqlFunctionProperties; -import com.facebook.presto.common.type.AbstractPrimitiveType; -import com.facebook.presto.common.type.FixedWidthType; -import com.facebook.presto.common.type.StandardTypes; -import com.google.common.net.InetAddresses; import io.airlift.slice.Slice; import io.airlift.slice.Slices; import io.airlift.slice.XxHash64; @@ -31,6 +27,7 @@ import java.net.UnknownHostException; import static com.facebook.presto.common.block.Int128ArrayBlock.INT128_BYTES; +import static com.facebook.presto.common.type.IpAddressUtils.toAddrString; import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature; import static io.airlift.slice.SizeOf.SIZE_OF_LONG; import static java.lang.Long.reverseBytes; @@ -121,7 +118,7 @@ public Object getObjectValue(SqlFunctionProperties properties, Block block, int return null; } try { - return InetAddresses.toAddrString(InetAddress.getByAddress(getSlice(block, position).getBytes())); + return toAddrString(InetAddress.getByAddress(getSlice(block, position).getBytes())); } catch (UnknownHostException e) { throw new IllegalArgumentException(); diff --git a/presto-common/src/main/java/com/facebook/presto/common/type/IpAddressUtils.java b/presto-common/src/main/java/com/facebook/presto/common/type/IpAddressUtils.java new file mode 100644 index 0000000000000..b744d927040e3 --- /dev/null +++ b/presto-common/src/main/java/com/facebook/presto/common/type/IpAddressUtils.java @@ -0,0 +1,107 @@ +/* + * 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 com.facebook.presto.common.type; + +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.util.Arrays; + +import static com.facebook.presto.common.Utils.checkArgument; +import static java.nio.ByteOrder.BIG_ENDIAN; +import static java.nio.ByteOrder.LITTLE_ENDIAN; +import static java.util.Objects.requireNonNull; + +public class IpAddressUtils +{ + private static final int IPV6_PART_COUNT = 8; + + private IpAddressUtils() {}; + + public static String toAddrString(InetAddress ip) + { + requireNonNull(ip, "ip is empty"); + if (ip instanceof Inet4Address) { + // For IPv4, Java's formatting is good enough. + return ip.getHostAddress(); + } + checkArgument(ip instanceof Inet6Address); + byte[] bytes = ip.getAddress(); + int[] hextets = new int[IPV6_PART_COUNT]; + for (int i = 0; i < hextets.length; i++) { + hextets[i] = fromBytes(new byte[] {(byte) 0, (byte) 0, bytes[2 * i], bytes[2 * i + 1]}, true); + } + compressLongestRunOfZeroes(hextets); + return hextetsToIPv6String(hextets); + } + + private static void compressLongestRunOfZeroes(int[] hextets) + { + int bestRunStart = -1; + int bestRunLength = -1; + int runStart = -1; + for (int i = 0; i < hextets.length + 1; i++) { + if (i < hextets.length && hextets[i] == 0) { + if (runStart < 0) { + runStart = i; + } + } + else if (runStart >= 0) { + int runLength = i - runStart; + if (runLength > bestRunLength) { + bestRunStart = runStart; + bestRunLength = runLength; + } + runStart = -1; + } + } + if (bestRunLength >= 2) { + Arrays.fill(hextets, bestRunStart, bestRunStart + bestRunLength, -1); + } + } + + private static String hextetsToIPv6String(int[] hextets) + { + // While scanning the array, handle these state transitions: + // start->num => "num" start->gap => "::" + // num->num => ":num" num->gap => "::" + // gap->num => "num" gap->gap => "" + StringBuilder buf = new StringBuilder(39); + boolean lastWasNumber = false; + for (int i = 0; i < hextets.length; i++) { + boolean thisIsNumber = hextets[i] >= 0; + if (thisIsNumber) { + if (lastWasNumber) { + buf.append(':'); + } + buf.append(Integer.toHexString(hextets[i])); + } + else { + if (i == 0 || lastWasNumber) { + buf.append("::"); + } + } + lastWasNumber = thisIsNumber; + } + return buf.toString(); + } + + private static int fromBytes(byte[] bytes, boolean bigEndian) + { + ByteBuffer buffer = ByteBuffer.wrap(bytes); + buffer.order(bigEndian ? BIG_ENDIAN : LITTLE_ENDIAN); + return buffer.getInt(); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/type/IpPrefixType.java b/presto-common/src/main/java/com/facebook/presto/common/type/IpPrefixType.java similarity index 92% rename from presto-main/src/main/java/com/facebook/presto/type/IpPrefixType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/IpPrefixType.java index 9381ff5c0ea34..e96a249145200 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IpPrefixType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/IpPrefixType.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.common.type; import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; @@ -19,16 +19,13 @@ import com.facebook.presto.common.block.PageBuilderStatus; import com.facebook.presto.common.block.VariableWidthBlockBuilder; import com.facebook.presto.common.function.SqlFunctionProperties; -import com.facebook.presto.common.type.AbstractPrimitiveType; -import com.facebook.presto.common.type.FixedWidthType; -import com.facebook.presto.common.type.StandardTypes; -import com.google.common.net.InetAddresses; import io.airlift.slice.Slice; import io.airlift.slice.XxHash64; import java.net.InetAddress; import java.net.UnknownHostException; +import static com.facebook.presto.common.type.IpAddressUtils.toAddrString; import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature; public class IpPrefixType @@ -36,7 +33,6 @@ public class IpPrefixType implements FixedWidthType { public static final IpPrefixType IPPREFIX = new IpPrefixType(); - private IpPrefixType() { super(parseTypeSignature(StandardTypes.IPPREFIX), Slice.class); @@ -113,7 +109,7 @@ public Object getObjectValue(SqlFunctionProperties properties, Block block, int return null; } try { - String addrString = InetAddresses.toAddrString(InetAddress.getByAddress(getSlice(block, position).getBytes(0, 2 * Long.BYTES))); + String addrString = toAddrString(InetAddress.getByAddress(getSlice(block, position).getBytes(0, 2 * Long.BYTES))); String prefixString = Integer.toString(getSlice(block, position).getByte(2 * Long.BYTES) & 0xff); return addrString + "/" + prefixString; } diff --git a/presto-common/src/main/java/com/facebook/presto/common/type/NoOpMapType.java b/presto-common/src/main/java/com/facebook/presto/common/type/NoOpMapType.java new file mode 100644 index 0000000000000..4d2abc4aa9fa9 --- /dev/null +++ b/presto-common/src/main/java/com/facebook/presto/common/type/NoOpMapType.java @@ -0,0 +1,53 @@ +/* + * 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 com.facebook.presto.common.type; + +import com.facebook.presto.common.block.MethodHandleUtil; + +import java.util.List; + +import static com.facebook.presto.common.Utils.checkArgument; +import static java.lang.String.format; + +public final class NoOpMapType + implements ParametricType +{ + public static final NoOpMapType NO_OP_MAP = new NoOpMapType(); + + @Override + public String getName() + { + return StandardTypes.MAP; + } + + @Override + public Type createType(List parameters) + { + checkArgument(parameters.size() == 2, format("Expected two parameters, got %s", parameters)); + TypeParameter firstParameter = parameters.get(0); + TypeParameter secondParameter = parameters.get(1); + checkArgument( + firstParameter.getKind() == ParameterKind.TYPE && secondParameter.getKind() == ParameterKind.TYPE, + format("Expected key and type to be types, got %s", + parameters)); + + Type keyType = firstParameter.getType(); + Type valueType = secondParameter.getType(); + return new MapType( + keyType, + valueType, + MethodHandleUtil.methodHandle(NoOpMapType.class, "throwUnsupportedOperation"), + MethodHandleUtil.methodHandle(NoOpMapType.class, "throwUnsupportedOperation")); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/type/RowParametricType.java b/presto-common/src/main/java/com/facebook/presto/common/type/RowParametricType.java similarity index 73% rename from presto-main/src/main/java/com/facebook/presto/type/RowParametricType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/RowParametricType.java index e96d9843b2c3d..9c57e86460c2f 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/RowParametricType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/RowParametricType.java @@ -11,19 +11,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; - -import com.facebook.presto.common.type.ParameterKind; -import com.facebook.presto.common.type.ParametricType; -import com.facebook.presto.common.type.RowFieldName; -import com.facebook.presto.common.type.RowType; -import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.common.type.Type; -import com.facebook.presto.common.type.TypeParameter; +package com.facebook.presto.common.type; import java.util.List; -import static com.google.common.base.Preconditions.checkArgument; +import static com.facebook.presto.common.Utils.checkArgument; +import static java.lang.String.format; import static java.util.stream.Collectors.toList; public final class RowParametricType @@ -47,8 +40,7 @@ public Type createType(List parameters) checkArgument(!parameters.isEmpty(), "Row type must have at least one parameter"); checkArgument( parameters.stream().allMatch(parameter -> parameter.getKind() == ParameterKind.NAMED_TYPE), - "Expected only named types as a parameters, got %s", - parameters); + format("Expected only named types as a parameters, got %s", parameters)); List fields = parameters.stream() .map(TypeParameter::getNamedType) diff --git a/presto-main/src/main/java/com/facebook/presto/type/SqlIntervalDayTime.java b/presto-common/src/main/java/com/facebook/presto/common/type/SqlIntervalDayTime.java similarity index 89% rename from presto-main/src/main/java/com/facebook/presto/type/SqlIntervalDayTime.java rename to presto-common/src/main/java/com/facebook/presto/common/type/SqlIntervalDayTime.java index 1828c281885f4..5c80284d7fd5e 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/SqlIntervalDayTime.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/SqlIntervalDayTime.java @@ -11,14 +11,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.common.type; import com.fasterxml.jackson.annotation.JsonValue; import java.util.Objects; -import static com.facebook.presto.client.IntervalDayTime.formatMillis; -import static com.facebook.presto.client.IntervalDayTime.toMillis; +import static com.facebook.presto.common.type.IntervalDayTime.formatMillis; +import static com.facebook.presto.common.type.IntervalDayTime.toMillis; public class SqlIntervalDayTime { diff --git a/presto-main/src/main/java/com/facebook/presto/type/SqlIntervalYearMonth.java b/presto-common/src/main/java/com/facebook/presto/common/type/SqlIntervalYearMonth.java similarity index 88% rename from presto-main/src/main/java/com/facebook/presto/type/SqlIntervalYearMonth.java rename to presto-common/src/main/java/com/facebook/presto/common/type/SqlIntervalYearMonth.java index 3010917b57eb7..931bccb26f2c0 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/SqlIntervalYearMonth.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/SqlIntervalYearMonth.java @@ -11,14 +11,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.common.type; import com.fasterxml.jackson.annotation.JsonValue; import java.util.Objects; -import static com.facebook.presto.client.IntervalYearMonth.formatMonths; -import static com.facebook.presto.client.IntervalYearMonth.toMonths; +import static com.facebook.presto.common.type.IntervalYearMonth.formatMonths; +import static com.facebook.presto.common.type.IntervalYearMonth.toMonths; public class SqlIntervalYearMonth { diff --git a/presto-main/src/main/java/com/facebook/presto/type/VarcharParametricType.java b/presto-common/src/main/java/com/facebook/presto/common/type/VarcharParametricType.java similarity index 86% rename from presto-main/src/main/java/com/facebook/presto/type/VarcharParametricType.java rename to presto-common/src/main/java/com/facebook/presto/common/type/VarcharParametricType.java index 8edfa2fe1ff95..191e8222ba43b 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/VarcharParametricType.java +++ b/presto-common/src/main/java/com/facebook/presto/common/type/VarcharParametricType.java @@ -11,13 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; - -import com.facebook.presto.common.type.ParametricType; -import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.common.type.Type; -import com.facebook.presto.common.type.TypeParameter; -import com.facebook.presto.common.type.VarcharType; +package com.facebook.presto.common.type; import java.util.List; diff --git a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalDayTime.java b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalDayTime.java index afaaa93d25860..f1d2880e9d762 100644 --- a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalDayTime.java +++ b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalDayTime.java @@ -15,8 +15,8 @@ import java.util.Objects; -import static com.facebook.presto.client.IntervalDayTime.formatMillis; -import static com.facebook.presto.client.IntervalDayTime.toMillis; +import static com.facebook.presto.common.type.IntervalDayTime.formatMillis; +import static com.facebook.presto.common.type.IntervalDayTime.toMillis; public class PrestoIntervalDayTime implements Comparable diff --git a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalYearMonth.java b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalYearMonth.java index d90f35e499f4a..5a16ce316661a 100644 --- a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalYearMonth.java +++ b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoIntervalYearMonth.java @@ -15,8 +15,8 @@ import java.util.Objects; -import static com.facebook.presto.client.IntervalYearMonth.formatMonths; -import static com.facebook.presto.client.IntervalYearMonth.toMonths; +import static com.facebook.presto.common.type.IntervalYearMonth.formatMonths; +import static com.facebook.presto.common.type.IntervalYearMonth.toMonths; public class PrestoIntervalYearMonth implements Comparable diff --git a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoResultSet.java b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoResultSet.java index b0763caadcfe8..2d1a2a328aae7 100644 --- a/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoResultSet.java +++ b/presto-jdbc/src/main/java/com/facebook/presto/jdbc/PrestoResultSet.java @@ -14,11 +14,11 @@ package com.facebook.presto.jdbc; import com.facebook.presto.client.Column; -import com.facebook.presto.client.IntervalDayTime; -import com.facebook.presto.client.IntervalYearMonth; import com.facebook.presto.client.QueryError; import com.facebook.presto.client.QueryStatusInfo; import com.facebook.presto.client.StatementClient; +import com.facebook.presto.common.type.IntervalDayTime; +import com.facebook.presto.common.type.IntervalYearMonth; import com.facebook.presto.jdbc.ColumnInfo.Nullable; import com.google.common.collect.AbstractIterator; import com.google.common.collect.ImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java index ae76fd532db64..025ab1f80f002 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java @@ -21,7 +21,7 @@ import com.facebook.presto.common.block.BlockSerdeUtil; import com.facebook.presto.common.function.OperatorType; import com.facebook.presto.common.function.SqlFunctionResult; -import com.facebook.presto.common.type.DistinctTypeInfo; +import com.facebook.presto.common.type.DecimalParametricType; import com.facebook.presto.common.type.ParametricType; import com.facebook.presto.common.type.Type; import com.facebook.presto.common.type.TypeManager; @@ -29,6 +29,7 @@ import com.facebook.presto.common.type.TypeSignature; import com.facebook.presto.common.type.TypeSignatureParameter; import com.facebook.presto.common.type.UserDefinedType; +import com.facebook.presto.common.type.VarcharParametricType; import com.facebook.presto.expressions.DynamicFilters.DynamicFilterPlaceholderFunction; import com.facebook.presto.geospatial.BingTileFunctions; import com.facebook.presto.geospatial.BingTileOperators; @@ -221,6 +222,7 @@ import com.facebook.presto.operator.window.RowNumberFunction; import com.facebook.presto.operator.window.SqlWindowFunction; import com.facebook.presto.operator.window.WindowFunctionSupplier; +import com.facebook.presto.spi.ExactTypeSignature; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.AggregationFunctionImplementation; import com.facebook.presto.spi.function.AlterRoutineCharacteristics; @@ -235,6 +237,7 @@ import com.facebook.presto.spi.function.SqlFunctionVisibility; import com.facebook.presto.spi.function.SqlInvokedFunction; import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; +import com.facebook.presto.spi.type.TypeManagerProvider; import com.facebook.presto.sql.analyzer.FunctionsConfig; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; import com.facebook.presto.type.BigintOperators; @@ -245,7 +248,6 @@ import com.facebook.presto.type.DateOperators; import com.facebook.presto.type.DateTimeOperators; import com.facebook.presto.type.DecimalOperators; -import com.facebook.presto.type.DecimalParametricType; import com.facebook.presto.type.DoubleComparisonOperators; import com.facebook.presto.type.DoubleOperators; import com.facebook.presto.type.EnumCasts; @@ -277,7 +279,6 @@ import com.facebook.presto.type.VarbinaryOperators; import com.facebook.presto.type.VarcharEnumOperators; import com.facebook.presto.type.VarcharOperators; -import com.facebook.presto.type.VarcharParametricType; import com.facebook.presto.type.khyperloglog.KHyperLogLogAggregationFunction; import com.facebook.presto.type.khyperloglog.KHyperLogLogFunctions; import com.facebook.presto.type.khyperloglog.KHyperLogLogOperators; @@ -307,7 +308,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -315,14 +315,20 @@ import java.util.concurrent.ConcurrentMap; import static com.facebook.presto.common.function.OperatorType.tryGetOperatorType; +import static com.facebook.presto.common.type.ArrayParametricType.ARRAY; import static com.facebook.presto.common.type.BigintEnumParametricType.BIGINT_ENUM; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; import static com.facebook.presto.common.type.DateType.DATE; import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.DoubleType.OLD_NAN_DOUBLE; +import static com.facebook.presto.common.type.FunctionParametricType.FUNCTION; import static com.facebook.presto.common.type.HyperLogLogType.HYPER_LOG_LOG; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.common.type.JsonType.JSON; import static com.facebook.presto.common.type.KdbTreeType.KDB_TREE; import static com.facebook.presto.common.type.KllSketchParametricType.KLL_SKETCH; @@ -330,6 +336,7 @@ import static com.facebook.presto.common.type.QuantileDigestParametricType.QDIGEST; import static com.facebook.presto.common.type.RealType.OLD_NAN_REAL; import static com.facebook.presto.common.type.RealType.REAL; +import static com.facebook.presto.common.type.RowParametricType.ROW; import static com.facebook.presto.common.type.SmallintType.SMALLINT; import static com.facebook.presto.common.type.TDigestParametricType.TDIGEST; import static com.facebook.presto.common.type.TimeType.TIME; @@ -463,7 +470,6 @@ import static com.facebook.presto.spi.function.SqlFunctionVisibility.HIDDEN; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypeSignatures; import static com.facebook.presto.sql.planner.LiteralEncoder.MAGIC_LITERAL_FUNCTION_PREFIX; -import static com.facebook.presto.type.ArrayParametricType.ARRAY; import static com.facebook.presto.type.CodePointsType.CODE_POINTS; import static com.facebook.presto.type.ColorType.COLOR; import static com.facebook.presto.type.DecimalCasts.BIGINT_TO_DECIMAL_CAST; @@ -509,17 +515,11 @@ import static com.facebook.presto.type.DecimalToDecimalCasts.DECIMAL_TO_DECIMAL_CAST; import static com.facebook.presto.type.DistinctTypeCasts.DISTINCT_TYPE_FROM_CAST; import static com.facebook.presto.type.DistinctTypeCasts.DISTINCT_TYPE_TO_CAST; -import static com.facebook.presto.type.FunctionParametricType.FUNCTION; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.type.JoniRegexpType.JONI_REGEXP; import static com.facebook.presto.type.JsonPathType.JSON_PATH; import static com.facebook.presto.type.LikePatternType.LIKE_PATTERN; import static com.facebook.presto.type.MapParametricType.MAP; import static com.facebook.presto.type.Re2JRegexpType.RE2J_REGEXP; -import static com.facebook.presto.type.RowParametricType.ROW; import static com.facebook.presto.type.SfmSketchType.SFM_SKETCH; import static com.facebook.presto.type.TypeUtils.resolveTypes; import static com.facebook.presto.type.khyperloglog.KHyperLogLogType.K_HYPER_LOG_LOG; @@ -535,7 +535,7 @@ @ThreadSafe public class BuiltInTypeAndFunctionNamespaceManager - implements FunctionNamespaceManager + implements FunctionNamespaceManager, TypeManagerProvider { public static final CatalogSchemaName DEFAULT_NAMESPACE = new CatalogSchemaName("presto", "default"); public static final String ID = "builtin"; @@ -1265,6 +1265,7 @@ public ScalarFunctionImplementation getScalarFunctionImplementation(Signature si } } + @Override public Optional getType(TypeSignature typeSignature) { Type type = types.get(typeSignature); @@ -1299,12 +1300,19 @@ public void addParametricType(ParametricType parametricType) parametricTypes.putIfAbsent(name, parametricType); } - public Collection getParametricTypes() + @Override + public Map getParametricTypes() { - return parametricTypes.values(); + return parametricTypes; } private Type instantiateParametricType(ExactTypeSignature exactSignature) + { + return instantiateParametricType(exactSignature, functionAndTypeManager, parametricTypes); + } + + public Type instantiateParametricType(ExactTypeSignature exactSignature, + FunctionAndTypeManager functionAndTypeManager, Map parametricTypes) { TypeSignature signature = exactSignature.getTypeSignature(); List parameters = new ArrayList<>(); @@ -1453,92 +1461,6 @@ public Collection get(QualifiedObjectName name) } } - /** - * TypeSignature but has overridden equals(). Here, we compare exact signature of any underlying distinct - * types. Some distinct types may have extra information on their lazily loaded parents, and same parent - * information is compared in equals(). This is needed to cache types in parametricTypesCache. - */ - private static class ExactTypeSignature - { - private final TypeSignature typeSignature; - - public ExactTypeSignature(TypeSignature typeSignature) - { - this.typeSignature = typeSignature; - } - - public TypeSignature getTypeSignature() - { - return typeSignature; - } - - @Override - public int hashCode() - { - return Objects.hash(typeSignature); - } - - @Override - public boolean equals(Object o) - { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - ExactTypeSignature other = (ExactTypeSignature) o; - return equals(typeSignature, other.typeSignature); - } - - private static boolean equals(TypeSignature left, TypeSignature right) - { - if (!left.equals(right)) { - return false; - } - - if (left.isDistinctType() && right.isDistinctType()) { - return equals(left.getDistinctTypeInfo(), right.getDistinctTypeInfo()); - } - int index = 0; - for (TypeSignatureParameter leftParameter : left.getParameters()) { - TypeSignatureParameter rightParameter = right.getParameters().get(index++); - if (!leftParameter.getKind().equals(rightParameter.getKind())) { - return false; - } - - switch (leftParameter.getKind()) { - case TYPE: - if (!equals(leftParameter.getTypeSignature(), rightParameter.getTypeSignature())) { - return false; - } - break; - case NAMED_TYPE: - if (!equals(leftParameter.getNamedTypeSignature().getTypeSignature(), rightParameter.getNamedTypeSignature().getTypeSignature())) { - return false; - } - break; - case DISTINCT_TYPE: - if (!equals(leftParameter.getDistinctTypeInfo(), rightParameter.getDistinctTypeInfo())) { - return false; - } - break; - } - } - return true; - } - - private static boolean equals(DistinctTypeInfo left, DistinctTypeInfo right) - { - return Objects.equals(left.getName(), right.getName()) && - Objects.equals(left.getBaseType(), right.getBaseType()) && - Objects.equals(left.isOrderable(), right.isOrderable()) && - Objects.equals(left.getTopMostAncestor(), right.getTopMostAncestor()) && - Objects.equals(left.getOtherAncestors(), right.getOtherAncestors()); - } - } - private static class MagicLiteralFunction extends SqlScalarFunction { diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java index 55dcbdd2a619a..06723850560aa 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java @@ -33,6 +33,7 @@ import com.facebook.presto.common.type.TypeWithName; import com.facebook.presto.common.type.UserDefinedType; import com.facebook.presto.operator.window.WindowFunctionSupplier; +import com.facebook.presto.spi.ExactTypeSignature; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.AggregationFunctionImplementation; import com.facebook.presto.spi.function.AlterRoutineCharacteristics; @@ -50,6 +51,9 @@ import com.facebook.presto.spi.function.SqlFunction; import com.facebook.presto.spi.function.SqlFunctionId; import com.facebook.presto.spi.function.SqlInvokedFunction; +import com.facebook.presto.spi.type.TypeManagerContext; +import com.facebook.presto.spi.type.TypeManagerFactory; +import com.facebook.presto.spi.type.TypeManagerProvider; import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.analyzer.FunctionAndTypeResolver; import com.facebook.presto.sql.analyzer.FunctionsConfig; @@ -122,8 +126,10 @@ public class FunctionAndTypeManager private final BuiltInTypeAndFunctionNamespaceManager builtInTypeAndFunctionNamespaceManager; private final FunctionInvokerProvider functionInvokerProvider; private final Map functionNamespaceManagerFactories = new ConcurrentHashMap<>(); + private final Map typeManagerFactories = new ConcurrentHashMap<>(); private final HandleResolver handleResolver; private final Map> functionNamespaceManagers = new ConcurrentHashMap<>(); + private final Map typeManagers = new ConcurrentHashMap<>(); private final FunctionSignatureMatcher functionSignatureMatcher; private final TypeCoercer typeCoercer; private final LoadingCache functionCache; @@ -220,6 +226,12 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) return FunctionAndTypeManager.this.getFunctionMetadata(functionHandle); } + @Override + public Type instantiateParametricType(ExactTypeSignature exactSignature) + { + return FunctionAndTypeManager.this.instantiateParametricType(exactSignature); + } + @Override public Collection listBuiltInFunctions() { @@ -290,6 +302,17 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) return functionNamespaceManager.get().getFunctionMetadata(functionHandle); } + @Override + public Type instantiateParametricType(ExactTypeSignature exactSignature) + { + // This method is only used by nativeTypeManager, so check if typeManagers is empty first + checkState(!typeManagers.isEmpty()); + return builtInTypeAndFunctionNamespaceManager.instantiateParametricType( + exactSignature, + this, + getServingTypeManagerProvider().getParametricTypes()); + } + @Override public Type getType(TypeSignature signature) { @@ -298,7 +321,7 @@ public Type getType(TypeSignature signature) if (signature.isDistinctType()) { return getDistinctType(signature.getParameters().get(0).getDistinctTypeInfo()); } - Optional type = builtInTypeAndFunctionNamespaceManager.getType(signature.getStandardTypeSignature()); + Optional type = getServingTypeManagerProvider().getType(signature.getStandardTypeSignature()); if (type.isPresent()) { if (signature.getTypeSignatureBase().hasTypeName()) { return new TypeWithName(signature.getTypeSignatureBase().getTypeName(), type.get()); @@ -335,6 +358,32 @@ public void addFunctionNamespaceFactory(FunctionNamespaceManagerFactory factory) handleResolver.addFunctionNamespace(factory.getName(), factory.getHandleResolver()); } + public void loadTypeManager(String typeManagerName) + { + requireNonNull(typeManagerName, "typeManagerName is null"); + TypeManagerFactory factory = typeManagerFactories.get(typeManagerName); + checkState(factory != null, "No factory for type manager %s", typeManagerName); + TypeManagerProvider typeManager = factory.create(new TypeManagerContext(Optional.of(this))); + + if (typeManagers.putIfAbsent(typeManagerName, typeManager) != null) { + throw new IllegalArgumentException(format("Type manager [%s] is already registered", typeManager)); + } + } + + public void loadTypeManagers() + { + for (String typeManagerName : typeManagerFactories.keySet()) { + loadTypeManager(typeManagerName); + } + } + + public void addTypeManagerFactory(TypeManagerFactory factory) + { + if (typeManagerFactories.putIfAbsent(factory.getName(), factory) != null) { + throw new IllegalArgumentException(format("Type manager '%s' is already registered", factory.getName())); + } + } + public void registerBuiltInFunctions(List functions) { builtInTypeAndFunctionNamespaceManager.registerBuiltInFunctions(functions); @@ -488,7 +537,7 @@ public List getTypes() public Collection getParametricTypes() { - return ImmutableList.copyOf(builtInTypeAndFunctionNamespaceManager.getParametricTypes()); + return ImmutableList.copyOf(builtInTypeAndFunctionNamespaceManager.getParametricTypes().values()); } public Optional getCommonSuperType(Type firstType, Type secondType) @@ -726,6 +775,20 @@ private Optional> getServingFunc return Optional.ofNullable(functionNamespaceManagers.get(typeSignatureBase.getTypeName().getCatalogName())); } + private TypeManagerProvider getServingTypeManagerProvider() + { + TypeManagerProvider typeManagerProvider = builtInTypeAndFunctionNamespaceManager; + for (Map.Entry entry : typeManagerFactories.entrySet()) { + TypeManagerFactory typeManagerFactory = entry.getValue(); + // Get the type manager name from the factory + String name = typeManagerFactory.getName(); + + // Check if the type manager exists in typeManagers else use builtInTypeAndFunctionNamespaceManager + typeManagerProvider = typeManagers.getOrDefault(name, typeManagerProvider); + } + return typeManagerProvider; + } + private static class FunctionResolutionCacheKey { private final QualifiedObjectName functionName; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondAverageAggregation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondAverageAggregation.java index 059e285966901..26f4759110b8a 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondAverageAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondAverageAggregation.java @@ -22,7 +22,7 @@ import com.facebook.presto.spi.function.OutputFunction; import com.facebook.presto.spi.function.SqlType; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static java.lang.Math.round; @AggregationFunction("avg") diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondSumAggregation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondSumAggregation.java index 44256914c3172..8116be1859ee0 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondSumAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalDayToSecondSumAggregation.java @@ -22,8 +22,8 @@ import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.type.BigintOperators; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.StandardTypes.INTERVAL_DAY_TO_SECOND; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; @AggregationFunction("sum") public final class IntervalDayToSecondSumAggregation diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthAverageAggregation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthAverageAggregation.java index 49fefbe63a9a7..16f254e95c6f1 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthAverageAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthAverageAggregation.java @@ -22,7 +22,7 @@ import com.facebook.presto.spi.function.OutputFunction; import com.facebook.presto.spi.function.SqlType; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static java.lang.Math.round; @AggregationFunction("avg") diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthSumAggregation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthSumAggregation.java index 8b9633b67ef2d..4bb28a227fe7f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthSumAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/IntervalYearToMonthSumAggregation.java @@ -22,8 +22,8 @@ import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.type.BigintOperators; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.common.type.StandardTypes.INTERVAL_YEAR_TO_MONTH; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; @AggregationFunction("sum") public final class IntervalYearToMonthSumAggregation diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/sketch/kll/KllSketchAggregationState.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/sketch/kll/KllSketchAggregationState.java index 0aa8c20c7780e..59972f2e77870 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/sketch/kll/KllSketchAggregationState.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/sketch/kll/KllSketchAggregationState.java @@ -45,6 +45,7 @@ import static com.facebook.presto.common.type.DateType.DATE; import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.common.type.RealType.REAL; import static com.facebook.presto.common.type.SmallintType.SMALLINT; import static com.facebook.presto.common.type.TimeType.TIME; @@ -54,7 +55,6 @@ import static com.facebook.presto.common.type.TinyintType.TINYINT; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_ARGUMENTS; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static java.util.Objects.requireNonNull; @AccumulatorStateMetadata(stateFactoryClass = KllSketchStateFactory.class, stateSerializerClass = KllSketchStateSerializer.class) diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/IpPrefixFunctions.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/IpPrefixFunctions.java index 5f7f9a27d19f7..ace3200d78e8f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/IpPrefixFunctions.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/IpPrefixFunctions.java @@ -32,15 +32,15 @@ import java.util.Comparator; import java.util.List; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.operator.scalar.ArraySortFunction.sort; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.type.IpAddressOperators.between; import static com.facebook.presto.type.IpAddressOperators.castFromVarcharToIpAddress; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; import static com.facebook.presto.type.IpPrefixOperators.castFromIpPrefixToIpAddress; import static com.facebook.presto.type.IpPrefixOperators.castFromVarcharToIpPrefix; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.util.Failures.checkCondition; import static io.airlift.slice.Slices.utf8Slice; import static io.airlift.slice.Slices.wrappedBuffer; diff --git a/presto-main/src/main/java/com/facebook/presto/server/PluginManager.java b/presto-main/src/main/java/com/facebook/presto/server/PluginManager.java index e71d1ee561994..6e1322245d8bb 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/PluginManager.java +++ b/presto-main/src/main/java/com/facebook/presto/server/PluginManager.java @@ -48,6 +48,7 @@ import com.facebook.presto.spi.tracing.TracerProvider; import com.facebook.presto.spi.ttl.ClusterTtlProviderFactory; import com.facebook.presto.spi.ttl.NodeTtlFetcherFactory; +import com.facebook.presto.spi.type.TypeManagerFactory; import com.facebook.presto.sql.analyzer.AnalyzerProviderManager; import com.facebook.presto.sql.analyzer.QueryPreparerProviderManager; import com.facebook.presto.sql.planner.sanity.PlanCheckerProviderManager; @@ -372,6 +373,11 @@ public void installCoordinatorPlugin(CoordinatorPlugin plugin) log.info("Registering system session property provider factory %s", providerFactory.getName()); metadata.getSessionPropertyManager().addSessionPropertyProviderFactory(providerFactory); } + + for (TypeManagerFactory typeManagerFactory : plugin.getTypeManagerFactories()) { + log.info("Registering type manager factory %s", typeManagerFactory.getName()); + metadata.getFunctionAndTypeManager().addTypeManagerFactory(typeManagerFactory); + } } private URLClassLoader buildClassLoader(String plugin) diff --git a/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java b/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java index 5d681d829ffa4..955c24452567c 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java +++ b/presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java @@ -39,6 +39,7 @@ import com.facebook.presto.execution.warnings.WarningCollectorModule; import com.facebook.presto.metadata.Catalog; import com.facebook.presto.metadata.CatalogManager; +import com.facebook.presto.metadata.FunctionAndTypeManager; import com.facebook.presto.metadata.SessionPropertyManager; import com.facebook.presto.metadata.StaticCatalogStore; import com.facebook.presto.metadata.StaticFunctionNamespaceStore; @@ -181,6 +182,7 @@ public void run() injector.getInstance(GracefulShutdownHandler.class).loadNodeStatusNotification(); injector.getInstance(PlanCheckerProviderManager.class).loadPlanCheckerProviders(); injector.getInstance(SessionPropertyManager.class).loadSessionPropertyProviders(); + injector.getInstance(FunctionAndTypeManager.class).loadTypeManagers(); startAssociatedProcesses(injector); injector.getInstance(Announcer.class).start(); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java index 02961c0f7e765..e1e2f9f396378 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java @@ -134,11 +134,14 @@ import static com.facebook.presto.common.function.OperatorType.ADD; import static com.facebook.presto.common.function.OperatorType.SUBSCRIPT; import static com.facebook.presto.common.function.OperatorType.SUBTRACT; +import static com.facebook.presto.common.type.ArrayParametricType.ARRAY; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; import static com.facebook.presto.common.type.DateType.DATE; import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.common.type.JsonType.JSON; import static com.facebook.presto.common.type.RealType.REAL; import static com.facebook.presto.common.type.SmallintType.SMALLINT; @@ -186,9 +189,6 @@ import static com.facebook.presto.sql.tree.WindowFrame.Type.GROUPS; import static com.facebook.presto.sql.tree.WindowFrame.Type.RANGE; import static com.facebook.presto.sql.tree.WindowFrame.Type.ROWS; -import static com.facebook.presto.type.ArrayParametricType.ARRAY; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.util.DateTimeUtils.parseTimestampLiteral; import static com.facebook.presto.util.DateTimeUtils.timeHasTimeZone; import static com.facebook.presto.util.DateTimeUtils.timestampHasTimeZone; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java index 8325eae2892af..19ecbfc5d7363 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java @@ -22,9 +22,13 @@ import com.facebook.presto.common.type.Decimals; import com.facebook.presto.common.type.DoubleType; import com.facebook.presto.common.type.IntegerType; +import com.facebook.presto.common.type.IntervalDayTimeType; +import com.facebook.presto.common.type.IntervalYearMonthType; import com.facebook.presto.common.type.RealType; import com.facebook.presto.common.type.SmallintType; import com.facebook.presto.common.type.SqlDate; +import com.facebook.presto.common.type.SqlIntervalDayTime; +import com.facebook.presto.common.type.SqlIntervalYearMonth; import com.facebook.presto.common.type.SqlTime; import com.facebook.presto.common.type.SqlTimestamp; import com.facebook.presto.common.type.SqlVarbinary; @@ -58,10 +62,6 @@ import com.facebook.presto.sql.tree.StringLiteral; import com.facebook.presto.sql.tree.TimeLiteral; import com.facebook.presto.sql.tree.TimestampLiteral; -import com.facebook.presto.type.IntervalDayTimeType; -import com.facebook.presto.type.IntervalYearMonthType; -import com.facebook.presto.type.SqlIntervalDayTime; -import com.facebook.presto.type.SqlIntervalYearMonth; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/QueryPlanner.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/QueryPlanner.java index bf257e0f7a59f..422a25ac7c2ba 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/QueryPlanner.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/QueryPlanner.java @@ -103,6 +103,8 @@ import static com.facebook.presto.SystemSessionProperties.isSkipRedundantSort; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.common.type.VarbinaryType.VARBINARY; import static com.facebook.presto.common.type.VarcharType.VARCHAR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_LIMIT_CLAUSE; @@ -131,8 +133,6 @@ import static com.facebook.presto.sql.tree.WindowFrame.Type.GROUPS; import static com.facebook.presto.sql.tree.WindowFrame.Type.RANGE; import static com.facebook.presto.sql.tree.WindowFrame.Type.ROWS; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.google.common.base.MoreObjects.firstNonNull; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/CheckUnsupportedPrestissimoTypes.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/CheckUnsupportedPrestissimoTypes.java index 29217e5451577..a7755d49e6148 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/CheckUnsupportedPrestissimoTypes.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/CheckUnsupportedPrestissimoTypes.java @@ -41,8 +41,8 @@ import java.util.Objects; import java.util.Optional; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; import static com.facebook.presto.common.type.TimestampWithTimeZoneType.TIMESTAMP_WITH_TIME_ZONE; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; diff --git a/presto-main/src/main/java/com/facebook/presto/testing/QueryRunner.java b/presto-main/src/main/java/com/facebook/presto/testing/QueryRunner.java index d2121ce335f86..841ea0c9fa779 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/QueryRunner.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/QueryRunner.java @@ -102,6 +102,11 @@ default void loadSessionPropertyProvider(String sessionPropertyProviderName) throw new UnsupportedOperationException(); } + default void loadTypeManager(String typeManagerName) + { + throw new UnsupportedOperationException(); + } + Lock getExclusiveLock(); class MaterializedResultWithPlan diff --git a/presto-main/src/main/java/com/facebook/presto/type/IntervalDayTimeOperators.java b/presto-main/src/main/java/com/facebook/presto/type/IntervalDayTimeOperators.java index 15c92d2be7867..208297b46f29d 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IntervalDayTimeOperators.java +++ b/presto-main/src/main/java/com/facebook/presto/type/IntervalDayTimeOperators.java @@ -25,7 +25,6 @@ import com.facebook.presto.spi.function.SqlType; import io.airlift.slice.Slice; -import static com.facebook.presto.client.IntervalDayTime.formatMillis; import static com.facebook.presto.common.function.OperatorType.ADD; import static com.facebook.presto.common.function.OperatorType.BETWEEN; import static com.facebook.presto.common.function.OperatorType.CAST; @@ -42,7 +41,8 @@ import static com.facebook.presto.common.function.OperatorType.NEGATION; import static com.facebook.presto.common.function.OperatorType.NOT_EQUAL; import static com.facebook.presto.common.function.OperatorType.SUBTRACT; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalDayTime.formatMillis; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static io.airlift.slice.Slices.utf8Slice; public final class IntervalDayTimeOperators diff --git a/presto-main/src/main/java/com/facebook/presto/type/IntervalYearMonthOperators.java b/presto-main/src/main/java/com/facebook/presto/type/IntervalYearMonthOperators.java index 7dbd1b197a6ff..e575b50511052 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IntervalYearMonthOperators.java +++ b/presto-main/src/main/java/com/facebook/presto/type/IntervalYearMonthOperators.java @@ -13,7 +13,6 @@ */ package com.facebook.presto.type; -import com.facebook.presto.client.IntervalYearMonth; import com.facebook.presto.common.block.Block; import com.facebook.presto.common.type.AbstractIntType; import com.facebook.presto.common.type.StandardTypes; @@ -42,7 +41,8 @@ import static com.facebook.presto.common.function.OperatorType.NEGATION; import static com.facebook.presto.common.function.OperatorType.NOT_EQUAL; import static com.facebook.presto.common.function.OperatorType.SUBTRACT; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IntervalYearMonth.formatMonths; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static io.airlift.slice.Slices.utf8Slice; import static java.lang.Math.toIntExact; @@ -167,7 +167,7 @@ public static boolean between( @SqlType("varchar(x)") public static Slice castToSlice(@SqlType(StandardTypes.INTERVAL_YEAR_TO_MONTH) long value) { - return utf8Slice(IntervalYearMonth.formatMonths(toIntExact(value))); + return utf8Slice(formatMonths(toIntExact(value))); } @ScalarOperator(HASH_CODE) diff --git a/presto-main/src/main/java/com/facebook/presto/type/IpAddressOperators.java b/presto-main/src/main/java/com/facebook/presto/type/IpAddressOperators.java index 5d68bb96e5195..108f27b820140 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IpAddressOperators.java +++ b/presto-main/src/main/java/com/facebook/presto/type/IpAddressOperators.java @@ -42,9 +42,9 @@ import static com.facebook.presto.common.function.OperatorType.LESS_THAN_OR_EQUAL; import static com.facebook.presto.common.function.OperatorType.NOT_EQUAL; import static com.facebook.presto.common.function.OperatorType.XX_HASH_64; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; import static io.airlift.slice.Slices.utf8Slice; import static io.airlift.slice.Slices.wrappedBuffer; import static java.lang.System.arraycopy; diff --git a/presto-main/src/main/java/com/facebook/presto/type/IpPrefixOperators.java b/presto-main/src/main/java/com/facebook/presto/type/IpPrefixOperators.java index 44f23753ea08e..029e5b27a892b 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/IpPrefixOperators.java +++ b/presto-main/src/main/java/com/facebook/presto/type/IpPrefixOperators.java @@ -42,10 +42,10 @@ import static com.facebook.presto.common.function.OperatorType.LESS_THAN_OR_EQUAL; import static com.facebook.presto.common.function.OperatorType.NOT_EQUAL; import static com.facebook.presto.common.function.OperatorType.XX_HASH_64; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; import static io.airlift.slice.Slices.utf8Slice; import static io.airlift.slice.Slices.wrappedBuffer; import static java.lang.Math.max; diff --git a/presto-main/src/main/java/com/facebook/presto/util/DateTimeUtils.java b/presto-main/src/main/java/com/facebook/presto/util/DateTimeUtils.java index f33cf36076f94..a319d36829117 100644 --- a/presto-main/src/main/java/com/facebook/presto/util/DateTimeUtils.java +++ b/presto-main/src/main/java/com/facebook/presto/util/DateTimeUtils.java @@ -13,8 +13,8 @@ */ package com.facebook.presto.util; -import com.facebook.presto.client.IntervalDayTime; -import com.facebook.presto.client.IntervalYearMonth; +import com.facebook.presto.common.type.IntervalDayTime; +import com.facebook.presto.common.type.IntervalYearMonth; import com.facebook.presto.common.type.TimeZoneKey; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.sql.tree.IntervalLiteral.IntervalField; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java index 64bc0afd92f01..c837923ea9911 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java @@ -20,8 +20,8 @@ import java.util.concurrent.ThreadLocalRandom; import static com.facebook.presto.common.type.DoubleType.DOUBLE; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; public class TestApproximateCountDistinctIpAddress extends AbstractTestApproximateCountDistinct diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondAverageAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondAverageAggregation.java index e439204726b13..3c33ee1c71005 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondAverageAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondAverageAggregation.java @@ -15,13 +15,13 @@ import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; +import com.facebook.presto.common.type.SqlIntervalDayTime; import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.type.SqlIntervalDayTime; import com.google.common.collect.ImmutableList; import java.util.List; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static java.lang.Math.round; public class TestIntervalDayToSecondAverageAggregation diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondSumAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondSumAggregation.java index 4909d15142b92..642ba894304d6 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondSumAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalDayToSecondSumAggregation.java @@ -15,13 +15,13 @@ import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; +import com.facebook.presto.common.type.SqlIntervalDayTime; import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.type.SqlIntervalDayTime; import com.google.common.collect.ImmutableList; import java.util.List; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; public class TestIntervalDayToSecondSumAggregation extends AbstractTestAggregationFunction diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthAverageAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthAverageAggregation.java index 4b76f818d7a86..7b028a931bbbc 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthAverageAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthAverageAggregation.java @@ -15,13 +15,13 @@ import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; +import com.facebook.presto.common.type.SqlIntervalYearMonth; import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.type.SqlIntervalYearMonth; import com.google.common.collect.ImmutableList; import java.util.List; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static java.lang.Math.round; import static java.lang.Math.toIntExact; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthSumAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthSumAggregation.java index afd676d01e3b1..5c1463613381d 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthSumAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestIntervalYearToMonthSumAggregation.java @@ -15,13 +15,13 @@ import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; +import com.facebook.presto.common.type.SqlIntervalYearMonth; import com.facebook.presto.common.type.StandardTypes; -import com.facebook.presto.type.SqlIntervalYearMonth; import com.google.common.collect.ImmutableList; import java.util.List; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; public class TestIntervalYearToMonthSumAggregation extends AbstractTestAggregationFunction diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestKllSketchAggregationFunction.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestKllSketchAggregationFunction.java index d781eab66c59a..597d54a1c167e 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestKllSketchAggregationFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestKllSketchAggregationFunction.java @@ -50,6 +50,7 @@ import static com.facebook.presto.common.type.DateType.DATE; import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.common.type.RealType.REAL; import static com.facebook.presto.common.type.SmallintType.SMALLINT; import static com.facebook.presto.common.type.TimeType.TIME; @@ -59,7 +60,6 @@ import static com.facebook.presto.common.type.VarcharType.VARCHAR; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.lang.String.format; import static org.testng.Assert.assertEquals; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianAggregation.java index e27fc7f2e57d1..042648de6ebb5 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianAggregation.java @@ -36,6 +36,7 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createRLEBlock; +import static com.facebook.presto.common.type.ArrayParametricType.ARRAY; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.CharType.createCharType; import static com.facebook.presto.common.type.DateType.DATE; @@ -43,10 +44,15 @@ import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.HyperLogLogType.HYPER_LOG_LOG; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.common.type.JsonType.JSON; import static com.facebook.presto.common.type.P4HyperLogLogType.P4_HYPER_LOG_LOG; import static com.facebook.presto.common.type.QuantileDigestParametricType.QDIGEST; import static com.facebook.presto.common.type.RealType.REAL; +import static com.facebook.presto.common.type.RowParametricType.ROW; import static com.facebook.presto.common.type.SmallintType.SMALLINT; import static com.facebook.presto.common.type.TDigestParametricType.TDIGEST; import static com.facebook.presto.common.type.TimeType.TIME; @@ -65,13 +71,7 @@ import static com.facebook.presto.operator.aggregation.noisyaggregation.TestNoisyAggregationUtils.equalLongAssertion; import static com.facebook.presto.operator.aggregation.noisyaggregation.TestNoisyAggregationUtils.withinSomeStdAssertion; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; -import static com.facebook.presto.type.ArrayParametricType.ARRAY; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.type.MapParametricType.MAP; -import static com.facebook.presto.type.RowParametricType.ROW; import static com.facebook.presto.type.khyperloglog.KHyperLogLogType.K_HYPER_LOG_LOG; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianRandomSeedAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianRandomSeedAggregation.java index 34a84c7c8a3bc..d15e138e1d7f0 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianRandomSeedAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/noisyaggregation/TestNoisyCountGaussianRandomSeedAggregation.java @@ -36,6 +36,7 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createRLEBlock; +import static com.facebook.presto.common.type.ArrayParametricType.ARRAY; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.CharType.createCharType; import static com.facebook.presto.common.type.DateType.DATE; @@ -43,10 +44,15 @@ import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.HyperLogLogType.HYPER_LOG_LOG; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.common.type.JsonType.JSON; import static com.facebook.presto.common.type.P4HyperLogLogType.P4_HYPER_LOG_LOG; import static com.facebook.presto.common.type.QuantileDigestParametricType.QDIGEST; import static com.facebook.presto.common.type.RealType.REAL; +import static com.facebook.presto.common.type.RowParametricType.ROW; import static com.facebook.presto.common.type.SmallintType.SMALLINT; import static com.facebook.presto.common.type.TDigestParametricType.TDIGEST; import static com.facebook.presto.common.type.TimeType.TIME; @@ -65,13 +71,7 @@ import static com.facebook.presto.operator.aggregation.noisyaggregation.TestNoisyAggregationUtils.equalLongAssertion; import static com.facebook.presto.operator.aggregation.noisyaggregation.TestNoisyAggregationUtils.withinSomeStdAssertion; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; -import static com.facebook.presto.type.ArrayParametricType.ARRAY; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.type.MapParametricType.MAP; -import static com.facebook.presto.type.RowParametricType.ROW; import static com.facebook.presto.type.khyperloglog.KHyperLogLogType.K_HYPER_LOG_LOG; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestDateTimeFunctionsBase.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestDateTimeFunctionsBase.java index 53186af9f835e..865ba92d436f2 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestDateTimeFunctionsBase.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestDateTimeFunctionsBase.java @@ -17,6 +17,7 @@ import com.facebook.presto.common.type.BigintType; import com.facebook.presto.common.type.DateType; import com.facebook.presto.common.type.SqlDate; +import com.facebook.presto.common.type.SqlIntervalDayTime; import com.facebook.presto.common.type.SqlTime; import com.facebook.presto.common.type.SqlTimeWithTimeZone; import com.facebook.presto.common.type.SqlTimestamp; @@ -28,7 +29,6 @@ import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.testing.TestingConnectorSession; import com.facebook.presto.testing.TestingSession; -import com.facebook.presto.type.SqlIntervalDayTime; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -55,6 +55,7 @@ import static com.facebook.presto.SystemSessionProperties.isLegacyTimestamp; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.DoubleType.DOUBLE; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.TimeWithTimeZoneType.TIME_WITH_TIME_ZONE; import static com.facebook.presto.common.type.TimeZoneKey.UTC_KEY; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKey; @@ -66,7 +67,6 @@ import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimeOf; import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimestampOf; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.util.DateTimeZoneIndex.getDateTimeZone; import static java.lang.Math.toIntExact; import static java.lang.String.format; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestIpPrefixFunctions.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestIpPrefixFunctions.java index 21f2b615887c9..a95c330290fbf 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestIpPrefixFunctions.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestIpPrefixFunctions.java @@ -19,8 +19,8 @@ import org.testng.annotations.Test; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; public class TestIpPrefixFunctions extends AbstractTestFunctions diff --git a/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java b/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java index 37295146c4296..26034b8392136 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionInterpreter.java @@ -87,6 +87,7 @@ import static com.facebook.presto.common.type.DecimalType.createDecimalType; import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.TimeType.TIME; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKey; import static com.facebook.presto.common.type.TimestampType.TIMESTAMP; @@ -107,7 +108,6 @@ import static com.facebook.presto.sql.planner.ExpressionInterpreter.expressionInterpreter; import static com.facebook.presto.sql.planner.ExpressionInterpreter.expressionOptimizer; import static com.facebook.presto.sql.planner.RowExpressionInterpreter.rowExpressionInterpreter; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.util.AnalyzerUtil.createParsingOptions; import static com.facebook.presto.util.DateTimeZoneIndex.getDateTimeZone; import static io.airlift.slice.Slices.utf8Slice; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java index f6e6fcb94ed27..7ed50a6db607e 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java @@ -61,6 +61,8 @@ import static com.facebook.presto.common.type.DateType.DATE; import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.common.type.RealType.REAL; import static com.facebook.presto.common.type.SmallintType.SMALLINT; import static com.facebook.presto.common.type.TimestampType.TIMESTAMP; @@ -79,8 +81,6 @@ import static com.facebook.presto.sql.relational.Expressions.constantNull; import static com.facebook.presto.testing.TestingConnectorSession.SESSION; import static com.facebook.presto.type.ColorType.COLOR; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.type.LikePatternType.LIKE_PATTERN; import static io.airlift.slice.Slices.utf8Slice; import static java.lang.Float.floatToIntBits; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/sanity/TestCheckUnsupportedPrestissimoTypes.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/sanity/TestCheckUnsupportedPrestissimoTypes.java index 3dcb2570c72d4..f593aeae25578 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/sanity/TestCheckUnsupportedPrestissimoTypes.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/sanity/TestCheckUnsupportedPrestissimoTypes.java @@ -31,11 +31,11 @@ import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; import static com.facebook.presto.common.type.TimestampWithTimeZoneType.TIMESTAMP_WITH_TIME_ZONE; import static com.facebook.presto.common.type.VarcharType.VARCHAR; import static com.facebook.presto.sql.planner.iterative.rule.test.PlanBuilder.assignment; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; public class TestCheckUnsupportedPrestissimoTypes extends BasePlanTest diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTime.java b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTime.java index 36dddb114c1aa..8aa6ec66a343f 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTime.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTime.java @@ -13,14 +13,15 @@ */ package com.facebook.presto.type; +import com.facebook.presto.common.type.SqlIntervalDayTime; import com.facebook.presto.common.type.Type; import com.facebook.presto.operator.scalar.AbstractTestFunctions; import org.testng.annotations.Test; import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.VarcharType.VARCHAR; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static java.util.concurrent.TimeUnit.DAYS; import static org.testng.Assert.assertEquals; diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTimeType.java b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTimeType.java index 4c146ca1431ea..967602dc0878f 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTimeType.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalDayTimeType.java @@ -15,8 +15,9 @@ import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; +import com.facebook.presto.common.type.SqlIntervalDayTime; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; public class TestIntervalDayTimeType extends AbstractTestType diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonth.java b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonth.java index 66c551519dd5f..86e93d2c0f9d7 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonth.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonth.java @@ -13,14 +13,15 @@ */ package com.facebook.presto.type; +import com.facebook.presto.common.type.SqlIntervalYearMonth; import com.facebook.presto.common.type.Type; import com.facebook.presto.operator.scalar.AbstractTestFunctions; import org.testng.annotations.Test; import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static com.facebook.presto.common.type.VarcharType.VARCHAR; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; import static java.lang.String.format; import static org.testng.Assert.assertEquals; diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonthType.java b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonthType.java index fdf693ff7dc38..ba9c5ff73b446 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonthType.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIntervalYearMonthType.java @@ -15,8 +15,9 @@ import com.facebook.presto.common.block.Block; import com.facebook.presto.common.block.BlockBuilder; +import com.facebook.presto.common.type.SqlIntervalYearMonth; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; public class TestIntervalYearMonthType extends AbstractTestType diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressOperators.java b/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressOperators.java index 7c1d54dbfad49..b83540d2c05c4 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressOperators.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressOperators.java @@ -25,9 +25,9 @@ import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; import static com.facebook.presto.common.type.VarbinaryType.VARBINARY; import static com.facebook.presto.common.type.VarcharType.VARCHAR; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; import static com.google.common.io.BaseEncoding.base16; public class TestIpAddressOperators diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressType.java b/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressType.java index cacd4b3ad252c..39a4ec375d253 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressType.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIpAddressType.java @@ -20,7 +20,7 @@ import io.airlift.slice.Slices; import org.testng.annotations.Test; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; import static org.testng.Assert.assertEquals; public class TestIpAddressType diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixOperators.java b/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixOperators.java index cbd9dff770e28..77f3280787539 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixOperators.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixOperators.java @@ -24,9 +24,9 @@ import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BigintType.BIGINT; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; import static com.facebook.presto.common.type.VarcharType.VARCHAR; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; import static java.lang.System.arraycopy; public class TestIpPrefixOperators diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixType.java b/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixType.java index 50b5eb672708a..7a3a6d94337d7 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixType.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestIpPrefixType.java @@ -20,7 +20,7 @@ import io.airlift.slice.Slices; import org.testng.annotations.Test; -import static com.facebook.presto.type.IpPrefixType.IPPREFIX; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; import static com.google.common.base.Preconditions.checkState; import static java.lang.System.arraycopy; import static org.testng.Assert.assertEquals; diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestRowParametricType.java b/presto-main/src/test/java/com/facebook/presto/type/TestRowParametricType.java index 75586342840a2..8aa083001d0a1 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestRowParametricType.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestRowParametricType.java @@ -15,6 +15,7 @@ import com.facebook.presto.common.type.NamedTypeSignature; import com.facebook.presto.common.type.RowFieldName; +import com.facebook.presto.common.type.RowParametricType; import com.facebook.presto.common.type.Type; import com.facebook.presto.common.type.TypeParameter; import com.facebook.presto.common.type.TypeSignature; diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestTimeBase.java b/presto-main/src/test/java/com/facebook/presto/type/TestTimeBase.java index a6c06f5835312..035b04dabdddb 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestTimeBase.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestTimeBase.java @@ -30,6 +30,7 @@ import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.TimeType.TIME; import static com.facebook.presto.common.type.TimeWithTimeZoneType.TIME_WITH_TIME_ZONE; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKey; @@ -39,7 +40,6 @@ import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimeOf; import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimestampOf; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.util.DateTimeZoneIndex.getDateTimeZone; public abstract class TestTimeBase diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestTimeWithTimeZoneBase.java b/presto-main/src/test/java/com/facebook/presto/type/TestTimeWithTimeZoneBase.java index 42baf882b5d41..98b9e7f6b5a2b 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestTimeWithTimeZoneBase.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestTimeWithTimeZoneBase.java @@ -23,13 +23,13 @@ import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.TimeWithTimeZoneType.TIME_WITH_TIME_ZONE; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKey; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKeyForOffset; import static com.facebook.presto.common.type.TimestampWithTimeZoneType.TIMESTAMP_WITH_TIME_ZONE; import static com.facebook.presto.common.type.VarcharType.VARCHAR; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; public abstract class TestTimeWithTimeZoneBase extends AbstractTestFunctions diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestTimestampBase.java b/presto-main/src/test/java/com/facebook/presto/type/TestTimestampBase.java index d48e8e327be08..6c0f99d80c22b 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestTimestampBase.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestTimestampBase.java @@ -31,6 +31,7 @@ import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; import static com.facebook.presto.common.type.DateType.DATE; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.TimeType.TIME; import static com.facebook.presto.common.type.TimeWithTimeZoneType.TIME_WITH_TIME_ZONE; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKey; @@ -41,7 +42,6 @@ import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimeOf; import static com.facebook.presto.testing.DateTimeTestingUtils.sqlTimestampOf; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.util.DateTimeZoneIndex.getDateTimeZone; import static org.joda.time.DateTimeZone.UTC; diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestTimestampWithTimeZoneBase.java b/presto-main/src/test/java/com/facebook/presto/type/TestTimestampWithTimeZoneBase.java index e7d51858b59cf..168fda82f500f 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestTimestampWithTimeZoneBase.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestTimestampWithTimeZoneBase.java @@ -27,13 +27,13 @@ import static com.facebook.presto.common.function.OperatorType.INDETERMINATE; import static com.facebook.presto.common.type.BooleanType.BOOLEAN; import static com.facebook.presto.common.type.DateType.DATE; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.common.type.TimeWithTimeZoneType.TIME_WITH_TIME_ZONE; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKey; import static com.facebook.presto.common.type.TimeZoneKey.getTimeZoneKeyForOffset; import static com.facebook.presto.common.type.TimestampWithTimeZoneType.TIMESTAMP_WITH_TIME_ZONE; import static com.facebook.presto.common.type.VarcharType.VARCHAR; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; import static com.facebook.presto.util.DateTimeZoneIndex.getDateTimeZone; import static org.joda.time.DateTimeZone.UTC; diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarPlugin.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarPlugin.java index 4c11cfa9b34dd..d65b6dfb5c108 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarPlugin.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/NativeSidecarPlugin.java @@ -14,8 +14,10 @@ package com.facebook.presto.sidecar; import com.facebook.presto.sidecar.sessionpropertyproviders.NativeSystemSessionPropertyProviderFactory; +import com.facebook.presto.sidecar.typemanager.NativeTypeManagerFactory; import com.facebook.presto.spi.CoordinatorPlugin; import com.facebook.presto.spi.session.WorkerSessionPropertyProviderFactory; +import com.facebook.presto.spi.type.TypeManagerFactory; import com.google.common.collect.ImmutableList; public class NativeSidecarPlugin @@ -26,4 +28,10 @@ public Iterable getWorkerSessionPropertyPr { return ImmutableList.of(new NativeSystemSessionPropertyProviderFactory()); } + + @Override + public Iterable getTypeManagerFactories() + { + return ImmutableList.of(new NativeTypeManagerFactory()); + } } diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManager.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManager.java new file mode 100644 index 0000000000000..7c8a29379db6e --- /dev/null +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManager.java @@ -0,0 +1,178 @@ +/* + * 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 com.facebook.presto.sidecar.typemanager; + +import com.facebook.airlift.log.Logger; +import com.facebook.presto.common.type.ParametricType; +import com.facebook.presto.common.type.Type; +import com.facebook.presto.common.type.TypeSignature; +import com.facebook.presto.spi.ExactTypeSignature; +import com.facebook.presto.spi.function.FunctionMetadataManager; +import com.facebook.presto.spi.type.TypeManagerProvider; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableList; +import com.google.common.util.concurrent.UncheckedExecutionException; +import com.google.inject.Inject; + +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import static com.facebook.presto.common.type.ArrayParametricType.ARRAY; +import static com.facebook.presto.common.type.BigintType.BIGINT; +import static com.facebook.presto.common.type.BooleanType.BOOLEAN; +import static com.facebook.presto.common.type.DateType.DATE; +import static com.facebook.presto.common.type.DecimalParametricType.DECIMAL; +import static com.facebook.presto.common.type.DoubleType.DOUBLE; +import static com.facebook.presto.common.type.FunctionParametricType.FUNCTION; +import static com.facebook.presto.common.type.HyperLogLogType.HYPER_LOG_LOG; +import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; +import static com.facebook.presto.common.type.IpPrefixType.IPPREFIX; +import static com.facebook.presto.common.type.JsonType.JSON; +import static com.facebook.presto.common.type.NoOpMapType.NO_OP_MAP; +import static com.facebook.presto.common.type.RealType.REAL; +import static com.facebook.presto.common.type.RowParametricType.ROW; +import static com.facebook.presto.common.type.SmallintType.SMALLINT; +import static com.facebook.presto.common.type.TimestampType.TIMESTAMP; +import static com.facebook.presto.common.type.TimestampWithTimeZoneType.TIMESTAMP_WITH_TIME_ZONE; +import static com.facebook.presto.common.type.TinyintType.TINYINT; +import static com.facebook.presto.common.type.UnknownType.UNKNOWN; +import static com.facebook.presto.common.type.UuidType.UUID; +import static com.facebook.presto.common.type.VarbinaryType.VARBINARY; +import static com.facebook.presto.common.type.VarcharParametricType.VARCHAR; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Throwables.throwIfUnchecked; +import static java.util.Objects.requireNonNull; +import static java.util.concurrent.TimeUnit.HOURS; + +public class NativeTypeManager + implements TypeManagerProvider +{ + private static final Logger log = Logger.get(NativeTypeManager.class); + + private static final List TYPES = + ImmutableList.of( + BIGINT, + UNKNOWN, + REAL, + VARBINARY, + TIMESTAMP, + TINYINT, + BOOLEAN, + DATE, + INTEGER, + DOUBLE, + SMALLINT, + HYPER_LOG_LOG, + JSON, + TIMESTAMP_WITH_TIME_ZONE, + UUID, + IPADDRESS, + IPPREFIX, + INTERVAL_DAY_TIME, + INTERVAL_YEAR_MONTH); + + private static final List PARAMETRIC_TYPES = + ImmutableList.of( + ARRAY, + DECIMAL, + FUNCTION, + NO_OP_MAP, + ROW, + VARCHAR); + + private final FunctionMetadataManager functionMetadataManager; + private final LoadingCache parametricTypeCache; + private final ConcurrentMap types = new ConcurrentHashMap<>(); + private final ConcurrentMap parametricTypes = new ConcurrentHashMap<>(); + + @Inject + public NativeTypeManager(FunctionMetadataManager functionMetadataManager) + { + this.functionMetadataManager = requireNonNull(functionMetadataManager, "functionMetadataManager is null"); + parametricTypeCache = CacheBuilder.newBuilder() + .maximumSize(1000) + .expireAfterWrite(1, HOURS) + .build(CacheLoader.from(this::instantiateParametricType)); + addAllTypes(); + } + + @Override + public Optional getType(TypeSignature typeSignature) + { + Type type = types.get(typeSignature); + if (type != null) { + return Optional.of(type); + } + try { + // Todo: Functions are getting parsed with char type signatures in it, native execution does not support char type signatures. + // Once support for native function namespace manager is merged, clean this up. + if (typeSignature.getBase().equals("char")) { + typeSignature = new TypeSignature( + "varchar", + typeSignature.getParameters()); + } + return Optional.ofNullable(parametricTypeCache.getUnchecked(new ExactTypeSignature(typeSignature))); + } + catch (UncheckedExecutionException e) { + throwIfUnchecked(e.getCause()); + throw new RuntimeException(e.getCause()); + } + } + + @Override + public Map getParametricTypes() + { + return parametricTypes; + } + + private Type instantiateParametricType(ExactTypeSignature exactTypeSignature) + { + return functionMetadataManager.instantiateParametricType(exactTypeSignature); + } + + private void addAllTypes() + { + for (Type type : TYPES) { + addType(type); + } + + for (ParametricType type : PARAMETRIC_TYPES) { + addParametricType(type); + } + } + + private void addType(Type type) + { + requireNonNull(type, "type is null"); + Type existingType = types.putIfAbsent(type.getTypeSignature(), type); + checkState(existingType == null || existingType.equals(type), "Type %s is already registered", type); + } + + public void addParametricType(ParametricType parametricType) + { + String name = parametricType.getName().toLowerCase(Locale.ENGLISH); + checkArgument(!parametricTypes.containsKey(name), "Parametric type already registered: %s", name); + parametricTypes.putIfAbsent(name, parametricType); + } +} diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManagerFactory.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManagerFactory.java new file mode 100644 index 0000000000000..25f70e102ffae --- /dev/null +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManagerFactory.java @@ -0,0 +1,45 @@ +/* + * 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 com.facebook.presto.sidecar.typemanager; + +import com.facebook.airlift.bootstrap.Bootstrap; +import com.facebook.presto.spi.type.TypeManagerContext; +import com.facebook.presto.spi.type.TypeManagerFactory; +import com.facebook.presto.spi.type.TypeManagerProvider; +import com.google.inject.Injector; + +public class NativeTypeManagerFactory + implements TypeManagerFactory +{ + public static final String NAME = "native"; + + @Override + public String getName() + { + return NAME; + } + + @Override + public TypeManagerProvider create(TypeManagerContext context) + { + Bootstrap app = new Bootstrap( + new NativeTypeManagerModule(context.getFunctionMetadataManager())); + + Injector injector = app + .doNotInitializeLogging() + .noStrictConfig() + .initialize(); + return injector.getInstance(NativeTypeManager.class); + } +} diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManagerModule.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManagerModule.java new file mode 100644 index 0000000000000..1ad777c3db00a --- /dev/null +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/typemanager/NativeTypeManagerModule.java @@ -0,0 +1,49 @@ +/* + * 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 com.facebook.presto.sidecar.typemanager; + +import com.facebook.airlift.json.JsonCodec; +import com.facebook.airlift.json.JsonCodecFactory; +import com.facebook.presto.spi.function.FunctionMetadataManager; +import com.facebook.presto.spi.session.SessionPropertyMetadata; +import com.facebook.presto.spi.type.TypeManagerProvider; +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + +import java.util.List; + +import static java.util.Objects.requireNonNull; + +public class NativeTypeManagerModule + implements Module +{ + private final FunctionMetadataManager functionMetadataManager; + + public NativeTypeManagerModule(FunctionMetadataManager functionMetadataManager) + { + this.functionMetadataManager = requireNonNull(functionMetadataManager, "functionMetadataManager is null"); + } + + @Override + public void configure(Binder binder) + { + binder.bind(new TypeLiteral>>() {}) + .toInstance(new JsonCodecFactory().listJsonCodec(SessionPropertyMetadata.class)); + binder.bind(FunctionMetadataManager.class).toInstance(functionMetadataManager); + binder.bind(NativeTypeManager.class).in(Scopes.SINGLETON); + binder.bind(TypeManagerProvider.class).to(NativeTypeManager.class).in(Scopes.SINGLETON); + } +} diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java index 4ac96f6f837fc..0d5200fdc99e4 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/NativeSidecarPluginQueryRunnerUtils.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.sidecar; import com.facebook.presto.sidecar.sessionpropertyproviders.NativeSystemSessionPropertyProviderFactory; +import com.facebook.presto.sidecar.typemanager.NativeTypeManagerFactory; import com.facebook.presto.testing.QueryRunner; public class NativeSidecarPluginQueryRunnerUtils @@ -23,5 +24,6 @@ public static void setupNativeSidecarPlugin(QueryRunner queryRunner) { queryRunner.installCoordinatorPlugin(new NativeSidecarPlugin()); queryRunner.loadSessionPropertyProvider(NativeSystemSessionPropertyProviderFactory.NAME); + queryRunner.loadTypeManager(NativeTypeManagerFactory.NAME); } } diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPluginSystemPropertyProvider.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/sessionpropertyproviders/TestNativeSidecarPluginSystemPropertyProvider.java similarity index 98% rename from presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPluginSystemPropertyProvider.java rename to presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/sessionpropertyproviders/TestNativeSidecarPluginSystemPropertyProvider.java index 0ea9eec5b49aa..75f50bdbd6c9f 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPluginSystemPropertyProvider.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/sessionpropertyproviders/TestNativeSidecarPluginSystemPropertyProvider.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sidecar; +package com.facebook.presto.sidecar.sessionpropertyproviders; import com.facebook.presto.nativeworker.PrestoNativeQueryRunnerUtils; import com.facebook.presto.testing.MaterializedResult; diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSystemSessionPropertyProviderConfig.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/sessionpropertyproviders/TestNativeSystemSessionPropertyProviderConfig.java similarity index 92% rename from presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSystemSessionPropertyProviderConfig.java rename to presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/sessionpropertyproviders/TestNativeSystemSessionPropertyProviderConfig.java index 6784928044478..7cb12c8480699 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSystemSessionPropertyProviderConfig.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/sessionpropertyproviders/TestNativeSystemSessionPropertyProviderConfig.java @@ -11,9 +11,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sidecar; +package com.facebook.presto.sidecar.sessionpropertyproviders; -import com.facebook.presto.sidecar.sessionpropertyproviders.NativeSystemSessionPropertyProviderConfig; import com.google.common.collect.ImmutableMap; import io.airlift.units.Duration; import org.testng.annotations.Test; diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/typemanager/TestNativeSidecarPluginTypeManager.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/typemanager/TestNativeSidecarPluginTypeManager.java new file mode 100644 index 0000000000000..7c7ce60234217 --- /dev/null +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/typemanager/TestNativeSidecarPluginTypeManager.java @@ -0,0 +1,73 @@ +/* + * 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 com.facebook.presto.sidecar.typemanager; + +import com.facebook.presto.nativeworker.PrestoNativeQueryRunnerUtils; +import com.facebook.presto.testing.QueryRunner; +import com.facebook.presto.tests.AbstractTestQueryFramework; +import com.facebook.presto.tests.DistributedQueryRunner; +import org.testng.annotations.Test; + +import static com.facebook.presto.nativeworker.NativeQueryRunnerUtils.createLineitem; +import static com.facebook.presto.nativeworker.NativeQueryRunnerUtils.createNation; +import static com.facebook.presto.nativeworker.NativeQueryRunnerUtils.createOrders; +import static com.facebook.presto.nativeworker.NativeQueryRunnerUtils.createOrdersEx; +import static com.facebook.presto.sidecar.NativeSidecarPluginQueryRunnerUtils.setupNativeSidecarPlugin; + +@Test(singleThreaded = true) +public class TestNativeSidecarPluginTypeManager + extends AbstractTestQueryFramework +{ + @Override + protected void createTables() + { + QueryRunner queryRunner = (QueryRunner) getExpectedQueryRunner(); + createLineitem(queryRunner); + createNation(queryRunner); + createOrders(queryRunner); + } + + @Override + protected QueryRunner createQueryRunner() + throws Exception + { + DistributedQueryRunner queryRunner = (DistributedQueryRunner) PrestoNativeQueryRunnerUtils.createQueryRunner(true, true); + setupNativeSidecarPlugin(queryRunner); + return queryRunner; + } + + @Override + protected QueryRunner createExpectedQueryRunner() + throws Exception + { + return PrestoNativeQueryRunnerUtils.createJavaQueryRunner(); + } + + @Test + public void testTypes() + { + assertQuery("SELECT substr(comment, 1, 10), length(comment), trim(comment) FROM orders"); + assertQuery("SELECT substr(comment, 1, 10), length(comment), ltrim(comment) FROM orders"); + assertQuery("SELECT substr(comment, 1, 10), length(comment), rtrim(comment) FROM orders"); + assertQuery("select lower(comment) from nation"); + assertQuery("select array[nationkey], array_constructor(comment) from nation"); + assertQuery("SELECT nationkey, bit_count(nationkey, 10) FROM nation ORDER BY 1"); + assertQuery("SELECT * FROM lineitem WHERE shipinstruct like 'TAKE BACK%'"); + assertQueryFails( + "SELECT trim(comment, ' ns'), ltrim(comment, 'a b c'), rtrim(comment, 'l y') FROM orders", + "java.lang.IllegalArgumentException: Unknown type CodePoints"); + assertQueryFails("SELECT * FROM lineitem WHERE shipinstruct like 'TAKE BACK%' escape '#'", + "java.lang.IllegalArgumentException: Unknown type LikePattern"); + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/CoordinatorPlugin.java b/presto-spi/src/main/java/com/facebook/presto/spi/CoordinatorPlugin.java index 81e57f7e12359..7ad8c91830edb 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/CoordinatorPlugin.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/CoordinatorPlugin.java @@ -15,6 +15,7 @@ import com.facebook.presto.spi.function.FunctionNamespaceManagerFactory; import com.facebook.presto.spi.session.WorkerSessionPropertyProviderFactory; +import com.facebook.presto.spi.type.TypeManagerFactory; import static java.util.Collections.emptyList; @@ -36,4 +37,9 @@ default Iterable getWorkerSessionPropertyP { return emptyList(); } + + default Iterable getTypeManagerFactories() + { + return emptyList(); + } } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/ExactTypeSignature.java b/presto-spi/src/main/java/com/facebook/presto/spi/ExactTypeSignature.java new file mode 100644 index 0000000000000..23d25a387199e --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/ExactTypeSignature.java @@ -0,0 +1,106 @@ +/* + * 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 com.facebook.presto.spi; + +import com.facebook.presto.common.type.DistinctTypeInfo; +import com.facebook.presto.common.type.TypeSignature; +import com.facebook.presto.common.type.TypeSignatureParameter; + +import java.util.Objects; + +/** + * TypeSignature but has overridden equals(). Here, we compare exact signature of any underlying distinct + * types. Some distinct types may have extra information on their lazily loaded parents, and same parent + * information is compared in equals(). This is needed to cache types in parametricTypesCache. + */ +public class ExactTypeSignature +{ + private final TypeSignature typeSignature; + + public ExactTypeSignature(TypeSignature typeSignature) + { + this.typeSignature = typeSignature; + } + + public TypeSignature getTypeSignature() + { + return typeSignature; + } + + @Override + public int hashCode() + { + return Objects.hash(typeSignature); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + ExactTypeSignature other = (ExactTypeSignature) o; + return equals(typeSignature, other.typeSignature); + } + + private static boolean equals(TypeSignature left, TypeSignature right) + { + if (!left.equals(right)) { + return false; + } + + if (left.isDistinctType() && right.isDistinctType()) { + return equals(left.getDistinctTypeInfo(), right.getDistinctTypeInfo()); + } + int index = 0; + for (TypeSignatureParameter leftParameter : left.getParameters()) { + TypeSignatureParameter rightParameter = right.getParameters().get(index++); + if (!leftParameter.getKind().equals(rightParameter.getKind())) { + return false; + } + + switch (leftParameter.getKind()) { + case TYPE: + if (!equals(leftParameter.getTypeSignature(), rightParameter.getTypeSignature())) { + return false; + } + break; + case NAMED_TYPE: + if (!equals(leftParameter.getNamedTypeSignature().getTypeSignature(), rightParameter.getNamedTypeSignature().getTypeSignature())) { + return false; + } + break; + case DISTINCT_TYPE: + if (!equals(leftParameter.getDistinctTypeInfo(), rightParameter.getDistinctTypeInfo())) { + return false; + } + break; + } + } + return true; + } + + private static boolean equals(DistinctTypeInfo left, DistinctTypeInfo right) + { + return Objects.equals(left.getName(), right.getName()) && + Objects.equals(left.getBaseType(), right.getBaseType()) && + Objects.equals(left.isOrderable(), right.isOrderable()) && + Objects.equals(left.getTopMostAncestor(), right.getTopMostAncestor()) && + Objects.equals(left.getOtherAncestors(), right.getOtherAncestors()); + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadataManager.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadataManager.java index 04231b2c15557..353ecaa45324f 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadataManager.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadataManager.java @@ -13,7 +13,11 @@ */ package com.facebook.presto.spi.function; +import com.facebook.presto.common.type.Type; +import com.facebook.presto.spi.ExactTypeSignature; + public interface FunctionMetadataManager { FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle); + public Type instantiateParametricType(ExactTypeSignature exactSignature); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerContext.java b/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerContext.java new file mode 100644 index 0000000000000..3afab98d08182 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerContext.java @@ -0,0 +1,35 @@ +/* + * 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 com.facebook.presto.spi.type; + +import com.facebook.presto.spi.function.FunctionMetadataManager; + +import java.util.Optional; + +import static java.util.Objects.requireNonNull; + +public class TypeManagerContext +{ + private final Optional functionMetadataManager; + + public TypeManagerContext(Optional functionMetadataManager) + { + this.functionMetadataManager = requireNonNull(functionMetadataManager, "functionMetadataManager is null"); + } + + public FunctionMetadataManager getFunctionMetadataManager() + { + return functionMetadataManager.orElseThrow(() -> new IllegalArgumentException("functionMetadataManager is not present")); + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerFactory.java b/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerFactory.java new file mode 100644 index 0000000000000..9ba964174cf3c --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerFactory.java @@ -0,0 +1,21 @@ +/* + * 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 com.facebook.presto.spi.type; + +public interface TypeManagerFactory +{ + String getName(); + + TypeManagerProvider create(TypeManagerContext context); +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerProvider.java b/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerProvider.java new file mode 100644 index 0000000000000..c4cc3b4fa6497 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/type/TypeManagerProvider.java @@ -0,0 +1,28 @@ +/* + * 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 com.facebook.presto.spi.type; + +import com.facebook.presto.common.type.ParametricType; +import com.facebook.presto.common.type.Type; +import com.facebook.presto.common.type.TypeSignature; + +import java.util.Map; +import java.util.Optional; + +public interface TypeManagerProvider +{ + Optional getType(TypeSignature signature); + + Map getParametricTypes(); +} diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java b/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java index 787d43f37279f..12fe28c86a871 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java @@ -15,6 +15,8 @@ import com.facebook.presto.Session; import com.facebook.presto.SystemSessionProperties; +import com.facebook.presto.common.type.SqlIntervalDayTime; +import com.facebook.presto.common.type.SqlIntervalYearMonth; import com.facebook.presto.common.type.SqlTimestampWithTimeZone; import com.facebook.presto.metadata.FunctionListBuilder; import com.facebook.presto.spi.PrestoException; @@ -23,8 +25,6 @@ import com.facebook.presto.sql.analyzer.SemanticException; import com.facebook.presto.testing.MaterializedResult; import com.facebook.presto.testing.MaterializedRow; -import com.facebook.presto.type.SqlIntervalDayTime; -import com.facebook.presto.type.SqlIntervalYearMonth; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java b/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java index 5ad1d98853351..126a9c015dd75 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java @@ -943,6 +943,14 @@ public void loadSessionPropertyProvider(String sessionPropertyProviderName) } } + @Override + public void loadTypeManager(String typeManagerName) + { + for (TestingPrestoServer server : servers) { + server.getMetadata().getFunctionAndTypeManager().loadTypeManager(typeManagerName); + } + } + private static void closeUnchecked(AutoCloseable closeable) { try { diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/TestingPrestoClient.java b/presto-tests/src/main/java/com/facebook/presto/tests/TestingPrestoClient.java index 9f08d59024294..13be3eafd58cb 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/TestingPrestoClient.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/TestingPrestoClient.java @@ -14,17 +14,19 @@ package com.facebook.presto.tests; import com.facebook.presto.Session; -import com.facebook.presto.client.IntervalDayTime; -import com.facebook.presto.client.IntervalYearMonth; import com.facebook.presto.client.QueryData; import com.facebook.presto.client.QueryStatusInfo; import com.facebook.presto.common.type.ArrayType; import com.facebook.presto.common.type.BigintEnumType; import com.facebook.presto.common.type.DecimalType; import com.facebook.presto.common.type.DistinctType; +import com.facebook.presto.common.type.IntervalDayTime; +import com.facebook.presto.common.type.IntervalYearMonth; import com.facebook.presto.common.type.JsonType; import com.facebook.presto.common.type.MapType; import com.facebook.presto.common.type.RowType; +import com.facebook.presto.common.type.SqlIntervalDayTime; +import com.facebook.presto.common.type.SqlIntervalYearMonth; import com.facebook.presto.common.type.SqlTimestamp; import com.facebook.presto.common.type.SqlTimestampWithTimeZone; import com.facebook.presto.common.type.Type; @@ -36,8 +38,6 @@ import com.facebook.presto.spi.PrestoWarning; import com.facebook.presto.testing.MaterializedResult; import com.facebook.presto.testing.MaterializedRow; -import com.facebook.presto.type.SqlIntervalDayTime; -import com.facebook.presto.type.SqlIntervalYearMonth; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; @@ -66,6 +66,9 @@ import static com.facebook.presto.common.type.DateType.DATE; import static com.facebook.presto.common.type.DoubleType.DOUBLE; import static com.facebook.presto.common.type.IntegerType.INTEGER; +import static com.facebook.presto.common.type.IntervalDayTimeType.INTERVAL_DAY_TIME; +import static com.facebook.presto.common.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; +import static com.facebook.presto.common.type.IpAddressType.IPADDRESS; import static com.facebook.presto.common.type.JsonType.JSON; import static com.facebook.presto.common.type.RealType.REAL; import static com.facebook.presto.common.type.SmallintType.SMALLINT; @@ -76,9 +79,6 @@ import static com.facebook.presto.common.type.TinyintType.TINYINT; import static com.facebook.presto.common.type.VarbinaryType.VARBINARY; import static com.facebook.presto.testing.MaterializedResult.DEFAULT_PRECISION; -import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME; -import static com.facebook.presto.type.IntervalYearMonthType.INTERVAL_YEAR_MONTH; -import static com.facebook.presto.type.IpAddressType.IPADDRESS; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.transform;