[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:
Kang
2023-03-17 10:28:17 +08:00
committed by GitHub
parent f099b7d7b5
commit 5d3de05976
10 changed files with 1470 additions and 14 deletions

View File

@ -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);

View File

@ -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);