From eab7f79427a27a64ad502dc0faaa6bb29fcd2f49 Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Sun, 9 Mar 2014 18:05:26 +0100 Subject: [PATCH] Implemented and tested the AbstractFilteringRetrievalProcessor --- .../{components => }/TestProcessorQuery.java | 7 +- ...stAbstractFilteringRetrievalProcessor.java | 103 ++++++++++++++++++ .../impl/{components => }/ProcessorQuery.java | 4 +- .../AbstractFilteringRetrievalProcessor.java | 12 ++ ...ildingAndOverwritingResultDataBuilder.java | 26 ++++- 5 files changed, 148 insertions(+), 4 deletions(-) rename java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/{components => }/TestProcessorQuery.java (96%) create mode 100644 java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java rename java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/{components => }/ProcessorQuery.java (97%) rename java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/{ => components}/SumBuildingAndOverwritingResultDataBuilder.java (83%) diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestProcessorQuery.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestProcessorQuery.java similarity index 96% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestProcessorQuery.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestProcessorQuery.java index 98a701212e4..da7c87547f7 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestProcessorQuery.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestProcessorQuery.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl.components; +package com.sap.sse.datamining.impl; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; @@ -25,6 +25,11 @@ import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.i18n.DataMiningStringMessages; +import com.sap.sse.datamining.impl.ProcessorQuery; +import com.sap.sse.datamining.impl.components.AbstractSimpleParallelProcessor; +import com.sap.sse.datamining.impl.components.GroupedDataEntry; +import com.sap.sse.datamining.impl.components.ParallelGroupedElementsValueExtractionProcessor; +import com.sap.sse.datamining.impl.components.ParallelMultiDimensionalGroupingProcessor; import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDoubleDataSumAggregationProcessor; import com.sap.sse.datamining.shared.GroupKey; import com.sap.sse.datamining.shared.QueryResult; diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java new file mode 100644 index 00000000000..715d2885dce --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java @@ -0,0 +1,103 @@ +package com.sap.sse.datamining.impl.components; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.Callable; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sse.datamining.AdditionalResultDataBuilder; +import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil; + +public class TestAbstractFilteringRetrievalProcessor { + + private Processor> filteringRetrievalProcessor; + private Collection dataSource; + + private Collection receivedResults = new ArrayList<>(); + + @Test + public void testFiltration() throws InterruptedException { + filteringRetrievalProcessor.onElement(dataSource); + filteringRetrievalProcessor.finish(); + ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish + + Collection expectedResults = Arrays.asList(0, 1, 2); + assertThat(receivedResults, is(expectedResults)); + } + + @Test + public void testProvidedAdditionalData() throws InterruptedException { + filteringRetrievalProcessor.onElement(dataSource); + filteringRetrievalProcessor.finish(); + ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish + + int expectedRetrievedDataAmount = 5; + int expectedFilteredDataAmount = 3; + + SumBuildingAndOverwritingResultDataBuilder resultDataBuilder = new SumBuildingAndOverwritingResultDataBuilder(); + filteringRetrievalProcessor.getAdditionalResultData(resultDataBuilder); + assertThat(resultDataBuilder.getRetrievedDataAmount(), is(expectedRetrievedDataAmount)); + assertThat(resultDataBuilder.getFilteredDataAmount(), is(expectedFilteredDataAmount)); + } + + @Before + public void setUpResultReceiverAndProcessor() { + Processor resultReceiver = new Processor() { + @Override + public void onElement(Integer element) { + synchronized (receivedResults) { + receivedResults.add(element); + } + } + @Override + public void finish() throws InterruptedException { + } + @Override + public void abort() { + } + @Override + public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) { + return additionalDataBuilder; + } + }; + + FilterCriteria filterCriteria = new FilterCriteria() { + @Override + public boolean matches(Integer element) { + return element >= 0; + } + }; + filteringRetrievalProcessor = new AbstractFilteringRetrievalProcessor, Integer, Integer>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), filterCriteria) { + @Override + protected Iterable retrieveData(Iterable element) { + return element; + } + @Override + protected Callable createInstruction(final Integer filteredPartialElement) { + return new Callable() { + @Override + public Integer call() throws Exception { + return filteredPartialElement; + } + }; + } + }; + } + + @Before + public void setUpDataSource() { + dataSource = Arrays.asList(-2, -1, 0, 1, 2); + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ProcessorQuery.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/ProcessorQuery.java similarity index 97% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ProcessorQuery.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/ProcessorQuery.java index b5346fdb9eb..1fa7ae28943 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ProcessorQuery.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/ProcessorQuery.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl.components; +package com.sap.sse.datamining.impl; import java.util.Locale; import java.util.Map; @@ -14,7 +14,7 @@ import com.sap.sse.datamining.AdditionalResultDataBuilder; import com.sap.sse.datamining.Query; import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.SumBuildingAndOverwritingResultDataBuilder; +import com.sap.sse.datamining.impl.components.SumBuildingAndOverwritingResultDataBuilder; import com.sap.sse.datamining.shared.GroupKey; import com.sap.sse.datamining.shared.QueryResult; import com.sap.sse.datamining.shared.impl.QueryResultImpl; diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java index 25227c6e7d5..8fc5ded98e1 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; +import com.sap.sse.datamining.AdditionalResultDataBuilder; import com.sap.sse.datamining.components.FilterCriteria; import com.sap.sse.datamining.components.Processor; @@ -12,6 +13,9 @@ public abstract class AbstractFilteringRetrievalProcessor { private final FilterCriteria criteria; + + private int retrievedDataAmount; + private int filteredDataAmount; public AbstractFilteringRetrievalProcessor(ExecutorService executor, Collection> resultReceivers, FilterCriteria criteria) { super(executor, resultReceivers); @@ -24,10 +28,12 @@ public abstract class AbstractFilteringRetrievalProcessor retrievedData = retrieveData(element); for (WorkingType retrievedDataEntry : retrievedData) { + retrievedDataAmount++; if (criteria.matches(retrievedDataEntry)) { filteredData.add(retrievedDataEntry); } } + filteredDataAmount = filteredData.size(); return filteredData; } @@ -37,5 +43,11 @@ public abstract class AbstractFilteringRetrievalProcessor createInstruction(WorkingType filteredPartialElement); + + @Override + protected void setAdditionalData(AdditionalResultDataBuilder additionalDataBuilder) { + additionalDataBuilder.setRetrievedDataAmount(retrievedDataAmount); + additionalDataBuilder.setFilteredDataAmount(filteredDataAmount); + } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SumBuildingAndOverwritingResultDataBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/SumBuildingAndOverwritingResultDataBuilder.java similarity index 83% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SumBuildingAndOverwritingResultDataBuilder.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/SumBuildingAndOverwritingResultDataBuilder.java index cbf5c6483bc..f3f4b304da7 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SumBuildingAndOverwritingResultDataBuilder.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/SumBuildingAndOverwritingResultDataBuilder.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl; +package com.sap.sse.datamining.impl.components; import java.util.Locale; @@ -74,4 +74,28 @@ public class SumBuildingAndOverwritingResultDataBuilder implements AdditionalRes this.aggregationNameMessageKey = aggregationNameMessageKey; } + protected int getRetrievedDataAmount() { + return retrievedDataAmount; + } + + protected int getFilteredDataAmount() { + return filteredDataAmount; + } + + protected Function getExtractionFunction() { + return extractionFunction; + } + + protected String getAggregationNameMessageKey() { + return aggregationNameMessageKey; + } + + protected Unit getUnit() { + return unit; + } + + protected int getResultDecimals() { + return resultDecimals; + } + }