@Override public Map<Integer, Types.NestedField> map(Types.MapType map, Map<Integer, Types.NestedField> keyResult, Map<Integer, Types.NestedField> valueResult) { for (Types.NestedField field : map.fields()) { index.put(field.fieldId(), field); } return null; } }
@Override public Set<Integer> map(Types.MapType map, Set<Integer> keyResult, Set<Integer> valueResult) { if (valueResult == null) { for (Types.NestedField field : map.fields()) { fieldIds.add(field.fieldId()); } } return fieldIds; } }
@Override public Type map(Types.MapType map, Type kResult, Type vResult) { // if any updates are intended for the key, throw an exception int keyId = map.fields().get(0).fieldId(); if (deletes.contains(keyId)) { throw new IllegalArgumentException("Cannot delete map keys: " + map); } else if (updates.containsKey(keyId)) { throw new IllegalArgumentException("Cannot update map keys: " + map); } else if (adds.containsKey(keyId)) { throw new IllegalArgumentException("Cannot add fields to map keys: " + map); } else if (!map.keyType().equals(kResult)) { throw new IllegalArgumentException("Cannot alter map keys: " + map); } // use field to apply updates to the value Type valueResult = field(map.fields().get(1), vResult); if (valueResult == null) { throw new IllegalArgumentException("Cannot delete value type from map: " + map); } if (map.valueType() == valueResult) { return map; } if (map.isValueOptional()) { return Types.MapType.ofOptional(map.keyId(), map.valueId(), map.keyType(), valueResult); } else { return Types.MapType.ofRequired(map.keyId(), map.valueId(), map.keyType(), valueResult); } }
if (nested.isMapType()) { parentField = nested.asMapType().fields().get(1); } else if (nested.isListType()) {
Preconditions.checkArgument(current.isMapType(), "Incompatible projected type: %s", current); Types.MapType m = current.asNestedType().asMapType(); this.current = Types.StructType.of(m.fields()); // create a struct to correspond to element try { Schema keyValueSchema = array.getElementType();
@Override public Map<String, Integer> map(Types.MapType map, Map<String, Integer> keyResult, Map<String, Integer> valueResult) { for (Types.NestedField field : map.fields()) { addField(field.name(), field.fieldId()); } return null; }