|
29 | 29 | import java.math.BigInteger;
|
30 | 30 | import java.net.InetAddress;
|
31 | 31 | import java.util.ArrayList;
|
32 |
| -import java.util.HashSet; |
| 32 | +import java.util.HashMap; |
| 33 | +import java.util.Map; |
33 | 34 | import java.util.Set;
|
34 | 35 |
|
35 | 36 | // Data types that are supported as return or argument types in Java UDFs.
|
@@ -63,32 +64,36 @@ public class JavaUdfDataType {
|
63 | 64 | public static final JavaUdfDataType MAP_TYPE = new JavaUdfDataType("MAP_TYPE", TPrimitiveType.MAP, 0);
|
64 | 65 | public static final JavaUdfDataType STRUCT_TYPE = new JavaUdfDataType("STRUCT_TYPE", TPrimitiveType.STRUCT, 0);
|
65 | 66 |
|
66 |
| - private static Set<JavaUdfDataType> JavaUdfDataTypeSet = new HashSet<>(); |
| 67 | + private static final Map<TPrimitiveType, JavaUdfDataType> javaUdfDataTypeMap = new HashMap<>(); |
| 68 | + |
| 69 | + public static void addJavaUdfDataType(JavaUdfDataType dataType) { |
| 70 | + javaUdfDataTypeMap.put(dataType.getPrimitiveType(), dataType); |
| 71 | + } |
67 | 72 |
|
68 | 73 | static {
|
69 |
| - JavaUdfDataTypeSet.add(INVALID_TYPE); |
70 |
| - JavaUdfDataTypeSet.add(BOOLEAN); |
71 |
| - JavaUdfDataTypeSet.add(TINYINT); |
72 |
| - JavaUdfDataTypeSet.add(SMALLINT); |
73 |
| - JavaUdfDataTypeSet.add(INT); |
74 |
| - JavaUdfDataTypeSet.add(BIGINT); |
75 |
| - JavaUdfDataTypeSet.add(FLOAT); |
76 |
| - JavaUdfDataTypeSet.add(DOUBLE); |
77 |
| - JavaUdfDataTypeSet.add(STRING); |
78 |
| - JavaUdfDataTypeSet.add(DATE); |
79 |
| - JavaUdfDataTypeSet.add(DATETIME); |
80 |
| - JavaUdfDataTypeSet.add(LARGEINT); |
81 |
| - JavaUdfDataTypeSet.add(DECIMALV2); |
82 |
| - JavaUdfDataTypeSet.add(DATEV2); |
83 |
| - JavaUdfDataTypeSet.add(DATETIMEV2); |
84 |
| - JavaUdfDataTypeSet.add(DECIMAL32); |
85 |
| - JavaUdfDataTypeSet.add(DECIMAL64); |
86 |
| - JavaUdfDataTypeSet.add(DECIMAL128); |
87 |
| - JavaUdfDataTypeSet.add(ARRAY_TYPE); |
88 |
| - JavaUdfDataTypeSet.add(MAP_TYPE); |
89 |
| - JavaUdfDataTypeSet.add(STRUCT_TYPE); |
90 |
| - JavaUdfDataTypeSet.add(IPV4); |
91 |
| - JavaUdfDataTypeSet.add(IPV6); |
| 74 | + addJavaUdfDataType(INVALID_TYPE); |
| 75 | + addJavaUdfDataType(BOOLEAN); |
| 76 | + addJavaUdfDataType(TINYINT); |
| 77 | + addJavaUdfDataType(SMALLINT); |
| 78 | + addJavaUdfDataType(INT); |
| 79 | + addJavaUdfDataType(BIGINT); |
| 80 | + addJavaUdfDataType(FLOAT); |
| 81 | + addJavaUdfDataType(DOUBLE); |
| 82 | + addJavaUdfDataType(STRING); |
| 83 | + addJavaUdfDataType(DATE); |
| 84 | + addJavaUdfDataType(DATETIME); |
| 85 | + addJavaUdfDataType(LARGEINT); |
| 86 | + addJavaUdfDataType(DECIMALV2); |
| 87 | + addJavaUdfDataType(DATEV2); |
| 88 | + addJavaUdfDataType(DATETIMEV2); |
| 89 | + addJavaUdfDataType(DECIMAL32); |
| 90 | + addJavaUdfDataType(DECIMAL64); |
| 91 | + addJavaUdfDataType(DECIMAL128); |
| 92 | + addJavaUdfDataType(ARRAY_TYPE); |
| 93 | + addJavaUdfDataType(MAP_TYPE); |
| 94 | + addJavaUdfDataType(STRUCT_TYPE); |
| 95 | + addJavaUdfDataType(IPV4); |
| 96 | + addJavaUdfDataType(IPV6); |
92 | 97 | }
|
93 | 98 |
|
94 | 99 | private final String description;
|
@@ -117,17 +122,33 @@ public JavaUdfDataType(JavaUdfDataType other) {
|
117 | 122 |
|
118 | 123 | @Override
|
119 | 124 | public String toString() {
|
120 |
| - return description; |
121 |
| - } |
| 125 | + StringBuilder res = new StringBuilder(); |
| 126 | + res.append(description); |
| 127 | + // TODO: the item/key/value type should be dispose in child class |
| 128 | + if (getItemType() != null) { |
| 129 | + res.append(" item: ").append(getItemType().toString()).append(" sql: ") |
| 130 | + .append(getItemType().toSql()); |
| 131 | + } |
| 132 | + if (getKeyType() != null) { |
| 133 | + res.append(" key: ").append(getKeyType().toString()).append(" sql: ") |
| 134 | + .append(getKeyType().toSql()); |
| 135 | + } |
| 136 | + if (getValueType() != null) { |
| 137 | + res.append(" value: ").append(getValueType().toString()).append(" sql: ") |
| 138 | + .append(getValueType().toSql()); |
| 139 | + } |
122 | 140 |
|
123 |
| - public TPrimitiveType getPrimitiveType() { |
124 |
| - return thriftType; |
| 141 | + return res.toString(); |
125 | 142 | }
|
126 | 143 |
|
127 | 144 | public int getLen() {
|
128 | 145 | return len;
|
129 | 146 | }
|
130 | 147 |
|
| 148 | + public TPrimitiveType getPrimitiveType() { |
| 149 | + return thriftType; |
| 150 | + } |
| 151 | + |
131 | 152 | public static Set<JavaUdfDataType> getCandidateTypes(Class<?> c) {
|
132 | 153 | if (c == boolean.class || c == Boolean.class) {
|
133 | 154 | return Sets.newHashSet(JavaUdfDataType.BOOLEAN);
|
@@ -169,19 +190,14 @@ public static Set<JavaUdfDataType> getCandidateTypes(Class<?> c) {
|
169 | 190 | }
|
170 | 191 |
|
171 | 192 | public static boolean isSupported(Type t) {
|
172 |
| - for (JavaUdfDataType javaType : JavaUdfDataTypeSet) { |
173 |
| - if (javaType == JavaUdfDataType.INVALID_TYPE) { |
174 |
| - continue; |
175 |
| - } |
176 |
| - if (javaType.getPrimitiveType() == t.getPrimitiveType().toThrift()) { |
177 |
| - return true; |
178 |
| - } |
179 |
| - } |
180 |
| - if (t.getPrimitiveType().toThrift() == TPrimitiveType.VARCHAR |
181 |
| - || t.getPrimitiveType().toThrift() == TPrimitiveType.CHAR) { |
| 193 | + TPrimitiveType thriftType = t.getPrimitiveType().toThrift(); |
| 194 | + // varchar and char are supported in java udf, type is String |
| 195 | + if (thriftType == TPrimitiveType.VARCHAR |
| 196 | + || thriftType == TPrimitiveType.CHAR) { |
182 | 197 | return true;
|
183 | 198 | }
|
184 |
| - return false; |
| 199 | + return !thriftType.equals(TPrimitiveType.INVALID_TYPE) |
| 200 | + && javaUdfDataTypeMap.containsKey(thriftType); |
185 | 201 | }
|
186 | 202 |
|
187 | 203 | public int getPrecision() {
|
@@ -209,7 +225,6 @@ public void setItemType(Type type) throws InternalException {
|
209 | 225 | this.itemType = type;
|
210 | 226 | } else {
|
211 | 227 | if (!this.itemType.matchesType(type)) {
|
212 |
| - LOG.info("set error"); |
213 | 228 | throw new InternalException("udf type not matches origin type :" + this.itemType.toSql()
|
214 | 229 | + " set type :" + type.toSql());
|
215 | 230 | }
|
|
0 commit comments