From 3d0666cabce5e6df40ec341bb1d21b74343d1e3f Mon Sep 17 00:00:00 2001 From: kaspersorensen Date: Fri, 22 Apr 2016 14:54:22 -0700 Subject: [PATCH 1/8] METAMODEL-244: Made ColumnNamingStrategy available to fixedwidth module --- .../AlphabeticColumnNamingStrategy.java | 36 +++++++++++ .../schema/builder/ColumnNamingContext.java | 52 +++++++++++++++ .../builder/ColumnNamingContextImpl.java | 64 +++++++++++++++++++ .../schema/builder/ColumnNamingStrategy.java | 37 +++++++++++ .../fixedwidth/FixedWidthConfiguration.java | 16 +++++ .../fixedwidth/FixedWidthDataContext.java | 16 +++-- 6 files changed, 214 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContext.java create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContextImpl.java create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java new file mode 100644 index 000000000..284e85109 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java @@ -0,0 +1,36 @@ +/** + * 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 org.apache.metamodel.util.AlphabeticSequence; + +public class AlphabeticColumnNamingStrategy implements ColumnNamingStrategy { + + @Override + public String getColumnName(ColumnNamingContext ctx) { + final int columnIndex = ctx.getColumnIndex(); + final AlphabeticSequence seq = new AlphabeticSequence("A"); + // naive way to get to the right value is to iterate - to be optimized + for (int i = 0; i < columnIndex; i++) { + seq.next(); + } + return seq.current(); + } + +} diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContext.java b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContext.java new file mode 100644 index 000000000..5bcfe5688 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContext.java @@ -0,0 +1,52 @@ +/** + * 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 org.apache.metamodel.schema.Table; + +/** + * Defines the context for naming a single column in a + * {@link ColumnNamingStrategy} session. + */ +public interface ColumnNamingContext { + + /** + * Gets the index of the column being named. + * + * @return + */ + public int getColumnIndex(); + + /** + * Gets the {@link Table} that the column is to pertain to. If the table is + * not yet available then this may return null. + * + * @return + */ + public Table getTable(); + + /** + * Gets the intrinsic column name, if this is defined in the datastore + * itself. This may be in the form of a header or such. Sometimes intrinsic + * column names exist only for some columns and sometimes there may be + * duplicate names or other anomalies which are often discouraged. + * + * @return + */ + public String getIntrinsicColumnName(); +} diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContextImpl.java b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContextImpl.java new file mode 100644 index 000000000..cd04f9800 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContextImpl.java @@ -0,0 +1,64 @@ +/** + * 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 org.apache.metamodel.schema.Table; + +public class ColumnNamingContextImpl implements ColumnNamingContext { + + private final int columnIndex; + private final Table table; + private final String intrinsicColumnName; + + /** + * + * @param table + * @param intrinsicColumnName + * @param columnIndex + */ + public ColumnNamingContextImpl(Table table, String intrinsicColumnName, int columnIndex) { + this.table = table; + this.intrinsicColumnName = intrinsicColumnName; + this.columnIndex = columnIndex; + } + + /** + * + * @param columnIndex + */ + public ColumnNamingContextImpl(int columnIndex) { + this(null, null, columnIndex); + } + + @Override + public int getColumnIndex() { + return columnIndex; + } + + @Override + public Table getTable() { + return table; + } + + @Override + public String getIntrinsicColumnName() { + return intrinsicColumnName; + } + +} diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java new file mode 100644 index 000000000..626daaf68 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java @@ -0,0 +1,37 @@ +/** + * 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; + +/** + * A strategy that defines how columns are logically named. Such strategies are + * mostly used when a particular datastore is not itself intrinsically + * specifying the column name. + */ +public interface ColumnNamingStrategy { + + /** + * Provides the name to apply for a given column. + * + * @param ctx + * the context of the column naming taking place. This contains + * column index, intrinsic name etc. if available. + * @return the name to provide to the column. + */ + public String getColumnName(ColumnNamingContext ctx); +} 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 86a038a1b..3b90b32a8 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java @@ -23,6 +23,8 @@ import java.util.List; import org.apache.metamodel.data.DataSet; +import org.apache.metamodel.schema.builder.AlphabeticColumnNamingStrategy; +import org.apache.metamodel.schema.builder.ColumnNamingStrategy; import org.apache.metamodel.util.BaseObject; import org.apache.metamodel.util.FileHelper; @@ -42,6 +44,7 @@ public final class FixedWidthConfiguration extends BaseObject implements private final int[] valueWidths; private final int columnNameLineNumber; private final boolean failOnInconsistentLineWidth; + private final ColumnNamingStrategy columnNamingStrategy; public FixedWidthConfiguration(int fixedValueWidth) { this(DEFAULT_COLUMN_NAME_LINE, FileHelper.DEFAULT_ENCODING, @@ -64,6 +67,7 @@ public FixedWidthConfiguration(int columnNameLineNumber, String encoding, this.fixedValueWidth = fixedValueWidth; this.columnNameLineNumber = columnNameLineNumber; this.failOnInconsistentLineWidth = failOnInconsistentLineWidth; + this.columnNamingStrategy = null; this.valueWidths = new int[0]; } @@ -73,6 +77,7 @@ public FixedWidthConfiguration(int columnNameLineNumber, String encoding, this.fixedValueWidth = -1; this.columnNameLineNumber = columnNameLineNumber; this.failOnInconsistentLineWidth = failOnInconsistentLineWidth; + this.columnNamingStrategy = null; this.valueWidths = valueWidths; } @@ -84,6 +89,17 @@ public FixedWidthConfiguration(int columnNameLineNumber, String encoding, public int getColumnNameLineNumber() { return columnNameLineNumber; } + + /** + * Gets a {@link ColumnNamingStrategy} to use if needed. + * @return + */ + public ColumnNamingStrategy getColumnNamingStrategy() { + if (columnNamingStrategy == null) { + return new AlphabeticColumnNamingStrategy(); + } + return columnNamingStrategy; + } /** * Gets the file encoding to use for reading the file. diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java index 48768472d..fcc31ed95 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java @@ -33,7 +33,8 @@ import org.apache.metamodel.schema.Schema; import org.apache.metamodel.schema.Table; 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.ColumnNamingStrategy; import org.apache.metamodel.util.FileHelper; import org.apache.metamodel.util.FileResource; import org.apache.metamodel.util.Resource; @@ -127,11 +128,12 @@ protected Schema getMainSchema() throws MetaModelException { } columnNames = reader.readLine(); } else { + final ColumnNamingStrategy columnNamingStrategy = _configuration.getColumnNamingStrategy(); columnNames = reader.readLine(); if (columnNames != null) { - AlphabeticSequence sequence = new AlphabeticSequence(); for (int i = 0; i < columnNames.length; i++) { - columnNames[i] = sequence.next(); + columnNames[i] = columnNamingStrategy.getColumnName(new ColumnNamingContextImpl(table, null, + i)); } } } @@ -179,11 +181,11 @@ private FixedWidthReader createReader() { final Reader fileReader = FileHelper.getReader(inputStream, _configuration.getEncoding()); final FixedWidthReader reader; if (_configuration.isConstantValueWidth()) { - reader = new FixedWidthReader(fileReader, _configuration.getFixedValueWidth(), - _configuration.isFailOnInconsistentLineWidth()); + reader = new FixedWidthReader(fileReader, _configuration.getFixedValueWidth(), _configuration + .isFailOnInconsistentLineWidth()); } else { - reader = new FixedWidthReader(fileReader, _configuration.getValueWidths(), - _configuration.isFailOnInconsistentLineWidth()); + reader = new FixedWidthReader(fileReader, _configuration.getValueWidths(), _configuration + .isFailOnInconsistentLineWidth()); } return reader; } From 0da8f1a1cb9fa8bfe87eb73f38df047d111e196d Mon Sep 17 00:00:00 2001 From: kaspersorensen Date: Fri, 22 Apr 2016 15:50:06 -0700 Subject: [PATCH 2/8] METAMODEL-244: Refactored fixedwidth module a bit and added strategies --- .../AlphabeticColumnNamingStrategy.java | 12 ++--- .../schema/builder/ColumnNamingStrategy.java | 2 +- .../builder/DefaultColumnNamingStrategy.java | 31 ++++++++++++ ...ngIntrinsicSwitchColumnNamingStrategy.java | 46 +++++++++++++++++ .../builder/UniqueColumnNamingStrategy.java | 50 +++++++++++++++++++ .../fixedwidth/FixedWidthConfiguration.java | 4 +- .../fixedwidth/FixedWidthDataContext.java | 17 ++++--- 7 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java index 284e85109..83679a317 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java @@ -21,16 +21,12 @@ import org.apache.metamodel.util.AlphabeticSequence; public class AlphabeticColumnNamingStrategy implements ColumnNamingStrategy { + + private final AlphabeticSequence seq = new AlphabeticSequence(); @Override - public String getColumnName(ColumnNamingContext ctx) { - final int columnIndex = ctx.getColumnIndex(); - final AlphabeticSequence seq = new AlphabeticSequence("A"); - // naive way to get to the right value is to iterate - to be optimized - for (int i = 0; i < columnIndex; i++) { - seq.next(); - } - return seq.current(); + public String getNextColumnName(ColumnNamingContext ctx) { + return seq.next(); } } diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java index 626daaf68..4923c58fd 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java @@ -33,5 +33,5 @@ public interface ColumnNamingStrategy { * column index, intrinsic name etc. if available. * @return the name to provide to the column. */ - public String getColumnName(ColumnNamingContext ctx); + public String getNextColumnName(ColumnNamingContext ctx); } 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 new file mode 100644 index 000000000..9aef86371 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java @@ -0,0 +1,31 @@ +/** + * 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; + +/** + * The default (in most cases) {@link ColumnNamingStrategy} to use when no other + * strategy is specified. + */ +public class DefaultColumnNamingStrategy extends DelegatingIntrinsicSwitchColumnNamingStrategy { + + public DefaultColumnNamingStrategy() { + super(new UniqueColumnNamingStrategy(), new AlphabeticColumnNamingStrategy()); + } + +} diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java new file mode 100644 index 000000000..99cdaf5db --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.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; + +/** + * A {@link ColumnNamingStrategy} that switches between two other + * {@link ColumnNamingStrategy} delegates depending on the availability of a + * intrinsic column name. + */ +public class DelegatingIntrinsicSwitchColumnNamingStrategy implements ColumnNamingStrategy { + + private final ColumnNamingStrategy intrinsicStrategy; + private final ColumnNamingStrategy nonIntrinsicStrategy; + + public DelegatingIntrinsicSwitchColumnNamingStrategy(ColumnNamingStrategy intrinsicStrategy, + ColumnNamingStrategy nonIntrinsicStrategy) { + this.intrinsicStrategy = intrinsicStrategy; + this.nonIntrinsicStrategy = nonIntrinsicStrategy; + } + + @Override + public String getNextColumnName(ColumnNamingContext ctx) { + final String intrinsicColumnName = ctx.getIntrinsicColumnName(); + if (intrinsicColumnName == null || intrinsicColumnName.isEmpty()) { + return nonIntrinsicStrategy.getNextColumnName(ctx); + } + return intrinsicStrategy.getNextColumnName(ctx); + } + +} diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java new file mode 100644 index 000000000..937105956 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java @@ -0,0 +1,50 @@ +/** + * 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 java.util.HashSet; +import java.util.Set; + +/** + * A {@link ColumnNamingStrategy} that uses the intrinsic column names, but + * ensures that all column names are unique. When duplicate names are + * encountered a number will be appended yielding column names like "name", + * "name1", "name2" etc. + */ +public class UniqueColumnNamingStrategy implements ColumnNamingStrategy { + + private final Set names = new HashSet<>(); + + @Override + public String getNextColumnName(ColumnNamingContext ctx) { + final String intrinsicName = ctx.getIntrinsicColumnName(); + boolean unique = names.add(intrinsicName); + if (unique) { + return intrinsicName; + } + + String newName = null; + for (int i = 2; !unique; i++) { + newName = intrinsicName + i; + unique = names.add(newName); + } + return newName; + } + +} 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 3b90b32a8..6538f5c51 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java @@ -23,8 +23,8 @@ import java.util.List; import org.apache.metamodel.data.DataSet; -import org.apache.metamodel.schema.builder.AlphabeticColumnNamingStrategy; 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; @@ -96,7 +96,7 @@ public int getColumnNameLineNumber() { */ public ColumnNamingStrategy getColumnNamingStrategy() { if (columnNamingStrategy == null) { - return new AlphabeticColumnNamingStrategy(); + return new DefaultColumnNamingStrategy(); } return columnNamingStrategy; } diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java index fcc31ed95..0a326ccde 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java @@ -122,19 +122,22 @@ protected Schema getMainSchema() throws MetaModelException { final FixedWidthReader reader = createReader(); final String[] columnNames; try { - if (_configuration.getColumnNameLineNumber() != FixedWidthConfiguration.NO_COLUMN_NAME_LINE) { + final boolean hasColumnHeader = _configuration + .getColumnNameLineNumber() != FixedWidthConfiguration.NO_COLUMN_NAME_LINE; + if (hasColumnHeader) { for (int i = 1; i < _configuration.getColumnNameLineNumber(); i++) { reader.readLine(); } columnNames = reader.readLine(); } else { - final ColumnNamingStrategy columnNamingStrategy = _configuration.getColumnNamingStrategy(); columnNames = reader.readLine(); - if (columnNames != null) { - for (int i = 0; i < columnNames.length; i++) { - columnNames[i] = columnNamingStrategy.getColumnName(new ColumnNamingContextImpl(table, null, - i)); - } + } + final ColumnNamingStrategy columnNamingStrategy = _configuration.getColumnNamingStrategy(); + if (columnNames != null) { + for (int i = 0; i < columnNames.length; i++) { + final String intrinsicColumnName = hasColumnHeader ? columnNames[i] : null; + columnNames[i] = columnNamingStrategy.getNextColumnName(new ColumnNamingContextImpl(table, + intrinsicColumnName, i)); } } } finally { From d5b9e12a016e94af78cceeeaf966a226afe8650d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20S=C3=B8rensen?= Date: Sun, 24 Apr 2016 13:32:15 -0700 Subject: [PATCH 3/8] METAMODEL-244: Scoped the column naming session and state into an object --- .../AlphabeticColumnNamingStrategy.java | 19 ++++++-- .../schema/builder/ColumnNamingSession.java | 47 +++++++++++++++++++ .../schema/builder/ColumnNamingStrategy.java | 16 ++----- ...ngIntrinsicSwitchColumnNamingStrategy.java | 28 ++++++++--- .../builder/UniqueColumnNamingStrategy.java | 40 ++++++++++------ .../fixedwidth/FixedWidthDataContext.java | 11 +++-- 6 files changed, 121 insertions(+), 40 deletions(-) create mode 100644 core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingSession.java diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java index 83679a317..91d1b85e6 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java @@ -21,12 +21,23 @@ import org.apache.metamodel.util.AlphabeticSequence; public class AlphabeticColumnNamingStrategy implements ColumnNamingStrategy { - - private final AlphabeticSequence seq = new AlphabeticSequence(); + + private static final long serialVersionUID = 1L; @Override - public String getNextColumnName(ColumnNamingContext ctx) { - return seq.next(); + public ColumnNamingSession startColumnNamingSession() { + return new ColumnNamingSession() { + private final AlphabeticSequence seq = new AlphabeticSequence(); + + @Override + public String getNextColumnName(ColumnNamingContext ctx) { + return seq.next(); + } + + @Override + public void close() { + } + }; } } diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingSession.java b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingSession.java new file mode 100644 index 000000000..2c6f7b222 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingSession.java @@ -0,0 +1,47 @@ +/** + * 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 java.io.Closeable; + +import org.apache.metamodel.schema.Column; +import org.apache.metamodel.schema.Table; + +/** + * Represents a 'session' in which a single {@link Table}'s {@link Column}s are + * named. + */ +public interface ColumnNamingSession extends Closeable { + + /** + * Provides the name to apply for a given column. + * + * @param ctx + * the context of the column naming taking place. This contains + * column index, intrinsic name etc. if available. + * @return the name to provide to the column. + */ + public String getNextColumnName(ColumnNamingContext ctx); + + /** + * Ends the column naming session. + */ + @Override + public void close(); +} diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java index 4923c58fd..2219fb78d 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java @@ -18,20 +18,14 @@ */ package org.apache.metamodel.schema.builder; +import java.io.Serializable; + /** * A strategy that defines how columns are logically named. Such strategies are * mostly used when a particular datastore is not itself intrinsically * specifying the column name. */ -public interface ColumnNamingStrategy { - - /** - * Provides the name to apply for a given column. - * - * @param ctx - * the context of the column naming taking place. This contains - * column index, intrinsic name etc. if available. - * @return the name to provide to the column. - */ - public String getNextColumnName(ColumnNamingContext ctx); +public interface ColumnNamingStrategy extends Serializable { + + public ColumnNamingSession startColumnNamingSession(); } diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java index 99cdaf5db..612f81d67 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java @@ -25,6 +25,7 @@ */ public class DelegatingIntrinsicSwitchColumnNamingStrategy implements ColumnNamingStrategy { + private static final long serialVersionUID = 1L; private final ColumnNamingStrategy intrinsicStrategy; private final ColumnNamingStrategy nonIntrinsicStrategy; @@ -35,12 +36,25 @@ public DelegatingIntrinsicSwitchColumnNamingStrategy(ColumnNamingStrategy intrin } @Override - public String getNextColumnName(ColumnNamingContext ctx) { - final String intrinsicColumnName = ctx.getIntrinsicColumnName(); - if (intrinsicColumnName == null || intrinsicColumnName.isEmpty()) { - return nonIntrinsicStrategy.getNextColumnName(ctx); - } - return intrinsicStrategy.getNextColumnName(ctx); - } + public ColumnNamingSession startColumnNamingSession() { + final ColumnNamingSession intrinsicSession = intrinsicStrategy.startColumnNamingSession(); + final ColumnNamingSession nonIntrinsicSession = nonIntrinsicStrategy.startColumnNamingSession(); + return new ColumnNamingSession() { + + @Override + public String getNextColumnName(ColumnNamingContext ctx) { + final String intrinsicColumnName = ctx.getIntrinsicColumnName(); + if (intrinsicColumnName == null || intrinsicColumnName.isEmpty()) { + return nonIntrinsicSession.getNextColumnName(ctx); + } + return intrinsicSession.getNextColumnName(ctx); + } + @Override + public void close() { + intrinsicSession.close(); + nonIntrinsicSession.close(); + } + }; + } } diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java index 937105956..17e783061 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java @@ -29,22 +29,34 @@ */ public class UniqueColumnNamingStrategy implements ColumnNamingStrategy { - private final Set names = new HashSet<>(); + private static final long serialVersionUID = 1L; @Override - public String getNextColumnName(ColumnNamingContext ctx) { - final String intrinsicName = ctx.getIntrinsicColumnName(); - boolean unique = names.add(intrinsicName); - if (unique) { - return intrinsicName; - } - - String newName = null; - for (int i = 2; !unique; i++) { - newName = intrinsicName + i; - unique = names.add(newName); - } - return newName; + public ColumnNamingSession startColumnNamingSession() { + return new ColumnNamingSession() { + + private final Set names = new HashSet<>(); + + @Override + public String getNextColumnName(ColumnNamingContext ctx) { + final String intrinsicName = ctx.getIntrinsicColumnName(); + boolean unique = names.add(intrinsicName); + if (unique) { + return intrinsicName; + } + + String newName = null; + for (int i = 2; !unique; i++) { + newName = intrinsicName + i; + unique = names.add(newName); + } + return newName; + } + + @Override + public void close() { + } + }; } } diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java index 0a326ccde..25a8457f6 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java @@ -34,6 +34,7 @@ import org.apache.metamodel.schema.Table; import org.apache.metamodel.schema.TableType; 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 org.apache.metamodel.util.FileResource; @@ -134,10 +135,12 @@ protected Schema getMainSchema() throws MetaModelException { } final ColumnNamingStrategy columnNamingStrategy = _configuration.getColumnNamingStrategy(); if (columnNames != null) { - for (int i = 0; i < columnNames.length; i++) { - final String intrinsicColumnName = hasColumnHeader ? columnNames[i] : null; - columnNames[i] = columnNamingStrategy.getNextColumnName(new ColumnNamingContextImpl(table, - intrinsicColumnName, i)); + try (final ColumnNamingSession columnNamingSession = columnNamingStrategy.startColumnNamingSession()) { + for (int i = 0; i < columnNames.length; i++) { + final String intrinsicColumnName = hasColumnHeader ? columnNames[i] : null; + columnNames[i] = columnNamingSession.getNextColumnName(new ColumnNamingContextImpl(table, + intrinsicColumnName, i)); + } } } } finally { From 0fcc4de38faa180a321f01ba724f112a70cd86f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20S=C3=B8rensen?= Date: Sun, 24 Apr 2016 13:48:28 -0700 Subject: [PATCH 4/8] METAMODEL-244: Implemented naming strategy support in csv module --- .../builder/DefaultColumnNamingStrategy.java | 2 + .../DefaultColumnNamingStrategyTest.java | 46 ++++++++++++++++++ .../metamodel/csv/CsvConfiguration.java | 24 +++++++++- .../org/apache/metamodel/csv/CsvTable.java | 26 +++++----- .../fixedwidth/FixedWidthConfiguration.java | 48 ++++++++++--------- 5 files changed, 111 insertions(+), 35 deletions(-) create mode 100644 core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.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 9aef86371..2cc9fb776 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 @@ */ public class DefaultColumnNamingStrategy extends DelegatingIntrinsicSwitchColumnNamingStrategy { + private static final long serialVersionUID = 1L; + public DefaultColumnNamingStrategy() { super(new UniqueColumnNamingStrategy(), new AlphabeticColumnNamingStrategy()); } 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 000000000..b903065a8 --- /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))); + } + } +} 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 d45709cc3..4d1874c3f 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 @@ 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 CsvConfiguration(int columnNameLineNumber, String encoding, char separato 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 CsvConfiguration(int columnNameLineNumber, String encoding, char separato 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; } /** 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 b5ae485a3..e2a665d7d 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.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 @@ private Column[] buildColumns(final String[] columnNames) { 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; } 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 6538f5c51..9c0dd461c 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 FixedWidthConfiguration(int[] valueWidth) { 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. From a2314f8da2379f7c6da264b1f20071fa77ac832e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20S=C3=B8rensen?= Date: Sun, 24 Apr 2016 13:54:40 -0700 Subject: [PATCH 5/8] METAMODEL-244: Moved to pkg org.apache.metamodel.schema.naming --- .../DelegatingIntrinsicSwitchColumnNamingStrategy.java | 4 ++++ .../{builder => naming}/AlphabeticColumnNamingStrategy.java | 2 +- .../schema/{builder => naming}/ColumnNamingContext.java | 2 +- .../schema/{builder => naming}/ColumnNamingContextImpl.java | 2 +- .../schema/{builder => naming}/ColumnNamingSession.java | 2 +- .../schema/{builder => naming}/ColumnNamingStrategy.java | 2 +- .../{builder => naming}/DefaultColumnNamingStrategy.java | 4 +++- .../{builder => naming}/UniqueColumnNamingStrategy.java | 2 +- .../DefaultColumnNamingStrategyTest.java | 5 ++++- .../java/org/apache/metamodel/csv/CsvConfiguration.java | 4 ++-- csv/src/main/java/org/apache/metamodel/csv/CsvTable.java | 6 +++--- .../metamodel/fixedwidth/FixedWidthConfiguration.java | 4 ++-- .../apache/metamodel/fixedwidth/FixedWidthDataContext.java | 6 +++--- 13 files changed, 27 insertions(+), 18 deletions(-) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/AlphabeticColumnNamingStrategy.java (94%) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/ColumnNamingContext.java (94%) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/ColumnNamingContextImpl.java (94%) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/ColumnNamingSession.java (97%) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/ColumnNamingStrategy.java (93%) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/DefaultColumnNamingStrategy.java (87%) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/UniqueColumnNamingStrategy.java (95%) rename core/src/test/java/org/apache/metamodel/schema/{builder => naming}/DefaultColumnNamingStrategyTest.java (89%) diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java index 612f81d67..4fa5d306f 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java @@ -18,6 +18,10 @@ */ package org.apache.metamodel.schema.builder; +import org.apache.metamodel.schema.naming.ColumnNamingContext; +import org.apache.metamodel.schema.naming.ColumnNamingSession; +import org.apache.metamodel.schema.naming.ColumnNamingStrategy; + /** * A {@link ColumnNamingStrategy} that switches between two other * {@link ColumnNamingStrategy} delegates depending on the availability of a diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/naming/AlphabeticColumnNamingStrategy.java similarity index 94% rename from core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java rename to core/src/main/java/org/apache/metamodel/schema/naming/AlphabeticColumnNamingStrategy.java index 91d1b85e6..f6575c746 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/AlphabeticColumnNamingStrategy.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; +package org.apache.metamodel.schema.naming; import org.apache.metamodel.util.AlphabeticSequence; diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContext.java b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingContext.java similarity index 94% rename from core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContext.java rename to core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingContext.java index 5bcfe5688..b6139132f 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContext.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingContext.java @@ -15,7 +15,7 @@ * 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; + */package org.apache.metamodel.schema.naming; import org.apache.metamodel.schema.Table; diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContextImpl.java b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingContextImpl.java similarity index 94% rename from core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContextImpl.java rename to core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingContextImpl.java index cd04f9800..cc7a24edd 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingContextImpl.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingContextImpl.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; +package org.apache.metamodel.schema.naming; import org.apache.metamodel.schema.Table; diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingSession.java b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingSession.java similarity index 97% rename from core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingSession.java rename to core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingSession.java index 2c6f7b222..85e5261fe 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingSession.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingSession.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; +package org.apache.metamodel.schema.naming; import java.io.Closeable; diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingStrategy.java similarity index 93% rename from core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java rename to core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingStrategy.java index 2219fb78d..6ccccbfa3 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingStrategy.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; +package org.apache.metamodel.schema.naming; import java.io.Serializable; diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategy.java similarity index 87% rename from core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java rename to core/src/main/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategy.java index 2cc9fb776..f0bcb235a 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategy.java @@ -16,7 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; +package org.apache.metamodel.schema.naming; + +import org.apache.metamodel.schema.builder.DelegatingIntrinsicSwitchColumnNamingStrategy; /** * The default (in most cases) {@link ColumnNamingStrategy} to use when no other diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/naming/UniqueColumnNamingStrategy.java similarity index 95% rename from core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java rename to core/src/main/java/org/apache/metamodel/schema/naming/UniqueColumnNamingStrategy.java index 17e783061..e5288fecd 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/UniqueColumnNamingStrategy.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; +package org.apache.metamodel.schema.naming; import java.util.HashSet; import java.util.Set; diff --git a/core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.java b/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java similarity index 89% rename from core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.java rename to core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java index b903065a8..c8c408bae 100644 --- a/core/src/test/java/org/apache/metamodel/schema/builder/DefaultColumnNamingStrategyTest.java +++ b/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java @@ -16,10 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; +package org.apache.metamodel.schema.naming; import static org.junit.Assert.*; +import org.apache.metamodel.schema.naming.ColumnNamingContextImpl; +import org.apache.metamodel.schema.naming.ColumnNamingSession; +import org.apache.metamodel.schema.naming.DefaultColumnNamingStrategy; import org.junit.Test; public class DefaultColumnNamingStrategyTest { 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 4d1874c3f..dd1c8acf1 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java @@ -21,8 +21,8 @@ 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.schema.naming.ColumnNamingStrategy; +import org.apache.metamodel.schema.naming.DefaultColumnNamingStrategy; import org.apache.metamodel.util.BaseObject; import org.apache.metamodel.util.FileHelper; 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 e2a665d7d..334af7e0a 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java @@ -27,9 +27,9 @@ import org.apache.metamodel.schema.Relationship; import org.apache.metamodel.schema.Schema; import org.apache.metamodel.schema.TableType; -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.schema.naming.ColumnNamingContextImpl; +import org.apache.metamodel.schema.naming.ColumnNamingSession; +import org.apache.metamodel.schema.naming.ColumnNamingStrategy; import org.apache.metamodel.util.FileHelper; import au.com.bytecode.opencsv.CSVReader; 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 9c0dd461c..bbdd0adb9 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java @@ -23,8 +23,8 @@ import java.util.List; import org.apache.metamodel.data.DataSet; -import org.apache.metamodel.schema.builder.ColumnNamingStrategy; -import org.apache.metamodel.schema.builder.DefaultColumnNamingStrategy; +import org.apache.metamodel.schema.naming.ColumnNamingStrategy; +import org.apache.metamodel.schema.naming.DefaultColumnNamingStrategy; import org.apache.metamodel.util.BaseObject; import org.apache.metamodel.util.FileHelper; diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java index 25a8457f6..d28a0b278 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java @@ -33,9 +33,9 @@ import org.apache.metamodel.schema.Schema; import org.apache.metamodel.schema.Table; import org.apache.metamodel.schema.TableType; -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.schema.naming.ColumnNamingContextImpl; +import org.apache.metamodel.schema.naming.ColumnNamingSession; +import org.apache.metamodel.schema.naming.ColumnNamingStrategy; import org.apache.metamodel.util.FileHelper; import org.apache.metamodel.util.FileResource; import org.apache.metamodel.util.Resource; From 28cd2cd07f4bd385fed81dab10df8cf369e33fd5 Mon Sep 17 00:00:00 2001 From: kaspersorensen Date: Tue, 26 Apr 2016 08:28:37 -0700 Subject: [PATCH 6/8] Added underscore to generated name's suffix --- .../metamodel/schema/naming/UniqueColumnNamingStrategy.java | 4 ++-- .../schema/naming/DefaultColumnNamingStrategyTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/metamodel/schema/naming/UniqueColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/naming/UniqueColumnNamingStrategy.java index e5288fecd..d4d21dd5b 100644 --- a/core/src/main/java/org/apache/metamodel/schema/naming/UniqueColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/UniqueColumnNamingStrategy.java @@ -25,7 +25,7 @@ * A {@link ColumnNamingStrategy} that uses the intrinsic column names, but * ensures that all column names are unique. When duplicate names are * encountered a number will be appended yielding column names like "name", - * "name1", "name2" etc. + * "name_2", "name_3" etc. */ public class UniqueColumnNamingStrategy implements ColumnNamingStrategy { @@ -47,7 +47,7 @@ public String getNextColumnName(ColumnNamingContext ctx) { String newName = null; for (int i = 2; !unique; i++) { - newName = intrinsicName + i; + newName = intrinsicName + '_' + i; unique = names.add(newName); } return newName; diff --git a/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java b/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java index c8c408bae..a293939cf 100644 --- a/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java +++ b/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java @@ -34,7 +34,7 @@ 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))); + assertEquals("foo_2", session.getNextColumnName(new ColumnNamingContextImpl(null, "foo", 2))); } } From c1e1d52f9517f2a60c7d04033445517abbda0bbc Mon Sep 17 00:00:00 2001 From: kaspersorensen Date: Tue, 26 Apr 2016 12:08:47 -0700 Subject: [PATCH 7/8] Removed DefaultColumnNamingStrategy in favor of a factory method --- ...Strategy.java => ColumnNamingStrategies.java} | 16 ++++++++-------- ...atingIntrinsicSwitchColumnNamingStrategy.java | 6 +----- .../naming/DefaultColumnNamingStrategyTest.java | 7 ++----- .../apache/metamodel/csv/CsvConfiguration.java | 4 ++-- .../fixedwidth/FixedWidthConfiguration.java | 4 ++-- 5 files changed, 15 insertions(+), 22 deletions(-) rename core/src/main/java/org/apache/metamodel/schema/naming/{DefaultColumnNamingStrategy.java => ColumnNamingStrategies.java} (62%) rename core/src/main/java/org/apache/metamodel/schema/{builder => naming}/DelegatingIntrinsicSwitchColumnNamingStrategy.java (89%) diff --git a/core/src/main/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingStrategies.java similarity index 62% rename from core/src/main/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategy.java rename to core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingStrategies.java index f0bcb235a..de78338b0 100644 --- a/core/src/main/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/ColumnNamingStrategies.java @@ -18,18 +18,18 @@ */ package org.apache.metamodel.schema.naming; -import org.apache.metamodel.schema.builder.DelegatingIntrinsicSwitchColumnNamingStrategy; - /** - * The default (in most cases) {@link ColumnNamingStrategy} to use when no other - * strategy is specified. + * Constructors and common utilities for {@link ColumnNamingStrategy} objects. */ -public class DefaultColumnNamingStrategy extends DelegatingIntrinsicSwitchColumnNamingStrategy { +public class ColumnNamingStrategies { - private static final long serialVersionUID = 1L; + private static final DelegatingIntrinsicSwitchColumnNamingStrategy DEFAULT_STRATEGY = new DelegatingIntrinsicSwitchColumnNamingStrategy( + new UniqueColumnNamingStrategy(), new AlphabeticColumnNamingStrategy()); - public DefaultColumnNamingStrategy() { - super(new UniqueColumnNamingStrategy(), new AlphabeticColumnNamingStrategy()); + private ColumnNamingStrategies() { } + public static ColumnNamingStrategy defaultStrategy() { + return DEFAULT_STRATEGY; + } } diff --git a/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java b/core/src/main/java/org/apache/metamodel/schema/naming/DelegatingIntrinsicSwitchColumnNamingStrategy.java similarity index 89% rename from core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java rename to core/src/main/java/org/apache/metamodel/schema/naming/DelegatingIntrinsicSwitchColumnNamingStrategy.java index 4fa5d306f..e18cb3a56 100644 --- a/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java +++ b/core/src/main/java/org/apache/metamodel/schema/naming/DelegatingIntrinsicSwitchColumnNamingStrategy.java @@ -16,11 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.metamodel.schema.builder; - -import org.apache.metamodel.schema.naming.ColumnNamingContext; -import org.apache.metamodel.schema.naming.ColumnNamingSession; -import org.apache.metamodel.schema.naming.ColumnNamingStrategy; +package org.apache.metamodel.schema.naming; /** * A {@link ColumnNamingStrategy} that switches between two other diff --git a/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java b/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java index a293939cf..eb618c25d 100644 --- a/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java +++ b/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java @@ -18,16 +18,13 @@ */ package org.apache.metamodel.schema.naming; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; -import org.apache.metamodel.schema.naming.ColumnNamingContextImpl; -import org.apache.metamodel.schema.naming.ColumnNamingSession; -import org.apache.metamodel.schema.naming.DefaultColumnNamingStrategy; import org.junit.Test; public class DefaultColumnNamingStrategyTest { - private final DefaultColumnNamingStrategy namingStrategy = new DefaultColumnNamingStrategy(); + private final ColumnNamingStrategy namingStrategy = ColumnNamingStrategies.defaultStrategy(); @Test public void testDuplicateColumnNames() throws Exception { 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 dd1c8acf1..abcf2d4c3 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java @@ -21,8 +21,8 @@ import java.io.Serializable; import java.util.List; +import org.apache.metamodel.schema.naming.ColumnNamingStrategies; import org.apache.metamodel.schema.naming.ColumnNamingStrategy; -import org.apache.metamodel.schema.naming.DefaultColumnNamingStrategy; import org.apache.metamodel.util.BaseObject; import org.apache.metamodel.util.FileHelper; @@ -103,7 +103,7 @@ public CsvConfiguration(int columnNameLineNumber, ColumnNamingStrategy columnNam */ public ColumnNamingStrategy getColumnNamingStrategy() { if (columnNamingStrategy == null) { - return new DefaultColumnNamingStrategy(); + return ColumnNamingStrategies.defaultStrategy(); } return columnNamingStrategy; } 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 bbdd0adb9..6e9f0f1fd 100644 --- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java +++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthConfiguration.java @@ -23,8 +23,8 @@ import java.util.List; import org.apache.metamodel.data.DataSet; +import org.apache.metamodel.schema.naming.ColumnNamingStrategies; import org.apache.metamodel.schema.naming.ColumnNamingStrategy; -import org.apache.metamodel.schema.naming.DefaultColumnNamingStrategy; import org.apache.metamodel.util.BaseObject; import org.apache.metamodel.util.FileHelper; @@ -100,7 +100,7 @@ public int getColumnNameLineNumber() { */ public ColumnNamingStrategy getColumnNamingStrategy() { if (columnNamingStrategy == null) { - return new DefaultColumnNamingStrategy(); + return ColumnNamingStrategies.defaultStrategy(); } return columnNamingStrategy; } From 410759094569f6e12850eb7b24eee8eaf29e0da9 Mon Sep 17 00:00:00 2001 From: kaspersorensen Date: Tue, 26 Apr 2016 12:39:03 -0700 Subject: [PATCH 8/8] Moved test to DelegatingIntrinsicSwitchColumnNamingStrategyTest --- ...legatingIntrinsicSwitchColumnNamingStrategyTest.java} | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) rename core/src/test/java/org/apache/metamodel/schema/naming/{DefaultColumnNamingStrategyTest.java => DelegatingIntrinsicSwitchColumnNamingStrategyTest.java} (87%) diff --git a/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java b/core/src/test/java/org/apache/metamodel/schema/naming/DelegatingIntrinsicSwitchColumnNamingStrategyTest.java similarity index 87% rename from core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java rename to core/src/test/java/org/apache/metamodel/schema/naming/DelegatingIntrinsicSwitchColumnNamingStrategyTest.java index eb618c25d..a10ec7cdd 100644 --- a/core/src/test/java/org/apache/metamodel/schema/naming/DefaultColumnNamingStrategyTest.java +++ b/core/src/test/java/org/apache/metamodel/schema/naming/DelegatingIntrinsicSwitchColumnNamingStrategyTest.java @@ -18,13 +18,18 @@ */ package org.apache.metamodel.schema.naming; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import org.junit.Test; -public class DefaultColumnNamingStrategyTest { +public class DelegatingIntrinsicSwitchColumnNamingStrategyTest { private final ColumnNamingStrategy namingStrategy = ColumnNamingStrategies.defaultStrategy(); + + @Test + public void testItIsTheDefaultStrategy() throws Exception { + assertTrue(namingStrategy instanceof DelegatingIntrinsicSwitchColumnNamingStrategy); + } @Test public void testDuplicateColumnNames() throws Exception {