From ca8db4cc822af01bb569004d9d7fb5fca616d743 Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Mon, 19 Oct 2015 20:53:03 +0200 Subject: [PATCH] Cleaned the CompoundGroupKey A CompoundGroupKey is now represented as a main key and a list of sub keys. --- .../AbstractResultsPresenter.java | 2 +- .../datamining/presentation/ResultsChart.java | 13 +- .../CubicRegressionPerCourseProcessor.java | 2 +- ...eedRegressionPerAngleClusterProcessor.java | 2 +- .../sap/sse/datamining/shared/GroupKey.java | 13 +- .../shared/impl/AbstractGroupKey.java | 6 - .../shared/impl/CompoundGroupKey.java | 113 ++++++++++++++++++ .../shared/impl/GenericGroupKey.java | 8 +- .../shared/impl/NestingCompoundGroupKey.java | 98 --------------- ...llelMultiDimensionalGroupingProcessor.java | 7 +- .../datamining/factories/GroupKeyFactory.java | 18 ++- ...tiDimensionalNestingGroupingProcessor.java | 14 ++- 12 files changed, 170 insertions(+), 126 deletions(-) create mode 100644 java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/CompoundGroupKey.java delete mode 100644 java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/NestingCompoundGroupKey.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/AbstractResultsPresenter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/AbstractResultsPresenter.java index 277c70fed85..8effafd7f9f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/AbstractResultsPresenter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/AbstractResultsPresenter.java @@ -159,7 +159,7 @@ public abstract class AbstractResultsPresenter im if (currentResult != null) { isSimple = true; for (GroupKey groupKey : getCurrentResult().getResults().keySet()) { - if (groupKey.hasSubKey()) { + if (groupKey.hasSubKeys()) { isSimple = false; break; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ResultsChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ResultsChart.java index fed2ca0a63d..0f60284cb40 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ResultsChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ResultsChart.java @@ -36,6 +36,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.controls.SimpleObjectRenderer; import com.sap.sse.common.settings.Settings; import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.impl.CompoundGroupKey; import com.sap.sse.datamining.shared.impl.GenericGroupKey; import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent; @@ -338,7 +339,17 @@ public class ResultsChart extends AbstractResultsPresenterWithDataProviders subKeys = groupKey.getSubKeys(); + GroupKey subMainKey = subKeys.get(0); + List subSubKeys = new ArrayList<>(); + for (int i = 1; i < subKeys.size(); i++) { + subSubKeys.add(subKeys.get(i)); + } + return subSubKeys.isEmpty() ? subMainKey : new CompoundGroupKey(subMainKey, subSubKeys); + } else { + return simpleResultSeriesKey; + } } private Chart createChart() { diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/CubicRegressionPerCourseProcessor.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/CubicRegressionPerCourseProcessor.java index 0d052e225b8..b6c2f39e176 100644 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/CubicRegressionPerCourseProcessor.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/CubicRegressionPerCourseProcessor.java @@ -123,7 +123,7 @@ public class CubicRegressionPerCourseProcessor implements GroupKey compoundKey; try { compoundKey = GroupKeyFactory.createNestingCompoundKeyFor(key, PolarDataDimensionCollectionFactory - .getCubicRegressionPerCourseClusterKeyDimensions().iterator()); + .getCubicRegressionPerCourseClusterKeyDimensions()); } catch (NoSuchMethodException e) { e.printStackTrace(); throw new RuntimeException(e); diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/SpeedRegressionPerAngleClusterProcessor.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/SpeedRegressionPerAngleClusterProcessor.java index bc8693a6431..0e7b1a56d30 100644 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/SpeedRegressionPerAngleClusterProcessor.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/SpeedRegressionPerAngleClusterProcessor.java @@ -149,7 +149,7 @@ public class SpeedRegressionPerAngleClusterProcessor implements GroupKey compoundKey; try { compoundKey = GroupKeyFactory.createNestingCompoundKeyFor(key, PolarDataDimensionCollectionFactory - .getSpeedRegressionPerAngleClusterClusterKeyDimensions().iterator()); + .getSpeedRegressionPerAngleClusterClusterKeyDimensions()); } catch (NoSuchMethodException e) { e.printStackTrace(); throw new RuntimeException(e); diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/GroupKey.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/GroupKey.java index 6289d7f23b3..9997815e622 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/GroupKey.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/GroupKey.java @@ -1,6 +1,7 @@ package com.sap.sse.datamining.shared; import java.io.Serializable; +import java.util.List; public interface GroupKey extends Serializable, Comparable { @@ -14,7 +15,7 @@ public interface GroupKey extends Serializable, Comparable { * Checks if this group key has a sub key. For example if the data was grouped primary by competitor and secondary by leg type. * @return true, if this group key has a sub key */ - public boolean hasSubKey(); + public boolean hasSubKeys(); /** * @return the main key, if there is one. Otherwise it returns this. @@ -22,8 +23,14 @@ public interface GroupKey extends Serializable, Comparable { public GroupKey getMainKey(); /** - * @return the sub key or null, if there's none. + * @return the sub keys or an empty list, if there are none. */ - public GroupKey getSubKey(); + public List getSubKeys(); + + //Enforce hash code and equals in all subclasses + @Override + public abstract boolean equals(Object other); + @Override + public abstract int hashCode(); } diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AbstractGroupKey.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AbstractGroupKey.java index b7dd2d77df1..4b62dda7627 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AbstractGroupKey.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AbstractGroupKey.java @@ -15,11 +15,5 @@ public abstract class AbstractGroupKey implements GroupKey { public int compareTo(GroupKey key) { return asString().compareTo(key.asString()); } - - //Enforce hash code and equals in all subclasses - @Override - public abstract boolean equals(Object other); - @Override - public abstract int hashCode(); } diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/CompoundGroupKey.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/CompoundGroupKey.java new file mode 100644 index 00000000000..f45dee1bcdf --- /dev/null +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/CompoundGroupKey.java @@ -0,0 +1,113 @@ +package com.sap.sse.datamining.shared.impl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.sap.sse.datamining.shared.GroupKey; + + +public class CompoundGroupKey extends AbstractGroupKey { + + private static final long serialVersionUID = -7902450253393172550L; + + private GroupKey mainKey; + private ArrayList subKeys; + + /** + * Constructor for the GWT-Serialization. Don't use this! + */ + @Deprecated + CompoundGroupKey() { } + + public CompoundGroupKey(GroupKey mainKey, List subKeys) { + if (mainKey == null) { + throw new IllegalArgumentException("The mainKey mustn't be null"); + } + + this.mainKey = mainKey; + this.subKeys = new ArrayList<>(subKeys); + } + + @Override + public String asString() { + StringBuilder builder = new StringBuilder(mainKey.asString()); + for (GroupKey groupKey : subKeys) { + builder.append("(" + groupKey.asString()); + } + for (int i = 0; i < subKeys.size(); i++) { + builder.append(")"); + } + return builder.toString(); + } + + @Override + public boolean hasSubKeys() { + return !subKeys.isEmpty(); + } + + @Override + public GroupKey getMainKey() { + return mainKey; + } + + @Override + public List getSubKeys() { + return Collections.unmodifiableList(subKeys); + } + + @Override + public int compareTo(GroupKey key) { + int result; + if (key instanceof CompoundGroupKey) { + CompoundGroupKey compoundGroupKey = (CompoundGroupKey) key; + result = mainKey.compareTo(compoundGroupKey.mainKey); + if (result == 0) { + result = Integer.compare(subKeys.size(), compoundGroupKey.subKeys.size()); + if (result == 0) { + for (int i = 0; i < subKeys.size(); i++) { + result = subKeys.get(i).compareTo(compoundGroupKey.subKeys.get(i)); + if (result != 0) { + break; + } + } + } + } + } else { + result = super.compareTo(key); + } + return result; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((mainKey == null) ? 0 : mainKey.hashCode()); + result = prime * result + ((subKeys == null) ? 0 : subKeys.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CompoundGroupKey other = (CompoundGroupKey) obj; + if (mainKey == null) { + if (other.mainKey != null) + return false; + } else if (!mainKey.equals(other.mainKey)) + return false; + if (subKeys == null) { + if (other.subKeys != null) + return false; + } else if (!subKeys.equals(other.subKeys)) + return false; + return true; + } + +} diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java index 51ab252df60..1c40ec40354 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java @@ -1,6 +1,8 @@ package com.sap.sse.datamining.shared.impl; +import java.util.Collections; import java.util.Comparator; +import java.util.List; import com.sap.sse.common.util.NaturalComparator; import com.sap.sse.datamining.shared.GroupKey; @@ -26,7 +28,7 @@ public class GenericGroupKey extends AbstractGroupKey { } @Override - public boolean hasSubKey() { + public boolean hasSubKeys() { return false; } @@ -36,8 +38,8 @@ public class GenericGroupKey extends AbstractGroupKey { } @Override - public GroupKey getSubKey() { - return null; + public List getSubKeys() { + return Collections.emptyList(); } @Override diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/NestingCompoundGroupKey.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/NestingCompoundGroupKey.java deleted file mode 100644 index 7c64b58e082..00000000000 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/NestingCompoundGroupKey.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.sap.sse.datamining.shared.impl; - -import com.sap.sse.datamining.shared.GroupKey; - - -public class NestingCompoundGroupKey extends AbstractGroupKey { - - private static final long serialVersionUID = -7902450253393172550L; - - private GroupKey mainKey; - private GroupKey subKey; - - /** - * Constructor for the GWT-Serialization. Don't use this! - */ - @Deprecated - NestingCompoundGroupKey() { } - - public NestingCompoundGroupKey(GroupKey mainKey) { - this(mainKey, null); - } - - public NestingCompoundGroupKey(GroupKey mainKey, GroupKey subKey) { - this.mainKey = mainKey; - this.subKey = subKey; - } - - @Override - public String asString() { - return mainKey.asString() + " (" + subKey.asString() + ")"; - } - - @Override - public boolean hasSubKey() { - return subKey != null; - } - - @Override - public GroupKey getMainKey() { - return mainKey; - } - - @Override - public GroupKey getSubKey() { - return subKey; - } - - public void setSubKey(GroupKey subKey) { - this.subKey = subKey; - } - - @Override - public int compareTo(GroupKey key) { - int result = super.compareTo(key); - if (key instanceof NestingCompoundGroupKey) { - NestingCompoundGroupKey nestingCompoundGroupKey = (NestingCompoundGroupKey) key; - result = mainKey.compareTo(nestingCompoundGroupKey.mainKey); - if (result == 0) { - result = subKey.compareTo(nestingCompoundGroupKey.subKey); - } - } - return result; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((mainKey == null) ? 0 : mainKey.hashCode()); - result = prime * result + ((subKey == null) ? 0 : subKey.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - NestingCompoundGroupKey other = (NestingCompoundGroupKey) obj; - if (mainKey == null) { - if (other.mainKey != null) - return false; - } else if (!mainKey.equals(other.mainKey)) - return false; - if (subKey == null) { - if (other.subKey != null) - return false; - } else if (!subKey.equals(other.subKey)) - return false; - return true; - } - - - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java index a5c764453f1..504701b6f33 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java @@ -19,7 +19,7 @@ import com.sap.sse.datamining.impl.functions.MethodWrappingFunction; import com.sap.sse.datamining.impl.functions.SimpleParameterizedFunction; import com.sap.sse.datamining.shared.GroupKey; import com.sap.sse.datamining.shared.impl.GenericGroupKey; -import com.sap.sse.datamining.shared.impl.NestingCompoundGroupKey; +import com.sap.sse.datamining.shared.impl.CompoundGroupKey; import com.sap.sse.datamining.test.util.ComponentTestsUtil; import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil; import com.sap.sse.datamining.test.util.FunctionTestsUtil; @@ -84,8 +84,9 @@ public class TestParallelMultiDimensionalGroupingProcessor { private void verifyGroupedElement(Number originElement) { GroupKey mainKey = new GenericGroupKey(originElement.getLength()); - GroupKey subKey = new GenericGroupKey(originElement.getCrossSum()); - GroupKey expectedKey = new NestingCompoundGroupKey(mainKey, subKey); + List subKeys = new ArrayList<>(); + subKeys.add(new GenericGroupKey(originElement.getCrossSum())); + GroupKey expectedKey = new CompoundGroupKey(mainKey, subKeys); assertThat(groupedElement.getKey(), is(expectedKey)); } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/GroupKeyFactory.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/GroupKeyFactory.java index 24dc08e233e..98e077e87ef 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/GroupKeyFactory.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/GroupKeyFactory.java @@ -1,21 +1,29 @@ package com.sap.sse.datamining.factories; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.impl.CompoundGroupKey; import com.sap.sse.datamining.shared.impl.GenericGroupKey; -import com.sap.sse.datamining.shared.impl.NestingCompoundGroupKey; public class GroupKeyFactory { - public static GroupKey createNestingCompoundKeyFor(DataType input, Iterator> dimensionsIterator) { + public static GroupKey createNestingCompoundKeyFor(DataType input, Iterable> dimensions) { + Iterator> dimensionsIterator = dimensions.iterator(); + Function mainDimension = dimensionsIterator.next(); - GroupKey key = createDimensionValueGroupKeyFor(input, mainDimension); + GroupKey mainKey = createDimensionValueGroupKeyFor(input, mainDimension); + List subKeys = new ArrayList<>(); if (dimensionsIterator.hasNext()) { - key = new NestingCompoundGroupKey(key, createNestingCompoundKeyFor(input, dimensionsIterator)); + while (dimensionsIterator.hasNext()) { + Function dimension = dimensionsIterator.next(); + subKeys.add(createDimensionValueGroupKeyFor(input, dimension)); + } } - return key; + return subKeys.isEmpty() ? mainKey : new CompoundGroupKey(mainKey, subKeys); } public static GroupKey createDimensionValueGroupKeyFor(DataType input, Function mainDimension) { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractParallelMultiDimensionalNestingGroupingProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractParallelMultiDimensionalNestingGroupingProcessor.java index 08d905ee7e4..bf92a9520cd 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractParallelMultiDimensionalNestingGroupingProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractParallelMultiDimensionalNestingGroupingProcessor.java @@ -1,7 +1,9 @@ package com.sap.sse.datamining.impl.components; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.List; import java.util.concurrent.ExecutorService; import com.sap.sse.datamining.components.AdditionalResultDataBuilder; @@ -11,7 +13,7 @@ import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.functions.ParameterProvider; import com.sap.sse.datamining.functions.ParameterizedFunction; import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.impl.NestingCompoundGroupKey; +import com.sap.sse.datamining.shared.impl.CompoundGroupKey; public abstract class AbstractParallelMultiDimensionalNestingGroupingProcessor extends AbstractParallelProcessor> { @@ -62,11 +64,15 @@ public abstract class AbstractParallelMultiDimensionalNestingGroupingProcessor> dimensionsIterator) { ParameterizedFunction mainDimension = dimensionsIterator.next(); - GroupKey key = createGroupKeyFor(input, mainDimension.getFunction(), mainDimension.getParameterProvider()); + GroupKey mainKey = createGroupKeyFor(input, mainDimension.getFunction(), mainDimension.getParameterProvider()); + List subKeys = new ArrayList<>(); if (dimensionsIterator.hasNext()) { - key = new NestingCompoundGroupKey(key, createCompoundKeyFor(input, dimensionsIterator)); + while (dimensionsIterator.hasNext()) { + ParameterizedFunction dimension = dimensionsIterator.next(); + subKeys.add(createGroupKeyFor(input, dimension.getFunction(), dimension.getParameterProvider())); + } } - return key; + return subKeys.isEmpty() ? mainKey : new CompoundGroupKey(mainKey, subKeys); } protected abstract GroupKey createGroupKeyFor(DataType input, Function dimension, ParameterProvider parameterProvider);