METAMODEL-244: Refactored fixedwidth module a bit and added strategies Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/0da8f1a1 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/0da8f1a1 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/0da8f1a1
Branch: refs/heads/master Commit: 0da8f1a1cb9fa8bfe87eb73f38df047d111e196d Parents: 3d0666c Author: kaspersorensen <[email protected]> Authored: Fri Apr 22 15:50:06 2016 -0700 Committer: kaspersorensen <[email protected]> Committed: Fri Apr 22 15:50:06 2016 -0700 ---------------------------------------------------------------------- .../builder/AlphabeticColumnNamingStrategy.java | 12 ++--- .../schema/builder/ColumnNamingStrategy.java | 2 +- .../builder/DefaultColumnNamingStrategy.java | 31 ++++++++++++ ...tingIntrinsicSwitchColumnNamingStrategy.java | 46 ++++++++++++++++++ .../builder/UniqueColumnNamingStrategy.java | 50 ++++++++++++++++++++ .../fixedwidth/FixedWidthConfiguration.java | 4 +- .../fixedwidth/FixedWidthDataContext.java | 17 ++++--- 7 files changed, 144 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/0da8f1a1/core/src/main/java/org/apache/metamodel/schema/builder/AlphabeticColumnNamingStrategy.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 284e851..83679a3 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 @@ package org.apache.metamodel.schema.builder; 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(); } } http://git-wip-us.apache.org/repos/asf/metamodel/blob/0da8f1a1/core/src/main/java/org/apache/metamodel/schema/builder/ColumnNamingStrategy.java ---------------------------------------------------------------------- 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 626daaf..4923c58 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); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/0da8f1a1/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 new file mode 100644 index 0000000..9aef863 --- /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()); + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/0da8f1a1/core/src/main/java/org/apache/metamodel/schema/builder/DelegatingIntrinsicSwitchColumnNamingStrategy.java ---------------------------------------------------------------------- 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 0000000..99cdaf5 --- /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); + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/0da8f1a1/core/src/main/java/org/apache/metamodel/schema/builder/UniqueColumnNamingStrategy.java ---------------------------------------------------------------------- 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 0000000..9371059 --- /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<String> 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; + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/0da8f1a1/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 3b90b32..6538f5c 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.Arrays; 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 final class FixedWidthConfiguration extends BaseObject implements */ public ColumnNamingStrategy getColumnNamingStrategy() { if (columnNamingStrategy == null) { - return new AlphabeticColumnNamingStrategy(); + return new DefaultColumnNamingStrategy(); } return columnNamingStrategy; } http://git-wip-us.apache.org/repos/asf/metamodel/blob/0da8f1a1/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java ---------------------------------------------------------------------- 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 fcc31ed..0a326cc 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 @@ public class FixedWidthDataContext extends QueryPostprocessDataContext { 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 {
