[feature](map) basic functions for map datatype (#16916)
basic functions for map datatype: - MAP<K, V> map(K k1, V v1, ...) - BIGINT map_size(MAP<K, V> m) - BOOL map_contains_key(MAP<K, V> m, K k1) - BOOL map_contains_value(MAP<K, V> m, V v1) - ARRAY< K> map_keys(MAP<K, V> m) - ARRAY< V> map_values(MAP<K, V> m)
This commit is contained in:
@ -101,14 +101,18 @@ public class ArrayType extends Type {
|
||||
@Override
|
||||
public Type specializeTemplateType(Type specificType, Map<String, Type> specializedTypeMap,
|
||||
boolean useSpecializedType) throws TypeException {
|
||||
if (!(specificType instanceof ArrayType)) {
|
||||
ArrayType specificArrayType = null;
|
||||
if (specificType instanceof ArrayType) {
|
||||
specificArrayType = (ArrayType) specificType;
|
||||
} else if (!useSpecializedType) {
|
||||
throw new TypeException(specificType + " is not ArrayType");
|
||||
}
|
||||
|
||||
ArrayType o = (ArrayType) specificType;
|
||||
Type newItemType = itemType;
|
||||
if (itemType.hasTemplateType()) {
|
||||
newItemType = itemType.specializeTemplateType(o.itemType, specializedTypeMap, useSpecializedType);
|
||||
newItemType = itemType.specializeTemplateType(
|
||||
specificArrayType != null ? specificArrayType.itemType : specificType,
|
||||
specializedTypeMap, useSpecializedType);
|
||||
}
|
||||
|
||||
return new ArrayType(newItemType);
|
||||
|
||||
@ -130,24 +130,29 @@ public class MapType extends Type {
|
||||
@Override
|
||||
public Type specializeTemplateType(Type specificType, Map<String, Type> specializedTypeMap,
|
||||
boolean useSpecializedType) throws TypeException {
|
||||
if (!(specificType instanceof MapType)) {
|
||||
MapType specificMapType = null;
|
||||
if (specificType instanceof MapType) {
|
||||
specificMapType = (MapType) specificType;
|
||||
} else if (!useSpecializedType) {
|
||||
throw new TypeException(specificType + " is not MapType");
|
||||
}
|
||||
|
||||
MapType specificMapType = (MapType) specificType;
|
||||
Type newKeyType = keyType;
|
||||
if (keyType.hasTemplateType()) {
|
||||
newKeyType = keyType.specializeTemplateType(
|
||||
specificMapType.keyType, specializedTypeMap, useSpecializedType);
|
||||
specificMapType != null ? specificMapType.keyType : specificType,
|
||||
specializedTypeMap, useSpecializedType);
|
||||
}
|
||||
Type newValueType = valueType;
|
||||
if (valueType.hasTemplateType()) {
|
||||
newValueType = valueType.specializeTemplateType(
|
||||
specificMapType.valueType, specializedTypeMap, useSpecializedType);
|
||||
specificMapType != null ? specificMapType.valueType : specificType,
|
||||
specializedTypeMap, useSpecializedType);
|
||||
}
|
||||
|
||||
Type newMapType = new MapType(newKeyType, newValueType);
|
||||
if (Type.canCastTo(specificType, newMapType)) {
|
||||
if (Type.canCastTo(specificType, newMapType)
|
||||
|| (useSpecializedType && !(specificType instanceof MapType))) {
|
||||
return newMapType;
|
||||
} else {
|
||||
throw new TypeException(specificType + " can not cast to specialize type " + newMapType);
|
||||
|
||||
Reference in New Issue
Block a user