Implemented and tested the AbstractFilteringRetrievalProcessor

This commit is contained in:
Lennart Hensler committed 2014-03-09 18:05:26 +01:00
1 parent 0e272885ac
commit eab7f79427
5 files changed
+148 -4

No files matched your search

@@ -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;
@@ -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<Iterable<Integer>> filteringRetrievalProcessor;
private Collection<Integer> dataSource;
private Collection<Integer> receivedResults = new ArrayList<>();
@Test
public void testFiltration() throws InterruptedException {
filteringRetrievalProcessor.onElement(dataSource);
filteringRetrievalProcessor.finish();
ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish
Collection<Integer> 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<Integer> resultReceiver = new Processor<Integer>() {
@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<Integer> filterCriteria = new FilterCriteria<Integer>() {
@Override
public boolean matches(Integer element) {
return element >= 0;
}
};
filteringRetrievalProcessor = new AbstractFilteringRetrievalProcessor<Iterable<Integer>, Integer, Integer>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), filterCriteria) {
@Override
protected Iterable<Integer> retrieveData(Iterable<Integer> element) {
return element;
}
@Override
protected Callable<Integer> createInstruction(final Integer filteredPartialElement) {
return new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return filteredPartialElement;
}
};
}
};
}
@Before
public void setUpDataSource() {
dataSource = Arrays.asList(-2, -1, 0, 1, 2);
}
}
@@ -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;
@@ -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<InputType, WorkingType
extends AbstractPartitioningParallelProcessor<InputType, WorkingType, ResultType> {
private final FilterCriteria<WorkingType> criteria;
private int retrievedDataAmount;
private int filteredDataAmount;
public AbstractFilteringRetrievalProcessor(ExecutorService executor, Collection<Processor<ResultType>> resultReceivers, FilterCriteria<WorkingType> criteria) {
super(executor, resultReceivers);
@@ -24,10 +28,12 @@ public abstract class AbstractFilteringRetrievalProcessor<InputType, WorkingType
Iterable<WorkingType> 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<InputType, WorkingType
//This makes the implementation of sub classes more fluent.
@Override
protected abstract Callable<ResultType> createInstruction(WorkingType filteredPartialElement);
@Override
protected void setAdditionalData(AdditionalResultDataBuilder additionalDataBuilder) {
additionalDataBuilder.setRetrievedDataAmount(retrievedDataAmount);
additionalDataBuilder.setFilteredDataAmount(filteredDataAmount);
}
}
@@ -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;
}
}