// for pull request 89 public void testColumnReordering() throws IOException { CsvFactory factory = new CsvFactory(); String CSV = "b,a,c\nvb,va,vc\n"; /* Test first column reordering, by setting the columns in a different order to the ones found in the CSV example */ CsvSchema schemaWithReordering = CsvSchema.builder() .addColumn("a") .addColumn("b") .addColumn("c") .setLineSeparator('\n') .setUseHeader(true) // must be set for column reordering .setReorderColumns(true) // set column reordering .build(); // Create a parser and ensure data is processed in the // right order, as per header CsvParser parser = factory.createParser(CSV); parser.setSchema(schemaWithReordering); assertEquals(JsonToken.START_OBJECT, parser.nextToken()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("b", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vb", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("a", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("va", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("c", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vc", parser.getValueAsString()); assertEquals(JsonToken.END_OBJECT, parser.nextToken()); /* Now make a copy of the schema but set the reordering flag to false. In this case the columns values are reported as per the schema order, not the header. */ CsvSchema schemaWithoutReordering = schemaWithReordering.withColumnReordering(false); parser = factory.createParser(CSV); parser.setSchema(schemaWithoutReordering); assertEquals(JsonToken.START_OBJECT, parser.nextToken()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("a", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vb", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("b", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("va", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("c", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vc", parser.getValueAsString()); assertEquals(JsonToken.END_OBJECT, parser.nextToken()); /* From the schema with reordering, disabling use header flag causes the same effect as the previous test. */ CsvSchema schemaWithoutHeader = schemaWithReordering.withUseHeader(false).withSkipFirstDataRow(true); parser = factory.createParser(CSV); parser.setSchema(schemaWithoutHeader); assertEquals(JsonToken.START_OBJECT, parser.nextToken()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("a", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vb", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("b", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("va", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("c", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vc", parser.getValueAsString()); assertEquals(JsonToken.END_OBJECT, parser.nextToken()); /* Finally, test an empty schema, where the header is use to set the columns, independently of the reordering flag. */ CsvSchema emptySchema = CsvSchema.builder().setLineSeparator('\n').setUseHeader(true).build(); parser = factory.createParser(CSV); parser.setSchema(emptySchema); assertEquals(JsonToken.START_OBJECT, parser.nextToken()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("b", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vb", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("a", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("va", parser.getValueAsString()); assertEquals(JsonToken.FIELD_NAME, parser.nextToken()); assertEquals("c", parser.getCurrentName()); assertEquals(JsonToken.VALUE_STRING, parser.nextToken()); assertEquals("vc", parser.getValueAsString()); assertEquals(JsonToken.END_OBJECT, parser.nextToken()); }