METAMODEL-244: Implemented naming strategy support in csv module Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/0fcc4de3 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/0fcc4de3 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/0fcc4de3
Branch: refs/heads/master Commit: 0fcc4de38faa180a321f01ba724f112a70cd86f9 Parents: d5b9e12 Author: Kasper Sørensen <[email protected]> Authored: Sun Apr 24 13:48:28 2016 -0700 Committer: Kasper Sørensen <[email protected]> Committed: Sun Apr 24 13:48:28 2016 -0700 ---------------------------------------------------------------------- .../builder/DefaultColumnNamingStrategy.java | 2 + .../DefaultColumnNamingStrategyTest.java | 46 +++++++++++++++++++ .../apache/metamodel/csv/CsvConfiguration.java | 24 +++++++++- .../java/org/apache/metamodel/csv/CsvTable.java | 26 ++++++----- .../fixedwidth/FixedWidthConfiguration.java | 48 +++++++++++--------- 5 files changed, 111 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/0fcc4de3/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java index 9aef863..2cc9fb7 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java @@ -24,6 +24,8 @@ package org.apache.metamodel.schema.builder; */ public class DefaultColumnNamingStrategy extends DelegatingIntrinsicSwitchColumnNamingStrategy { + private static final long serialVersionUID = 1L; + public DefaultColumnNamingStrategy() { super(new UniqueColumnNamingStrategy(), new AlphabeticColumnNamingStrategy()); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/0fcc4de3/core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.java b/core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.java new file mode 100644 index 0000000..b903065 --- /dev/null +++ b/core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.java @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.schema.builder; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class DefaultColumnNamingStrategyTest { + + private final DefaultColumnNamingStrategy namingStrategy = new DefaultColumnNamingStrategy(); + + @Test + public void testDuplicateColumnNames() throws Exception { + try (final ColumnNamingSession session = namingStrategy.startColumnNamingSession()) { + assertEquals("foo", session.getNextColumnName(new ColumnNamingContextImpl(null, "foo", 0))); + assertEquals("bar", session.getNextColumnName(new ColumnNamingContextImpl(null, "bar", 1))); + assertEquals("foo2", session.getNextColumnName(new ColumnNamingContextImpl(null, "foo", 2))); + } + } + + @Test + public void testNoIntrinsicColumnNames() throws Exception { + try (final ColumnNamingSession session = namingStrategy.startColumnNamingSession()) { + assertEquals("A", session.getNextColumnName(new ColumnNamingContextImpl(null, "", 0))); + assertEquals("B", session.getNextColumnName(new ColumnNamingContextImpl(null, null, 1))); + assertEquals("C", session.getNextColumnName(new ColumnNamingContextImpl(null, "", 2))); + } + } +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/0fcc4de3/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java ---------------------------------------------------------------------- diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java b/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java index d45709c..4d1874c 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java @@ -21,6 +21,8 @@ package org.apache.metamodel.csv; import java.io.Serializable; import java.util.List; +import org.apache.metamodel.schema.builder.ColumnNamingStrategy; +import org.apache.metamodel.schema.builder.DefaultColumnNamingStrategy; import org.apache.metamodel.util.BaseObject; import org.apache.metamodel.util.FileHelper; @@ -50,6 +52,7 @@ public final class CsvConfiguration extends BaseObject implements Serializable { private final char escapeChar; private final boolean failOnInconsistentRowLength; private final boolean multilineValues; + private final ColumnNamingStrategy columnNamingStrategy; public CsvConfiguration() { this(DEFAULT_COLUMN_NAME_LINE); @@ -74,9 +77,16 @@ public final class CsvConfiguration extends BaseObject implements Serializable { char escapeChar, boolean failOnInconsistentRowLength) { this(columnNameLineNumber, encoding, separatorChar, quoteChar, escapeChar, failOnInconsistentRowLength, true); } - + public CsvConfiguration(int columnNameLineNumber, String encoding, char separatorChar, char quoteChar, char escapeChar, boolean failOnInconsistentRowLength, boolean multilineValues) { + this(columnNameLineNumber, null, encoding, separatorChar, quoteChar, escapeChar, failOnInconsistentRowLength, + multilineValues); + } + + public CsvConfiguration(int columnNameLineNumber, ColumnNamingStrategy columnNamingStrategy, String encoding, + char separatorChar, char quoteChar, char escapeChar, boolean failOnInconsistentRowLength, + boolean multilineValues) { this.columnNameLineNumber = columnNameLineNumber; this.encoding = encoding; this.separatorChar = separatorChar; @@ -84,6 +94,18 @@ public final class CsvConfiguration extends BaseObject implements Serializable { this.escapeChar = escapeChar; this.failOnInconsistentRowLength = failOnInconsistentRowLength; this.multilineValues = multilineValues; + this.columnNamingStrategy = null; + } + + /** + * Gets a {@link ColumnNamingStrategy} to use if needed. + * @return + */ + public ColumnNamingStrategy getColumnNamingStrategy() { + if (columnNamingStrategy == null) { + return new DefaultColumnNamingStrategy(); + } + return columnNamingStrategy; } /** http://git-wip-us.apache.org/repos/asf/metamodel/blob/0fcc4de3/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java ---------------------------------------------------------------------- diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java index b5ae485..e2a665d 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java @@ -27,7 +27,9 @@ import org.apache.metamodel.schema.MutableColumn; import org.apache.metamodel.schema.Relationship; import org.apache.metamodel.schema.Schema; import org.apache.metamodel.schema.TableType; -import org.apache.metamodel.util.AlphabeticSequence; +import org.apache.metamodel.schema.builder.ColumnNamingContextImpl; +import org.apache.metamodel.schema.builder.ColumnNamingSession; +import org.apache.metamodel.schema.builder.ColumnNamingStrategy; import org.apache.metamodel.util.FileHelper; import au.com.bytecode.opencsv.CSVReader; @@ -109,23 +111,23 @@ final class CsvTable extends AbstractTable { if (columnNames == null) { return new Column[0]; } - + final CsvConfiguration configuration = _schema.getDataContext().getConfiguration(); final int columnNameLineNumber = configuration.getColumnNameLineNumber(); final boolean nullable = !configuration.isFailOnInconsistentRowLength(); + final ColumnNamingStrategy columnNamingStrategy = configuration.getColumnNamingStrategy(); final Column[] columns = new Column[columnNames.length]; - final AlphabeticSequence sequence = new AlphabeticSequence(); - for (int i = 0; i < columnNames.length; i++) { - final String columnName; - if (columnNameLineNumber == CsvConfiguration.NO_COLUMN_NAME_LINE) { - columnName = sequence.next(); - } else { - columnName = columnNames[i]; + try (final ColumnNamingSession namingSession = columnNamingStrategy.startColumnNamingSession()) { + for (int i = 0; i < columnNames.length; i++) { + final String intrinsicColumnName = columnNameLineNumber == CsvConfiguration.NO_COLUMN_NAME_LINE ? null + : columnNames[i]; + final String columnName = namingSession.getNextColumnName(new ColumnNamingContextImpl(this, + intrinsicColumnName, i)); + final Column column = new MutableColumn(columnName, ColumnType.STRING, this, i, null, null, nullable, + null, false, null); + columns[i] = column; } - Column column = new MutableColumn(columnName, ColumnType.STRING, this, i, null, null, nullable, null, - false, null); - columns[i] = column; } return columns; } http://git-wip-us.apache.org/repos/asf/metamodel/blob/0fcc4de3/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java ---------------------------------------------------------------------- diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java index 6538f5c..9c0dd46 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java @@ -56,30 +56,34 @@ public final class FixedWidthConfiguration extends BaseObject implements false); } - public FixedWidthConfiguration(int columnNameLineNumber, String encoding, - int fixedValueWidth) { - this(columnNameLineNumber, encoding, fixedValueWidth, false); - } + public FixedWidthConfiguration(int columnNameLineNumber, String encoding, int fixedValueWidth) { + this(columnNameLineNumber, encoding, fixedValueWidth, false); + } - public FixedWidthConfiguration(int columnNameLineNumber, String encoding, - int fixedValueWidth, boolean failOnInconsistentLineWidth) { - this.encoding = encoding; - this.fixedValueWidth = fixedValueWidth; - this.columnNameLineNumber = columnNameLineNumber; - this.failOnInconsistentLineWidth = failOnInconsistentLineWidth; - this.columnNamingStrategy = null; - this.valueWidths = new int[0]; - } + public FixedWidthConfiguration(int columnNameLineNumber, String encoding, int fixedValueWidth, + boolean failOnInconsistentLineWidth) { + this.encoding = encoding; + this.fixedValueWidth = fixedValueWidth; + this.columnNameLineNumber = columnNameLineNumber; + this.failOnInconsistentLineWidth = failOnInconsistentLineWidth; + this.columnNamingStrategy = null; + this.valueWidths = new int[0]; + } - public FixedWidthConfiguration(int columnNameLineNumber, String encoding, - int[] valueWidths, boolean failOnInconsistentLineWidth) { - this.encoding = encoding; - this.fixedValueWidth = -1; - this.columnNameLineNumber = columnNameLineNumber; - this.failOnInconsistentLineWidth = failOnInconsistentLineWidth; - this.columnNamingStrategy = null; - this.valueWidths = valueWidths; - } + public FixedWidthConfiguration(int columnNameLineNumber, String encoding, + int[] valueWidths, boolean failOnInconsistentLineWidth) { + this(columnNameLineNumber, null, encoding, valueWidths, failOnInconsistentLineWidth); + } + + public FixedWidthConfiguration(int columnNameLineNumber, ColumnNamingStrategy columnNamingStrategy, String encoding, + int[] valueWidths, boolean failOnInconsistentLineWidth) { + this.encoding = encoding; + this.fixedValueWidth = -1; + this.columnNameLineNumber = columnNameLineNumber; + this.failOnInconsistentLineWidth = failOnInconsistentLineWidth; + this.columnNamingStrategy = columnNamingStrategy; + this.valueWidths = valueWidths; + } /** * The line number (1 based) from which to get the names of the columns.
