diff --git hcatalog/core/src/main/java/org/apache/hcatalog/data/schema/HCatSchema.java hcatalog/core/src/main/java/org/apache/hcatalog/data/schema/HCatSchema.java index 966ae8a..62cad18 100644 --- hcatalog/core/src/main/java/org/apache/hcatalog/data/schema/HCatSchema.java +++ hcatalog/core/src/main/java/org/apache/hcatalog/data/schema/HCatSchema.java @@ -36,6 +36,7 @@ private static final long serialVersionUID = 1L; private final List fieldSchemas; + //HCatFieldSchema.getName()->position private final Map fieldPositionMap; private final List fieldNames; @@ -118,7 +119,7 @@ public void remove(final HCatFieldSchema hcatFieldSchema) throws HCatException { } fieldSchemas.remove(hcatFieldSchema); - fieldPositionMap.remove(hcatFieldSchema); + fieldPositionMap.remove(hcatFieldSchema.getName()); fieldNames.remove(hcatFieldSchema.getName()); } diff --git hcatalog/core/src/test/java/org/apache/hcatalog/data/schema/TestHCatSchema.java hcatalog/core/src/test/java/org/apache/hcatalog/data/schema/TestHCatSchema.java index 17e5d93..e3cdf0b 100644 --- hcatalog/core/src/test/java/org/apache/hcatalog/data/schema/TestHCatSchema.java +++ hcatalog/core/src/test/java/org/apache/hcatalog/data/schema/TestHCatSchema.java @@ -76,4 +76,21 @@ public void testCannotInstantiateSchemaWithRepeatedFieldNames() throws HCatExcep assertTrue(iae.getMessage().contains("Field named memberID already exists")); } } + public void testRemoveAddField() throws HCatException { + List fieldSchemaList = new ArrayList(); + + fieldSchemaList.add(new HCatFieldSchema("memberID", HCatFieldSchema.Type.INT, "as a number")); + HCatFieldSchema locationField = new HCatFieldSchema("location", HCatFieldSchema.Type.STRING, "there's Waldo"); + fieldSchemaList.add(locationField); + HCatSchema schema = new HCatSchema(fieldSchemaList); + schema.remove(locationField); + Integer position = schema.getPosition(locationField.getName()); + assertTrue("position is not null after remove" , position == null); + try { + schema.append(locationField); + } + catch (HCatException ex) { + assertFalse(ex.getMessage(), true); + } + } }