mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-13 22:15:26 +00:00
Merge branch 'master' into axel-usermanagement
Conflicts: java/com.sap.sailing.gwt.ui/SailingGWT.launch java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties
This commit is contained in:
commit
baeb7fdd91
169 files changed
+3129
-1855
No files matched your search
+6
-18
@@ -6,7 +6,6 @@ import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.stub;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@@ -17,17 +16,17 @@ import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sailing.datamining.test.util.NullProcessor;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
|
||||
public class TestLeaderboardGroupRetrievalProcessor {
|
||||
|
||||
private RacingEventService service;
|
||||
private Processor<RacingEventService> retriever;
|
||||
private Processor<RacingEventService, LeaderboardGroup> retriever;
|
||||
|
||||
private Collection<LeaderboardGroup> retrievedGroups;
|
||||
|
||||
@@ -37,27 +36,16 @@ public class TestLeaderboardGroupRetrievalProcessor {
|
||||
stub(service.getLeaderboardGroups()).toReturn(getGroupsInService());
|
||||
|
||||
retrievedGroups = new HashSet<>();
|
||||
Processor<LeaderboardGroup> receiver = new Processor<LeaderboardGroup>() {
|
||||
Processor<LeaderboardGroup, Void> receiver = new NullProcessor<LeaderboardGroup, Void>(LeaderboardGroup.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(LeaderboardGroup element) {
|
||||
retrievedGroups.add(element);
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
retriever = new LeaderboardGroupRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(receiver));
|
||||
Collection<Processor<LeaderboardGroup, ?>> resultReceivers = new ArrayList<>();
|
||||
resultReceivers.add(receiver);
|
||||
retriever = new LeaderboardGroupRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), resultReceivers);
|
||||
}
|
||||
|
||||
private Map<String, LeaderboardGroup> getGroupsInService() {
|
||||
|
||||
+22
-22
@@ -8,13 +8,13 @@ import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.datamining.Activator;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.datamining.impl.data.SailingDataMiningClassesWithFunctionsService;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Moving;
|
||||
import com.sap.sailing.domain.base.Nationality;
|
||||
@@ -27,15 +27,15 @@ import com.sap.sse.datamining.functions.FunctionRegistry;
|
||||
import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry;
|
||||
|
||||
public class TestSailingFunctionsRegistration {
|
||||
|
||||
private static FunctionFactory functionFactory = new FunctionFactory();
|
||||
|
||||
private static FunctionRegistry functionRegistry;
|
||||
private FunctionRegistry functionRegistry;
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpFunctionRegistryAndProvider() {
|
||||
SailingDataMiningClassesWithFunctionsService classesWithFunctionsService = new SailingDataMiningClassesWithFunctionsService();
|
||||
|
||||
@Before
|
||||
public void setUpFunctionRegistryAndProvider() {
|
||||
functionRegistry = new SimpleFunctionRegistry();
|
||||
functionRegistry.registerAllWithInternalFunctionPolicy(classesWithFunctionsService.getInternalClassesWithMarkedMethods());
|
||||
functionRegistry.registerAllWithInternalFunctionPolicy(Activator.getInternalClassesWithMarkedMethods());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -52,23 +52,23 @@ public class TestSailingFunctionsRegistration {
|
||||
Collection<Function<?>> expectedDimensions = new HashSet<>();
|
||||
|
||||
Method getRegattaMethod = HasTrackedRaceContext.class.getMethod("getRegatta", new Class<?>[0]);
|
||||
Function<?> getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod);
|
||||
Function<?> getRegatta = functionFactory.createMethodWrappingFunction(getRegattaMethod);
|
||||
Method getNameMethod = Named.class.getMethod("getName", new Class<?>[0]);
|
||||
Function<?> getName = FunctionFactory.createMethodWrappingFunction(getNameMethod);
|
||||
expectedDimensions.add(FunctionFactory.createCompoundFunction(Arrays.asList(getRegatta, getName)));
|
||||
Function<?> getName = functionFactory.createMethodWrappingFunction(getNameMethod);
|
||||
expectedDimensions.add(functionFactory.createCompoundFunction(Arrays.asList(getRegatta, getName)));
|
||||
|
||||
Method getYearMethod = HasTrackedRaceContext.class.getMethod("getYear", new Class<?>[0]);
|
||||
expectedDimensions.add(FunctionFactory.createMethodWrappingFunction(getYearMethod));
|
||||
expectedDimensions.add(functionFactory.createMethodWrappingFunction(getYearMethod));
|
||||
|
||||
Method getCompetitorMethod = HasTrackedLegOfCompetitorContext.class.getMethod("getCompetitor", new Class<?>[0]);
|
||||
Function<?> getCompetitor = FunctionFactory.createMethodWrappingFunction(getCompetitorMethod);
|
||||
Function<?> getCompetitor = functionFactory.createMethodWrappingFunction(getCompetitorMethod);
|
||||
Method getTeamMethod = Competitor.class.getMethod("getTeam", new Class<?>[0]);
|
||||
Function<?> getTeam = FunctionFactory.createMethodWrappingFunction(getTeamMethod);
|
||||
Function<?> getTeam = functionFactory.createMethodWrappingFunction(getTeamMethod);
|
||||
Method getNationalityMethod = Team.class.getMethod("getNationality", new Class<?>[0]);
|
||||
Function<?> getNationality = FunctionFactory.createMethodWrappingFunction(getNationalityMethod);
|
||||
Function<?> getNationality = functionFactory.createMethodWrappingFunction(getNationalityMethod);
|
||||
Method getAcronymMethod = Nationality.class.getMethod("getThreeLetterIOCAcronym", new Class<?>[0]);
|
||||
Function<?> getAcronym = FunctionFactory.createMethodWrappingFunction(getAcronymMethod);
|
||||
expectedDimensions.add(FunctionFactory.createCompoundFunction(Arrays.asList(getCompetitor, getTeam, getNationality, getAcronym)));
|
||||
Function<?> getAcronym = functionFactory.createMethodWrappingFunction(getAcronymMethod);
|
||||
expectedDimensions.add(functionFactory.createCompoundFunction(Arrays.asList(getCompetitor, getTeam, getNationality, getAcronym)));
|
||||
|
||||
return expectedDimensions;
|
||||
}
|
||||
@@ -87,15 +87,15 @@ public class TestSailingFunctionsRegistration {
|
||||
Collection<Function<?>> expectedStatistics = new HashSet<>();
|
||||
|
||||
Method getDistanceTraveledMethod = HasTrackedLegOfCompetitorContext.class.getMethod("getDistanceTraveled", new Class<?>[0]);
|
||||
expectedStatistics.add(FunctionFactory.createMethodWrappingFunction(getDistanceTraveledMethod));
|
||||
expectedStatistics.add(functionFactory.createMethodWrappingFunction(getDistanceTraveledMethod));
|
||||
|
||||
Method getGPSFixMethod = HasGPSFixContext.class.getMethod("getGPSFix", new Class<?>[0]);
|
||||
Function<?> getGPSFix = FunctionFactory.createMethodWrappingFunction(getGPSFixMethod);
|
||||
Function<?> getGPSFix = functionFactory.createMethodWrappingFunction(getGPSFixMethod);
|
||||
Method getSpeedMethod = Moving.class.getMethod("getSpeed", new Class<?>[0]);
|
||||
Function<?> getSpeed = FunctionFactory.createMethodWrappingFunction(getSpeedMethod);
|
||||
Function<?> getSpeed = functionFactory.createMethodWrappingFunction(getSpeedMethod);
|
||||
Method getKnotsMethod = Speed.class.getMethod("getKnots", new Class<?>[0]);
|
||||
Function<?> getKnots = FunctionFactory.createMethodWrappingFunction(getKnotsMethod);
|
||||
expectedStatistics.add(FunctionFactory.createCompoundFunction(Arrays.asList(getGPSFix, getSpeed, getKnots)));
|
||||
Function<?> getKnots = functionFactory.createMethodWrappingFunction(getKnotsMethod);
|
||||
expectedStatistics.add(functionFactory.createCompoundFunction(Arrays.asList(getGPSFix, getSpeed, getKnots)));
|
||||
|
||||
return expectedStatistics;
|
||||
}
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ public class ConcurrencyTestsUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static void tryToFinishTheProcessorInAnotherThread(final Processor<?> processor) {
|
||||
public static void tryToFinishTheProcessorInAnotherThread(final Processor<?, ?> processor) {
|
||||
Runnable finishingRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
package com.sap.sailing.datamining.test.util;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.impl.components.AbstractProcessor;
|
||||
|
||||
public class NullProcessor<InputType, ResultType> extends AbstractProcessor<InputType, ResultType> {
|
||||
|
||||
public NullProcessor(Class<InputType> inputType, Class<ResultType> resultType) {
|
||||
super(inputType, resultType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processElement(InputType element) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void abort() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,38 +1,82 @@
|
||||
package com.sap.sailing.datamining;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.osgi.framework.BundleActivator;
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.framework.ServiceRegistration;
|
||||
import org.osgi.framework.ServiceReference;
|
||||
|
||||
import com.sap.sailing.datamining.impl.data.SailingDataMiningClassesWithFunctionsService;
|
||||
import com.sap.sse.datamining.ClassesWithFunctionsService;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sse.datamining.ClassesWithFunctionsRegistrationService;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinitionRegistrationService;
|
||||
|
||||
public class Activator implements BundleActivator {
|
||||
|
||||
public static final String dataRetrieverGroupName = "Sailing";
|
||||
private static final Logger LOGGER = Logger.getLogger(Activator.class.getSimpleName());
|
||||
|
||||
private static BundleContext context;
|
||||
|
||||
private ServiceRegistration<ClassesWithFunctionsService> classesWithFunctionsServiceRegistration;
|
||||
private static ServiceReference<ClassesWithFunctionsRegistrationService> classesWithFunctionsRegistrationServiceReference;
|
||||
private static ServiceReference<DataRetrieverChainDefinitionRegistrationService> dataRetrieverChainDefinitionRegistrationServiceServiceReference;
|
||||
|
||||
@Override
|
||||
public void start(BundleContext context) throws Exception {
|
||||
Activator.context = context;
|
||||
registerClassesWithFunctionsService();
|
||||
|
||||
classesWithFunctionsRegistrationServiceReference = Activator.context.getServiceReference(ClassesWithFunctionsRegistrationService.class);
|
||||
if (classesWithFunctionsRegistrationServiceReference != null) {
|
||||
Activator.context.getService(classesWithFunctionsRegistrationServiceReference)
|
||||
.registerInternalClassesWithMarkedMethods(getInternalClassesWithMarkedMethods());
|
||||
Activator.context.getService(classesWithFunctionsRegistrationServiceReference)
|
||||
.registerExternalLibraryClasses(getExternalLibraryClasses());
|
||||
} else {
|
||||
LOGGER.log(Level.WARNING, "Couldn't register the sailing classes with functions. No registration service was available.");
|
||||
}
|
||||
|
||||
dataRetrieverChainDefinitionRegistrationServiceServiceReference = Activator.context.getServiceReference(DataRetrieverChainDefinitionRegistrationService.class);
|
||||
if (dataRetrieverChainDefinitionRegistrationServiceServiceReference != null) {
|
||||
for (DataRetrieverChainDefinition<?> dataRetrieverChainDefinition : SailingDataRetrieverChainDefinitions.getDataRetrieverChainDefinitions()) {
|
||||
Activator.context.getService(dataRetrieverChainDefinitionRegistrationServiceServiceReference).addDataRetrieverChainDefinition(dataRetrieverChainDefinition);
|
||||
}
|
||||
} else {
|
||||
LOGGER.log(Level.WARNING, "Couldn't register the sailing data retriever chain definitions. No registration service was available.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop(BundleContext context) throws Exception {
|
||||
unregisterClassesWithFunctionsService();
|
||||
if (classesWithFunctionsRegistrationServiceReference != null) {
|
||||
Activator.context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf(
|
||||
getInternalClassesWithMarkedMethods());
|
||||
Activator.context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf(
|
||||
getExternalLibraryClasses());
|
||||
}
|
||||
|
||||
if (dataRetrieverChainDefinitionRegistrationServiceServiceReference != null) {
|
||||
for (DataRetrieverChainDefinition<?> dataRetrieverChainDefinition : SailingDataRetrieverChainDefinitions.getDataRetrieverChainDefinitions()) {
|
||||
Activator.context.getService(dataRetrieverChainDefinitionRegistrationServiceServiceReference).removeDataRetrieverChainDefinition(dataRetrieverChainDefinition);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void unregisterClassesWithFunctionsService() {
|
||||
context.ungetService(classesWithFunctionsServiceRegistration.getReference());
|
||||
public static Set<Class<?>> getInternalClassesWithMarkedMethods() {
|
||||
Set<Class<?>> internalClasses = new HashSet<>();
|
||||
internalClasses.add(HasTrackedRaceContext.class);
|
||||
internalClasses.add(HasTrackedLegContext.class);
|
||||
internalClasses.add(HasTrackedLegOfCompetitorContext.class);
|
||||
internalClasses.add(HasGPSFixContext.class);
|
||||
return internalClasses;
|
||||
}
|
||||
|
||||
private void registerClassesWithFunctionsService() {
|
||||
classesWithFunctionsServiceRegistration = context.registerService(ClassesWithFunctionsService.class,
|
||||
new SailingDataMiningClassesWithFunctionsService(), null);
|
||||
public static Set<Class<?>> getExternalLibraryClasses() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
package com.sap.sailing.datamining;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.datamining.impl.components.GPSFixRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.RegattaLeaderboardFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedLegFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedRaceFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.SimpleDataRetrieverChainDefinition;
|
||||
|
||||
public class SailingDataRetrieverChainDefinitions {
|
||||
|
||||
private static Collection<DataRetrieverChainDefinition<?>> dataRetrieverChainDefinitions;
|
||||
|
||||
public static Collection<DataRetrieverChainDefinition<?>> getDataRetrieverChainDefinitions() {
|
||||
if (dataRetrieverChainDefinitions == null) {
|
||||
initializeDataRetrieverChainDefinitions();
|
||||
}
|
||||
return dataRetrieverChainDefinitions;
|
||||
}
|
||||
|
||||
private static void initializeDataRetrieverChainDefinitions() {
|
||||
dataRetrieverChainDefinitions = new ArrayList<>();
|
||||
|
||||
DataRetrieverChainDefinition<RacingEventService> legRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(RacingEventService.class, "SailingDomainRetrieverChain");
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<Processor<RacingEventService, LeaderboardGroup>> leaderboardGroupRetrieverType = (Class<Processor<RacingEventService, LeaderboardGroup>>)(Class<?>) LeaderboardGroupRetrievalProcessor.class;
|
||||
legRetrieverChainDefinition.startWith(leaderboardGroupRetrieverType, LeaderboardGroup.class);
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<Processor<LeaderboardGroup, RegattaLeaderboard>> regattaLeaderboardRetrieverType = (Class<Processor<LeaderboardGroup, RegattaLeaderboard>>)(Class<?>) RegattaLeaderboardFilteringRetrievalProcessor.class;
|
||||
legRetrieverChainDefinition.addAsLast(leaderboardGroupRetrieverType, regattaLeaderboardRetrieverType, RegattaLeaderboard.class);
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<Processor<RegattaLeaderboard, HasTrackedRaceContext>> raceRetrieverType = (Class<Processor<RegattaLeaderboard, HasTrackedRaceContext>>)(Class<?>) TrackedRaceFilteringRetrievalProcessor.class;
|
||||
legRetrieverChainDefinition.addAsLast(regattaLeaderboardRetrieverType, raceRetrieverType, HasTrackedRaceContext.class);
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<Processor<HasTrackedRaceContext, HasTrackedLegContext>> legRetrieverType = (Class<Processor<HasTrackedRaceContext, HasTrackedLegContext>>)(Class<?>) TrackedLegFilteringRetrievalProcessor.class;
|
||||
legRetrieverChainDefinition.addAsLast(raceRetrieverType, legRetrieverType, HasTrackedLegContext.class);
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<Processor<HasTrackedLegContext, HasTrackedLegOfCompetitorContext>> legOfCompetitorRetrieverType = (Class<Processor<HasTrackedLegContext, HasTrackedLegOfCompetitorContext>>)(Class<?>) TrackedLegOfCompetitorFilteringRetrievalProcessor.class;
|
||||
legRetrieverChainDefinition.addAsLast(legRetrieverType, legOfCompetitorRetrieverType, HasTrackedLegOfCompetitorContext.class);
|
||||
dataRetrieverChainDefinitions.add(legRetrieverChainDefinition);
|
||||
|
||||
DataRetrieverChainDefinition<RacingEventService> gpsFixRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(legRetrieverChainDefinition, "SailingDomainRetrieverChain");
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<Processor<HasTrackedLegOfCompetitorContext, HasGPSFixContext>> gpsFixRetrieverType = (Class<Processor<HasTrackedLegOfCompetitorContext, HasGPSFixContext>>)(Class<?>) GPSFixRetrievalProcessor.class;
|
||||
gpsFixRetrieverChainDefinition.addAsLast(legOfCompetitorRetrieverType, gpsFixRetrieverType, HasGPSFixContext.class);
|
||||
dataRetrieverChainDefinitions.add(gpsFixRetrieverChainDefinition);
|
||||
}
|
||||
|
||||
}
|
||||
+4
-1
@@ -3,7 +3,10 @@ package com.sap.sailing.datamining.data;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
|
||||
public interface HasGPSFixContext extends HasTrackedLegOfCompetitorContext {
|
||||
public interface HasGPSFixContext {
|
||||
|
||||
@Connector
|
||||
public HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext();
|
||||
|
||||
@Connector
|
||||
public GPSFixMoving getGPSFix();
|
||||
|
||||
+7
-3
@@ -2,15 +2,19 @@ package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
|
||||
public interface HasTrackedLegContext extends HasTrackedRaceContext {
|
||||
public interface HasTrackedLegContext {
|
||||
|
||||
@Connector
|
||||
public HasTrackedRaceContext getTrackedRaceContext();
|
||||
|
||||
public TrackedLeg getTrackedLeg();
|
||||
|
||||
@Dimension(messageKey="LegType", ordinal=5)
|
||||
@Dimension(messageKey="LegType", ordinal=6)
|
||||
public LegType getLegType();
|
||||
@Dimension(messageKey="LegNumber", ordinal=6)
|
||||
@Dimension(messageKey="LegNumber", ordinal=7)
|
||||
public int getLegNumber();
|
||||
|
||||
}
|
||||
+4
-1
@@ -6,7 +6,10 @@ import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
import com.sap.sse.datamining.shared.annotations.Statistic;
|
||||
|
||||
public interface HasTrackedLegOfCompetitorContext extends HasTrackedLegContext {
|
||||
public interface HasTrackedLegOfCompetitorContext {
|
||||
|
||||
@Connector
|
||||
public HasTrackedLegContext getTrackedLegContext();
|
||||
|
||||
public TrackedLegOfCompetitor getTrackedLegOfCompetitor();
|
||||
|
||||
|
||||
+4
-4
@@ -16,19 +16,19 @@ public interface HasTrackedRaceContext {
|
||||
@Connector(messageKey="Regatta", ordinal=0)
|
||||
public Regatta getRegatta();
|
||||
|
||||
@Connector(messageKey="CourseArea", ordinal=2)
|
||||
@Connector(messageKey="CourseArea", ordinal=3)
|
||||
public CourseArea getCourseArea();
|
||||
|
||||
@Connector(messageKey="BoatClass", ordinal=1)
|
||||
public BoatClass getBoatClass();
|
||||
|
||||
@Connector(messageKey="Fleet", ordinal=3)
|
||||
@Connector(messageKey="Fleet", ordinal=4)
|
||||
public Fleet getFleet();
|
||||
|
||||
@Connector(messageKey="Race", ordinal=4)
|
||||
@Connector(messageKey="Race", ordinal=5)
|
||||
public RaceDefinition getRace();
|
||||
|
||||
@Dimension(messageKey="Year", ordinal=10)
|
||||
@Dimension(messageKey="Year", ordinal=2)
|
||||
public Integer getYear();
|
||||
|
||||
}
|
||||
+110
-76
@@ -1,90 +1,90 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.DataRetrieverChainBuilder;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.Query;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.factories.ProcessorFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionProvider;
|
||||
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
|
||||
import com.sap.sse.datamining.impl.DataMiningActivator;
|
||||
import com.sap.sse.datamining.impl.DataRetrieverChainDefinitionRegistry;
|
||||
import com.sap.sse.datamining.impl.ProcessorQuery;
|
||||
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
|
||||
import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.CompoundFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.NullaryFunctionValuesFilterCriterion;
|
||||
import com.sap.sse.datamining.shared.GroupKey;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public final class SailingDataMiningFactory {
|
||||
public class SailingDataMiningFactory {
|
||||
|
||||
private final ProcessorFactory processorFactory;
|
||||
|
||||
private SailingDataMiningFactory() {
|
||||
private final FunctionProvider functionProvider;
|
||||
private final DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry;
|
||||
|
||||
public SailingDataMiningFactory(FunctionProvider functionProvider, DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry) {
|
||||
processorFactory = new ProcessorFactory(DataMiningActivator.getExecutor());
|
||||
|
||||
this.functionProvider = functionProvider;
|
||||
this.dataRetrieverChainDefinitionRegistry = dataRetrieverChainDefinitionRegistry;
|
||||
}
|
||||
|
||||
public static <ElementType> Query<Double> createQuery(RacingEventService dataSource, final QueryDefinition queryDefinition, final FunctionProvider functionProvider) {
|
||||
public <ElementType> Query<Double> createQuery(RacingEventService dataSource, final QueryDefinition queryDefinition) {
|
||||
return new ProcessorQuery<Double, RacingEventService>(DataMiningActivator.getExecutor(), dataSource,
|
||||
DataMiningActivator.getStringMessages(), DataMiningStringMessages.Util.getLocaleFor(queryDefinition.getLocaleInfoName())) {
|
||||
|
||||
@Override
|
||||
protected Processor<RacingEventService> createFirstProcessor() {
|
||||
Processor<GroupedDataEntry<Double>> aggregationProcessor = ProcessorFactory.createAggregationProcessor(/*query*/ this, queryDefinition.getAggregatorType());
|
||||
|
||||
protected Processor<RacingEventService, ?> createFirstProcessor() {
|
||||
@SuppressWarnings("unchecked") // TODO Clean, after the deprecated components have been removed
|
||||
Function<Double> extractionFunction = (Function<Double>) functionProvider.getFunctionForDTO(queryDefinition.getStatisticToCalculate());
|
||||
Processor<GroupedDataEntry<ElementType>> extractionProcessor = ProcessorFactory.createExtractionProcessor(aggregationProcessor, extractionFunction);
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<ElementType> dataTypeToRetrieve = (Class<ElementType>) extractionFunction.getDeclaringType();
|
||||
|
||||
List<Function<?>> dimensionsToGroupBy = convertDTOsToFunctions(queryDefinition.getDimensionsToGroupBy(), functionProvider);
|
||||
Processor<ElementType> groupingProcessor = ProcessorFactory.createGroupingProcessor(extractionProcessor, dimensionsToGroupBy);
|
||||
Processor<GroupedDataEntry<Double>, Map<GroupKey, Double>> aggregationProcessor = processorFactory.createAggregationProcessor(/*query*/ this, queryDefinition.getAggregatorType());
|
||||
Processor<GroupedDataEntry<ElementType>, GroupedDataEntry<Double>> extractionProcessor = processorFactory.createExtractionProcessor(aggregationProcessor, extractionFunction);
|
||||
|
||||
SailingDataRetrievalLevels dataRetrievalLevel = calculateDataRetrievalLevel(extractionFunction);
|
||||
Processor<RacingEventService> firstRetrievalProcessor = SailingDataRetrieverFactory.createRetrievalProcessorChain(dataRetrievalLevel, groupingProcessor, queryDefinition.getFilterSelection(), functionProvider);
|
||||
return firstRetrievalProcessor;
|
||||
List<Function<?>> dimensionsToGroupBy = convertDTOsToFunctions(queryDefinition.getDimensionsToGroupBy());
|
||||
Processor<ElementType, GroupedDataEntry<ElementType>> groupingProcessor = processorFactory.createGroupingProcessor(dataTypeToRetrieve, extractionProcessor, dimensionsToGroupBy);
|
||||
|
||||
DataRetrieverChainDefinition<RacingEventService> dataRetrieverChainDefinition = dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinition(RacingEventService.class, queryDefinition.getDataRetrieverChainDefinition().getId());
|
||||
DataRetrieverChainBuilder<RacingEventService> chainBuilder = dataRetrieverChainDefinition.startBuilding(DataMiningActivator.getExecutor());
|
||||
Map<Class<?>, FilterCriterion<?>> criteriaMappedByDataType = createFilterCriteria(queryDefinition.getFilterSelection());
|
||||
do {
|
||||
if (criteriaMappedByDataType.containsKey(chainBuilder.getCurrentRetrievedDataType())) {
|
||||
chainBuilder.setFilter(criteriaMappedByDataType.get(chainBuilder.getCurrentRetrievedDataType()));
|
||||
}
|
||||
|
||||
chainBuilder.stepDeeper();
|
||||
} while (!dataTypeToRetrieve.equals(chainBuilder.getCurrentRetrievedDataType()));
|
||||
if (criteriaMappedByDataType.containsKey(chainBuilder.getCurrentRetrievedDataType())) {
|
||||
chainBuilder.setFilter(criteriaMappedByDataType.get(chainBuilder.getCurrentRetrievedDataType()));
|
||||
}
|
||||
chainBuilder.addResultReceiver(groupingProcessor);
|
||||
|
||||
return chainBuilder.build();
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Query<Set<Object>> createDimensionValuesQuery(RacingEventService dataSource, final Collection<FunctionDTO> dimensionDTOs, final FunctionProvider functionProvider) {
|
||||
return new ProcessorQuery<Set<Object>, RacingEventService>(DataMiningActivator.getExecutor(), dataSource) {
|
||||
@Override
|
||||
protected Processor<RacingEventService> createFirstProcessor() {
|
||||
Processor<GroupedDataEntry<Object>> valueCollector = ProcessorFactory.createGroupedDataCollectingAsSetProcessor(/*query*/ this);
|
||||
|
||||
Collection<Function<?>> dimensions = convertDTOsToFunctions(dimensionDTOs, functionProvider);
|
||||
Map<SailingDataRetrievalLevels, Collection<Function<?>>> dimensionsMappedByRetrievalLevel = mapFunctionsByRetrievalLevel(dimensions);
|
||||
SailingDataRetrievalLevels deepestRetrievalLevel = getDeepestRetrievalLevel(dimensionsMappedByRetrievalLevel.keySet());
|
||||
|
||||
Processor<?> retrievalProcessor = null;
|
||||
for (int i = deepestRetrievalLevel.ordinal(); i >= 0; i--) {
|
||||
SailingDataRetrievalLevels retrievalLevel = SailingDataRetrievalLevels.values()[i];
|
||||
|
||||
Collection<Function<?>> dimensionsForRetrievalLevel = dimensionsMappedByRetrievalLevel.containsKey(retrievalLevel) ? dimensionsMappedByRetrievalLevel.get(retrievalLevel) : new ArrayList<Function<?>>();
|
||||
Collection<Processor<?>> retrievalResultReceivers = ProcessorFactory.createGroupingExtractorsForDimensions(valueCollector, dimensionsForRetrievalLevel);
|
||||
if (retrievalProcessor != null) {
|
||||
retrievalResultReceivers.add(retrievalProcessor);
|
||||
}
|
||||
|
||||
retrievalProcessor = SailingDataRetrieverFactory.createRetrievalProcessorWithoutFilter(retrievalLevel, retrievalResultReceivers);
|
||||
}
|
||||
|
||||
// A retrieval processor created this way results always in a Processor<RacingEventService>
|
||||
return (Processor<RacingEventService>) retrievalProcessor;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static List<Function<?>> convertDTOsToFunctions(Collection<FunctionDTO> functionDTOs, FunctionProvider functionProvider) {
|
||||
private List<Function<?>> convertDTOsToFunctions(Collection<FunctionDTO> functionDTOs) {
|
||||
List<Function<?>> dimensionsToGroupBy = new ArrayList<>();
|
||||
for (FunctionDTO functionDTO : functionDTOs) {
|
||||
dimensionsToGroupBy.add(functionProvider.getFunctionForDTO(functionDTO));
|
||||
@@ -92,36 +92,70 @@ public final class SailingDataMiningFactory {
|
||||
return dimensionsToGroupBy;
|
||||
}
|
||||
|
||||
private static Map<SailingDataRetrievalLevels, Collection<Function<?>>> mapFunctionsByRetrievalLevel(Collection<Function<?>> functions) {
|
||||
Map<SailingDataRetrievalLevels, Collection<Function<?>>> mappedFunctions = new HashMap<>();
|
||||
for (Function<?> function : functions) {
|
||||
SailingDataRetrievalLevels retrievalLevel = calculateDataRetrievalLevel(function);
|
||||
if (!mappedFunctions.containsKey(retrievalLevel)) {
|
||||
mappedFunctions.put(retrievalLevel, new HashSet<Function<?>>());
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> Map<Class<?>, FilterCriterion<?>> createFilterCriteria(Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection) {
|
||||
Map<Class<?>, CompoundFilterCriterion<?>> criteriaMappedByDataType = new HashMap<>();
|
||||
for (Entry<FunctionDTO, Iterable<? extends Serializable>> filterSelectionEntry : filterSelection.entrySet()) {
|
||||
Function<?> function = functionProvider.getFunctionForDTO(filterSelectionEntry.getKey());
|
||||
Class<T> dataType = (Class<T>) function.getDeclaringType();
|
||||
|
||||
if (!criteriaMappedByDataType.containsKey(dataType)) {
|
||||
criteriaMappedByDataType.put(dataType, new AndCompoundFilterCriterion<>(dataType));
|
||||
}
|
||||
mappedFunctions.get(retrievalLevel).add(function);
|
||||
|
||||
Collection<Object> filterValues = new ArrayList<>();
|
||||
for (Object filterValue : filterSelectionEntry.getValue()) {
|
||||
filterValues.add(filterValue);
|
||||
}
|
||||
((CompoundFilterCriterion<T>) criteriaMappedByDataType.get(dataType)).addCriteria(new NullaryFunctionValuesFilterCriterion<>(dataType, function, filterValues));
|
||||
}
|
||||
return (Map<Class<?>, FilterCriterion<?>>)(Map<Class<?>, ?>) criteriaMappedByDataType;
|
||||
}
|
||||
|
||||
public Query<Set<Object>> createDimensionValuesQuery(RacingEventService dataSource, final DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, final String localeInfoName) {
|
||||
final DataMiningStringMessages stringMessages = DataMiningActivator.getStringMessages();
|
||||
final Locale locale = DataMiningStringMessages.Util.getLocaleFor(localeInfoName);
|
||||
return new ProcessorQuery<Set<Object>, RacingEventService>(DataMiningActivator.getExecutor(), dataSource, stringMessages, locale) {
|
||||
@Override
|
||||
protected Processor<RacingEventService, ?> createFirstProcessor() {
|
||||
Processor<GroupedDataEntry<Object>, Map<GroupKey, Set<Object>>> valueCollector = processorFactory.createGroupedDataCollectingAsSetProcessor(/*query*/ this);
|
||||
|
||||
DataRetrieverChainDefinition<RacingEventService> dataRetrieverChainDefinition = dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinition(RacingEventService.class, dataRetrieverChainDefinitionDTO.getId());
|
||||
DataRetrieverChainBuilder<RacingEventService> chainBuilder = dataRetrieverChainDefinition.startBuilding(DataMiningActivator.getExecutor());
|
||||
Collection<Function<?>> dimensions = functionProvider.getMinimizedDimensionsFor(dataRetrieverChainDefinition);
|
||||
Map<Class<?>, Collection<Function<?>>> dimensionsMappedByDeclaringType = mapFunctionsByDeclaringType(dimensions);
|
||||
while (!dimensionsMappedByDeclaringType.isEmpty()) {
|
||||
Class<?> dataType = chainBuilder.getCurrentRetrievedDataType();
|
||||
|
||||
if (dimensionsMappedByDeclaringType.containsKey(dataType)) {
|
||||
for (Processor<?, ?> resultReceiver : processorFactory.createGroupingExtractorsForDimensions(
|
||||
dataType, valueCollector, dimensionsMappedByDeclaringType.get(dataType),
|
||||
stringMessages, locale)) {
|
||||
chainBuilder.addResultReceiver(resultReceiver);
|
||||
}
|
||||
dimensionsMappedByDeclaringType.remove(dataType);
|
||||
}
|
||||
|
||||
if (!dimensionsMappedByDeclaringType.isEmpty()) {
|
||||
chainBuilder.stepDeeper();
|
||||
}
|
||||
}
|
||||
|
||||
return chainBuilder.build();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private Map<Class<?>, Collection<Function<?>>> mapFunctionsByDeclaringType(Collection<Function<?>> functions) {
|
||||
Map<Class<?>, Collection<Function<?>>> mappedFunctions = new HashMap<>();
|
||||
for (Function<?> function : functions) {
|
||||
Class<?> declaringType = function.getDeclaringType();
|
||||
if (!mappedFunctions.containsKey(declaringType)) {
|
||||
mappedFunctions.put(declaringType, new HashSet<Function<?>>());
|
||||
}
|
||||
mappedFunctions.get(declaringType).add(function);
|
||||
}
|
||||
return mappedFunctions;
|
||||
}
|
||||
|
||||
private static SailingDataRetrievalLevels calculateDataRetrievalLevel(Function<?> function) {
|
||||
if (function.getDeclaringType().equals(HasTrackedRaceContext.class)) {
|
||||
return SailingDataRetrievalLevels.TrackedRace;
|
||||
}
|
||||
if (function.getDeclaringType().equals(HasTrackedLegContext.class)) {
|
||||
return SailingDataRetrievalLevels.TrackedLeg;
|
||||
}
|
||||
if (function.getDeclaringType().equals(HasTrackedLegOfCompetitorContext.class)) {
|
||||
return SailingDataRetrievalLevels.TrackedLegOfCompetitor;
|
||||
}
|
||||
if (function.getDeclaringType().equals(HasGPSFixContext.class)) {
|
||||
return SailingDataRetrievalLevels.GPSFix;
|
||||
}
|
||||
return SailingDataRetrievalLevels.GPSFix;
|
||||
}
|
||||
|
||||
private static SailingDataRetrievalLevels getDeepestRetrievalLevel(Collection<SailingDataRetrievalLevels> retrievalLevels) {
|
||||
return Collections.max(retrievalLevels);
|
||||
}
|
||||
|
||||
}
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
public enum SailingDataRetrievalLevels {
|
||||
|
||||
LeaderboardGroup, RegattaLeaderboard, TrackedRace, TrackedLeg, TrackedLegOfCompetitor, GPSFix
|
||||
|
||||
}
|
||||
-141
@@ -1,141 +0,0 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.datamining.impl.components.GPSFixRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.RegattaLeaderboardFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedLegFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedRaceFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionProvider;
|
||||
import com.sap.sse.datamining.impl.DataMiningActivator;
|
||||
import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.CompoundFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.NonFilteringFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.NullaryFunctionValuesFilterCriterion;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public final class SailingDataRetrieverFactory {
|
||||
|
||||
private SailingDataRetrieverFactory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the processor chain for the data retrieval and returns the first processor of the chain.
|
||||
* @param groupingProcessor The result receiver after the retrieval
|
||||
* @param filterSelection The filter functions and values for the filtration
|
||||
* @param functionProvider
|
||||
* @return The first processor of the retrieval chain.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <ElementType> Processor<RacingEventService> createRetrievalProcessorChain(SailingDataRetrievalLevels dataRetrievalLevel, Processor<ElementType> groupingProcessor, Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection, FunctionProvider functionProvider) {
|
||||
Processor<?> resultReceiver = groupingProcessor;
|
||||
for (int i = dataRetrievalLevel.ordinal(); i >= 0; i--) {
|
||||
resultReceiver = createDataRetrieverFor(SailingDataRetrievalLevels.values()[i], resultReceiver, filterSelection, functionProvider);
|
||||
}
|
||||
return (Processor<RacingEventService>) resultReceiver;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
/* The way this method is used should guarantee, that the result receiver matches the new processor
|
||||
*/
|
||||
private static Processor<?> createDataRetrieverFor(SailingDataRetrievalLevels dataRetrievalLevel,
|
||||
Processor<?> resultReceiver, Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection, FunctionProvider functionProvider) {
|
||||
ThreadPoolExecutor executor = DataMiningActivator.getExecutor();
|
||||
|
||||
switch (dataRetrievalLevel) {
|
||||
case GPSFix:
|
||||
Processor<HasGPSFixContext> gpsFixSpecificResultReceiver = (Processor<HasGPSFixContext>) resultReceiver;
|
||||
return new GPSFixRetrievalProcessor(executor, Arrays.asList(gpsFixSpecificResultReceiver));
|
||||
case LeaderboardGroup:
|
||||
Processor<LeaderboardGroup> leaderboardGroupSpecificResultReceiver = (Processor<LeaderboardGroup>) resultReceiver;
|
||||
return new LeaderboardGroupRetrievalProcessor(executor, Arrays.asList(leaderboardGroupSpecificResultReceiver));
|
||||
case RegattaLeaderboard:
|
||||
Processor<RegattaLeaderboard> regattaLeaderboardSpecificResultReceiver = (Processor<RegattaLeaderboard>) resultReceiver;
|
||||
return new RegattaLeaderboardFilteringRetrievalProcessor(executor, Arrays.asList(regattaLeaderboardSpecificResultReceiver), getFilterCriteriaForBaseDataType(RegattaLeaderboard.class, filterSelection, functionProvider));
|
||||
case TrackedLeg:
|
||||
Processor<HasTrackedLegContext> trackedLegSpecificResultReceiver = (Processor<HasTrackedLegContext>) resultReceiver;
|
||||
return new TrackedLegFilteringRetrievalProcessor(executor, Arrays.asList(trackedLegSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedLegContext.class, filterSelection, functionProvider));
|
||||
case TrackedLegOfCompetitor:
|
||||
Processor<HasTrackedLegOfCompetitorContext> trackedLegOfCompetitorSpecificResultReceiver = (Processor<HasTrackedLegOfCompetitorContext>) resultReceiver;
|
||||
return new TrackedLegOfCompetitorFilteringRetrievalProcessor(executor, Arrays.asList(trackedLegOfCompetitorSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedLegOfCompetitorContext.class, filterSelection, functionProvider));
|
||||
case TrackedRace:
|
||||
Processor<HasTrackedRaceContext> trackedRaceSpecificResultReceiver = (Processor<HasTrackedRaceContext>) resultReceiver;
|
||||
return new TrackedRaceFilteringRetrievalProcessor(executor, Arrays.asList(trackedRaceSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedRaceContext.class, filterSelection, functionProvider));
|
||||
}
|
||||
throw new IllegalArgumentException("No data retriever implemented for the given data retrieval level '"
|
||||
+ dataRetrievalLevel + "'");
|
||||
}
|
||||
|
||||
private static <BaseDataType> FilterCriterion<BaseDataType> getFilterCriteriaForBaseDataType(Class<BaseDataType> baseDataType,
|
||||
Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection, FunctionProvider functionProvider) {
|
||||
CompoundFilterCriterion<BaseDataType> criteria = null;
|
||||
for (Entry<FunctionDTO, Iterable<? extends Serializable>> filterSelectionEntry : filterSelection.entrySet()) {
|
||||
Function<?> function = functionProvider.getFunctionForDTO(filterSelectionEntry.getKey());
|
||||
if (baseDataType.equals(function.getDeclaringType())) {
|
||||
if (criteria == null) {
|
||||
criteria = new AndCompoundFilterCriterion<>();
|
||||
}
|
||||
|
||||
Collection<Object> filterValues = new ArrayList<>();
|
||||
for (Object filterValue : filterSelectionEntry.getValue()) {
|
||||
filterValues.add(filterValue);
|
||||
}
|
||||
criteria.addCriteria(new NullaryFunctionValuesFilterCriterion<BaseDataType>(function, filterValues));
|
||||
}
|
||||
}
|
||||
return criteria != null ? criteria : new NonFilteringFilterCriterion<BaseDataType>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a retrieval processor without filter for the given retrieval level and result receivers.<br>
|
||||
* The input type of the result receivers has to match the result type of the created retrieval processor for the given retrievel level or a {@link ClassCastException} can be thrown.
|
||||
* For example, if the retrieval Level is {@link SailingDataRetrievalLevels#TrackedRace} the input must be {@link HasTrackedRaceContext}.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Processor<?> createRetrievalProcessorWithoutFilter(SailingDataRetrievalLevels retrievalLevel,
|
||||
Collection<Processor<?>> retrievalResultReceivers) throws ClassCastException {
|
||||
ThreadPoolExecutor executor = DataMiningActivator.getExecutor();
|
||||
|
||||
switch (retrievalLevel) {
|
||||
case GPSFix:
|
||||
Collection<Processor<HasGPSFixContext>> gpsFixSpecificResultReceivers = (Collection<Processor<HasGPSFixContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new GPSFixRetrievalProcessor(executor, gpsFixSpecificResultReceivers);
|
||||
case LeaderboardGroup:
|
||||
Collection<Processor<LeaderboardGroup>> leaderboardGroupSpecificResultReceivers = (Collection<Processor<LeaderboardGroup>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new LeaderboardGroupRetrievalProcessor(executor, leaderboardGroupSpecificResultReceivers);
|
||||
case RegattaLeaderboard:
|
||||
Collection<Processor<RegattaLeaderboard>> regattaLeaderboardSpecificResultReceivers = (Collection<Processor<RegattaLeaderboard>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new RegattaLeaderboardFilteringRetrievalProcessor(executor, regattaLeaderboardSpecificResultReceivers, new NonFilteringFilterCriterion<RegattaLeaderboard>());
|
||||
case TrackedLeg:
|
||||
Collection<Processor<HasTrackedLegContext>> trackedLegSpecificResultReceivers = (Collection<Processor<HasTrackedLegContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new TrackedLegFilteringRetrievalProcessor(executor, trackedLegSpecificResultReceivers, new NonFilteringFilterCriterion<HasTrackedLegContext>());
|
||||
case TrackedLegOfCompetitor:
|
||||
Collection<Processor<HasTrackedLegOfCompetitorContext>> trackedLegOfCompetitorSpecificResultReceivers = (Collection<Processor<HasTrackedLegOfCompetitorContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new TrackedLegOfCompetitorFilteringRetrievalProcessor(executor, trackedLegOfCompetitorSpecificResultReceivers, new NonFilteringFilterCriterion<HasTrackedLegOfCompetitorContext>());
|
||||
case TrackedRace:
|
||||
Collection<Processor<HasTrackedRaceContext>> trackedRaceSpecificResultReceivers = (Collection<Processor<HasTrackedRaceContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new TrackedRaceFilteringRetrievalProcessor(executor, trackedRaceSpecificResultReceivers, new NonFilteringFilterCriterion<HasTrackedRaceContext>());
|
||||
}
|
||||
throw new IllegalArgumentException("No data retriever implemented for the given data retrieval level '"
|
||||
+ retrievalLevel + "'");
|
||||
}
|
||||
|
||||
}
|
||||
+3
-3
@@ -21,14 +21,14 @@ import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
level=5)
|
||||
public class GPSFixRetrievalProcessor extends AbstractSimpleRetrievalProcessor<HasTrackedLegOfCompetitorContext, HasGPSFixContext> {
|
||||
|
||||
public GPSFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasGPSFixContext>> resultReceivers) {
|
||||
super(executor, resultReceivers);
|
||||
public GPSFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasGPSFixContext, ?>> resultReceivers) {
|
||||
super(HasTrackedLegOfCompetitorContext.class, HasGPSFixContext.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<HasGPSFixContext> retrieveData(HasTrackedLegOfCompetitorContext element) {
|
||||
Collection<HasGPSFixContext> gpsFixesWithContext = new ArrayList<>();
|
||||
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = element.getTrackedRace().getTrack(element.getCompetitor());
|
||||
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = element.getTrackedLegContext().getTrackedRaceContext().getTrackedRace().getTrack(element.getCompetitor());
|
||||
competitorTrack.lockForRead();
|
||||
try {
|
||||
TrackedLegOfCompetitor trackedLegOfCompetitor = element.getTrackedLegOfCompetitor();
|
||||
|
||||
+2
-2
@@ -17,8 +17,8 @@ public class LeaderboardGroupRetrievalProcessor extends
|
||||
AbstractSimpleRetrievalProcessor<RacingEventService, LeaderboardGroup> {
|
||||
|
||||
public LeaderboardGroupRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<LeaderboardGroup>> resultReceivers) {
|
||||
super(executor, resultReceivers);
|
||||
Collection<Processor<LeaderboardGroup, ?>> resultReceivers) {
|
||||
super(RacingEventService.class, LeaderboardGroup.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+4
-5
@@ -8,20 +8,19 @@ import com.sap.sailing.datamining.Activator;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=RegattaLeaderboard.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=1)
|
||||
public class RegattaLeaderboardFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<LeaderboardGroup, RegattaLeaderboard> {
|
||||
AbstractSimpleRetrievalProcessor<LeaderboardGroup, RegattaLeaderboard> {
|
||||
|
||||
public RegattaLeaderboardFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<RegattaLeaderboard>> resultReceivers, FilterCriterion<RegattaLeaderboard> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
Collection<Processor<RegattaLeaderboard, ?>> resultReceivers) {
|
||||
super(LeaderboardGroup.class, RegattaLeaderboard.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+4
-5
@@ -9,20 +9,19 @@ import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegWithContext;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=HasTrackedLegContext.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=3)
|
||||
public class TrackedLegFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<HasTrackedRaceContext, HasTrackedLegContext> {
|
||||
AbstractSimpleRetrievalProcessor<HasTrackedRaceContext, HasTrackedLegContext> {
|
||||
|
||||
public TrackedLegFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<HasTrackedLegContext>> resultReceivers, FilterCriterion<HasTrackedLegContext> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
Collection<Processor<HasTrackedLegContext, ?>> resultReceivers) {
|
||||
super(HasTrackedRaceContext.class, HasTrackedLegContext.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-7
@@ -9,27 +9,25 @@ import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=HasTrackedLegOfCompetitorContext.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=4)
|
||||
public class TrackedLegOfCompetitorFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<HasTrackedLegContext, HasTrackedLegOfCompetitorContext> {
|
||||
AbstractSimpleRetrievalProcessor<HasTrackedLegContext, HasTrackedLegOfCompetitorContext> {
|
||||
|
||||
public TrackedLegOfCompetitorFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<HasTrackedLegOfCompetitorContext>> resultReceivers,
|
||||
FilterCriterion<HasTrackedLegOfCompetitorContext> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
Collection<Processor<HasTrackedLegOfCompetitorContext, ?>> resultReceivers) {
|
||||
super(HasTrackedLegContext.class, HasTrackedLegOfCompetitorContext.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<HasTrackedLegOfCompetitorContext> retrieveData(HasTrackedLegContext element) {
|
||||
Collection<HasTrackedLegOfCompetitorContext> trackedLegOfCompetitorsWithContext = new ArrayList<>();
|
||||
for (Competitor competitor : element.getRace().getCompetitors()) {
|
||||
for (Competitor competitor : element.getTrackedRaceContext().getTrackedRace().getRace().getCompetitors()) {
|
||||
HasTrackedLegOfCompetitorContext trackedLegOfCompetitorWithContext = new TrackedLegOfCompetitorWithContext(element, element.getTrackedLeg().getTrackedLeg(competitor));
|
||||
trackedLegOfCompetitorsWithContext.add(trackedLegOfCompetitorWithContext);
|
||||
}
|
||||
|
||||
+4
-5
@@ -11,20 +11,19 @@ import com.sap.sailing.domain.base.RaceColumn;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=HasTrackedRaceContext.class,
|
||||
groupName="Sailing",
|
||||
level=2)
|
||||
public class TrackedRaceFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<Leaderboard, HasTrackedRaceContext> {
|
||||
AbstractSimpleRetrievalProcessor<Leaderboard, HasTrackedRaceContext> {
|
||||
|
||||
public TrackedRaceFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<HasTrackedRaceContext>> resultReceivers, FilterCriterion<HasTrackedRaceContext> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
Collection<Processor<HasTrackedRaceContext, ?>> resultReceivers) {
|
||||
super(Leaderboard.class, HasTrackedRaceContext.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+10
-14
@@ -2,27 +2,23 @@ package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class GPSFixWithContext extends TrackedLegOfCompetitorWithContext implements HasGPSFixContext {
|
||||
public class GPSFixWithContext implements HasGPSFixContext {
|
||||
|
||||
private final HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext;
|
||||
|
||||
private final GPSFixMoving gpsFix;
|
||||
|
||||
public GPSFixWithContext(HasTrackedLegOfCompetitorContext legContext, GPSFixMoving gpsFix) {
|
||||
this(legContext.getRegatta(), legContext.getFleet(), legContext.getTrackedRace(),
|
||||
legContext.getTrackedLeg(), legContext.getLegNumber(), legContext.getTrackedLegOfCompetitor(), gpsFix);
|
||||
}
|
||||
|
||||
public GPSFixWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace,
|
||||
TrackedLeg trackedLeg, int legNumber, TrackedLegOfCompetitor trackedLegOfCompetitor, GPSFixMoving gpsFix) {
|
||||
super(regatta, fleet, trackedRace, trackedLeg, legNumber, trackedLegOfCompetitor);
|
||||
public GPSFixWithContext(HasTrackedLegOfCompetitorContext trackedLegOfCompetitorContext, GPSFixMoving gpsFix) {
|
||||
this.trackedLegOfCompetitorContext = trackedLegOfCompetitorContext;
|
||||
this.gpsFix = gpsFix;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasTrackedLegOfCompetitorContext getTrackedLegOfCompetitorContext() {
|
||||
return trackedLegOfCompetitorContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GPSFixMoving getGPSFix() {
|
||||
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sse.datamining.ClassesWithFunctionsService;
|
||||
|
||||
public class SailingDataMiningClassesWithFunctionsService implements ClassesWithFunctionsService {
|
||||
|
||||
@Override
|
||||
public Set<Class<?>> getInternalClassesWithMarkedMethods() {
|
||||
Set<Class<?>> internalClasses = new HashSet<>();
|
||||
/*
|
||||
* This also contains the marked methods of
|
||||
* HasTrackedRaceContext,
|
||||
* HasTrackedLegContext and
|
||||
* HasTrackedLegOfCompetitorContext,
|
||||
* because these are the super types of HasGPSFixContext.
|
||||
*/
|
||||
internalClasses.add(HasGPSFixContext.class);
|
||||
return internalClasses;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Class<?>> getExternalLibraryClasses() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
}
|
||||
+10
-14
@@ -3,31 +3,27 @@ package com.sap.sailing.datamining.impl.data;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class TrackedLegOfCompetitorWithContext extends TrackedLegWithContext implements HasTrackedLegOfCompetitorContext {
|
||||
public class TrackedLegOfCompetitorWithContext implements HasTrackedLegOfCompetitorContext {
|
||||
|
||||
private final HasTrackedLegContext trackedLegContext;
|
||||
|
||||
private final TrackedLegOfCompetitor trackedLegOfCompetitor;
|
||||
private final Competitor competitor;
|
||||
|
||||
public TrackedLegOfCompetitorWithContext(HasTrackedLegContext trackedLegContext, TrackedLegOfCompetitor trackedLegOfCompetitor) {
|
||||
this(trackedLegContext.getRegatta(), trackedLegContext.getFleet(),
|
||||
trackedLegContext.getTrackedRace(), trackedLegContext.getTrackedLeg(),
|
||||
trackedLegContext.getLegNumber(), trackedLegOfCompetitor);
|
||||
}
|
||||
|
||||
public TrackedLegOfCompetitorWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace,
|
||||
TrackedLeg trackedLeg, int legNumber, TrackedLegOfCompetitor trackedLegOfCompetitor) {
|
||||
super(regatta, fleet, trackedRace, trackedLeg, legNumber);
|
||||
this.trackedLegContext = trackedLegContext;
|
||||
this.trackedLegOfCompetitor = trackedLegOfCompetitor;
|
||||
this.competitor = trackedLegOfCompetitor.getCompetitor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasTrackedLegContext getTrackedLegContext() {
|
||||
return trackedLegContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedLegOfCompetitor getTrackedLegOfCompetitor() {
|
||||
return trackedLegOfCompetitor;
|
||||
@@ -40,7 +36,7 @@ public class TrackedLegOfCompetitorWithContext extends TrackedLegWithContext imp
|
||||
|
||||
@Override
|
||||
public Double getDistanceTraveled() {
|
||||
TimePoint timePoint = getTrackedRace().getEndOfTracking();
|
||||
TimePoint timePoint = getTrackedLegContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking();
|
||||
return getTrackedLegOfCompetitor().getDistanceTraveled(timePoint).getMeters();
|
||||
}
|
||||
|
||||
|
||||
+9
-10
@@ -2,17 +2,16 @@ package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class TrackedLegWithContext extends TrackedRaceWithContext implements HasTrackedLegContext {
|
||||
public class TrackedLegWithContext implements HasTrackedLegContext {
|
||||
|
||||
private final HasTrackedRaceContext trackedRaceContext;
|
||||
|
||||
private final TrackedLeg trackedLeg;
|
||||
private final int legNumber;
|
||||
@@ -20,15 +19,15 @@ public class TrackedLegWithContext extends TrackedRaceWithContext implements Has
|
||||
private boolean legTypeHasBeenInitialized;
|
||||
|
||||
public TrackedLegWithContext(HasTrackedRaceContext trackedRaceContext, TrackedLeg trackedLeg, int legNumber) {
|
||||
this(trackedRaceContext.getRegatta(), trackedRaceContext.getFleet(),
|
||||
trackedRaceContext.getTrackedRace(), trackedLeg, legNumber);
|
||||
}
|
||||
|
||||
public TrackedLegWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber) {
|
||||
super(regatta, fleet, trackedRace);
|
||||
this.trackedRaceContext = trackedRaceContext;
|
||||
this.trackedLeg = trackedLeg;
|
||||
this.legNumber = legNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasTrackedRaceContext getTrackedRaceContext() {
|
||||
return trackedRaceContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedLeg getTrackedLeg() {
|
||||
|
||||
+2
-2
@@ -6,10 +6,10 @@ import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
import com.sap.sse.common.Named;
|
||||
|
||||
public interface Competitor extends Named, WithID, IsManagedBySharedDomainFactory {
|
||||
@Connector(messageKey="Team", ordinal=8)
|
||||
@Connector(messageKey="Team", ordinal=9)
|
||||
Team getTeam();
|
||||
|
||||
@Connector(messageKey="Boat", ordinal=9)
|
||||
@Connector(messageKey="Boat", ordinal=10)
|
||||
Boat getBoat();
|
||||
|
||||
Color getColor();
|
||||
|
||||
+2
@@ -1094,6 +1094,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
|
||||
String raceVisibilityColumn();
|
||||
String enterCarryValueFor(String competitorName);
|
||||
String advanced();
|
||||
String basedOn();
|
||||
String retrieveWith();
|
||||
String mappingDetails();
|
||||
String deviceMappingQrCodeExplanation();
|
||||
String qrCode();
|
||||
|
||||
+3
-1
@@ -1076,6 +1076,8 @@ showAll=Show all
|
||||
raceVisibilityColumn=Visibility
|
||||
enterCarryValueFor=Enter carried points for competitor {0}
|
||||
advanced=Advanced
|
||||
basedOn=based on
|
||||
retrieveWith=Retrieve with
|
||||
mappingDetails=Mapping Details
|
||||
deviceMappingQrCodeExplanation=If you are using the Tracking App, you can add the device mapping also by selecting a competitor/mark, setting the from and to times, and then scanning this QRCode.
|
||||
qrCode=QRCode
|
||||
@@ -1084,4 +1086,4 @@ enterCourseName=Enter course name...
|
||||
enterImageURL=Enter image URL...
|
||||
enterVideoURL=Enter video URL...
|
||||
enterSponsorImageURL=Enter sponsor image URL...
|
||||
enterRaceName=Enter race name...
|
||||
enterRaceName=Enter race name...
|
||||
+2
-1
@@ -1071,6 +1071,7 @@ showAll=Alle zeigen
|
||||
raceVisibilityColumn=Sichtbarkeit
|
||||
enterCarryValueFor=Punkteübertrag für Teilnehmer {0} erfassen
|
||||
advanced=Erweitert
|
||||
retrieveWith=Beschaffe mit
|
||||
mappingDetails=Zuordnungsdetails
|
||||
deviceMappingQrCodeExplanation=Wenn die Tracking App verwendet wird, kann die Zuordnung auch wie folgt geschehen: Wettbewerber/Tonne auswaehlen, von und bis Zeiten setzen und dann den QRCode abscannen.
|
||||
qrCode=QRCode
|
||||
@@ -1079,4 +1080,4 @@ enterCourseName=Regattakurs-Namen eingeben...
|
||||
enterImageURL=Bild-URL eingeben...
|
||||
enterVideoURL=Video-URL eingeben...
|
||||
enterSponsorImageURL=Sponsorbild-URL eingeben...
|
||||
enterRaceName=Wettfahrtnamen eingeben...
|
||||
enterRaceName=Wettfahrtnamen eingeben...
|
||||
+4
-1
@@ -9,6 +9,7 @@ import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.QueryResult;
|
||||
import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public interface DataMiningService extends RemoteService {
|
||||
|
||||
@@ -16,7 +17,9 @@ public interface DataMiningService extends RemoteService {
|
||||
|
||||
Collection<FunctionDTO> getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName);
|
||||
|
||||
QueryResult<Set<Object>> getDimensionValuesFor(Collection<FunctionDTO> dimensions) throws Exception;
|
||||
Collection<DataRetrieverChainDefinitionDTO> getDataRetrieverChainDefinitionsFor(FunctionDTO statisticToCalculate, String localeInfoName);
|
||||
|
||||
QueryResult<Set<Object>> getDimensionValuesFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinition, String localeInfoName) throws Exception;
|
||||
|
||||
<ResultType extends Number> QueryResult<ResultType> runQuery(QueryDefinition queryDefinition) throws Exception;
|
||||
|
||||
|
||||
+5
-1
@@ -10,6 +10,7 @@ import com.sap.sse.datamining.shared.QueryResult;
|
||||
import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public interface DataMiningServiceAsync {
|
||||
|
||||
@@ -17,7 +18,10 @@ public interface DataMiningServiceAsync {
|
||||
|
||||
void getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName, AsyncCallback<Collection<FunctionDTO>> callback);
|
||||
|
||||
void getDimensionValuesFor(Collection<FunctionDTO> dimensions, AsyncCallback<QueryResult<Set<Object>>> callback);
|
||||
void getDataRetrieverChainDefinitionsFor(FunctionDTO statisticToCalculate, String localeInfoName,
|
||||
AsyncCallback<Collection<DataRetrieverChainDefinitionDTO>> callback);
|
||||
|
||||
void getDimensionValuesFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinition, String localeInfoName, AsyncCallback<QueryResult<Set<Object>>> callback);
|
||||
|
||||
<ResultType extends Number> void runQuery(QueryDefinition queryDefinition, AsyncCallback<QueryResult<ResultType>> callback);
|
||||
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public interface DataRetrieverChainDefinitionChangedListener {
|
||||
|
||||
public void dataRetrieverChainDefinitionChanged(DataRetrieverChainDefinitionDTO newDataRetrieverChainDefinition);
|
||||
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.Component;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public interface DataRetrieverChainDefinitionProvider extends Component<Object> {
|
||||
|
||||
public DataRetrieverChainDefinitionDTO getDataRetrieverChainDefinition();
|
||||
|
||||
public void addDataRetrieverChainDefinitionChangedListener(DataRetrieverChainDefinitionChangedListener listener);
|
||||
|
||||
public void applyQueryDefinition(QueryDefinition queryDefinition);
|
||||
|
||||
}
|
||||
-3
@@ -4,13 +4,10 @@ import java.util.Collection;
|
||||
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.Component;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.components.GrouperType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public interface GroupingProvider extends Component<Object> {
|
||||
|
||||
public GrouperType getGrouperType();
|
||||
|
||||
public Collection<FunctionDTO> getDimensionsToGroupBy();
|
||||
public String getCustomGrouperScriptText();
|
||||
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.selection;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public class ExtractionFunctionSet {
|
||||
|
||||
private final Map<FunctionDTOKey, FunctionDTO> functionDTOMap;
|
||||
private final Map<StrippedFunctionDTO, Collection<String>> sourceTypeNamesMap;
|
||||
|
||||
public ExtractionFunctionSet() {
|
||||
functionDTOMap = new HashMap<>();
|
||||
sourceTypeNamesMap = new HashMap<>();
|
||||
}
|
||||
|
||||
public void addAll(Collection<FunctionDTO> functionDTOs) {
|
||||
for (FunctionDTO functionDTO : functionDTOs) {
|
||||
add(functionDTO);
|
||||
}
|
||||
}
|
||||
|
||||
private void add(FunctionDTO functionDTO) {
|
||||
String sourceTypeName = functionDTO.getSourceTypeName();
|
||||
StrippedFunctionDTO strippedFunctionDTO = new StrippedFunctionDTO(functionDTO);
|
||||
FunctionDTOKey key = new FunctionDTOKey(strippedFunctionDTO, sourceTypeName);
|
||||
|
||||
if (!functionDTOMap.containsKey(key)) {
|
||||
functionDTOMap.put(key, functionDTO);
|
||||
|
||||
if (!sourceTypeNamesMap.containsKey(strippedFunctionDTO)) {
|
||||
sourceTypeNamesMap.put(strippedFunctionDTO, new HashSet<String>());
|
||||
}
|
||||
sourceTypeNamesMap.get(strippedFunctionDTO).add(sourceTypeName);
|
||||
}
|
||||
}
|
||||
|
||||
public Collection<StrippedFunctionDTO> getStrippedFunctionDTOs() {
|
||||
return sourceTypeNamesMap.keySet();
|
||||
}
|
||||
|
||||
public Collection<String> getSourceTypeNames(StrippedFunctionDTO strippedFunctionDTO) {
|
||||
return sourceTypeNamesMap.get(strippedFunctionDTO);
|
||||
}
|
||||
|
||||
public FunctionDTO getFunctionDTO(StrippedFunctionDTO strippedFunctionDTO, String sourceTypeName) {
|
||||
FunctionDTOKey key = new FunctionDTOKey(strippedFunctionDTO, sourceTypeName);
|
||||
return functionDTOMap.get(key);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
functionDTOMap.clear();
|
||||
sourceTypeNamesMap.clear();
|
||||
}
|
||||
|
||||
private class FunctionDTOKey extends Pair<StrippedFunctionDTO, String> {
|
||||
private static final long serialVersionUID = -5703889518055076338L;
|
||||
|
||||
public FunctionDTOKey(StrippedFunctionDTO a, String b) {
|
||||
super(a, b);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
-6
@@ -27,7 +27,6 @@ import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.StatisticProvider;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.components.GrouperType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public class MultiDimensionalGroupingProvider implements GroupingProvider, StatisticChangedListener {
|
||||
@@ -158,11 +157,6 @@ public class MultiDimensionalGroupingProvider implements GroupingProvider, Stati
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrouperType getGrouperType() {
|
||||
return GrouperType.Dimensions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<FunctionDTO> getDimensionsToGroupBy() {
|
||||
Collection<FunctionDTO> dimensionsToGroupBy = new ArrayList<FunctionDTO>();
|
||||
|
||||
+23
-7
@@ -11,6 +11,7 @@ import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.RequiresResize;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
@@ -19,6 +20,7 @@ import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
|
||||
import com.sap.sailing.gwt.ui.client.shared.panels.ResizingFlowPanel;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataMiningControls;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.GroupingChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.SelectionProvider;
|
||||
@@ -28,17 +30,19 @@ import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.QueryDefinitionImpl;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public class QueryDefinitionProviderWithControls extends AbstractQueryDefinitionProvider implements DataMiningControls {
|
||||
|
||||
private FlowPanel mainPanel;
|
||||
private HorizontalPanel controlsPanel;
|
||||
|
||||
private SelectionProvider<?> selectionProvider;
|
||||
|
||||
private StatisticProvider statisticProvider;
|
||||
private SimpleDataRetrieverChainDefinitionProvider retrieverChainProvider;
|
||||
|
||||
private MultiDimensionalGroupingProvider groupBySelectionPanel;
|
||||
|
||||
private SelectionProvider<?> selectionProvider;
|
||||
|
||||
public QueryDefinitionProviderWithControls(StringMessages stringMessages, SailingServiceAsync sailingService, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter) {
|
||||
super(stringMessages, sailingService, dataMiningService, errorReporter);
|
||||
@@ -55,7 +59,7 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
|
||||
|
||||
mainPanel.add(createFunctionsPanel());
|
||||
|
||||
selectionProvider = new RefreshingSelectionTablesPanel(stringMessages, dataMiningService, errorReporter, statisticProvider);
|
||||
selectionProvider = new RefreshingSelectionTablesPanel(stringMessages, dataMiningService, errorReporter, retrieverChainProvider);
|
||||
selectionProvider.addSelectionChangedListener(new SelectionChangedListener() {
|
||||
@Override
|
||||
public void selectionChanged() {
|
||||
@@ -70,6 +74,7 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
|
||||
HorizontalPanel functionsPanel = new HorizontalPanel();
|
||||
functionsPanel.setSpacing(5);
|
||||
|
||||
VerticalPanel statisticAndRetrieverChainPanel = new VerticalPanel();
|
||||
statisticProvider = new SimpleStatisticProvider(getStringMessages(), getDataMiningService(), getErrorReporter());
|
||||
statisticProvider.addStatisticChangedListener(new StatisticChangedListener() {
|
||||
@Override
|
||||
@@ -77,7 +82,17 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
|
||||
notifyQueryDefinitionChanged();
|
||||
}
|
||||
});
|
||||
functionsPanel.add(statisticProvider.getEntryWidget());
|
||||
statisticAndRetrieverChainPanel.add(statisticProvider.getEntryWidget());
|
||||
|
||||
retrieverChainProvider = new SimpleDataRetrieverChainDefinitionProvider(getStringMessages(), getDataMiningService(), getErrorReporter(), statisticProvider);
|
||||
retrieverChainProvider.addDataRetrieverChainDefinitionChangedListener(new DataRetrieverChainDefinitionChangedListener() {
|
||||
@Override
|
||||
public void dataRetrieverChainDefinitionChanged(DataRetrieverChainDefinitionDTO newDataRetrieverChainDefinition) {
|
||||
notifyQueryDefinitionChanged();
|
||||
}
|
||||
});
|
||||
statisticAndRetrieverChainPanel.add(retrieverChainProvider.getEntryWidget());
|
||||
functionsPanel.add(statisticAndRetrieverChainPanel);
|
||||
|
||||
groupBySelectionPanel = new MultiDimensionalGroupingProvider(getStringMessages(), getDataMiningService(), getErrorReporter(), statisticProvider);
|
||||
groupBySelectionPanel.addGroupingChangedListener(new GroupingChangedListener() {
|
||||
@@ -107,7 +122,7 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
|
||||
@Override
|
||||
public QueryDefinition getQueryDefinition() {
|
||||
QueryDefinitionImpl queryDTO = new QueryDefinitionImpl(LocaleInfo.getCurrentLocale().getLocaleName(), statisticProvider.getStatisticToCalculate(),
|
||||
statisticProvider.getAggregatorType());
|
||||
statisticProvider.getAggregatorType(), retrieverChainProvider.getDataRetrieverChainDefinition());
|
||||
|
||||
for (FunctionDTO dimension : groupBySelectionPanel.getDimensionsToGroupBy()) {
|
||||
queryDTO.appendDimensionToGroupBy(dimension);
|
||||
@@ -123,9 +138,10 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
|
||||
@Override
|
||||
public void applyQueryDefinition(QueryDefinition queryDefinition) {
|
||||
setBlockChangeNotification(true);
|
||||
selectionProvider.applySelection(queryDefinition);
|
||||
groupBySelectionPanel.applyQueryDefinition(queryDefinition);
|
||||
statisticProvider.applyQueryDefinition(queryDefinition);
|
||||
retrieverChainProvider.applyQueryDefinition(queryDefinition);
|
||||
groupBySelectionPanel.applyQueryDefinition(queryDefinition);
|
||||
selectionProvider.applySelection(queryDefinition);
|
||||
setBlockChangeNotification(false);
|
||||
|
||||
notifyQueryDefinitionChanged();
|
||||
|
||||
+84
-92
@@ -26,20 +26,21 @@ import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionProvider;
|
||||
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.SelectionProvider;
|
||||
import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.StatisticProvider;
|
||||
import com.sap.sailing.gwt.ui.datamining.settings.RefreshingSelectionTablesSettings;
|
||||
import com.sap.sailing.gwt.ui.datamining.settings.RefreshingSelectionTablesSettingsDialogComponent;
|
||||
import com.sap.sse.datamining.shared.GroupKey;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.QueryResult;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public class RefreshingSelectionTablesPanel implements SelectionProvider<RefreshingSelectionTablesSettings>,
|
||||
StatisticChangedListener {
|
||||
DataRetrieverChainDefinitionChangedListener {
|
||||
|
||||
private static final int resizeDelay = 100;
|
||||
private static final double relativeWidthInPercent = 1;
|
||||
@@ -57,18 +58,18 @@ public class RefreshingSelectionTablesPanel implements SelectionProvider<Refresh
|
||||
private Map<GenericGroupKey<FunctionDTO>, SelectionTable<?>> tablesMappedByDimensionAsKeys;
|
||||
private Set<SelectionChangedListener> listeners;
|
||||
|
||||
private FunctionDTO currentStatisticToCalculate;
|
||||
private DataRetrieverChainDefinitionDTO currentDataRetrieverChainDefinition;
|
||||
|
||||
public RefreshingSelectionTablesPanel(StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter,
|
||||
StatisticProvider statisticProvider) {
|
||||
DataRetrieverChainDefinitionProvider dataRetrieverChainDefinitionProvider) {
|
||||
this.stringMessages = stringMessages;
|
||||
this.dataMiningService = dataMiningService;
|
||||
this.errorReporter = errorReporter;
|
||||
settings = new RefreshingSelectionTablesSettings();
|
||||
listeners = new HashSet<SelectionChangedListener>();
|
||||
currentStatisticToCalculate = null;
|
||||
currentDataRetrieverChainDefinition = null;
|
||||
|
||||
tablesMappedByDimensionAsKeys = new HashMap<GenericGroupKey<FunctionDTO>, SelectionTable<?>>();
|
||||
tablesMappedByDimensionAsKeys = new HashMap<>();
|
||||
|
||||
tablesPanel = new HorizontalPanel();
|
||||
|
||||
@@ -93,68 +94,79 @@ public class RefreshingSelectionTablesPanel implements SelectionProvider<Refresh
|
||||
});
|
||||
|
||||
doLayout(Window.getClientWidth(), Window.getClientHeight());
|
||||
statisticProvider.addStatisticChangedListener(this);
|
||||
dataRetrieverChainDefinitionProvider.addDataRetrieverChainDefinitionChangedListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void statisticChanged(FunctionDTO newStatisticToCalculate, AggregatorType newAggregatorType) {
|
||||
if (!Objects.equals(currentStatisticToCalculate, newStatisticToCalculate)) {
|
||||
currentStatisticToCalculate = newStatisticToCalculate;
|
||||
updateAvailableTables();
|
||||
public void dataRetrieverChainDefinitionChanged(DataRetrieverChainDefinitionDTO newDataRetrieverChainDefinition) {
|
||||
if (!Objects.equals(currentDataRetrieverChainDefinition, newDataRetrieverChainDefinition)) {
|
||||
currentDataRetrieverChainDefinition = newDataRetrieverChainDefinition;
|
||||
timer.cancel();
|
||||
updateTables();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateAvailableTables() {
|
||||
dataMiningService.getDimensionsFor(currentStatisticToCalculate, LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<Collection<FunctionDTO>>() {
|
||||
private void updateTables() {
|
||||
dataMiningService.getDimensionValuesFor(currentDataRetrieverChainDefinition, LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<QueryResult<Set<Object>>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error fetching the dimensions from the server: " + caught.getMessage());
|
||||
}
|
||||
@Override
|
||||
public void onSuccess(Collection<FunctionDTO> dimensions) {
|
||||
Collection<GenericGroupKey<FunctionDTO>> dimensionsAsKeys = new HashSet<>();
|
||||
for (FunctionDTO dimension : dimensions) {
|
||||
dimensionsAsKeys.add(new GenericGroupKey<FunctionDTO>(dimension));
|
||||
}
|
||||
public void onSuccess(QueryResult<Set<Object>> dimensionValues) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<GenericGroupKey<FunctionDTO>> dimensionsAsKeys = (Collection<GenericGroupKey<FunctionDTO>>)(Collection<?>) dimensionValues.getResults().keySet();
|
||||
updateAvailableTables(dimensionsAsKeys);
|
||||
|
||||
Collection<GenericGroupKey<FunctionDTO>> dimensionTablesToBeRemoved = new HashSet<>(tablesMappedByDimensionAsKeys.keySet());
|
||||
dimensionTablesToBeRemoved.removeAll(dimensionsAsKeys);
|
||||
for (GenericGroupKey<FunctionDTO> dimensionToBeRemoved : dimensionTablesToBeRemoved) {
|
||||
tablesMappedByDimensionAsKeys.remove(dimensionToBeRemoved);
|
||||
boolean tableContentChanged = updateTableValues(dimensionValues.getResults());
|
||||
if (settings.isRerunQueryAfterRefresh() && tableContentChanged) {
|
||||
notifySelectionChanged();
|
||||
// TODO query is executed, before the data is ready to be analyzed
|
||||
// TODO does this error still appear with the new concept?
|
||||
}
|
||||
|
||||
for (GenericGroupKey<FunctionDTO> dimensionAsKey : dimensionsAsKeys) {
|
||||
if (!tablesMappedByDimensionAsKeys.containsKey(dimensionAsKey)) {
|
||||
SelectionTable<?> table = new SelectionTable<>(dimensionAsKey.getValue());
|
||||
table.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
notifySelectionChanged();
|
||||
}
|
||||
});
|
||||
|
||||
tablesMappedByDimensionAsKeys.put(dimensionAsKey, table);
|
||||
}
|
||||
if (settings.isRefreshAutomatically()) {
|
||||
timer.schedule(settings.getRefreshIntervalInMilliseconds());
|
||||
}
|
||||
|
||||
List<GenericGroupKey<FunctionDTO>> sortedDimensions = new ArrayList<>(tablesMappedByDimensionAsKeys.keySet());
|
||||
Collections.sort(sortedDimensions, new Comparator<GenericGroupKey<FunctionDTO>>() {
|
||||
@Override
|
||||
public int compare(GenericGroupKey<FunctionDTO> k1, GenericGroupKey<FunctionDTO> k2) {
|
||||
return k1.getValue().compareTo(k2.getValue());
|
||||
}
|
||||
});
|
||||
tablesPanel.clear();
|
||||
for (GenericGroupKey<FunctionDTO> dimension : sortedDimensions) {
|
||||
tablesPanel.add(tablesMappedByDimensionAsKeys.get(dimension));
|
||||
}
|
||||
|
||||
updateTables();
|
||||
doLayout(Window.getClientWidth(), Window.getClientHeight());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void updateAvailableTables(Collection<GenericGroupKey<FunctionDTO>> dimensionsAsKeys) {
|
||||
Collection<GenericGroupKey<FunctionDTO>> dimensionTablesToBeRemoved = new HashSet<>(tablesMappedByDimensionAsKeys.keySet());
|
||||
dimensionTablesToBeRemoved.removeAll(dimensionsAsKeys);
|
||||
for (GenericGroupKey<FunctionDTO> dimensionToBeRemoved : dimensionTablesToBeRemoved) {
|
||||
tablesMappedByDimensionAsKeys.remove(dimensionToBeRemoved);
|
||||
}
|
||||
|
||||
for (GenericGroupKey<FunctionDTO> dimensionAsKey : dimensionsAsKeys) {
|
||||
if (!tablesMappedByDimensionAsKeys.containsKey(dimensionAsKey)) {
|
||||
SelectionTable<?> table = new SelectionTable<>(dimensionAsKey.getValue());
|
||||
table.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
notifySelectionChanged();
|
||||
}
|
||||
});
|
||||
|
||||
tablesMappedByDimensionAsKeys.put(dimensionAsKey, table);
|
||||
}
|
||||
}
|
||||
|
||||
List<GenericGroupKey<FunctionDTO>> sortedDimensions = new ArrayList<>(tablesMappedByDimensionAsKeys.keySet());
|
||||
Collections.sort(sortedDimensions, new Comparator<GenericGroupKey<FunctionDTO>>() {
|
||||
@Override
|
||||
public int compare(GenericGroupKey<FunctionDTO> k1, GenericGroupKey<FunctionDTO> k2) {
|
||||
return k1.getValue().compareTo(k2.getValue());
|
||||
}
|
||||
});
|
||||
tablesPanel.clear();
|
||||
for (GenericGroupKey<FunctionDTO> dimension : sortedDimensions) {
|
||||
tablesPanel.add(tablesMappedByDimensionAsKeys.get(dimension));
|
||||
}
|
||||
|
||||
doLayout(Window.getClientWidth(), Window.getClientHeight());
|
||||
}
|
||||
|
||||
private void doLayout(int newWindowWidth, int newWindowHeight) {
|
||||
int absoluteWidth = (int) ((newWindowWidth - widthMargin) * relativeWidthInPercent);
|
||||
int absoluteHeight = (int) (newWindowHeight * relativeHeightInPercent);
|
||||
@@ -169,48 +181,28 @@ public class RefreshingSelectionTablesPanel implements SelectionProvider<Refresh
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTables() {
|
||||
Collection<FunctionDTO> dimensions = new HashSet<>();
|
||||
private boolean updateTableValues(Map<GroupKey, Set<Object>> newValues) {
|
||||
boolean tableContentChanged = false;
|
||||
for (GenericGroupKey<FunctionDTO> dimensionAsKey : tablesMappedByDimensionAsKeys.keySet()) {
|
||||
dimensions.add(dimensionAsKey.getValue());
|
||||
List<?> sortedDimensionValues = new ArrayList<>();
|
||||
if (newValues.containsKey(dimensionAsKey)) {
|
||||
sortedDimensionValues = new ArrayList<>(newValues.get(dimensionAsKey));
|
||||
Collections.sort(sortedDimensionValues, new Comparator<Object>() {
|
||||
@Override
|
||||
public int compare(Object o1, Object o2) {
|
||||
return o1.toString().compareTo(o2.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean currentTableContentChanged = tablesMappedByDimensionAsKeys.get(dimensionAsKey).updateContent(
|
||||
sortedDimensionValues);
|
||||
if (!tableContentChanged) {
|
||||
tableContentChanged = currentTableContentChanged;
|
||||
}
|
||||
}
|
||||
|
||||
dataMiningService.getDimensionValuesFor(dimensions, new AsyncCallback<QueryResult<Set<Object>>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error fetching the dimension values from the server: " + caught.getMessage());
|
||||
}
|
||||
@Override
|
||||
public void onSuccess(QueryResult<Set<Object>> result) {
|
||||
boolean tableContentChanged = false;
|
||||
for (GenericGroupKey<FunctionDTO> dimensionAsKey : tablesMappedByDimensionAsKeys.keySet()) {
|
||||
List<?> sortedDimensionValues = new ArrayList<>();
|
||||
if (result.getResults().containsKey(dimensionAsKey)) {
|
||||
sortedDimensionValues = new ArrayList<>(result.getResults().get(dimensionAsKey));
|
||||
Collections.sort(sortedDimensionValues, new Comparator<Object>() {
|
||||
@Override
|
||||
public int compare(Object o1, Object o2) {
|
||||
return o1.toString().compareTo(o2.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean currentTableContentChanged = tablesMappedByDimensionAsKeys.get(dimensionAsKey).updateContent(sortedDimensionValues);
|
||||
if (!tableContentChanged) {
|
||||
tableContentChanged = currentTableContentChanged;
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.isRerunQueryAfterRefresh() && tableContentChanged) {
|
||||
notifySelectionChanged();
|
||||
// TODO query is executed, before the data is ready to be analyzed
|
||||
// TODO does this error still appear with the new concept?
|
||||
}
|
||||
if (settings.isRefreshAutomatically()) {
|
||||
timer.schedule(settings.getRefreshIntervalInMilliseconds());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return tableContentChanged;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+184
@@ -0,0 +1,184 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.selection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
||||
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
||||
import com.google.gwt.i18n.client.LocaleInfo;
|
||||
import com.google.gwt.text.shared.AbstractRenderer;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.ValueListBox;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionProvider;
|
||||
import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener;
|
||||
import com.sap.sailing.gwt.ui.datamining.StatisticProvider;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public class SimpleDataRetrieverChainDefinitionProvider implements DataRetrieverChainDefinitionProvider,
|
||||
StatisticChangedListener {
|
||||
|
||||
private final StringMessages stringMessages;
|
||||
private final DataMiningServiceAsync dataMiningService;
|
||||
private final ErrorReporter errorReporter;
|
||||
private final Set<DataRetrieverChainDefinitionChangedListener> listeners;
|
||||
|
||||
private FunctionDTO currentStatisticToCalculate;
|
||||
|
||||
private final HorizontalPanel mainPanel;
|
||||
private final ValueListBox<DataRetrieverChainDefinitionDTO> retrieverChainsListBox;
|
||||
|
||||
public SimpleDataRetrieverChainDefinitionProvider(StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter,
|
||||
StatisticProvider statisticProvider) {
|
||||
this.stringMessages = stringMessages;
|
||||
this.dataMiningService = dataMiningService;
|
||||
this.errorReporter = errorReporter;
|
||||
listeners = new HashSet<>();
|
||||
currentStatisticToCalculate = null;
|
||||
|
||||
mainPanel = new HorizontalPanel();
|
||||
mainPanel.setSpacing(5);
|
||||
mainPanel.add(new Label(this.stringMessages.retrieveWith()));
|
||||
|
||||
retrieverChainsListBox = createRetrieverChainsListBox();
|
||||
mainPanel.add(retrieverChainsListBox);
|
||||
|
||||
statisticProvider.addStatisticChangedListener(this);
|
||||
}
|
||||
|
||||
private ValueListBox<DataRetrieverChainDefinitionDTO> createRetrieverChainsListBox() {
|
||||
ValueListBox<DataRetrieverChainDefinitionDTO> retrieverChainsListBox = new ValueListBox<>(new AbstractRenderer<DataRetrieverChainDefinitionDTO>() {
|
||||
@Override
|
||||
public String render(DataRetrieverChainDefinitionDTO retrieverChain) {
|
||||
return retrieverChain.getName();
|
||||
}
|
||||
|
||||
});
|
||||
retrieverChainsListBox.addValueChangeHandler(new ValueChangeHandler<DataRetrieverChainDefinitionDTO>() {
|
||||
@Override
|
||||
public void onValueChange(ValueChangeEvent<DataRetrieverChainDefinitionDTO> event) {
|
||||
notifyListeners();
|
||||
}
|
||||
});
|
||||
return retrieverChainsListBox;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void statisticChanged(FunctionDTO newStatisticToCalculate, AggregatorType newAggregatorType) {
|
||||
if (!Objects.equals(currentStatisticToCalculate, newStatisticToCalculate)) {
|
||||
String currentSourceType = currentStatisticToCalculate == null ? null : currentStatisticToCalculate.getSourceTypeName();
|
||||
currentStatisticToCalculate = newStatisticToCalculate;
|
||||
if (!Objects.equals(currentSourceType, newStatisticToCalculate.getSourceTypeName())) {
|
||||
updateAvailableRetrieverChains();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateAvailableRetrieverChains() {
|
||||
dataMiningService.getDataRetrieverChainDefinitionsFor(currentStatisticToCalculate, LocaleInfo.getCurrentLocale().getLocaleName(),
|
||||
new AsyncCallback<Collection<DataRetrieverChainDefinitionDTO>>() {
|
||||
@Override
|
||||
public void onSuccess(Collection<DataRetrieverChainDefinitionDTO> dataRetrieverChainDefinitions) {
|
||||
if (!dataRetrieverChainDefinitions.isEmpty()) {
|
||||
List<DataRetrieverChainDefinitionDTO> sortedRetrieverChains = new ArrayList<>(dataRetrieverChainDefinitions);
|
||||
Collections.sort(sortedRetrieverChains);
|
||||
|
||||
DataRetrieverChainDefinitionDTO currentRetrieverChain = getDataRetrieverChainDefinition();
|
||||
DataRetrieverChainDefinitionDTO retrieverChainToBeSelected = sortedRetrieverChains.contains(currentRetrieverChain) ?
|
||||
currentRetrieverChain :
|
||||
sortedRetrieverChains.get(0);
|
||||
|
||||
retrieverChainsListBox.setValue(retrieverChainToBeSelected);
|
||||
retrieverChainsListBox.setAcceptableValues(sortedRetrieverChains);
|
||||
|
||||
if (!retrieverChainToBeSelected.equals(currentRetrieverChain)) {
|
||||
notifyListeners();
|
||||
}
|
||||
} else {
|
||||
retrieverChainsListBox.setValue(null);
|
||||
retrieverChainsListBox.setAcceptableValues(new ArrayList<DataRetrieverChainDefinitionDTO>());
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error retrieving the available DataRetrieverChainDefinitions: " + caught.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataRetrieverChainDefinitionDTO getDataRetrieverChainDefinition() {
|
||||
return retrieverChainsListBox.getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDataRetrieverChainDefinitionChangedListener(DataRetrieverChainDefinitionChangedListener listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
private void notifyListeners() {
|
||||
for (DataRetrieverChainDefinitionChangedListener listener : listeners) {
|
||||
listener.dataRetrieverChainDefinitionChanged(getDataRetrieverChainDefinition());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyQueryDefinition(QueryDefinition queryDefinition) {
|
||||
retrieverChainsListBox.setValue(queryDefinition.getDataRetrieverChainDefinition(), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalizedShortName() {
|
||||
return SimpleDataRetrieverChainDefinitionProvider.class.getSimpleName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Widget getEntryWidget() {
|
||||
return mainPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return mainPanel.isVisible();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(boolean visibility) {
|
||||
mainPanel.setVisible(visibility);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDependentCssClassName() {
|
||||
return "simpleDataRetrieverChainDefinition";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSettings() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SettingsDialogComponent<Object> getSettingsDialogComponent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSettings(Object newSettings) { }
|
||||
|
||||
}
|
||||
+70
-20
@@ -35,9 +35,12 @@ public class SimpleStatisticProvider implements StatisticProvider {
|
||||
private final ErrorReporter errorReporter;
|
||||
private final Set<StatisticChangedListener> listeners;
|
||||
|
||||
private final ExtractionFunctionSet extractionFunctionSet;
|
||||
|
||||
private final HorizontalPanel mainPanel;
|
||||
private final ValueListBox<FunctionDTO> extractionFunctionListBox;
|
||||
private final ValueListBox<StrippedFunctionDTO> extractionFunctionListBox;
|
||||
private final ValueListBox<AggregatorType> aggregatorListBox;
|
||||
private final ValueListBox<String> baseDataTypeListBox;
|
||||
|
||||
public SimpleStatisticProvider(StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter) {
|
||||
this.stringMessages = stringMessages;
|
||||
@@ -45,6 +48,8 @@ public class SimpleStatisticProvider implements StatisticProvider {
|
||||
this.errorReporter = errorReporter;
|
||||
listeners = new HashSet<StatisticChangedListener>();
|
||||
|
||||
extractionFunctionSet = new ExtractionFunctionSet();
|
||||
|
||||
mainPanel = new HorizontalPanel();
|
||||
mainPanel.setSpacing(5);
|
||||
|
||||
@@ -55,6 +60,10 @@ public class SimpleStatisticProvider implements StatisticProvider {
|
||||
aggregatorListBox = createAggregatorListBox();
|
||||
HorizontalPanel aggregatorPanel = surroundAggregatorListBoxWithBraces(aggregatorListBox);
|
||||
mainPanel.add(aggregatorPanel);
|
||||
|
||||
mainPanel.add(new Label(this.stringMessages.basedOn()));
|
||||
baseDataTypeListBox = createBaseDataTypeListBox();
|
||||
mainPanel.add(baseDataTypeListBox);
|
||||
|
||||
updateExtractionFunctions();
|
||||
}
|
||||
@@ -64,22 +73,26 @@ public class SimpleStatisticProvider implements StatisticProvider {
|
||||
|
||||
@Override
|
||||
public void onSuccess(Collection<FunctionDTO> extractionFunctions) {
|
||||
extractionFunctionSet.clear();
|
||||
|
||||
if (!extractionFunctions.isEmpty()) {
|
||||
List<FunctionDTO> acceptableValues = new ArrayList<>(extractionFunctions);
|
||||
Collections.sort(acceptableValues);
|
||||
|
||||
FunctionDTO currentExtractionFunction = getStatisticToCalculate();
|
||||
FunctionDTO valueToBeSelected = acceptableValues.contains(currentExtractionFunction) ? currentExtractionFunction
|
||||
: acceptableValues.iterator().next();
|
||||
extractionFunctionListBox.setValue(valueToBeSelected);
|
||||
extractionFunctionListBox.setAcceptableValues(acceptableValues);
|
||||
|
||||
if (!valueToBeSelected.equals(currentExtractionFunction)) {
|
||||
extractionFunctionSet.addAll(extractionFunctions);
|
||||
|
||||
StrippedFunctionDTO previousExtractionFunction = extractionFunctionListBox.getValue();
|
||||
updateExtractionFunctionListBox();
|
||||
StrippedFunctionDTO newExtractionFunction = extractionFunctionListBox.getValue();
|
||||
|
||||
String previousBaseDataType = baseDataTypeListBox.getValue();
|
||||
updateBaseDataTypeListBox();
|
||||
String newBaseDataType = baseDataTypeListBox.getValue();
|
||||
|
||||
if (!newExtractionFunction.equals(previousExtractionFunction) ||
|
||||
!newBaseDataType.equals(previousBaseDataType)) {
|
||||
notifyListeners();
|
||||
}
|
||||
} else {
|
||||
extractionFunctionListBox.setValue(null);
|
||||
extractionFunctionListBox.setAcceptableValues(new ArrayList<FunctionDTO>());
|
||||
clearListBox(extractionFunctionListBox);
|
||||
clearListBox(baseDataTypeListBox);
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
@@ -91,21 +104,58 @@ public class SimpleStatisticProvider implements StatisticProvider {
|
||||
});
|
||||
}
|
||||
|
||||
private ValueListBox<FunctionDTO> createExtractionFunctionListBox() {
|
||||
ValueListBox<FunctionDTO> extractionFunctionListBox = new ValueListBox<FunctionDTO>(new AbstractObjectRenderer<FunctionDTO>() {
|
||||
private void updateExtractionFunctionListBox() {
|
||||
List<StrippedFunctionDTO> acceptableFunctions = new ArrayList<>(extractionFunctionSet.getStrippedFunctionDTOs());
|
||||
Collections.sort(acceptableFunctions);
|
||||
updateListBox(extractionFunctionListBox, acceptableFunctions);
|
||||
}
|
||||
|
||||
private void updateBaseDataTypeListBox() {
|
||||
List<String> acceptableBaseDataTypes = new ArrayList<>(extractionFunctionSet.getSourceTypeNames(extractionFunctionListBox.getValue()));
|
||||
Collections.sort(acceptableBaseDataTypes);
|
||||
updateListBox(baseDataTypeListBox, acceptableBaseDataTypes);
|
||||
}
|
||||
|
||||
private <T> void updateListBox(ValueListBox<T> listBox, Collection<T> acceptableValues) {
|
||||
T currentValue = listBox.getValue();
|
||||
T valueToBeSelected = acceptableValues.contains(currentValue) ? currentValue : acceptableValues.iterator().next();
|
||||
|
||||
listBox.setValue(valueToBeSelected);
|
||||
listBox.setAcceptableValues(acceptableValues);
|
||||
}
|
||||
|
||||
private <T> void clearListBox(ValueListBox<T> listBox) {
|
||||
listBox.setValue(null);
|
||||
listBox.setAcceptableValues(new ArrayList<T>());
|
||||
}
|
||||
|
||||
private ValueListBox<StrippedFunctionDTO> createExtractionFunctionListBox() {
|
||||
ValueListBox<StrippedFunctionDTO> extractionFunctionListBox = new ValueListBox<>(new AbstractObjectRenderer<StrippedFunctionDTO>() {
|
||||
@Override
|
||||
protected String convertObjectToString(FunctionDTO function) {
|
||||
protected String convertObjectToString(StrippedFunctionDTO function) {
|
||||
return function.getDisplayName();
|
||||
}
|
||||
});
|
||||
extractionFunctionListBox.addValueChangeHandler(new ValueChangeHandler<FunctionDTO>() {
|
||||
extractionFunctionListBox.addValueChangeHandler(new ValueChangeHandler<StrippedFunctionDTO>() {
|
||||
@Override
|
||||
public void onValueChange(ValueChangeEvent<FunctionDTO> event) {
|
||||
public void onValueChange(ValueChangeEvent<StrippedFunctionDTO> event) {
|
||||
updateBaseDataTypeListBox();
|
||||
notifyListeners();
|
||||
}
|
||||
});
|
||||
return extractionFunctionListBox;
|
||||
}
|
||||
|
||||
private ValueListBox<String> createBaseDataTypeListBox() {
|
||||
ValueListBox<String> baseDataTypeListBox = new ValueListBox<>(new SimpleObjectRenderer<String>());
|
||||
baseDataTypeListBox.addValueChangeHandler(new ValueChangeHandler<String>() {
|
||||
@Override
|
||||
public void onValueChange(ValueChangeEvent<String> event) {
|
||||
notifyListeners();
|
||||
}
|
||||
});
|
||||
return baseDataTypeListBox;
|
||||
}
|
||||
|
||||
private ValueListBox<AggregatorType> createAggregatorListBox() {
|
||||
ValueListBox<AggregatorType> aggregatorListBox = new ValueListBox<AggregatorType>(new SimpleObjectRenderer<AggregatorType>());
|
||||
@@ -136,7 +186,7 @@ public class SimpleStatisticProvider implements StatisticProvider {
|
||||
|
||||
@Override
|
||||
public void applyQueryDefinition(QueryDefinition queryDefinition) {
|
||||
extractionFunctionListBox.setValue(queryDefinition.getStatisticToCalculate(), false);
|
||||
extractionFunctionListBox.setValue(new StrippedFunctionDTO(queryDefinition.getStatisticToCalculate()), false);
|
||||
aggregatorListBox.setValue(queryDefinition.getAggregatorType(), false);
|
||||
}
|
||||
|
||||
@@ -153,7 +203,7 @@ public class SimpleStatisticProvider implements StatisticProvider {
|
||||
|
||||
@Override
|
||||
public FunctionDTO getStatisticToCalculate() {
|
||||
return extractionFunctionListBox.getValue();
|
||||
return extractionFunctionSet.getFunctionDTO(extractionFunctionListBox.getValue(), baseDataTypeListBox.getValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.selection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public class StrippedFunctionDTO implements Comparable<StrippedFunctionDTO> {
|
||||
|
||||
private final String returnTypeName;
|
||||
private final String displayName;
|
||||
private final List<String> parameterTypeNames;
|
||||
private final boolean isDimension;
|
||||
|
||||
private final int ordinal;
|
||||
|
||||
public StrippedFunctionDTO(FunctionDTO functionDTO) {
|
||||
returnTypeName = functionDTO.getReturnTypeName();
|
||||
displayName = functionDTO.getDisplayName();
|
||||
parameterTypeNames = new ArrayList<>(functionDTO.getParameterTypeNames());
|
||||
isDimension = functionDTO.isDimension();
|
||||
ordinal = functionDTO.getOrdinal();
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public int getOrdinal() {
|
||||
return ordinal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(StrippedFunctionDTO f) {
|
||||
return Integer.compare(this.getOrdinal(), f.getOrdinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((displayName == null) ? 0 : displayName.hashCode());
|
||||
result = prime * result + (isDimension ? 1231 : 1237);
|
||||
result = prime * result + ((parameterTypeNames == null) ? 0 : parameterTypeNames.hashCode());
|
||||
result = prime * result + ((returnTypeName == null) ? 0 : returnTypeName.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;
|
||||
StrippedFunctionDTO other = (StrippedFunctionDTO) obj;
|
||||
if (displayName == null) {
|
||||
if (other.displayName != null)
|
||||
return false;
|
||||
} else if (!displayName.equals(other.displayName))
|
||||
return false;
|
||||
if (isDimension != other.isDimension)
|
||||
return false;
|
||||
if (parameterTypeNames == null) {
|
||||
if (other.parameterTypeNames != null)
|
||||
return false;
|
||||
} else if (!parameterTypeNames.equals(other.parameterTypeNames))
|
||||
return false;
|
||||
if (returnTypeName == null) {
|
||||
if (other.returnTypeName != null)
|
||||
return false;
|
||||
} else if (!returnTypeName.equals(other.returnTypeName))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
+43
-8
@@ -14,6 +14,7 @@ import com.sap.sailing.datamining.shared.SailingDataMiningSerializationDummy;
|
||||
import com.sap.sailing.gwt.ui.datamining.DataMiningService;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.DataMiningServer;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.Query;
|
||||
import com.sap.sse.datamining.factories.FunctionDTOFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
@@ -22,19 +23,28 @@ import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.QueryResult;
|
||||
import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public class DataMiningServiceImpl extends RemoteServiceServlet implements DataMiningService {
|
||||
private static final long serialVersionUID = -7951930891674894528L;
|
||||
|
||||
private final BundleContext context;
|
||||
|
||||
private final SailingDataMiningFactory sailingDataMiningFactory;
|
||||
private final FunctionDTOFactory functionDTOFactory;
|
||||
|
||||
private final ServiceTracker<DataMiningServer, DataMiningServer> dataMiningServerTracker;
|
||||
private final ServiceTracker<RacingEventService, RacingEventService> racingEventServiceTracker;
|
||||
|
||||
public DataMiningServiceImpl() {
|
||||
context = Activator.getDefault();
|
||||
|
||||
dataMiningServerTracker = createAndOpenDataMiningServerTracker(context);
|
||||
racingEventServiceTracker = createAndOpenRacingEventServiceTracker(context);
|
||||
|
||||
sailingDataMiningFactory = new SailingDataMiningFactory(getDataMiningServer().getFunctionProvider(),
|
||||
getDataMiningServer().getDataRetrieverChainDefinitionRegistry());
|
||||
functionDTOFactory = new FunctionDTOFactory();
|
||||
}
|
||||
|
||||
private ServiceTracker<DataMiningServer, DataMiningServer> createAndOpenDataMiningServerTracker(
|
||||
@@ -68,37 +78,62 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
|
||||
|
||||
@Override
|
||||
public Collection<FunctionDTO> getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName) {
|
||||
Class<?> dataTypeBaseClass = getBaseClassFor(statisticToCalculate);
|
||||
Collection<Function<?>> dimensions = getDataMiningServer().getFunctionProvider().getDimensionsFor(dataTypeBaseClass);
|
||||
Class<?> baseDataType = getBaseDataType(statisticToCalculate);
|
||||
Collection<Function<?>> dimensions = getDataMiningServer().getFunctionProvider().getDimensionsFor(baseDataType);
|
||||
return functionsAsFunctionDTOs(dimensions, localeInfoName);
|
||||
}
|
||||
|
||||
private Class<?> getBaseClassFor(FunctionDTO statisticToCalculate) {
|
||||
@Override
|
||||
public Collection<DataRetrieverChainDefinitionDTO> getDataRetrieverChainDefinitionsFor(FunctionDTO statisticToCalculate, String localeInfoName) {
|
||||
Class<?> baseDataType = getBaseDataType(statisticToCalculate);
|
||||
return dataRetrieverChainDefinitionsAsDTOs(getDataMiningServer().getDataRetrieverChainDefinitionRegistry().getDataRetrieverChainDefinitions(RacingEventService.class, baseDataType), localeInfoName);
|
||||
}
|
||||
|
||||
private Collection<DataRetrieverChainDefinitionDTO> dataRetrieverChainDefinitionsAsDTOs(
|
||||
Collection<DataRetrieverChainDefinition<RacingEventService>> dataRetrieverChainDefinitions, String localeInfoName) {
|
||||
Locale locale = DataMiningStringMessages.Util.getLocaleFor(localeInfoName);
|
||||
DataMiningStringMessages dataMiningStringMessages = getDataMiningServer().getStringMessages();
|
||||
|
||||
Collection<DataRetrieverChainDefinitionDTO> DTOs = new ArrayList<>();
|
||||
for (DataRetrieverChainDefinition<RacingEventService> dataRetrieverChainDefinition : dataRetrieverChainDefinitions) {
|
||||
DTOs.add(new DataRetrieverChainDefinitionDTO(dataRetrieverChainDefinition.getUUID(), dataRetrieverChainDefinition.getLocalizedName(locale, dataMiningStringMessages),
|
||||
dataRetrieverChainDefinition.getDataSourceType().getSimpleName(), dataRetrieverChainDefinition.getRetrievedDataType().getSimpleName()));
|
||||
}
|
||||
return DTOs;
|
||||
}
|
||||
|
||||
private Class<?> getBaseDataType(FunctionDTO statisticToCalculate) {
|
||||
Function<?> function = getDataMiningServer().getFunctionProvider().getFunctionForDTO(statisticToCalculate);
|
||||
return function.getDeclaringType();
|
||||
}
|
||||
|
||||
|
||||
private Collection<FunctionDTO> functionsAsFunctionDTOs(Collection<Function<?>> functions, String localeInfoName) {
|
||||
Locale locale = DataMiningStringMessages.Util.getLocaleFor(localeInfoName);
|
||||
DataMiningStringMessages dataMiningStringMessages = getDataMiningServer().getStringMessages();
|
||||
|
||||
Collection<FunctionDTO> functionDTOs = new ArrayList<FunctionDTO>();
|
||||
for (Function<?> function : functions) {
|
||||
functionDTOs.add(FunctionDTOFactory.createFunctionDTO(function, locale, dataMiningStringMessages));
|
||||
functionDTOs.add(functionDTOFactory.createFunctionDTO(function, dataMiningStringMessages, locale));
|
||||
}
|
||||
return functionDTOs;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public QueryResult<Set<Object>> getDimensionValuesFor(Collection<FunctionDTO> dimensions) throws Exception {
|
||||
// Query<Set<Object>> dimensionValuesQuery = sailingDataMiningFactory.createDimensionValuesQuery(getRacingEventService(), null, dimensions);
|
||||
// return dimensionValuesQuery.run();
|
||||
// }
|
||||
@Override
|
||||
public QueryResult<Set<Object>> getDimensionValuesFor(Collection<FunctionDTO> dimensions) throws Exception {
|
||||
Query<Set<Object>> dimensionValuesQuery = SailingDataMiningFactory.createDimensionValuesQuery(getRacingEventService(), dimensions, getDataMiningServer().getFunctionProvider());
|
||||
public QueryResult<Set<Object>> getDimensionValuesFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinition,
|
||||
String localeInfoName) throws Exception {
|
||||
Query<Set<Object>> dimensionValuesQuery = sailingDataMiningFactory.createDimensionValuesQuery(getRacingEventService(), dataRetrieverChainDefinition, localeInfoName);
|
||||
return dimensionValuesQuery.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <ResultType extends Number> QueryResult<ResultType> runQuery(QueryDefinition queryDefinition) throws Exception {
|
||||
@SuppressWarnings("unchecked") // TODO Fix after the data mining has been cleaned
|
||||
Query<ResultType> query = (Query<ResultType>) SailingDataMiningFactory.createQuery(getRacingEventService(), queryDefinition, getDataMiningServer().getFunctionProvider());
|
||||
Query<ResultType> query = (Query<ResultType>) sailingDataMiningFactory.createQuery(getRacingEventService(), queryDefinition);
|
||||
return query.run();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
package com.sap.sse.datamining.shared;
|
||||
|
||||
public enum Message {
|
||||
Average, Median, Sum, Distance, Speed, Knots, Meters, ResultSignifier, SignifierInUnit, Collecting
|
||||
|
||||
}
|
||||
+5
-4
@@ -6,17 +6,18 @@ import java.util.Map;
|
||||
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public interface QueryDefinition extends Serializable {
|
||||
|
||||
public String getLocaleInfoName();
|
||||
|
||||
public FunctionDTO getStatisticToCalculate();
|
||||
public AggregatorType getAggregatorType();
|
||||
|
||||
public DataRetrieverChainDefinitionDTO getDataRetrieverChainDefinition();
|
||||
public Map<FunctionDTO, Iterable<? extends Serializable>> getFilterSelection();
|
||||
|
||||
public List<FunctionDTO> getDimensionsToGroupBy();
|
||||
|
||||
public FunctionDTO getStatisticToCalculate();
|
||||
|
||||
public AggregatorType getAggregatorType();
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.sap.sse.datamining.shared;
|
||||
|
||||
public enum Unit {
|
||||
|
||||
None, Knots, Meters
|
||||
|
||||
None, Knots, Meters
|
||||
|
||||
}
|
||||
-14
@@ -1,19 +1,5 @@
|
||||
package com.sap.sse.datamining.shared.components;
|
||||
|
||||
import com.sap.sse.datamining.shared.Message;
|
||||
|
||||
public enum AggregatorType {
|
||||
Sum, Average, Median;
|
||||
|
||||
public Message getNameMessage() {
|
||||
switch (this) {
|
||||
case Average:
|
||||
return Message.Average;
|
||||
case Median:
|
||||
return Message.Median;
|
||||
case Sum:
|
||||
return Message.Sum;
|
||||
};
|
||||
throw new IllegalArgumentException("No message available for the aggregator type '" + this + "'");
|
||||
}
|
||||
}
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
package com.sap.sse.datamining.shared.components;
|
||||
|
||||
public enum ElementType {
|
||||
Integer, Double
|
||||
}
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
package com.sap.sse.datamining.shared.components;
|
||||
|
||||
public enum GrouperType {
|
||||
Dimensions
|
||||
}
|
||||
+8
-6
@@ -5,15 +5,17 @@ import java.util.List;
|
||||
|
||||
public interface FunctionDTO extends Serializable, Comparable<FunctionDTO> {
|
||||
|
||||
public boolean isDimension();
|
||||
|
||||
public String getDisplayName();
|
||||
|
||||
public List<String> getParameters();
|
||||
public String getSourceTypeName();
|
||||
|
||||
public String getReturnTypeName();
|
||||
|
||||
public String getSourceTypeName();
|
||||
public String getFunctionName();
|
||||
|
||||
public String getDisplayName();
|
||||
|
||||
public List<String> getParameterTypeNames();
|
||||
|
||||
public boolean isDimension();
|
||||
|
||||
public int getOrdinal();
|
||||
|
||||
|
||||
+13
-5
@@ -9,15 +9,17 @@ import java.util.Map;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public class QueryDefinitionImpl implements QueryDefinition {
|
||||
private static final long serialVersionUID = -6438771277564908352L;
|
||||
|
||||
private String localeInfoName;
|
||||
private Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection;
|
||||
private List<FunctionDTO> dimensionsToGroupBy;
|
||||
private FunctionDTO statisticToCalculate;
|
||||
private AggregatorType aggregatorType;
|
||||
private List<FunctionDTO> dimensionsToGroupBy;
|
||||
private DataRetrieverChainDefinitionDTO dataRetrieverChainDefinition;
|
||||
private Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection;
|
||||
|
||||
/**
|
||||
* <b>Constructor for the GWT-Serialization. Don't use this!</b>
|
||||
@@ -25,12 +27,13 @@ public class QueryDefinitionImpl implements QueryDefinition {
|
||||
@Deprecated
|
||||
QueryDefinitionImpl() { }
|
||||
|
||||
public QueryDefinitionImpl(String localeInfoName, FunctionDTO statisticToCalculate, AggregatorType aggregatorType) {
|
||||
public QueryDefinitionImpl(String localeInfoName, FunctionDTO statisticToCalculate, AggregatorType aggregatorType, DataRetrieverChainDefinitionDTO dataRetrieverChainDefinition) {
|
||||
this.localeInfoName = localeInfoName;
|
||||
this.filterSelection = new HashMap<FunctionDTO, Iterable<? extends Serializable>>();
|
||||
this.dimensionsToGroupBy = new ArrayList<FunctionDTO>();
|
||||
this.statisticToCalculate = statisticToCalculate;
|
||||
this.aggregatorType = aggregatorType;
|
||||
this.dataRetrieverChainDefinition = dataRetrieverChainDefinition;
|
||||
this.filterSelection = new HashMap<FunctionDTO, Iterable<? extends Serializable>>();
|
||||
this.dimensionsToGroupBy = new ArrayList<FunctionDTO>();
|
||||
}
|
||||
|
||||
public void setFilterSelectionFor(FunctionDTO dimension, Iterable<? extends Serializable> selection) {
|
||||
@@ -45,6 +48,11 @@ public class QueryDefinitionImpl implements QueryDefinition {
|
||||
public String getLocaleInfoName() {
|
||||
return localeInfoName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataRetrieverChainDefinitionDTO getDataRetrieverChainDefinition() {
|
||||
return dataRetrieverChainDefinition;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<FunctionDTO, Iterable<? extends Serializable>> getFilterSelection() {
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package com.sap.sse.datamining.shared.impl.dto;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.UUID;
|
||||
|
||||
public class DataRetrieverChainDefinitionDTO implements Serializable, Comparable<DataRetrieverChainDefinitionDTO> {
|
||||
private static final long serialVersionUID = 7806173601799997214L;
|
||||
|
||||
private UUID id;
|
||||
private String name;
|
||||
private String dataSourceTypeName;
|
||||
private String retrievedDataTypeName;
|
||||
|
||||
/**
|
||||
* <b>Constructor for the GWT-Serialization. Don't use this!</b>
|
||||
*/
|
||||
@Deprecated
|
||||
DataRetrieverChainDefinitionDTO() { }
|
||||
|
||||
public DataRetrieverChainDefinitionDTO(UUID id, String name, String dataSourceTypeName, String retrievedDataTypeName) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.dataSourceTypeName = dataSourceTypeName;
|
||||
this.retrievedDataTypeName = retrievedDataTypeName;
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getDataSourceTypeName() {
|
||||
return dataSourceTypeName;
|
||||
}
|
||||
|
||||
public String getRetrievedDataTypeName() {
|
||||
return retrievedDataTypeName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(DataRetrieverChainDefinitionDTO d) {
|
||||
return this.getName().compareTo(d.getName());
|
||||
}
|
||||
|
||||
}
|
||||
+6
-1
@@ -47,9 +47,14 @@ public class FunctionDTOImpl implements FunctionDTO {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getParameters() {
|
||||
public List<String> getParameterTypeNames() {
|
||||
return parameterTypeNames;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFunctionName() {
|
||||
return functionName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName() {
|
||||
|
||||
+2
-1
@@ -4,4 +4,5 @@ dimension = dimension-deutsch
|
||||
value = sideEffectFreeValue-deutsch
|
||||
regattaName = Regatta Name
|
||||
crossSum = Quersumme
|
||||
Name = Name
|
||||
Name = Name
|
||||
Year = Jahr
|
||||
+2
-1
@@ -4,4 +4,5 @@ dimension = dimension-english
|
||||
value = sideEffectFreeValue-english
|
||||
regattaName = Regatta Name
|
||||
crossSum = Cross Sum
|
||||
Name = Name
|
||||
Name = Name
|
||||
Year=Year
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.ClassesWithFunctionsProvider;
|
||||
import com.sap.sse.datamining.DataMiningServer;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionProvider;
|
||||
import com.sap.sse.datamining.functions.FunctionRegistry;
|
||||
import com.sap.sse.datamining.impl.functions.RegistryFunctionProvider;
|
||||
import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.util.ExpectedFunctionRegistryUtil;
|
||||
import com.sap.sse.datamining.test.util.TestsUtil;
|
||||
|
||||
public class TestDataMiningServer {
|
||||
|
||||
private static ExpectedFunctionRegistryUtil expectedFunctionRegistryUtil;
|
||||
|
||||
@BeforeClass
|
||||
public static void intializeExpectedFunctions() throws NoSuchMethodException, SecurityException {
|
||||
expectedFunctionRegistryUtil = new ExpectedFunctionRegistryUtil();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testThatTheFunctionRegistryIsAllwaysUpToDate() {
|
||||
FunctionRegistry registry = new SimpleFunctionRegistry();
|
||||
FunctionProvider provider = new RegistryFunctionProvider(registry);
|
||||
OpenClassesWithFunctionsProvider classesWithFunctionsProvider = new OpenClassesWithFunctionsProvider();
|
||||
DataMiningServer server = new DataMiningServerImpl(TestsUtil.getTestStringMessages(), registry, provider, classesWithFunctionsProvider);
|
||||
|
||||
assertThat("The function registry should be empty.",
|
||||
server.getFunctionRegistry().getAllFunctions().isEmpty(),
|
||||
is(true));
|
||||
|
||||
classesWithFunctionsProvider.internalClassesWithMarkedMethods.add(Test_HasLegContext.class);
|
||||
Collection<Function<?>> expectedFunctions = new HashSet<>();
|
||||
expectedFunctions.addAll(expectedFunctionRegistryUtil.getExpectedFunctionsFor(Test_HasLegContext.class));
|
||||
expectedFunctions.addAll(expectedFunctionRegistryUtil.getExpectedFunctionsFor(Test_HasRaceContext.class));
|
||||
assertThat(server.getFunctionRegistry().getAllFunctions(), is(expectedFunctions));
|
||||
|
||||
classesWithFunctionsProvider.internalClassesWithMarkedMethods.remove(Test_HasLegContext.class);
|
||||
classesWithFunctionsProvider.internalClassesWithMarkedMethods.add(Test_HasRaceContext.class);
|
||||
expectedFunctions = expectedFunctionRegistryUtil.getExpectedFunctionsFor(Test_HasRaceContext.class);
|
||||
assertThat(server.getFunctionRegistry().getAllFunctions(), is(expectedFunctions));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testThatTheRegistryUpdateWorksWithNullCollections() {
|
||||
FunctionRegistry registry = new SimpleFunctionRegistry();
|
||||
FunctionProvider provider = new RegistryFunctionProvider(registry);
|
||||
OpenClassesWithFunctionsProvider classesWithFunctionsProvider = new OpenClassesWithFunctionsProvider();
|
||||
DataMiningServer server = new DataMiningServerImpl(TestsUtil.getTestStringMessages(), registry, provider, classesWithFunctionsProvider);
|
||||
|
||||
classesWithFunctionsProvider.internalClassesWithMarkedMethods = null;
|
||||
classesWithFunctionsProvider.externalLibraryClasses = null;
|
||||
server.getFunctionRegistry();
|
||||
}
|
||||
|
||||
private class OpenClassesWithFunctionsProvider implements ClassesWithFunctionsProvider {
|
||||
|
||||
public Set<Class<?>> internalClassesWithMarkedMethods;
|
||||
public Set<Class<?>> externalLibraryClasses;
|
||||
|
||||
public OpenClassesWithFunctionsProvider() {
|
||||
internalClassesWithMarkedMethods = new HashSet<>();
|
||||
externalLibraryClasses = new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Class<?>> getInternalClassesWithMarkedMethods() {
|
||||
return internalClassesWithMarkedMethods;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Class<?>> getExternalLibraryClasses() {
|
||||
return externalLibraryClasses;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+209
@@ -0,0 +1,209 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import static org.hamcrest.Matchers.greaterThan;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.lessThanOrEqualTo;
|
||||
import static org.hamcrest.Matchers.not;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.DataRetrieverChainBuilder;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.criterias.AbstractFilterCriterion;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.util.ComponentTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestLegOfCompetitorWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRaceWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRegattaRetrievalProcessor;
|
||||
|
||||
public class TestDataRetrieverChainCreation {
|
||||
|
||||
private DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition;
|
||||
|
||||
private FilterCriterion<Test_HasRaceContext> raceFilter;
|
||||
private FilterCriterion<Test_HasLegOfCompetitorContext> legOfCompetitorFilter;
|
||||
|
||||
private int receivedLegOfCompetitorAmount = 0;
|
||||
private Processor<Test_HasLegOfCompetitorContext, Void> legReceiver = new NullProcessor<Test_HasLegOfCompetitorContext, Void>(Test_HasLegOfCompetitorContext.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Test_HasLegOfCompetitorContext element) {
|
||||
receivedLegOfCompetitorAmount++;
|
||||
}
|
||||
};
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Before
|
||||
public void initializeRetrieverChain() {
|
||||
dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(regattaRetrieverClass,
|
||||
raceRetrieverClass,
|
||||
Test_HasRaceContext.class);
|
||||
|
||||
Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>> legRetrieverClass =
|
||||
(Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>>)(Class<?>) TestLegOfCompetitorWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(raceRetrieverClass,
|
||||
legRetrieverClass,
|
||||
Test_HasLegOfCompetitorContext.class);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void initializeFilters() {
|
||||
raceFilter = new AbstractFilterCriterion<Test_HasRaceContext>(Test_HasRaceContext.class) {
|
||||
@Override
|
||||
public boolean matches(Test_HasRaceContext element) {
|
||||
return element.getBoatClass().getName().equals("49er");
|
||||
}
|
||||
};
|
||||
|
||||
legOfCompetitorFilter = new AbstractFilterCriterion<Test_HasLegOfCompetitorContext>(Test_HasLegOfCompetitorContext.class) {
|
||||
@Override
|
||||
public boolean matches(Test_HasLegOfCompetitorContext element) {
|
||||
return element.getLegNumber() <= 3;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testCreationWithExistingChainDefinition() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> chainClone = new SimpleDataRetrieverChainDefinition<>(dataRetrieverChainDefinition, "TestRetrieverChain");
|
||||
assertThat(chainClone.getDataSourceType().equals(dataRetrieverChainDefinition.getDataSourceType()), is(true));
|
||||
assertThat(chainClone.getRetrievedDataType().equals(dataRetrieverChainDefinition.getRetrievedDataType()), is(true));
|
||||
|
||||
List<DataRetrieverTypeWithInformation<?, ?>> cloneDataRetrieverTypesWithInformation = (List<DataRetrieverTypeWithInformation<?, ?>>) chainClone.getDataRetrieverTypesWithInformation();
|
||||
assertThat(cloneDataRetrieverTypesWithInformation, is(dataRetrieverChainDefinition.getDataRetrieverTypesWithInformation()));
|
||||
|
||||
assertThat(chainClone.getUUID(), not(dataRetrieverChainDefinition.getUUID()));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testGetRetrievedDataTypeAndGetDataSourceType() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
assertThat(dataRetrieverChainDefinition.getDataSourceType().equals(Collection.class), is(true));
|
||||
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
assertThat(dataRetrieverChainDefinition.getRetrievedDataType().equals(Test_Regatta.class), is(true));
|
||||
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(regattaRetrieverClass,
|
||||
raceRetrieverClass,
|
||||
Test_HasRaceContext.class);
|
||||
assertThat(dataRetrieverChainDefinition.getRetrievedDataType().equals(Test_HasRaceContext.class), is(true));
|
||||
|
||||
Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>> legRetrieverClass =
|
||||
(Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>>)(Class<?>) TestLegOfCompetitorWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(raceRetrieverClass,
|
||||
legRetrieverClass,
|
||||
Test_HasLegOfCompetitorContext.class);
|
||||
assertThat(dataRetrieverChainDefinition.getRetrievedDataType().equals(Test_HasLegOfCompetitorContext.class), is(true));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStepByStepDataRetrieverChainCreation() throws InterruptedException {
|
||||
DataRetrieverChainBuilder<Collection<Test_Regatta>> chainBuilder = dataRetrieverChainDefinition.startBuilding(ConcurrencyTestsUtil.getExecutor());
|
||||
assertThat(chainBuilder.getCurrentRetrievedDataType().equals(Test_Regatta.class), is(true));
|
||||
assertThat(chainBuilder.canStepDeeper(), is(true));
|
||||
|
||||
chainBuilder.stepDeeper().setFilter(raceFilter);
|
||||
assertThat(chainBuilder.getCurrentRetrievedDataType().equals(Test_HasRaceContext.class), is(true));
|
||||
assertThat(chainBuilder.canStepDeeper(), is(true));
|
||||
|
||||
chainBuilder.stepDeeper().setFilter(legOfCompetitorFilter).addResultReceiver(legReceiver);
|
||||
assertThat(chainBuilder.getCurrentRetrievedDataType().equals(Test_HasLegOfCompetitorContext.class), is(true));
|
||||
assertThat(chainBuilder.canStepDeeper(), is(false));
|
||||
|
||||
Processor<Collection<Test_Regatta>, ?> firstRetrieverInChain = chainBuilder.build();
|
||||
firstRetrieverInChain.processElement(ComponentTestsUtil.createExampleDataSource());
|
||||
firstRetrieverInChain.finish();
|
||||
ConcurrencyTestsUtil.sleepFor(100);
|
||||
assertThat(receivedLegOfCompetitorAmount, is(greaterThan(0)));
|
||||
assertThat(receivedLegOfCompetitorAmount, is(lessThanOrEqualTo(3 /*races*/ * 3 /*legs*/ * 4 /*competitors*/)));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test(expected=UnsupportedOperationException.class)
|
||||
public void testAddAsLastWithoutStarting() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(regattaRetrieverClass,
|
||||
raceRetrieverClass,
|
||||
Test_HasRaceContext.class);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test(expected=UnsupportedOperationException.class)
|
||||
public void testStartingTwice() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testStartingWithProcessorWithoutUsableConstructor() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
dataRetrieverChainDefinition.startWith((Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) Processor.class, Test_Regatta.class);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testAddingProcessorWithoutUsableConstructor() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
|
||||
dataRetrieverChainDefinition.addAsLast(regattaRetrieverClass,
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) Processor.class,
|
||||
Test_HasRaceContext.class);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testAddingRetrieverThatDoesntMatch() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>> legRetrieverClass =
|
||||
(Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>>)(Class<?>) TestLegOfCompetitorWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(raceRetrieverClass,
|
||||
legRetrieverClass,
|
||||
Test_HasLegOfCompetitorContext.class);
|
||||
}
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testSettingAFilterWithWrongElementType() {
|
||||
dataRetrieverChainDefinition.startBuilding(ConcurrencyTestsUtil.getExecutor()).setFilter(raceFilter);
|
||||
}
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testSettingAResultReceiverWithWrongInputType() {
|
||||
dataRetrieverChainDefinition.startBuilding(ConcurrencyTestsUtil.getExecutor()).addResultReceiver(legReceiver);
|
||||
}
|
||||
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContextImpl;
|
||||
import com.sap.sse.datamining.test.util.components.TestLegOfCompetitorWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRaceWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRegattaRetrievalProcessor;
|
||||
|
||||
public class TestDataRetrieverChainDefinitionRegistry {
|
||||
|
||||
private DataRetrieverChainDefinition<Collection<Test_Regatta>> raceRetrieverChainDefinition;
|
||||
private DataRetrieverChainDefinition<Collection<Test_Regatta>> legRetrieverChainDefinition;
|
||||
private DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Before
|
||||
public void initializeRetrieverChainsAndRegistry() {
|
||||
raceRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRaceRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
raceRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
raceRetrieverChainDefinition.addAsLast(regattaRetrieverClass,
|
||||
raceRetrieverClass,
|
||||
Test_HasRaceContext.class);
|
||||
|
||||
legRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<Collection<Test_Regatta>>(raceRetrieverChainDefinition, "TestLegRetrieverChain");
|
||||
|
||||
Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>> legRetrieverClass =
|
||||
(Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>>)(Class<?>) TestLegOfCompetitorWithContextRetrievalProcessor.class;
|
||||
legRetrieverChainDefinition.addAsLast(raceRetrieverClass,
|
||||
legRetrieverClass,
|
||||
Test_HasLegOfCompetitorContext.class);
|
||||
|
||||
dataRetrieverChainDefinitionRegistry = new SimpleDataRetrieverChainDefinitionRegistry();
|
||||
dataRetrieverChainDefinitionRegistry.add(raceRetrieverChainDefinition);
|
||||
dataRetrieverChainDefinitionRegistry.add(legRetrieverChainDefinition);
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testGetDataRetrieverChainDefinitions() {
|
||||
Class<Collection<Test_Regatta>> dataSourceType = (Class<Collection<Test_Regatta>>)(Class<?>) Collection.class;
|
||||
|
||||
Collection<DataRetrieverChainDefinition<Collection<Test_Regatta>>> expectedDataRetrieverChainDefinitions = new HashSet<>();
|
||||
expectedDataRetrieverChainDefinitions.add(raceRetrieverChainDefinition);
|
||||
assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(dataSourceType, Test_HasRaceContext.class), is(expectedDataRetrieverChainDefinitions));
|
||||
|
||||
expectedDataRetrieverChainDefinitions = new HashSet<>();
|
||||
expectedDataRetrieverChainDefinitions.add(legRetrieverChainDefinition);
|
||||
assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(dataSourceType, Test_HasLegOfCompetitorContext.class), is(expectedDataRetrieverChainDefinitions));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testSingleGetDataRetrieverChainDefinition() {
|
||||
Class<Collection<Test_Regatta>> dataSourceType = (Class<Collection<Test_Regatta>>)(Class<?>) Collection.class;
|
||||
|
||||
assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinition(dataSourceType, raceRetrieverChainDefinition.getUUID()),
|
||||
is(raceRetrieverChainDefinition));
|
||||
|
||||
assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinition(dataSourceType, legRetrieverChainDefinition.getUUID()),
|
||||
is(legRetrieverChainDefinition));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testRemoveDataRetrieverChainDefinition() {
|
||||
Class<Collection<Test_Regatta>> dataSourceType = (Class<Collection<Test_Regatta>>)(Class<?>) Collection.class;
|
||||
|
||||
dataRetrieverChainDefinitionRegistry.remove(legRetrieverChainDefinition);
|
||||
Collection<DataRetrieverChainDefinition<Collection<Test_Regatta>>> expectedEmptyDataRetrieverChainDefinitions = new HashSet<>();
|
||||
assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(dataSourceType, Test_HasLegOfCompetitorContext.class), is(expectedEmptyDataRetrieverChainDefinitions));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testAddingDataRetrieverChainDefinitionTwice() {
|
||||
Class<Collection<Test_Regatta>> dataSourceType = (Class<Collection<Test_Regatta>>)(Class<?>) Collection.class;
|
||||
|
||||
dataRetrieverChainDefinitionRegistry.add(legRetrieverChainDefinition);
|
||||
Collection<DataRetrieverChainDefinition<Collection<Test_Regatta>>> expectedDataRetrieverChainDefinitions = new HashSet<>();
|
||||
expectedDataRetrieverChainDefinitions.add(legRetrieverChainDefinition);
|
||||
assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(dataSourceType, Test_HasLegOfCompetitorContext.class), is(expectedDataRetrieverChainDefinitions));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDataRetrieverChainDefinitionsForNotRegisteredChain() {
|
||||
Collection<DataRetrieverChainDefinition<Test_Regatta>> expectedEmptyDataRetrieverChainDefinitions = new HashSet<DataRetrieverChainDefinition<Test_Regatta>>();
|
||||
assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(Test_Regatta.class, Test_HasRaceContextImpl.class), is(expectedEmptyDataRetrieverChainDefinitions));
|
||||
}
|
||||
|
||||
}
|
||||
+77
-149
@@ -6,6 +6,7 @@ import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
@@ -13,41 +14,38 @@ import java.util.concurrent.ExecutionException;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.DataRetrieverChainBuilder;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.Query;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.factories.FunctionDTOFactory;
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
|
||||
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
|
||||
import com.sap.sse.datamining.impl.components.ParallelByDimensionGroupingProcessor;
|
||||
import com.sap.sse.datamining.impl.components.ParallelGroupedElementsValueExtractionProcessor;
|
||||
import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDataCollectingAsSetProcessor;
|
||||
import com.sap.sse.datamining.shared.GroupKey;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Boat;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Team;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_BoatClassImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_BoatImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_CompetitorImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_LegImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_RaceImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_RegattaImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_TeamImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContextImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContextImpl;
|
||||
import com.sap.sse.datamining.test.util.ComponentTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.TestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.TestLegOfCompetitorWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRaceWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRegattaRetrievalProcessor;
|
||||
|
||||
public class TestDimensionsValuesQuery {
|
||||
|
||||
private static final DataMiningStringMessages stringMessages = TestsUtil.getTestStringMessagesWithProductiveMessages();
|
||||
private static final Locale locale = Locale.ENGLISH;
|
||||
|
||||
private DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition;
|
||||
private Collection<Test_Regatta> dataSource;
|
||||
|
||||
//Test_HasRaceContext dimensions
|
||||
private Function<String> dimensionRegattaName;
|
||||
@@ -59,8 +57,6 @@ public class TestDimensionsValuesQuery {
|
||||
private Function<Integer> dimensionLegNumber;
|
||||
private Function<String> dimensionCompetitorName;
|
||||
private Function<String> dimensionCompetitorSailID;
|
||||
|
||||
private Collection<Test_Regatta> dataSource;
|
||||
|
||||
@Test
|
||||
public void testDimensionsValuesQuery() throws InterruptedException, ExecutionException {
|
||||
@@ -72,89 +68,55 @@ public class TestDimensionsValuesQuery {
|
||||
private Query<Set<Object>> createDimensionsValuesQuery() {
|
||||
return new ProcessorQuery<Set<Object>, Collection<Test_Regatta>>(ConcurrencyTestsUtil.getExecutor(), dataSource) {
|
||||
@Override
|
||||
protected Processor<Collection<Test_Regatta>> createFirstProcessor() {
|
||||
Collection<Processor<Map<GroupKey, Set<Object>>>> collectorResultReceivers = Arrays.asList(/*query*/ this.getResultReceiver());
|
||||
|
||||
Processor<GroupedDataEntry<Object>> resultCollector = new ParallelGroupedDataCollectingAsSetProcessor<Object>(ConcurrencyTestsUtil.getExecutor(), collectorResultReceivers);
|
||||
Collection<Processor<GroupedDataEntry<Object>>> extractionResultReceivers = new ArrayList<>();
|
||||
extractionResultReceivers.add(resultCollector);
|
||||
protected Processor<Collection<Test_Regatta>, ?> createFirstProcessor() {
|
||||
Processor<GroupedDataEntry<Object>, Map<GroupKey, Set<Object>>> resultCollector = ComponentTestsUtil.getProcessorFactory().createGroupedDataCollectingAsSetProcessor(this);
|
||||
|
||||
Collection<Function<?>> legDimensions = new ArrayList<>();
|
||||
legDimensions.add(dimensionLegNumber);
|
||||
legDimensions.add(dimensionCompetitorName);
|
||||
legDimensions.add(dimensionCompetitorSailID);
|
||||
Collection<Processor<Test_HasLegContext>> legRetrieverResultReceivers = createGroupingExtractorsForDimensions(extractionResultReceivers, legDimensions);
|
||||
Processor<Test_HasRaceContext> legRetriever = new AbstractSimpleRetrievalProcessor<Test_HasRaceContext, Test_HasLegContext>(ConcurrencyTestsUtil.getExecutor(), legRetrieverResultReceivers) {
|
||||
@Override
|
||||
protected Iterable<Test_HasLegContext> retrieveData(Test_HasRaceContext raceWithContext) {
|
||||
Collection<Test_HasLegContext> legsWithContext = new ArrayList<>();
|
||||
int legNumber = 0;
|
||||
for (Test_Leg leg : raceWithContext.getRace().getLegs()) {
|
||||
legNumber++;
|
||||
for (Test_Competitor competitor : raceWithContext.getRace().getCompetitors()) {
|
||||
legsWithContext.add(new Test_HasLegContextImpl(raceWithContext.getRegatta(), raceWithContext.getRace(), raceWithContext.getBoatClass(),
|
||||
raceWithContext.getYear(), leg, legNumber, competitor));
|
||||
}
|
||||
}
|
||||
return legsWithContext;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Collection<Function<?>> raceDimensions = new ArrayList<>();
|
||||
raceDimensions.add(dimensionRegattaName);
|
||||
raceDimensions.add(dimensionRaceName);
|
||||
raceDimensions.add(dimensionBoatClassName);
|
||||
raceDimensions.add(dimensionYear);
|
||||
Collection<Processor<Test_HasRaceContext>> raceRetrieverResultReceivers = createGroupingExtractorsForDimensions(extractionResultReceivers, raceDimensions);
|
||||
raceRetrieverResultReceivers.add(legRetriever);
|
||||
return new AbstractSimpleRetrievalProcessor<Collection<Test_Regatta>, Test_HasRaceContext>(ConcurrencyTestsUtil.getExecutor(), raceRetrieverResultReceivers) {
|
||||
@Override
|
||||
protected Iterable<Test_HasRaceContext> retrieveData(Collection<Test_Regatta> regattas) {
|
||||
Collection<Test_HasRaceContext> racesWithContext = new ArrayList<>();
|
||||
for (Test_Regatta regatta : regattas) {
|
||||
for (Test_Race race : regatta.getRaces()) {
|
||||
racesWithContext.add(new Test_HasRaceContextImpl(regatta, race, regatta.getBoatClass(), regatta.getYear()));
|
||||
}
|
||||
}
|
||||
return racesWithContext;
|
||||
}
|
||||
};
|
||||
|
||||
DataRetrieverChainBuilder<Collection<Test_Regatta>> chainBuilder = dataRetrieverChainDefinition.startBuilding(ConcurrencyTestsUtil.getExecutor());
|
||||
chainBuilder.stepDeeper();
|
||||
for (Processor<?, ?> resultReceiver : ComponentTestsUtil.getProcessorFactory().createGroupingExtractorsForDimensions(Test_HasRaceContext.class, resultCollector, raceDimensions, stringMessages, locale)) {
|
||||
chainBuilder.addResultReceiver(resultReceiver);
|
||||
}
|
||||
|
||||
chainBuilder.stepDeeper();
|
||||
for (Processor<?, ?> resultReceiver : ComponentTestsUtil.getProcessorFactory().createGroupingExtractorsForDimensions(Test_HasLegOfCompetitorContext.class, resultCollector, legDimensions, stringMessages, locale)) {
|
||||
chainBuilder.addResultReceiver(resultReceiver);
|
||||
}
|
||||
|
||||
return chainBuilder.build();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <DataType> Collection<Processor<DataType>> createGroupingExtractorsForDimensions(
|
||||
Collection<Processor<GroupedDataEntry<Object>>> extractionResultReceivers, Collection<Function<?>> dimensions) {
|
||||
Collection<Processor<DataType>> groupingExtractors = new ArrayList<>();
|
||||
for (Function<?> dimension : dimensions) {
|
||||
Processor<GroupedDataEntry<DataType>> dimensionValueExtractor = new ParallelGroupedElementsValueExtractionProcessor<DataType, Object>(ConcurrencyTestsUtil.getExecutor(), extractionResultReceivers, (Function<Object>) dimension);
|
||||
Processor<DataType> byDimensionGrouper = new ParallelByDimensionGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(dimensionValueExtractor), dimension);
|
||||
groupingExtractors.add(byDimensionGrouper);
|
||||
}
|
||||
return groupingExtractors;
|
||||
}
|
||||
|
||||
private Map<GroupKey, Set<Object>> buildExpectedResultData() {
|
||||
Map<GroupKey, Set<Object>> expectedResultData = new HashMap<>();
|
||||
|
||||
//Add empty sets for Test_HasRaceContext dimensions
|
||||
GroupKey dimensionRegattaNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionDTOFactory.createFunctionDTO(dimensionRegattaName));
|
||||
GroupKey dimensionRegattaNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimensionRegattaName, stringMessages, locale));
|
||||
expectedResultData.put(dimensionRegattaNameGroupKey, new HashSet<Object>());
|
||||
GroupKey dimensionRaceNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionDTOFactory.createFunctionDTO(dimensionRaceName));
|
||||
GroupKey dimensionRaceNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimensionRaceName, stringMessages, locale));
|
||||
expectedResultData.put(dimensionRaceNameGroupKey, new HashSet<Object>());
|
||||
GroupKey dimensionBoatClassNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionDTOFactory.createFunctionDTO(dimensionBoatClassName));
|
||||
GroupKey dimensionBoatClassNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimensionBoatClassName, stringMessages, locale));
|
||||
expectedResultData.put(dimensionBoatClassNameGroupKey, new HashSet<Object>());
|
||||
GroupKey dimensionYearGroupKey = new GenericGroupKey<FunctionDTO>(FunctionDTOFactory.createFunctionDTO(dimensionYear));
|
||||
GroupKey dimensionYearGroupKey = new GenericGroupKey<FunctionDTO>(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimensionYear, stringMessages, locale));
|
||||
expectedResultData.put(dimensionYearGroupKey, new HashSet<Object>());
|
||||
|
||||
//Add empty sets for Test_HasLegContext dimensions
|
||||
GroupKey dimensionLegNumberGroupKey = new GenericGroupKey<FunctionDTO>(FunctionDTOFactory.createFunctionDTO(dimensionLegNumber));
|
||||
GroupKey dimensionLegNumberGroupKey = new GenericGroupKey<FunctionDTO>(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimensionLegNumber, stringMessages, locale));
|
||||
expectedResultData.put(dimensionLegNumberGroupKey, new HashSet<Object>());
|
||||
GroupKey dimensionCompetitorNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionDTOFactory.createFunctionDTO(dimensionCompetitorName));
|
||||
GroupKey dimensionCompetitorNameGroupKey = new GenericGroupKey<FunctionDTO>(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimensionCompetitorName, stringMessages, locale));
|
||||
expectedResultData.put(dimensionCompetitorNameGroupKey, new HashSet<Object>());
|
||||
GroupKey dimensionCompetitorSailIDGroupKey = new GenericGroupKey<FunctionDTO>(FunctionDTOFactory.createFunctionDTO(dimensionCompetitorSailID));
|
||||
GroupKey dimensionCompetitorSailIDGroupKey = new GenericGroupKey<FunctionDTO>(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimensionCompetitorSailID, stringMessages, locale));
|
||||
expectedResultData.put(dimensionCompetitorSailIDGroupKey, new HashSet<Object>());
|
||||
|
||||
for (Test_Regatta regatta : dataSource) {
|
||||
@@ -177,101 +139,67 @@ public class TestDimensionsValuesQuery {
|
||||
}
|
||||
return expectedResultData;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Before
|
||||
public void initializeDataRetrieverChain() {
|
||||
dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(regattaRetrieverClass,
|
||||
raceRetrieverClass,
|
||||
Test_HasRaceContext.class);
|
||||
|
||||
Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>> legRetrieverClass =
|
||||
(Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>>)(Class<?>) TestLegOfCompetitorWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(raceRetrieverClass,
|
||||
legRetrieverClass,
|
||||
Test_HasLegOfCompetitorContext.class);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void initializeDimensions() throws NoSuchMethodException, SecurityException {
|
||||
Method getNameMethod = Test_Named.class.getMethod("getName", new Class<?>[0]);
|
||||
Function<?> getName = FunctionFactory.createMethodWrappingFunction(getNameMethod);
|
||||
Function<?> getName = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getNameMethod);
|
||||
|
||||
Method getRegattaMethod = Test_HasRaceContext.class.getMethod("getRegatta", new Class<?>[0]);
|
||||
Function<?> getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod);
|
||||
dimensionRegattaName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getRegatta, getName));
|
||||
Function<?> getRegatta = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getRegattaMethod);
|
||||
dimensionRegattaName = FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getRegatta, getName));
|
||||
|
||||
Method getRaceMethod = Test_HasRaceContext.class.getMethod("getRace", new Class<?>[0]);
|
||||
Function<?> getRace = FunctionFactory.createMethodWrappingFunction(getRaceMethod);
|
||||
dimensionRaceName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getRace, getName));
|
||||
Function<?> getRace = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getRaceMethod);
|
||||
dimensionRaceName = FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getRace, getName));
|
||||
|
||||
Method getBoatClassMethod = Test_HasRaceContext.class.getMethod("getBoatClass", new Class<?>[0]);
|
||||
Function<?> getBoatClass = FunctionFactory.createMethodWrappingFunction(getBoatClassMethod);
|
||||
dimensionBoatClassName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getBoatClass, getName));
|
||||
Function<?> getBoatClass = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getBoatClassMethod);
|
||||
dimensionBoatClassName = FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getBoatClass, getName));
|
||||
|
||||
Method getYearMethod = Test_HasRaceContext.class.getMethod("getYear", new Class<?>[0]);
|
||||
dimensionYear = FunctionFactory.createMethodWrappingFunction(getYearMethod);
|
||||
dimensionYear = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getYearMethod);
|
||||
|
||||
Method getLegNumberMethod = Test_HasLegContext.class.getMethod("getLegNumber", new Class<?>[0]);
|
||||
dimensionLegNumber = FunctionFactory.createMethodWrappingFunction(getLegNumberMethod);
|
||||
Method getLegNumberMethod = Test_HasLegOfCompetitorContext.class.getMethod("getLegNumber", new Class<?>[0]);
|
||||
dimensionLegNumber = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getLegNumberMethod);
|
||||
|
||||
Method getCompetitorMethod = Test_HasLegContext.class.getMethod("getCompetitor", new Class<?>[0]);
|
||||
Function<?> getCompetitor = FunctionFactory.createMethodWrappingFunction(getCompetitorMethod);
|
||||
Method getCompetitorMethod = Test_HasLegOfCompetitorContext.class.getMethod("getCompetitor", new Class<?>[0]);
|
||||
Function<?> getCompetitor = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getCompetitorMethod);
|
||||
|
||||
Method getTeamMethod = Test_Competitor.class.getMethod("getTeam", new Class<?>[0]);
|
||||
Function<?> getTeam = FunctionFactory.createMethodWrappingFunction(getTeamMethod);
|
||||
dimensionCompetitorName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getTeam, getName));
|
||||
Function<?> getTeam = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getTeamMethod);
|
||||
dimensionCompetitorName = FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getCompetitor, getTeam, getName));
|
||||
|
||||
Method getBoatMethod = Test_Competitor.class.getMethod("getBoat", new Class<?>[0]);
|
||||
Function<?> getBoat = FunctionFactory.createMethodWrappingFunction(getBoatMethod);
|
||||
Function<?> getBoat = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getBoatMethod);
|
||||
Method getSailIDMethod = Test_Boat.class.getMethod("getSailID", new Class<?>[0]);
|
||||
Function<?> getSailID = FunctionFactory.createMethodWrappingFunction(getSailIDMethod);
|
||||
dimensionCompetitorSailID = FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getBoat, getSailID));
|
||||
Function<?> getSailID = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getSailIDMethod);
|
||||
dimensionCompetitorSailID = FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getCompetitor, getBoat, getSailID));
|
||||
}
|
||||
|
||||
@Before
|
||||
public void initializeDataSource() {
|
||||
//Initialize 49er competitors
|
||||
Test_Team team1_49er = new Test_TeamImpl("49er Team 1");
|
||||
Test_Boat boatGER1 = new Test_BoatImpl("GER1");
|
||||
Test_Competitor competitor1_49er = new Test_CompetitorImpl(team1_49er, boatGER1);
|
||||
|
||||
Test_Team team2_49er = new Test_TeamImpl("49er Team 2");
|
||||
Test_Boat boatGER2 = new Test_BoatImpl("GER2");
|
||||
Test_Competitor competitor2_49er = new Test_CompetitorImpl(team2_49er, boatGER2);
|
||||
|
||||
Test_Team team3_49er = new Test_TeamImpl("49er Team 3");
|
||||
Test_Boat boatGER3 = new Test_BoatImpl("GER3");
|
||||
Test_Competitor competitor3_49er = new Test_CompetitorImpl(team3_49er, boatGER3);
|
||||
|
||||
Test_Team team4_49er = new Test_TeamImpl("49er Team 4");
|
||||
Test_Boat boatGER4 = new Test_BoatImpl("GER4");
|
||||
Test_Competitor competitor4_49er = new Test_CompetitorImpl(team4_49er, boatGER4);
|
||||
|
||||
Collection<Test_Competitor> competitors49er = Arrays.asList(competitor1_49er, competitor2_49er, competitor3_49er, competitor4_49er);
|
||||
|
||||
//Initialize 505 competitors
|
||||
Test_Team team1_505 = new Test_TeamImpl("505 Team 1");
|
||||
Test_Boat boatENG1 = new Test_BoatImpl("ENG1");
|
||||
Test_Competitor competitor1_505 = new Test_CompetitorImpl(team1_505, boatENG1);
|
||||
|
||||
Test_Team team2_505 = new Test_TeamImpl("505 Team 2");
|
||||
Test_Boat boatENG2 = new Test_BoatImpl("ENG2");
|
||||
Test_Competitor competitor2_505 = new Test_CompetitorImpl(team2_505, boatENG2);
|
||||
|
||||
Test_Team team3_505 = new Test_TeamImpl("505 Team 3");
|
||||
Test_Boat boatENG3 = new Test_BoatImpl("ENG3");
|
||||
Test_Competitor competitor3_505 = new Test_CompetitorImpl(team3_505, boatENG3);
|
||||
|
||||
Collection<Test_Competitor> competitors505 = Arrays.asList(competitor1_505, competitor2_505, competitor3_505);
|
||||
|
||||
// Test_Leg has only the statistic distance traveled
|
||||
// This test requires only the dimensions, so only one leg is necessary
|
||||
Test_Leg leg = new Test_LegImpl(0.0);
|
||||
Collection<Test_Leg> legs = Arrays.asList(leg, leg, leg, leg, leg);
|
||||
|
||||
//Initialize races, boat classes and regattas
|
||||
Test_Race race1_49er = new Test_RaceImpl("Race 1", competitors49er, legs);
|
||||
Test_Race race2_49er = new Test_RaceImpl("Race 2", competitors49er, legs);
|
||||
Test_Race race3_49er = new Test_RaceImpl("Race 3", competitors49er, legs);
|
||||
Test_Race race1_505 = new Test_RaceImpl("Race 1", competitors505, legs);
|
||||
Test_Race race2_505 = new Test_RaceImpl("Race 2", competitors505, legs);
|
||||
|
||||
Test_BoatClass boatClass49er = new Test_BoatClassImpl("49er");
|
||||
Test_BoatClass boatClass505 = new Test_BoatClassImpl("505");
|
||||
|
||||
Test_Regatta regatta49er = new Test_RegattaImpl("KW 2014 49er", boatClass49er, 2014, race1_49er, race2_49er, race3_49er);
|
||||
Test_Regatta regatta505 = new Test_RegattaImpl("KW 2014 505", boatClass505, 2014, race1_505, race2_505);
|
||||
|
||||
dataSource = new ArrayList<>();
|
||||
dataSource.add(regatta49er);
|
||||
dataSource.add(regatta505);
|
||||
dataSource = ComponentTestsUtil.createExampleDataSource();
|
||||
}
|
||||
|
||||
}
|
||||
+50
-36
@@ -6,9 +6,9 @@ import static org.junit.Assert.fail;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
@@ -17,39 +17,48 @@ import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.Query;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.factories.ProcessorFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleParallelProcessor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
|
||||
import com.sap.sse.datamining.impl.components.ParallelGroupedElementsValueExtractionProcessor;
|
||||
import com.sap.sse.datamining.impl.components.ParallelMultiDimensionsValueNestingGroupingProcessor;
|
||||
import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDoubleDataSumAggregationProcessor;
|
||||
import com.sap.sse.datamining.impl.components.ParallelFilteringProcessor;
|
||||
import com.sap.sse.datamining.impl.criterias.AbstractFilterCriterion;
|
||||
import com.sap.sse.datamining.shared.GroupKey;
|
||||
import com.sap.sse.datamining.shared.QueryResult;
|
||||
import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.impl.AdditionalResultDataImpl;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
import com.sap.sse.datamining.shared.impl.QueryResultImpl;
|
||||
import com.sap.sse.datamining.test.components.util.BlockingProcessor;
|
||||
import com.sap.sse.datamining.test.components.util.Number;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.TestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.BlockingProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.Number;
|
||||
|
||||
public class TestProcessorQuery {
|
||||
|
||||
private final static DataMiningStringMessages stringMessages = TestsUtil.getTestStringMessagesWithProductiveMessages();
|
||||
|
||||
private static ProcessorFactory processorFactory;
|
||||
|
||||
private boolean receivedElementOrFinished;
|
||||
private boolean receivedAbort;
|
||||
|
||||
@Before
|
||||
public void initializeProcessorFactory() {
|
||||
processorFactory = new ProcessorFactory(ConcurrencyTestsUtil.getExecutor());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStandardWorkflow() throws InterruptedException, ExecutionException {
|
||||
@@ -99,38 +108,42 @@ public class TestProcessorQuery {
|
||||
*/
|
||||
private Query<Double> createQueryWithStandardWorkflow(Collection<Number> dataSource) {
|
||||
final ThreadPoolExecutor executor = ConcurrencyTestsUtil.getExecutor();
|
||||
ProcessorQuery<Double, Iterable<Number>> query = new ProcessorQuery<Double, Iterable<Number>>(executor,
|
||||
dataSource, stringMessages, Locale.ENGLISH) {
|
||||
ProcessorQuery<Double, Iterable<Number>> query = new ProcessorQuery<Double, Iterable<Number>>(executor, dataSource, stringMessages, Locale.ENGLISH) {
|
||||
@Override
|
||||
protected Processor<Iterable<Number>> createFirstProcessor() {
|
||||
Collection<Processor<Map<GroupKey, Double>>> aggregationResultReceivers = Arrays.asList(/*query*/ this.getResultReceiver());
|
||||
Processor<GroupedDataEntry<Double>> sumAggregator =
|
||||
new ParallelGroupedDoubleDataSumAggregationProcessor(executor, aggregationResultReceivers);
|
||||
protected Processor<Iterable<Number>, ?> createFirstProcessor() {
|
||||
Processor<GroupedDataEntry<Double>, Map<GroupKey, Double>> sumAggregator = processorFactory.createAggregationProcessor(this, AggregatorType.Sum);
|
||||
|
||||
Method getCrossSumMethod = FunctionTestsUtil.getMethodFromClass(Number.class, "getCrossSum");
|
||||
Function<Double> getCrossSumFunction = FunctionFactory.createMethodWrappingFunction(getCrossSumMethod);
|
||||
Processor<GroupedDataEntry<Number>> crossSumExtractor = new ParallelGroupedElementsValueExtractionProcessor<Number, Double>(
|
||||
executor, Arrays.asList(sumAggregator), getCrossSumFunction);
|
||||
Function<Double> getCrossSumFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getCrossSumMethod);
|
||||
Processor<GroupedDataEntry<Number>, GroupedDataEntry<Double>> crossSumExtractor = processorFactory.createExtractionProcessor(sumAggregator, getCrossSumFunction);
|
||||
|
||||
Collection<Function<?>> dimensions = new ArrayList<>();
|
||||
Function<Integer> getLengthFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Number.class, "getLength"));
|
||||
List<Function<?>> dimensions = new ArrayList<>();
|
||||
Function<Integer> getLengthFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Number.class, "getLength"));
|
||||
dimensions.add(getLengthFunction);
|
||||
Processor<Number> lengthGrouper = new ParallelMultiDimensionsValueNestingGroupingProcessor<>(executor, Arrays.asList(crossSumExtractor), dimensions);
|
||||
Processor<Number, GroupedDataEntry<Number>> lengthGrouper = processorFactory.createGroupingProcessor(Number.class, crossSumExtractor, dimensions);
|
||||
Collection<Processor<Number, ?>> filtrationResultReceivers = new ArrayList<>();
|
||||
filtrationResultReceivers.add(lengthGrouper);
|
||||
|
||||
FilterCriterion<Number> retrievalFilterCriteria = new FilterCriterion<Number>() {
|
||||
FilterCriterion<Number> filterCriterion = new AbstractFilterCriterion<Number>(Number.class) {
|
||||
@Override
|
||||
public boolean matches(Number element) {
|
||||
return element.getValue() >= 10;
|
||||
}
|
||||
};
|
||||
Processor<Iterable<Number>> filteringRetrievalProcessor = new AbstractSimpleFilteringRetrievalProcessor<Iterable<Number>, Number>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(lengthGrouper), retrievalFilterCriteria) {
|
||||
Processor<Number, Number> filtrationProcessor = new ParallelFilteringProcessor<>(Number.class, executor, filtrationResultReceivers, filterCriterion);
|
||||
Collection<Processor<Number, ?>> retrievalResultReceivers = new ArrayList<>();
|
||||
retrievalResultReceivers.add(filtrationProcessor);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Processor<Iterable<Number>, Number> retrievalProcessor = new AbstractSimpleRetrievalProcessor<Iterable<Number>, Number>((Class<Iterable<Number>>)(Class<?>) Iterable.class, Number.class,
|
||||
ConcurrencyTestsUtil.getExecutor(), retrievalResultReceivers) {
|
||||
@Override
|
||||
protected Iterable<Number> retrieveData(Iterable<Number> element) {
|
||||
return element;
|
||||
}
|
||||
};
|
||||
|
||||
return filteringRetrievalProcessor;
|
||||
return retrievalProcessor;
|
||||
}
|
||||
};
|
||||
return query;
|
||||
@@ -158,17 +171,15 @@ public class TestProcessorQuery {
|
||||
public void testQueryTimeouting() throws TimeoutException {
|
||||
ProcessorQuery<Double, Iterable<Number>> query = new ProcessorQuery<Double, Iterable<Number>>(
|
||||
ConcurrencyTestsUtil.getExecutor(), createDataSource(), stringMessages, Locale.ENGLISH) {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected Processor<Iterable<Number>> createFirstProcessor() {
|
||||
Processor<Double> resultReceiver = new Processor<Double>() {
|
||||
protected Processor<Iterable<Number>, ?> createFirstProcessor() {
|
||||
Processor<Double, Void> resultReceiver = new NullProcessor<Double, Void>(Double.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Double element) {
|
||||
receivedElementOrFinished = true;
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
receivedElementOrFinished = true;
|
||||
}
|
||||
@@ -176,12 +187,10 @@ public class TestProcessorQuery {
|
||||
public void abort() {
|
||||
receivedAbort = true;
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
return new BlockingProcessor<Iterable<Number>, Double>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), (long) 1000);
|
||||
Collection<Processor<Double, ?>> resultReceivers = new ArrayList<>();
|
||||
resultReceivers.add(resultReceiver);
|
||||
return new BlockingProcessor<Iterable<Number>, Double>((Class<Iterable<Number>>)(Class<?>) Iterable.class, Double.class, ConcurrencyTestsUtil.getExecutor(), resultReceivers, (long) 1000);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -203,7 +212,7 @@ public class TestProcessorQuery {
|
||||
ProcessorQuery<Double, Iterable<Number>> query = new ProcessorQuery<Double, Iterable<Number>>(
|
||||
ConcurrencyTestsUtil.getExecutor(), createDataSource(), stringMessages, Locale.ENGLISH) {
|
||||
@Override
|
||||
protected Processor<Iterable<Number>> createFirstProcessor() {
|
||||
protected Processor<Iterable<Number>, ?> createFirstProcessor() {
|
||||
return createSumBuildingProcessor(/*query*/ this, keyValue);
|
||||
}
|
||||
};
|
||||
@@ -213,10 +222,15 @@ public class TestProcessorQuery {
|
||||
assertThat(query.run(500, TimeUnit.MILLISECONDS).getResults(), is(expectedResult));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private AbstractSimpleParallelProcessor<Iterable<Number>, Map<GroupKey, Double>> createSumBuildingProcessor(
|
||||
ProcessorQuery<Double, Iterable<Number>> query, final String keyValue) {
|
||||
return new AbstractSimpleParallelProcessor<Iterable<Number>, Map<GroupKey, Double>>(ConcurrencyTestsUtil.getExecutor(),
|
||||
Arrays.asList(query.getResultReceiver())) {
|
||||
Collection<Processor<Map<GroupKey, Double>, ?>> resultReceivers = new ArrayList<>();
|
||||
resultReceivers.add(query.getResultReceiver());
|
||||
return new AbstractSimpleParallelProcessor<Iterable<Number>, Map<GroupKey, Double>>((Class<Iterable<Number>>)(Class<?>) Iterable.class,
|
||||
(Class<Map<GroupKey, Double>>)(Class<?>) Map.class,
|
||||
ConcurrencyTestsUtil.getExecutor(),
|
||||
resultReceivers) {
|
||||
@Override
|
||||
protected Callable<Map<GroupKey, Double>> createInstruction(final Iterable<Number> element) {
|
||||
return new Callable<Map<GroupKey,Double>>() {
|
||||
|
||||
+8
-13
@@ -14,11 +14,12 @@ import org.junit.Test;
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
|
||||
public class TestAbstractParallelProcessorFinishing {
|
||||
|
||||
private Processor<Integer> processor;
|
||||
private Processor<Integer> receiver;
|
||||
private Processor<Integer, Integer> processor;
|
||||
private Processor<Integer, ?> receiver;
|
||||
|
||||
private boolean instructionIsWorking;
|
||||
private boolean receiverWasToldToFinish;
|
||||
@@ -30,7 +31,7 @@ public class TestAbstractParallelProcessorFinishing {
|
||||
|
||||
receiver = createReceiver();
|
||||
|
||||
Collection<Processor<Integer>> receivers = new HashSet<>();
|
||||
Collection<Processor<Integer, ?>> receivers = new HashSet<>();
|
||||
receivers.add(receiver);
|
||||
processor = createProcessor(receivers);
|
||||
}
|
||||
@@ -47,27 +48,21 @@ public class TestAbstractParallelProcessorFinishing {
|
||||
|
||||
}
|
||||
|
||||
private Processor<Integer> createReceiver() {
|
||||
return new Processor<Integer>() {
|
||||
@Override
|
||||
public void processElement(Integer element) { }
|
||||
@Override
|
||||
public void onFailure(Throwable failure) { }
|
||||
private Processor<Integer, ?> createReceiver() {
|
||||
return new NullProcessor<Integer, Void>(Integer.class, Void.class) {
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
receiverWasToldToFinish = true;
|
||||
}
|
||||
@Override
|
||||
public void abort() { }
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private AbstractSimpleParallelProcessor<Integer, Integer> createProcessor(Collection<Processor<Integer>> receivers) {
|
||||
return new AbstractSimpleParallelProcessor<Integer, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers) {
|
||||
private AbstractSimpleParallelProcessor<Integer, Integer> createProcessor(Collection<Processor<Integer, ?>> receivers) {
|
||||
return new AbstractSimpleParallelProcessor<Integer, Integer>(Integer.class, Integer.class, ConcurrencyTestsUtil.getExecutor(), receivers) {
|
||||
@Override
|
||||
protected Callable<Integer> createInstruction(Integer partialElement) {
|
||||
return new Callable<Integer>() {
|
||||
|
||||
+5
-14
@@ -13,40 +13,31 @@ import org.junit.Test;
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
|
||||
public class TestAbstractParallelProcessorWithManySimpleInstructions {
|
||||
|
||||
private Processor<Integer> processor;
|
||||
private Processor<Integer, Integer> processor;
|
||||
|
||||
private int sum = 0;
|
||||
private boolean receiverWasToldToFinish = false;
|
||||
|
||||
@Before
|
||||
public void initializeProcessor() {
|
||||
Processor<Integer> receiver = new Processor<Integer>() {
|
||||
Processor<Integer, Void> receiver = new NullProcessor<Integer, Void>(Integer.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Integer element) {
|
||||
incrementSum(element);
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
receiverWasToldToFinish = true;
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
Collection<Processor<Integer>> receivers = new ArrayList<>();
|
||||
Collection<Processor<Integer, ?>> receivers = new ArrayList<>();
|
||||
receivers.add(receiver);
|
||||
processor = new AbstractSimpleParallelProcessor<Integer, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers) {
|
||||
processor = new AbstractSimpleParallelProcessor<Integer, Integer>(Integer.class, Integer.class, ConcurrencyTestsUtil.getExecutor(), receivers) {
|
||||
@Override
|
||||
protected Callable<Integer> createInstruction(final Integer element) {
|
||||
return new Callable<Integer>() {
|
||||
|
||||
-64
@@ -1,64 +0,0 @@
|
||||
package com.sap.sse.datamining.impl.components;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
|
||||
public class TestAbstractProcessor {
|
||||
|
||||
private Collection<Processor<Integer>> receivers;
|
||||
private boolean receiverWasToldToFinish;
|
||||
|
||||
@Before
|
||||
public void initializeReceivers() {
|
||||
Processor<Integer> receiver = new Processor<Integer>() {
|
||||
@Override
|
||||
public void processElement(Integer element) {
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
receiverWasToldToFinish = true;
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
receivers.add(receiver);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFinishing() throws InterruptedException {
|
||||
Processor<Integer> processor = new AbstractProcessor<Integer, Integer>(receivers) {
|
||||
@Override
|
||||
protected Integer handleElement(Integer element) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
protected void setAdditionalData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
}
|
||||
};
|
||||
processor.finish();
|
||||
assertThat(receiverWasToldToFinish, is(true));
|
||||
}
|
||||
|
||||
}
|
||||
+7
-32
@@ -12,14 +12,15 @@ import java.util.Map;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.criterias.AbstractFilterCriterion;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
|
||||
public class TestFilteringProcessors {
|
||||
|
||||
private Collection<Processor<Integer>> receivers;
|
||||
private Collection<Processor<Integer, ?>> receivers;
|
||||
/**
|
||||
* Contains the last received elements as key and the amount of the received times as value;
|
||||
*/
|
||||
@@ -27,14 +28,14 @@ public class TestFilteringProcessors {
|
||||
|
||||
@Test
|
||||
public void testFilteringProcessor() {
|
||||
FilterCriterion<Integer> elementIsEvenCriteria = new FilterCriterion<Integer>() {
|
||||
FilterCriterion<Integer> elementIsEvenCriteria = new AbstractFilterCriterion<Integer>(Integer.class) {
|
||||
@Override
|
||||
public boolean matches(Integer element) {
|
||||
return element % 2 == 0;
|
||||
}
|
||||
};
|
||||
Processor<Integer> filteringProcessor = new ParallelFilteringProcessor<Integer>(ConcurrencyTestsUtil.getExecutor(), receivers, elementIsEvenCriteria);
|
||||
processElements(filteringProcessor, createElementsToProcess());
|
||||
Processor<Integer, Integer> filteringProcessor = new ParallelFilteringProcessor<Integer>(Integer.class, ConcurrencyTestsUtil.getExecutor(), receivers, elementIsEvenCriteria);
|
||||
ConcurrencyTestsUtil.processElements(filteringProcessor, createElementsToProcess());
|
||||
ConcurrencyTestsUtil.sleepFor(100); // Giving the processor time to process the instructions
|
||||
|
||||
Collection<Integer> evenElements = new ArrayList<>();
|
||||
@@ -54,19 +55,6 @@ public class TestFilteringProcessors {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNonFilteringProcessorFiltration() {
|
||||
Processor<Integer> nonFilteringProcessor = new NonFilteringProcessor<Integer>(receivers);
|
||||
processElements(nonFilteringProcessor, createElementsToProcess());
|
||||
verifyThatExpectedElementsHasBeenReceived(createElementsToProcess());
|
||||
}
|
||||
|
||||
private void processElements(Processor<Integer> processor, Collection<Integer> elements) {
|
||||
for (Integer element : elements) {
|
||||
processor.processElement(element);
|
||||
}
|
||||
}
|
||||
|
||||
private Collection<Integer> createElementsToProcess() {
|
||||
Collection<Integer> elements = new ArrayList<>();
|
||||
elements.add(1);
|
||||
@@ -86,7 +74,7 @@ public class TestFilteringProcessors {
|
||||
public void initializeReceivers() {
|
||||
receivedElements = new HashMap<>();
|
||||
|
||||
Processor<Integer> receiver = new Processor<Integer>() {
|
||||
Processor<Integer, Void> receiver = new NullProcessor<Integer, Void>(Integer.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Integer element) {
|
||||
if (!receivedElements.containsKey(element)) {
|
||||
@@ -95,19 +83,6 @@ public class TestFilteringProcessors {
|
||||
Integer elementAmount = receivedElements.get(element) + 1;
|
||||
receivedElements.put(element, elementAmount);
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
|
||||
+11
-30
@@ -13,19 +13,18 @@ import java.util.Map;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
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.shared.GroupKey;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
import com.sap.sse.datamining.test.components.util.Number;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.Number;
|
||||
|
||||
public class TestParallelExtractionProcessor {
|
||||
|
||||
private Collection<Processor<GroupedDataEntry<Integer>>> receivers;
|
||||
private Collection<Processor<GroupedDataEntry<Integer>, ?>> receivers;
|
||||
private Map<GroupKey, Integer> receivedValues;
|
||||
|
||||
private Function<Integer> getCrossSumFunction;
|
||||
@@ -39,24 +38,12 @@ public class TestParallelExtractionProcessor {
|
||||
public void initializeReceivers() {
|
||||
receivedValues = new HashMap<>();
|
||||
|
||||
Processor<GroupedDataEntry<Integer>> receiver = new Processor<GroupedDataEntry<Integer>>() {
|
||||
@SuppressWarnings("unchecked")
|
||||
Processor<GroupedDataEntry<Integer>, Void> receiver = new NullProcessor<GroupedDataEntry<Integer>, Void>((Class<GroupedDataEntry<Integer>>)(Class<?>) GroupedDataEntry.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(GroupedDataEntry<Integer> element) {
|
||||
receivedValues.put(element.getKey(), element.getDataEntry());
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
@@ -66,17 +53,17 @@ public class TestParallelExtractionProcessor {
|
||||
@Before
|
||||
public void initializeExtractionFunctions() {
|
||||
Method getCrossSumMethod = FunctionTestsUtil.getMethodFromClass(Number.class, "getCrossSum");
|
||||
getCrossSumFunction = FunctionFactory.createMethodWrappingFunction(getCrossSumMethod);
|
||||
getCrossSumFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getCrossSumMethod);
|
||||
|
||||
Method invalidMethod = FunctionTestsUtil.getMethodFromSimpleClassWithMarkedMethod("sideEffectFreeValue");
|
||||
invalidFunction = FunctionFactory.createMethodWrappingFunction(invalidMethod);
|
||||
invalidFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(invalidMethod);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValueExtraction() {
|
||||
Processor<GroupedDataEntry<Number>> processor = new ParallelGroupedElementsValueExtractionProcessor<Number, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers, getCrossSumFunction);
|
||||
Processor<GroupedDataEntry<Number>, GroupedDataEntry<Integer>> processor = new ParallelGroupedElementsValueExtractionProcessor<Number, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers, getCrossSumFunction);
|
||||
Collection<GroupedDataEntry<Number>> elements = createElements();
|
||||
processElements(processor, elements);
|
||||
ConcurrencyTestsUtil.processElements(processor, elements);
|
||||
ConcurrencyTestsUtil.sleepFor(100); //Giving the processor time to finish the instructions
|
||||
|
||||
Collection<GroupedDataEntry<Integer>> expectedReceivedValues = buildExpectedReceivedValues(elements);
|
||||
@@ -92,8 +79,8 @@ public class TestParallelExtractionProcessor {
|
||||
|
||||
@Test
|
||||
public void testValueExtractionWithInvalidFunction() {
|
||||
Processor<GroupedDataEntry<Number>> processor = new ParallelGroupedElementsValueExtractionProcessor<Number, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers, invalidFunction);
|
||||
processElements(processor, createElements());
|
||||
Processor<GroupedDataEntry<Number>, GroupedDataEntry<Integer>> processor = new ParallelGroupedElementsValueExtractionProcessor<Number, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers, invalidFunction);
|
||||
ConcurrencyTestsUtil.processElements(processor, createElements());
|
||||
ConcurrencyTestsUtil.sleepFor(100); //Giving the processor time to finish the instructions
|
||||
assertThat("Values have been received, but the processor function is invalid.", receivedValues.isEmpty(), is(true));
|
||||
}
|
||||
@@ -107,12 +94,6 @@ public class TestParallelExtractionProcessor {
|
||||
return elements;
|
||||
}
|
||||
|
||||
private void processElements(Processor<GroupedDataEntry<Number>> processor, Collection<GroupedDataEntry<Number>> elements) {
|
||||
for (GroupedDataEntry<Number> element : elements) {
|
||||
processor.processElement(element);
|
||||
}
|
||||
}
|
||||
|
||||
private Collection<GroupedDataEntry<Integer>> buildExpectedReceivedValues(Collection<GroupedDataEntry<Number>> elements) {
|
||||
Collection<GroupedDataEntry<Integer>> expectedReceivedValues = new ArrayList<>();
|
||||
for (GroupedDataEntry<Number> element : elements) {
|
||||
|
||||
+14
-22
@@ -6,75 +6,67 @@ import static org.junit.Assert.assertThat;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
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.impl.functions.MethodWrappingFunction;
|
||||
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.test.components.util.Number;
|
||||
import com.sap.sse.datamining.test.util.ComponentTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.Number;
|
||||
|
||||
public class TestParallelMultiDimensionalGroupingProcessor {
|
||||
|
||||
private Processor<Number> processor;
|
||||
private Collection<Processor<GroupedDataEntry<Number>>> receivers;
|
||||
private Processor<Number, GroupedDataEntry<Number>> processor;
|
||||
private Collection<Processor<GroupedDataEntry<Number>, ?>> receivers;
|
||||
|
||||
private GroupedDataEntry<Number> groupedElement;
|
||||
|
||||
@Before
|
||||
public void intializeProcessor() throws IllegalArgumentException, NoSuchMethodException, SecurityException {
|
||||
Processor<GroupedDataEntry<Number>> receiver = new Processor<GroupedDataEntry<Number>>() {
|
||||
@SuppressWarnings("unchecked")
|
||||
Processor<GroupedDataEntry<Number>, Void> receiver = new NullProcessor<GroupedDataEntry<Number>, Void>((Class<GroupedDataEntry<Number>>)(Class<?>) GroupedDataEntry.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(GroupedDataEntry<Number> element) {
|
||||
groupedElement = element;
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) { }
|
||||
@Override
|
||||
public void finish() throws InterruptedException { }
|
||||
@Override
|
||||
public void abort() { }
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new ArrayList<>();
|
||||
receivers.add(receiver);
|
||||
|
||||
Collection<Function<?>> dimensions = new ArrayList<Function<?>>();
|
||||
List<Function<?>> dimensions = new ArrayList<Function<?>>();
|
||||
dimensions.add(new MethodWrappingFunction<>(Number.class.getMethod("getLength", new Class<?>[0]), int.class));
|
||||
dimensions.add(new MethodWrappingFunction<>(Number.class.getMethod("getCrossSum", new Class<?>[0]), int.class));
|
||||
|
||||
processor = new ParallelMultiDimensionsValueNestingGroupingProcessor<Number>(ConcurrencyTestsUtil.getExecutor(), receivers, dimensions);
|
||||
processor = ComponentTestsUtil.getProcessorFactory().createGroupingProcessor(Number.class, receivers, dimensions);
|
||||
}
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testConstructionWithNullDimensions() {
|
||||
new ParallelMultiDimensionsValueNestingGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, null);
|
||||
new ParallelMultiDimensionsValueNestingGroupingProcessor<>(Number.class, ConcurrencyTestsUtil.getExecutor(), receivers, null);
|
||||
}
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testConstructionWithEmptyDimensions() {
|
||||
Iterable<Function<?>> dimensions = new ArrayList<>();
|
||||
new ParallelMultiDimensionsValueNestingGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, dimensions);
|
||||
new ParallelMultiDimensionsValueNestingGroupingProcessor<>(Number.class, ConcurrencyTestsUtil.getExecutor(), receivers, dimensions);
|
||||
}
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
public void testConstructionWithFunctionsInsteadOfDimensions() {
|
||||
Collection<Function<?>> functions = new ArrayList<>();
|
||||
Method method = FunctionTestsUtil.getMethodFromSimpleClassWithMarkedMethod("sideEffectFreeValue");
|
||||
functions.add(FunctionFactory.createMethodWrappingFunction(method));
|
||||
new ParallelMultiDimensionsValueNestingGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, functions);
|
||||
functions.add(FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(method));
|
||||
new ParallelMultiDimensionsValueNestingGroupingProcessor<>(Number.class, ConcurrencyTestsUtil.getExecutor(), receivers, functions);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ public class TestPartitioningOfAbstractSimpleParallelProcessor {
|
||||
|
||||
@Test
|
||||
public void testPartitioning() {
|
||||
Processor<Integer> processor = new AbstractSimpleParallelProcessor<Integer, Integer>(FunctionTestsUtil.getExecutor(), new HashSet<Processor<Integer>>()) {
|
||||
Processor<Integer, Integer> processor = new AbstractSimpleParallelProcessor<Integer, Integer>(Integer.class, Integer.class, FunctionTestsUtil.getExecutor(), new HashSet<Processor<Integer, ?>>()) {
|
||||
@Override
|
||||
protected Iterable<Integer> partitionElement(Integer element) {
|
||||
partitionedElements = super.partitionElement(element);
|
||||
|
||||
+25
-26
@@ -13,14 +13,15 @@ import java.util.Set;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.criterias.AbstractFilterCriterion;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
|
||||
public class TestAbstractFilteringRetrievalProcessor {
|
||||
public class TestRetrieverFilterProcessorChain {
|
||||
|
||||
private Processor<Iterable<Integer>> filteringRetrievalProcessor;
|
||||
private Processor<Iterable<Integer>, Integer> retrievalProcessor;
|
||||
private Collection<Integer> dataSource;
|
||||
|
||||
private Collection<Integer> receivedResults = new ArrayList<>();
|
||||
@@ -32,8 +33,8 @@ public class TestAbstractFilteringRetrievalProcessor {
|
||||
|
||||
@Test
|
||||
public void testFiltration() throws InterruptedException {
|
||||
filteringRetrievalProcessor.processElement(dataSource);
|
||||
filteringRetrievalProcessor.finish();
|
||||
retrievalProcessor.processElement(dataSource);
|
||||
retrievalProcessor.finish();
|
||||
ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish
|
||||
|
||||
Collection<Integer> expectedResults = Arrays.asList(0, 1, 2);
|
||||
@@ -49,14 +50,14 @@ public class TestAbstractFilteringRetrievalProcessor {
|
||||
|
||||
@Test
|
||||
public void testProvidedAdditionalData() throws InterruptedException {
|
||||
filteringRetrievalProcessor.processElement(dataSource);
|
||||
filteringRetrievalProcessor.finish();
|
||||
retrievalProcessor.processElement(dataSource);
|
||||
retrievalProcessor.finish();
|
||||
ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish
|
||||
|
||||
int expectedRetrievedDataAmount = receivedResults.size();
|
||||
|
||||
OverwritingResultDataBuilder resultDataBuilder = new OverwritingResultDataBuilder();
|
||||
filteringRetrievalProcessor.getAdditionalResultData(resultDataBuilder);
|
||||
retrievalProcessor.getAdditionalResultData(resultDataBuilder);
|
||||
assertThat(resultDataBuilder.getRetrievedDataAmount(), is(expectedRetrievedDataAmount));
|
||||
}
|
||||
|
||||
@@ -67,7 +68,11 @@ public class TestAbstractFilteringRetrievalProcessor {
|
||||
layeredDataSource.add(dataSource);
|
||||
layeredDataSource.add(dataSource);
|
||||
|
||||
Processor<Iterable<Iterable<Integer>>> layeredRetrievalProcessor = new AbstractSimpleRetrievalProcessor<Iterable<Iterable<Integer>>, Iterable<Integer>>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(filteringRetrievalProcessor)) {
|
||||
Collection<Processor<Iterable<Integer>, ?>> resultReceivers = new ArrayList<>();
|
||||
resultReceivers.add(retrievalProcessor);
|
||||
@SuppressWarnings("unchecked")
|
||||
Processor<Iterable<Iterable<Integer>>, Iterable<Integer>> layeredRetrievalProcessor = new AbstractSimpleRetrievalProcessor<Iterable<Iterable<Integer>>, Iterable<Integer>>((Class<Iterable<Iterable<Integer>>>)(Class<?>) Iterable.class, (Class<Iterable<Integer>>)(Class<?>) Iterable.class,
|
||||
ConcurrencyTestsUtil.getExecutor(), resultReceivers) {
|
||||
@Override
|
||||
protected Iterable<Iterable<Integer>> retrieveData(Iterable<Iterable<Integer>> element) {
|
||||
return element;
|
||||
@@ -85,37 +90,31 @@ public class TestAbstractFilteringRetrievalProcessor {
|
||||
assertThat(resultDataBuilder.getRetrievedDataAmount(), is(expectedRetrievedDataAmount));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Before
|
||||
public void setUpResultReceiverAndProcessor() {
|
||||
Processor<Integer> resultReceiver = new Processor<Integer>() {
|
||||
public void setUpResultReceiverAndProcessors() {
|
||||
Processor<Integer, Void> resultReceiver = new NullProcessor<Integer, Void>(Integer.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Integer element) {
|
||||
synchronized (receivedResults) {
|
||||
receivedResults.add(element);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
Collection<Processor<Integer, ?>> filtrationResultReceivers = new ArrayList<>();
|
||||
filtrationResultReceivers.add(resultReceiver);
|
||||
|
||||
FilterCriterion<Integer> elementGreaterZeroFilterCriteria = new FilterCriterion<Integer>() {
|
||||
FilterCriterion<Integer> elementGreaterZeroFilterCriteria = new AbstractFilterCriterion<Integer>(Integer.class) {
|
||||
@Override
|
||||
public boolean matches(Integer element) {
|
||||
return element >= 0;
|
||||
}
|
||||
};
|
||||
filteringRetrievalProcessor = new AbstractSimpleFilteringRetrievalProcessor<Iterable<Integer>, Integer>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), elementGreaterZeroFilterCriteria) {
|
||||
Processor<Integer, Integer> filtrationProcessor = new ParallelFilteringProcessor<>(Integer.class, ConcurrencyTestsUtil.getExecutor(), filtrationResultReceivers, elementGreaterZeroFilterCriteria);
|
||||
|
||||
Collection<Processor<Integer, ?>> retrievalResultReceivers = new ArrayList<>();
|
||||
retrievalResultReceivers.add(filtrationProcessor);
|
||||
retrievalProcessor = new AbstractSimpleRetrievalProcessor<Iterable<Integer>, Integer>((Class<Iterable<Integer>>)(Class<?>) Iterable.class, Integer.class, ConcurrencyTestsUtil.getExecutor(), retrievalResultReceivers) {
|
||||
@Override
|
||||
protected Iterable<Integer> retrieveData(Iterable<Integer> element) {
|
||||
return element;
|
||||
+6
-17
@@ -10,14 +10,13 @@ import java.util.HashSet;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.shared.Message;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
|
||||
public class TestAbstractStoringParallelAggregationProcessor {
|
||||
|
||||
private Collection<Processor<Integer>> receivers;
|
||||
private Collection<Processor<Integer, ?>> receivers;
|
||||
private boolean receiverWasToldToFinish = false;
|
||||
private Integer receivedElement = null;
|
||||
|
||||
@@ -25,25 +24,15 @@ public class TestAbstractStoringParallelAggregationProcessor {
|
||||
|
||||
@Before
|
||||
public void initializeReceivers() {
|
||||
Processor<Integer> receiver = new Processor<Integer>() {
|
||||
Processor<Integer, Void> receiver = new NullProcessor<Integer, Void>(Integer.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Integer element) {
|
||||
receivedElement = element;
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
receiverWasToldToFinish = true;
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
@@ -52,7 +41,7 @@ public class TestAbstractStoringParallelAggregationProcessor {
|
||||
|
||||
@Test
|
||||
public void testAbstractAggregationHandling() throws InterruptedException {
|
||||
Processor<Integer> processor = new AbstractParallelStoringAggregationProcessor<Integer, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers, Message.Sum.toString()) {
|
||||
Processor<Integer, Integer> processor = new AbstractParallelStoringAggregationProcessor<Integer, Integer>(Integer.class, Integer.class, ConcurrencyTestsUtil.getExecutor(), receivers, "Sum") {
|
||||
@Override
|
||||
protected void storeElement(Integer element) {
|
||||
elementStore.add(element);
|
||||
@@ -76,7 +65,7 @@ public class TestAbstractStoringParallelAggregationProcessor {
|
||||
assertThat(receivedElement, is(expectedReceivedElement));
|
||||
}
|
||||
|
||||
private void processElementAndVerifyThatItWasStored(Processor<Integer> processor, int element) {
|
||||
private void processElementAndVerifyThatItWasStored(Processor<Integer, Integer> processor, int element) {
|
||||
processor.processElement(element);
|
||||
ConcurrencyTestsUtil.sleepFor(100); //Giving the processor time to process the instructions
|
||||
assertThat("The element store doesn't contain the previously processed element '" + element + "'", elementStore.contains(element), is(true));
|
||||
@@ -84,7 +73,7 @@ public class TestAbstractStoringParallelAggregationProcessor {
|
||||
|
||||
@Test(timeout=5000)
|
||||
public void testThatTheLockIsReleasedAfterStoringFailed() throws InterruptedException {
|
||||
Processor<Integer> processor = new AbstractParallelStoringAggregationProcessor<Integer, Integer>(ConcurrencyTestsUtil.getExecutor(), receivers, Message.Sum.toString()) {
|
||||
Processor<Integer, Integer> processor = new AbstractParallelStoringAggregationProcessor<Integer, Integer>(Integer.class, Integer.class, ConcurrencyTestsUtil.getExecutor(), receivers, "Sum") {
|
||||
@Override
|
||||
protected void storeElement(Integer element) {
|
||||
if (element < 0) {
|
||||
|
||||
+9
-19
@@ -11,21 +11,23 @@ import java.util.Map.Entry;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
|
||||
import com.sap.sse.datamining.shared.GroupKey;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
import com.sap.sse.datamining.test.util.ComponentTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
|
||||
public class TestParallelDoubleAggregationProcessors {
|
||||
|
||||
private Collection<Processor<Map<GroupKey, Double>>> receivers;
|
||||
private Collection<Processor<Map<GroupKey, Double>, ?>> receivers;
|
||||
private Map<GroupKey, Double> receivedAggregations;
|
||||
|
||||
@Test
|
||||
public void testSumAggregationProcessor() throws InterruptedException {
|
||||
Processor<GroupedDataEntry<Double>> sumAggregationProcessor = new ParallelGroupedDoubleDataSumAggregationProcessor(ConcurrencyTestsUtil.getExecutor(), receivers);
|
||||
Processor<GroupedDataEntry<Double>, Map<GroupKey, Double>> sumAggregationProcessor = ComponentTestsUtil.getProcessorFactory().createAggregationProcessor(receivers, AggregatorType.Sum);
|
||||
Collection<GroupedDataEntry<Double>> elements = createElements();
|
||||
ConcurrencyTestsUtil.processElements(sumAggregationProcessor, elements);
|
||||
|
||||
@@ -49,7 +51,7 @@ public class TestParallelDoubleAggregationProcessors {
|
||||
|
||||
@Test
|
||||
public void testAverageAggregationProcessor() throws InterruptedException {
|
||||
Processor<GroupedDataEntry<Double>> averageAggregationProcessor = new ParallelGroupedDoubleDataAverageAggregationProcessor(ConcurrencyTestsUtil.getExecutor(), receivers);
|
||||
Processor<GroupedDataEntry<Double>, Map<GroupKey, Double>> averageAggregationProcessor = ComponentTestsUtil.getProcessorFactory().createAggregationProcessor(receivers, AggregatorType.Average);
|
||||
Collection<GroupedDataEntry<Double>> elements = createElements();
|
||||
ConcurrencyTestsUtil.processElements(averageAggregationProcessor, elements);
|
||||
|
||||
@@ -85,7 +87,7 @@ public class TestParallelDoubleAggregationProcessors {
|
||||
|
||||
@Test
|
||||
public void testMedianAggregationProcessor() throws InterruptedException {
|
||||
Processor<GroupedDataEntry<Double>> medianAggregationProcessor = new ParallelGroupedDoubleDataMedianAggregationProcessor(ConcurrencyTestsUtil.getExecutor(), receivers);
|
||||
Processor<GroupedDataEntry<Double>, Map<GroupKey, Double>> medianAggregationProcessor = ComponentTestsUtil.getProcessorFactory().createAggregationProcessor(receivers, AggregatorType.Median);
|
||||
Collection<GroupedDataEntry<Double>> elements = createElements();
|
||||
ConcurrencyTestsUtil.processElements(medianAggregationProcessor, elements);
|
||||
|
||||
@@ -157,24 +159,12 @@ public class TestParallelDoubleAggregationProcessors {
|
||||
|
||||
@Before
|
||||
public void initializeResultReceivers() {
|
||||
Processor<Map<GroupKey, Double>> receiver = new Processor<Map<GroupKey,Double>>() {
|
||||
@SuppressWarnings("unchecked")
|
||||
Processor<Map<GroupKey, Double>, Void> receiver = new NullProcessor<Map<GroupKey, Double>, Void>((Class<Map<GroupKey, Double>>)(Class<?>) Map.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Map<GroupKey, Double> element) {
|
||||
receivedAggregations = element;
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new ArrayList<>();
|
||||
|
||||
+5
-17
@@ -10,38 +10,26 @@ import java.util.Set;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
|
||||
import com.sap.sse.datamining.shared.GroupKey;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.NullProcessor;
|
||||
|
||||
public class TestParallelGroupedDataCollectingAsSetProcessor {
|
||||
|
||||
private Collection<Processor<Map<GroupKey, Set<Double>>>> receivers;
|
||||
private Collection<Processor<Map<GroupKey, Set<Double>>, ?>> receivers;
|
||||
private Map<GroupKey, Set<Double>> receivedData = null;
|
||||
|
||||
@Before
|
||||
public void initializeReceivers() {
|
||||
Processor<Map<GroupKey, Set<Double>>> receiver = new Processor<Map<GroupKey, Set<Double>>>() {
|
||||
@SuppressWarnings("unchecked")
|
||||
Processor<Map<GroupKey, Set<Double>>, Void> receiver = new NullProcessor<Map<GroupKey, Set<Double>>, Void>((Class<Map<GroupKey, Set<Double>>>)(Class<?>) Map.class, Void.class) {
|
||||
@Override
|
||||
public void processElement(Map<GroupKey, Set<Double>> element) {
|
||||
receivedData = element;
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
@@ -50,7 +38,7 @@ public class TestParallelGroupedDataCollectingAsSetProcessor {
|
||||
|
||||
@Test
|
||||
public void testDataCollecting() throws InterruptedException {
|
||||
Processor<GroupedDataEntry<Double>> collectingProcessor = new ParallelGroupedDataCollectingAsSetProcessor<Double>(ConcurrencyTestsUtil.getExecutor(), receivers);
|
||||
Processor<GroupedDataEntry<Double>, Map<GroupKey, Set<Double>>> collectingProcessor = new ParallelGroupedDataCollectingAsSetProcessor<Double>(ConcurrencyTestsUtil.getExecutor(), receivers);
|
||||
Collection<GroupedDataEntry<Double>> elements = createElements();
|
||||
|
||||
ConcurrencyTestsUtil.processElements(collectingProcessor, elements);
|
||||
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
package com.sap.sse.datamining.impl.criterias;
|
||||
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.StringRegexFilterCriterion;
|
||||
|
||||
public class TestFilterCriteria {
|
||||
|
||||
@Test
|
||||
public void testNonFilteringFilterCriterion() {
|
||||
FilterCriterion<String> nonFilteringFilterCriterion = new NonFilteringFilterCriterion<>(String.class);
|
||||
assertTrue(nonFilteringFilterCriterion.matches("Test"));
|
||||
assertTrue(nonFilteringFilterCriterion.matches(""));
|
||||
assertTrue(nonFilteringFilterCriterion.matches(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegexFilterCriterion() {
|
||||
FilterCriterion<String> regexFilterCriterion = new StringRegexFilterCriterion(".*");
|
||||
assertTrue(regexFilterCriterion.matches("some Random stuff"));
|
||||
assertFalse(regexFilterCriterion.matches(null));
|
||||
|
||||
String[] stringsToMatch = new String[] {"Regatta", "Other Regatta", "Third Regatta"};
|
||||
|
||||
regexFilterCriterion = new StringRegexFilterCriterion(stringsToMatch[0] + "|" + stringsToMatch[1] + "|" + stringsToMatch[2]);
|
||||
for (String stringToMatch : stringsToMatch) {
|
||||
assertTrue("Failed to match " + stringToMatch, regexFilterCriterion.matches(stringToMatch));
|
||||
}
|
||||
assertFalse("'Fourth Regatta' shouldn't be matched", regexFilterCriterion.matches("Fourth Regatta"));
|
||||
|
||||
regexFilterCriterion = new StringRegexFilterCriterion(".*Regatta");
|
||||
for (String stringToMatch : stringsToMatch) {
|
||||
assertTrue("Failed to match " + stringToMatch, regexFilterCriterion.matches(stringToMatch));
|
||||
}
|
||||
assertFalse("'Regatta (29ER)' shouldn't be matched", regexFilterCriterion.matches("Regatta (29ER)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompoundFilterCriterion() {
|
||||
StringRegexFilterCriterion startsWithBar = new StringRegexFilterCriterion("Bar.*");
|
||||
StringRegexFilterCriterion endWithFoo = new StringRegexFilterCriterion(".*Foo");
|
||||
|
||||
CompoundFilterCriterion<String> compoundCriterion = new AndCompoundFilterCriterion<String>(String.class);
|
||||
compoundCriterion.addCriteria(startsWithBar);
|
||||
compoundCriterion.addCriteria(endWithFoo);
|
||||
|
||||
assertTrue(compoundCriterion.matches("BarAndFoo"));
|
||||
assertFalse(compoundCriterion.matches("BarFo"));
|
||||
|
||||
compoundCriterion = new OrCompoundFilterCriterion<String>(String.class);
|
||||
compoundCriterion.addCriteria(startsWithBar);
|
||||
compoundCriterion.addCriteria(endWithFoo);
|
||||
|
||||
assertTrue(compoundCriterion.matches("BarF"));
|
||||
assertTrue(compoundCriterion.matches("BraFoo"));
|
||||
assertFalse(compoundCriterion.matches("Nothing"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNullaryFunctionValuesFilterCriterion() {
|
||||
Function<String> getRegattaName = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName"));
|
||||
Collection<String> valuesToMatch = Arrays.asList("Regatta", "Other Regatta");
|
||||
FilterCriterion<DataTypeWithContext> nullaryFunctionFilterCriterion = new NullaryFunctionValuesFilterCriterion<>(DataTypeWithContext.class, getRegattaName, valuesToMatch);
|
||||
|
||||
DataTypeWithContext regatta = new DataTypeWithContextImpl("Regatta", "Race Name", 7);
|
||||
assertThat(nullaryFunctionFilterCriterion.matches(regatta), is(true));
|
||||
|
||||
DataTypeWithContext otherRegatta = new DataTypeWithContextImpl("Other Regatta", "Race Name", 7);
|
||||
assertThat(nullaryFunctionFilterCriterion.matches(otherRegatta), is(true));
|
||||
|
||||
DataTypeWithContext unmatchingRegatta = new DataTypeWithContextImpl("Unmatching Regatta", "Race Name", 7);
|
||||
assertThat(nullaryFunctionFilterCriterion.matches(unmatchingRegatta), is(false));
|
||||
}
|
||||
|
||||
}
|
||||
-81
@@ -1,81 +0,0 @@
|
||||
package com.sap.sse.datamining.impl.criterias;
|
||||
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.StringRegexFilterCriterion;
|
||||
|
||||
public class TestFilterCriterias {
|
||||
|
||||
@Test
|
||||
public void testRegexFilterCriteria() {
|
||||
FilterCriterion<String> regexFilterCriteria = new StringRegexFilterCriterion(".*");
|
||||
assertTrue(regexFilterCriteria.matches("some Random stuff"));
|
||||
assertFalse(regexFilterCriteria.matches(null));
|
||||
|
||||
String[] stringsToMatch = new String[] {"Regatta", "Other Regatta", "Third Regatta"};
|
||||
|
||||
regexFilterCriteria = new StringRegexFilterCriterion(stringsToMatch[0] + "|" + stringsToMatch[1] + "|" + stringsToMatch[2]);
|
||||
for (String stringToMatch : stringsToMatch) {
|
||||
assertTrue("Failed to match " + stringToMatch, regexFilterCriteria.matches(stringToMatch));
|
||||
}
|
||||
assertFalse("'Fourth Regatta' shouldn't be matched", regexFilterCriteria.matches("Fourth Regatta"));
|
||||
|
||||
regexFilterCriteria = new StringRegexFilterCriterion(".*Regatta");
|
||||
for (String stringToMatch : stringsToMatch) {
|
||||
assertTrue("Failed to match " + stringToMatch, regexFilterCriteria.matches(stringToMatch));
|
||||
}
|
||||
assertFalse("'Regatta (29ER)' shouldn't be matched", regexFilterCriteria.matches("Regatta (29ER)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCompoundFilterCriterias() {
|
||||
StringRegexFilterCriterion startsWithBar = new StringRegexFilterCriterion("Bar.*");
|
||||
StringRegexFilterCriterion endWithFoo = new StringRegexFilterCriterion(".*Foo");
|
||||
|
||||
CompoundFilterCriterion<String> compoundCriteria = new AndCompoundFilterCriterion<String>();
|
||||
compoundCriteria.addCriteria(startsWithBar);
|
||||
compoundCriteria.addCriteria(endWithFoo);
|
||||
|
||||
assertTrue(compoundCriteria.matches("BarAndFoo"));
|
||||
assertFalse(compoundCriteria.matches("BarFo"));
|
||||
|
||||
compoundCriteria = new OrCompoundFilterCriterion<String>();
|
||||
compoundCriteria.addCriteria(startsWithBar);
|
||||
compoundCriteria.addCriteria(endWithFoo);
|
||||
|
||||
assertTrue(compoundCriteria.matches("BarF"));
|
||||
assertTrue(compoundCriteria.matches("BraFoo"));
|
||||
assertFalse(compoundCriteria.matches("Nothing"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNullaryFunctionValuesFilterCriteria() {
|
||||
Function<String> getRegattaName = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName"));
|
||||
Collection<String> valuesToMatch = Arrays.asList("Regatta", "Other Regatta");
|
||||
FilterCriterion<DataTypeWithContext> nullaryFunctionFilterCriteria = new NullaryFunctionValuesFilterCriterion<>(getRegattaName, valuesToMatch);
|
||||
|
||||
DataTypeWithContext regatta = new DataTypeWithContextImpl("Regatta", "Race Name", 7);
|
||||
assertThat(nullaryFunctionFilterCriteria.matches(regatta), is(true));
|
||||
|
||||
DataTypeWithContext otherRegatta = new DataTypeWithContextImpl("Other Regatta", "Race Name", 7);
|
||||
assertThat(nullaryFunctionFilterCriteria.matches(otherRegatta), is(true));
|
||||
|
||||
DataTypeWithContext unmatchingRegatta = new DataTypeWithContextImpl("Unmatching Regatta", "Race Name", 7);
|
||||
assertThat(nullaryFunctionFilterCriteria.matches(unmatchingRegatta), is(false));
|
||||
}
|
||||
|
||||
}
|
||||
+5
-5
@@ -16,7 +16,7 @@ import com.sap.sse.datamining.data.Cluster;
|
||||
import com.sap.sse.datamining.data.ClusterBoundary;
|
||||
import com.sap.sse.datamining.data.ClusterGroup;
|
||||
import com.sap.sse.datamining.data.ClusterGroupRepository;
|
||||
import com.sap.sse.datamining.test.components.util.Number;
|
||||
import com.sap.sse.datamining.test.util.components.Number;
|
||||
|
||||
public class TestClusterGroupRepository {
|
||||
|
||||
@@ -63,11 +63,11 @@ public class TestClusterGroupRepository {
|
||||
|
||||
ClusterBoundary<Number> lengthGreaterEqualsOne = new ComparatorClusterBoundary<Number>(lengthComparator, new Number(0), ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
ClusterBoundary<Number> lengthLowerSix = new ComparatorClusterBoundary<Number>(lengthComparator, new Number(100000), ComparisonStrategy.LOWER_THAN);
|
||||
Cluster<Number> lengthBetweenOneAndFiveCluster = new ClusterWithBoundaries<>("Short", lengthGreaterEqualsOne, lengthLowerSix);
|
||||
Cluster<Number> lengthBetweenOneAndFiveCluster = new ClusterWithLowerAndUpperBoundaries<>("Short", lengthGreaterEqualsOne, lengthLowerSix);
|
||||
|
||||
ClusterBoundary<Number> lengthGreaterEqualsSix = new ComparatorClusterBoundary<Number>(lengthComparator, new Number(100000), ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
ClusterBoundary<Number> lengthLowerEqualsTen = new ComparatorClusterBoundary<Number>(lengthComparator, new Number(1000000000), ComparisonStrategy.LOWER_EQUALS_THAN);
|
||||
Cluster<Number> lengthBetweenSixAndTen = new ClusterWithBoundaries<>("Long", lengthGreaterEqualsSix, lengthLowerEqualsTen);
|
||||
Cluster<Number> lengthBetweenSixAndTen = new ClusterWithLowerAndUpperBoundaries<>("Long", lengthGreaterEqualsSix, lengthLowerEqualsTen);
|
||||
|
||||
return new FixClusterGroup<>("Number Length", Arrays.asList(lengthBetweenOneAndFiveCluster, lengthBetweenSixAndTen));
|
||||
}
|
||||
@@ -82,11 +82,11 @@ public class TestClusterGroupRepository {
|
||||
|
||||
ClusterBoundary<Number> crossSumGreaterEqualsZero = new ComparatorClusterBoundary<Number>(crossSumComparator, new Number(0), ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
ClusterBoundary<Number> crossSumLowerTwentySix = new ComparatorClusterBoundary<Number>(crossSumComparator, new Number(998), ComparisonStrategy.LOWER_THAN);
|
||||
Cluster<Number> crossSumBetweenZeroAndTwentyFiveCluster = new ClusterWithBoundaries<>("Low", crossSumGreaterEqualsZero, crossSumLowerTwentySix);
|
||||
Cluster<Number> crossSumBetweenZeroAndTwentyFiveCluster = new ClusterWithLowerAndUpperBoundaries<>("Low", crossSumGreaterEqualsZero, crossSumLowerTwentySix);
|
||||
|
||||
ClusterBoundary<Number> crossSumGreaterEqualsTwentySix = new ComparatorClusterBoundary<Number>(crossSumComparator, new Number(998), ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
ClusterBoundary<Number> crossSumLowerEqualsFifty = new ComparatorClusterBoundary<Number>(crossSumComparator, new Number(999995), ComparisonStrategy.LOWER_EQUALS_THAN);
|
||||
Cluster<Number> lengthBetweenSixAndTen = new ClusterWithBoundaries<>("High", crossSumGreaterEqualsTwentySix, crossSumLowerEqualsFifty);
|
||||
Cluster<Number> lengthBetweenSixAndTen = new ClusterWithLowerAndUpperBoundaries<>("High", crossSumGreaterEqualsTwentySix, crossSumLowerEqualsFifty);
|
||||
|
||||
return new FixClusterGroup<>("Number Cross-Sum", Arrays.asList(crossSumBetweenZeroAndTwentyFiveCluster, lengthBetweenSixAndTen));
|
||||
}
|
||||
|
||||
+11
-3
@@ -12,6 +12,8 @@ import com.sap.sse.datamining.data.ClusterBoundary;
|
||||
|
||||
public class TestClustersWithBoundaries {
|
||||
|
||||
private static final char INFINITE = '\u221e';
|
||||
|
||||
private static final Comparator<Integer> comparator = new ComparableComparator<Integer>();
|
||||
|
||||
private static final ClusterBoundary<Integer> lowerBound = new ComparatorClusterBoundary<Integer>(comparator, 0, ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
@@ -19,7 +21,7 @@ public class TestClustersWithBoundaries {
|
||||
|
||||
@Test
|
||||
public void testClusterWithBoundaries() {
|
||||
Cluster<Integer> cluster = new ClusterWithBoundaries<>("Test Cluster", lowerBound, upperBound);
|
||||
Cluster<Integer> cluster = new ClusterWithLowerAndUpperBoundaries<>("Test Cluster", lowerBound, upperBound);
|
||||
|
||||
assertThat(cluster.isInRange(0), is(true));
|
||||
assertThat(cluster.isInRange(3), is(true));
|
||||
@@ -27,6 +29,8 @@ public class TestClustersWithBoundaries {
|
||||
|
||||
assertThat(cluster.isInRange(-1), is(false));
|
||||
assertThat(cluster.isInRange(10), is(false));
|
||||
|
||||
assertThat(cluster.toString(), is("Test Cluster [0 - 10["));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -35,15 +39,19 @@ public class TestClustersWithBoundaries {
|
||||
|
||||
assertThat(cluster.isInRange(0), is(true));
|
||||
assertThat(cluster.isInRange(3), is(true));
|
||||
|
||||
assertThat(cluster.isInRange(Integer.MAX_VALUE), is(true));
|
||||
assertThat(cluster.isInRange(-1), is(false));
|
||||
|
||||
assertThat(cluster.toString(), is("Test Cluster [0 - " + INFINITE));
|
||||
|
||||
cluster = new ClusterWithSingleBoundary<>("Test Cluster", upperBound);
|
||||
|
||||
assertThat(cluster.isInRange(Integer.MIN_VALUE), is(true));
|
||||
assertThat(cluster.isInRange(9), is(true));
|
||||
|
||||
assertThat(cluster.isInRange(10), is(false));
|
||||
assertThat(cluster.isInRange(11), is(false));
|
||||
|
||||
assertThat(cluster.toString(), is("Test Cluster -" + INFINITE + " - 10["));
|
||||
}
|
||||
|
||||
}
|
||||
+13
-9
@@ -3,48 +3,52 @@ package com.sap.sse.datamining.impl.data;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.data.ClusterBoundary;
|
||||
|
||||
public class TestComparatorClusterBoundary {
|
||||
|
||||
public static final Comparator<Integer> comparator = new ComparableComparator<Integer>();
|
||||
public class TestComparableClusterBoundary {
|
||||
|
||||
@Test
|
||||
public void testGreaterEqualsThanStrategy() {
|
||||
ClusterBoundary<Integer> greaterEqualsThan5Bound = new ComparatorClusterBoundary<Integer>(comparator, 5, ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
ClusterBoundary<Integer> greaterEqualsThan5Bound = new ComparableClusterBoundary<Integer>(5, ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
|
||||
assertThat(greaterEqualsThan5Bound.contains(6), is(true));
|
||||
assertThat(greaterEqualsThan5Bound.contains(5), is(true));
|
||||
assertThat(greaterEqualsThan5Bound.contains(4), is(false));
|
||||
|
||||
assertThat(greaterEqualsThan5Bound.toString(), is("[5"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGreaterThanStrategy() {
|
||||
ClusterBoundary<Integer> greaterThan5Bound = new ComparatorClusterBoundary<Integer>(comparator, 5, ComparisonStrategy.GREATER_THAN);
|
||||
ClusterBoundary<Integer> greaterThan5Bound = new ComparableClusterBoundary<Integer>(5, ComparisonStrategy.GREATER_THAN);
|
||||
|
||||
assertThat(greaterThan5Bound.contains(6), is(true));
|
||||
assertThat(greaterThan5Bound.contains(5), is(false));
|
||||
|
||||
assertThat(greaterThan5Bound.toString(), is("]5"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLowerEqualsThanStrategy() {
|
||||
ClusterBoundary<Integer> lowerEqualsThan5Bound = new ComparatorClusterBoundary<Integer>(comparator, 5, ComparisonStrategy.LOWER_EQUALS_THAN);
|
||||
ClusterBoundary<Integer> lowerEqualsThan5Bound = new ComparableClusterBoundary<Integer>(5, ComparisonStrategy.LOWER_EQUALS_THAN);
|
||||
|
||||
assertThat(lowerEqualsThan5Bound.contains(4), is(true));
|
||||
assertThat(lowerEqualsThan5Bound.contains(5), is(true));
|
||||
assertThat(lowerEqualsThan5Bound.contains(6), is(false));
|
||||
|
||||
assertThat(lowerEqualsThan5Bound.toString(), is("5]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLowerThanStrategy() {
|
||||
ClusterBoundary<Integer> lowerThan5Bound = new ComparatorClusterBoundary<Integer>(comparator, 5, ComparisonStrategy.LOWER_THAN);
|
||||
ClusterBoundary<Integer> lowerThan5Bound = new ComparableClusterBoundary<Integer>(5, ComparisonStrategy.LOWER_THAN);
|
||||
|
||||
assertThat(lowerThan5Bound.contains(4), is(true));
|
||||
assertThat(lowerThan5Bound.contains(5), is(false));
|
||||
|
||||
assertThat(lowerThan5Bound.toString(), is("5["));
|
||||
}
|
||||
|
||||
}
|
||||
+3
-3
@@ -75,15 +75,15 @@ public class TestFixClusterGroup {
|
||||
|
||||
ClusterBoundary<Integer> greaterEqualsThanZero = new ComparatorClusterBoundary<Integer>(new ComparableComparator<Integer>(), 0, ComparisonStrategy.GREATER_EQUALS_THAN);
|
||||
ClusterBoundary<Integer> lowerEqualsThanTen = new ComparatorClusterBoundary<Integer>(new ComparableComparator<Integer>(), 10, ComparisonStrategy.LOWER_EQUALS_THAN);
|
||||
clusterFromZeroToTen = new ClusterWithBoundaries<>("Test", greaterEqualsThanZero, lowerEqualsThanTen);
|
||||
clusterFromZeroToTen = new ClusterWithLowerAndUpperBoundaries<>("Test", greaterEqualsThanZero, lowerEqualsThanTen);
|
||||
|
||||
ClusterBoundary<Integer> greaterThanTen = new ComparatorClusterBoundary<Integer>(new ComparableComparator<Integer>(), 10, ComparisonStrategy.GREATER_THAN);
|
||||
ClusterBoundary<Integer> lowerEqualsThanTwenty = new ComparatorClusterBoundary<Integer>(new ComparableComparator<Integer>(), 20, ComparisonStrategy.LOWER_EQUALS_THAN);
|
||||
clusterFromElevenToTwenty = new ClusterWithBoundaries<>("Test", greaterThanTen, lowerEqualsThanTwenty);
|
||||
clusterFromElevenToTwenty = new ClusterWithLowerAndUpperBoundaries<>("Test", greaterThanTen, lowerEqualsThanTwenty);
|
||||
|
||||
ClusterBoundary<Integer> greaterThanTwenty = new ComparatorClusterBoundary<Integer>(new ComparableComparator<Integer>(), 20, ComparisonStrategy.GREATER_THAN);
|
||||
ClusterBoundary<Integer> lowerEqualsThanThirty = new ComparatorClusterBoundary<Integer>(new ComparableComparator<Integer>(), 30, ComparisonStrategy.LOWER_EQUALS_THAN);
|
||||
clusterFromTwentyOneToThirty = new ClusterWithBoundaries<>("Test", greaterThanTwenty, lowerEqualsThanThirty);
|
||||
clusterFromTwentyOneToThirty = new ClusterWithLowerAndUpperBoundaries<>("Test", greaterThanTwenty, lowerEqualsThanThirty);
|
||||
|
||||
ClusterBoundary<Integer> greaterThanThirty = new ComparatorClusterBoundary<Integer>(comparator, 30, ComparisonStrategy.GREATER_THAN);
|
||||
clusterGreaterThanThirty = new ClusterWithSingleBoundary<>("Test", greaterThanThirty);
|
||||
|
||||
+4
-4
@@ -10,13 +10,13 @@ import java.util.Locale;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.ContainerElement;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.ContainerElementImpl;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.MarkedContainer;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.MarkedContainerImpl;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.TestsUtil;
|
||||
|
||||
public class TestCompoundFunction {
|
||||
@@ -29,12 +29,12 @@ public class TestCompoundFunction {
|
||||
@Before
|
||||
public void initializeCompoundFunction() throws ClassCastException, NoSuchMethodException, SecurityException {
|
||||
List<Function<?>> functions = new ArrayList<>();
|
||||
getContainerElementFunction = FunctionFactory.createMethodWrappingFunction(MarkedContainer.class.getMethod("getContainerElement", new Class<?>[0]));
|
||||
getContainerElementFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(MarkedContainer.class.getMethod("getContainerElement", new Class<?>[0]));
|
||||
functions.add(getContainerElementFunction);
|
||||
getNameFunction = FunctionFactory.createMethodWrappingFunction(ContainerElement.class.getMethod("getName", new Class<?>[0]));
|
||||
getNameFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(ContainerElement.class.getMethod("getName", new Class<?>[0]));
|
||||
functions.add(getNameFunction);
|
||||
|
||||
compoundFunction = FunctionFactory.createCompoundFunction("TestCompoundFunction", functions);
|
||||
compoundFunction = FunctionTestsUtil.getFunctionFactory().createCompoundFunction("TestCompoundFunction", functions);
|
||||
}
|
||||
|
||||
@Test(expected=IllegalArgumentException.class)
|
||||
|
||||
+18
-20
@@ -11,8 +11,6 @@ import java.util.Locale;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.factories.FunctionDTOFactory;
|
||||
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.shared.dto.FunctionDTO;
|
||||
@@ -25,7 +23,7 @@ import com.sap.sse.datamining.test.util.TestsUtil;
|
||||
public class TestFunctionDTOConstruction {
|
||||
|
||||
private static final DataMiningStringMessages stringMessages = TestsUtil.getTestStringMessages();
|
||||
|
||||
|
||||
private Method dimensionMethod;
|
||||
private Method sideEffectFreeValueMethod;
|
||||
private Method externalLibraryMethod;
|
||||
@@ -41,12 +39,12 @@ public class TestFunctionDTOConstruction {
|
||||
|
||||
@Test
|
||||
public void testDimensionDTOConstruction() {
|
||||
Function<?> dimension = FunctionFactory.createMethodWrappingFunction(dimensionMethod);
|
||||
Function<?> dimension = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(dimensionMethod);
|
||||
|
||||
FunctionDTO expectedDimensionDTO = createExpectedDimensionDTO();
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(dimension), is(expectedDimensionDTO));
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(dimension, Locale.ENGLISH, stringMessages), is(expectedDimensionDTO));
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(dimension, Locale.GERMAN, stringMessages), is(expectedDimensionDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimension), is(expectedDimensionDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimension, stringMessages, Locale.ENGLISH), is(expectedDimensionDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimension, stringMessages, Locale.GERMAN), is(expectedDimensionDTO));
|
||||
}
|
||||
|
||||
public FunctionDTOImpl createExpectedDimensionDTO() {
|
||||
@@ -64,11 +62,11 @@ public class TestFunctionDTOConstruction {
|
||||
|
||||
@Test
|
||||
public void testNullarySideEffectFreeValueDTOConstruction() {
|
||||
Function<?> sideEffectFreeValue = FunctionFactory.createMethodWrappingFunction(sideEffectFreeValueMethod);
|
||||
Function<?> sideEffectFreeValue = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(sideEffectFreeValueMethod);
|
||||
|
||||
FunctionDTO expectedDTO = createExpectedNullarySideEffectFreeValueDTO();
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(sideEffectFreeValue, Locale.ENGLISH, stringMessages), is(expectedDTO));
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(sideEffectFreeValue, Locale.GERMAN, stringMessages), is(expectedDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(sideEffectFreeValue, stringMessages, Locale.ENGLISH), is(expectedDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(sideEffectFreeValue, stringMessages, Locale.GERMAN), is(expectedDTO));
|
||||
}
|
||||
|
||||
private FunctionDTO createExpectedNullarySideEffectFreeValueDTO() {
|
||||
@@ -86,11 +84,11 @@ public class TestFunctionDTOConstruction {
|
||||
|
||||
@Test
|
||||
public void testExternalLibraryFunctionDTOConstruction() {
|
||||
Function<?> externalLibraryFunction = FunctionFactory.createMethodWrappingFunction(externalLibraryMethod);
|
||||
Function<?> externalLibraryFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(externalLibraryMethod);
|
||||
|
||||
FunctionDTO expectedDTO = createExpectedExternalLibraryFunctionDTO();
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(externalLibraryFunction, Locale.ENGLISH, stringMessages), is(expectedDTO));
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(externalLibraryFunction, Locale.GERMAN, stringMessages), is(expectedDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(externalLibraryFunction, stringMessages, Locale.ENGLISH), is(expectedDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(externalLibraryFunction, stringMessages, Locale.GERMAN), is(expectedDTO));
|
||||
}
|
||||
|
||||
private FunctionDTO createExpectedExternalLibraryFunctionDTO() {
|
||||
@@ -108,11 +106,11 @@ public class TestFunctionDTOConstruction {
|
||||
|
||||
@Test
|
||||
public void testFunctionDTOConstructionForMethodWithParameters() {
|
||||
Function<?> increment = FunctionFactory.createMethodWrappingFunction(incrementMethod);
|
||||
Function<?> increment = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(incrementMethod);
|
||||
|
||||
FunctionDTO expectedDTO = createFunctionDTOWithParameters();
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(increment, Locale.ENGLISH, stringMessages), is(expectedDTO));
|
||||
assertThat(FunctionDTOFactory.createFunctionDTO(increment, Locale.GERMAN, stringMessages), is(expectedDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(increment, stringMessages, Locale.ENGLISH), is(expectedDTO));
|
||||
assertThat(FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(increment, stringMessages, Locale.GERMAN), is(expectedDTO));
|
||||
}
|
||||
|
||||
private FunctionDTO createFunctionDTOWithParameters() {
|
||||
@@ -131,11 +129,11 @@ public class TestFunctionDTOConstruction {
|
||||
|
||||
@Test
|
||||
public void testThatLocalizedFunctionDTOAndUnlocalizedAreEqual() {
|
||||
Function<?> dimension = FunctionFactory.createMethodWrappingFunction(dimensionMethod);
|
||||
Function<?> dimension = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(dimensionMethod);
|
||||
|
||||
FunctionDTO unlocalizedDimensionDTO = FunctionDTOFactory.createFunctionDTO(dimension);
|
||||
FunctionDTO englishDimensionDTO = FunctionDTOFactory.createFunctionDTO(dimension, Locale.ENGLISH, TestsUtil.getTestStringMessages());
|
||||
FunctionDTO germanDimensionDTO = FunctionDTOFactory.createFunctionDTO(dimension, Locale.GERMAN, TestsUtil.getTestStringMessages());
|
||||
FunctionDTO unlocalizedDimensionDTO = FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimension);
|
||||
FunctionDTO englishDimensionDTO = FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimension, TestsUtil.getTestStringMessages(), Locale.ENGLISH);
|
||||
FunctionDTO germanDimensionDTO = FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(dimension, TestsUtil.getTestStringMessages(), Locale.GERMAN);
|
||||
|
||||
assertThat(unlocalizedDimensionDTO, is(englishDimensionDTO));
|
||||
assertThat(englishDimensionDTO, is(germanDimensionDTO));
|
||||
|
||||
+64
-17
@@ -13,16 +13,18 @@ import java.util.Locale;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.factories.FunctionDTOFactory;
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionProvider;
|
||||
import com.sap.sse.datamining.functions.FunctionRegistry;
|
||||
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
|
||||
import com.sap.sse.datamining.impl.SimpleDataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContextImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContextImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContextImpl;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods;
|
||||
@@ -30,6 +32,9 @@ import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryCl
|
||||
import com.sap.sse.datamining.test.util.ExpectedFunctionRegistryUtil;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.TestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.TestLegOfCompetitorWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRaceWithContextRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.util.components.TestRegattaRetrievalProcessor;
|
||||
|
||||
public class TestFunctionProvider {
|
||||
|
||||
@@ -44,7 +49,7 @@ public class TestFunctionProvider {
|
||||
functionRegistry = new SimpleFunctionRegistry();
|
||||
|
||||
Collection<Class<?>> internalClassesToScan = new HashSet<>();
|
||||
internalClassesToScan.add(Test_HasLegContext.class);
|
||||
internalClassesToScan.add(Test_HasLegOfCompetitorContext.class);
|
||||
internalClassesToScan.add(Test_HasRaceContext.class);
|
||||
functionRegistry.registerAllWithInternalFunctionPolicy(internalClassesToScan);
|
||||
|
||||
@@ -68,28 +73,70 @@ public class TestFunctionProvider {
|
||||
assertThat(functionProvider.getDimensionsFor(Test_HasRaceContext.class), is(expectedDimensions));
|
||||
assertThat(functionProvider.getDimensionsFor(Test_HasRaceContextImpl.class), is(expectedDimensions));
|
||||
|
||||
expectedDimensions.addAll(functionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class));
|
||||
assertThat(functionProvider.getDimensionsFor(Test_HasLegContext.class), is(expectedDimensions));
|
||||
assertThat(functionProvider.getDimensionsFor(Test_HasLegContextImpl.class), is(expectedDimensions));
|
||||
expectedDimensions.addAll(functionRegistryUtil.getExpectedDimensionsFor(Test_HasLegOfCompetitorContext.class));
|
||||
assertThat(functionProvider.getDimensionsFor(Test_HasLegOfCompetitorContext.class), is(expectedDimensions));
|
||||
assertThat(functionProvider.getDimensionsFor(Test_HasLegOfCompetitorContextImpl.class), is(expectedDimensions));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDimensionsForDataRetrieverChainDefinition() {
|
||||
FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry);
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = createDataRetrieverChainDefinition();
|
||||
|
||||
Collection<Function<?>> expectedDimensions = functionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class);
|
||||
expectedDimensions.addAll(functionRegistryUtil.getExpectedDimensionsFor(Test_HasLegOfCompetitorContext.class));
|
||||
assertThat(functionProvider.getMinimizedDimensionsFor(dataRetrieverChainDefinition), is(expectedDimensions));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public DataRetrieverChainDefinition<Collection<Test_Regatta>> createDataRetrieverChainDefinition() {
|
||||
DataRetrieverChainDefinition<Collection<Test_Regatta>> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, "TestRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class);
|
||||
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(regattaRetrieverClass,
|
||||
raceRetrieverClass,
|
||||
Test_HasRaceContext.class);
|
||||
|
||||
Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>> legRetrieverClass =
|
||||
(Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>>)(Class<?>) TestLegOfCompetitorWithContextRetrievalProcessor.class;
|
||||
dataRetrieverChainDefinition.addAsLast(raceRetrieverClass,
|
||||
legRetrieverClass,
|
||||
Test_HasLegOfCompetitorContext.class);
|
||||
|
||||
return dataRetrieverChainDefinition;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetStatisticsForType() {
|
||||
FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry);
|
||||
Collection<Function<?>> expectedFunctions = functionRegistryUtil.getExpectedStatisticsFor(Test_HasLegContext.class);
|
||||
assertThat(functionProvider.getStatisticsFor(Test_HasLegContext.class), is(expectedFunctions));
|
||||
assertThat(functionProvider.getStatisticsFor(Test_HasLegContextImpl.class), is(expectedFunctions));
|
||||
Collection<Function<?>> expectedStatistics = functionRegistryUtil.getExpectedStatisticsFor(Test_HasLegOfCompetitorContext.class);
|
||||
assertThat(functionProvider.getStatisticsFor(Test_HasLegOfCompetitorContext.class), is(expectedStatistics));
|
||||
assertThat(functionProvider.getStatisticsFor(Test_HasLegOfCompetitorContextImpl.class), is(expectedStatistics));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAllFunctionsForType() {
|
||||
FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry);
|
||||
|
||||
Collection<Function<?>> expectedFunctions = functionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class);
|
||||
expectedFunctions.addAll(functionRegistryUtil.getExpectedDimensionsFor(Test_HasLegOfCompetitorContext.class));
|
||||
expectedFunctions.addAll(functionRegistryUtil.getExpectedStatisticsFor(Test_HasLegOfCompetitorContext.class));
|
||||
assertThat(functionProvider.getFunctionsFor(Test_HasLegOfCompetitorContext.class), is(expectedFunctions));
|
||||
assertThat(functionProvider.getFunctionsFor(Test_HasLegOfCompetitorContextImpl.class), is(expectedFunctions));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetFunctionForDTO() throws NoSuchMethodException, SecurityException {
|
||||
Method getRegattaMethod = Test_HasRaceContext.class.getMethod("getRace", new Class<?>[0]);
|
||||
Function<?> getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod);
|
||||
Function<?> getRegatta = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getRegattaMethod);
|
||||
Method getNameMethod = Test_Named.class.getMethod("getName", new Class<?>[0]);
|
||||
Function<?> getName = FunctionFactory.createMethodWrappingFunction(getNameMethod);
|
||||
Function<Object> getRegattaName = FunctionFactory.createCompoundFunction(Arrays.asList(getRegatta, getName));
|
||||
Function<?> getName = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getNameMethod);
|
||||
Function<Object> getRegattaName = FunctionTestsUtil.getFunctionFactory().createCompoundFunction(Arrays.asList(getRegatta, getName));
|
||||
|
||||
FunctionDTO getRegattaNameDTO = FunctionDTOFactory.createFunctionDTO(getRegattaName, Locale.ENGLISH, stringMessages);
|
||||
FunctionDTO getRegattaNameDTO = FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(getRegattaName, stringMessages, Locale.ENGLISH);
|
||||
|
||||
FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry);
|
||||
@SuppressWarnings("unchecked") // Hamcrest requires type matching of actual and expected type, so the Functions have to be specific (without <?>)
|
||||
@@ -100,8 +147,8 @@ public class TestFunctionProvider {
|
||||
@Test
|
||||
public void testGetFunctionForUnregisteredDTO() {
|
||||
Method incrementMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "increment", int.class);
|
||||
Function<Object> increment = FunctionFactory.createMethodWrappingFunction(incrementMethod);
|
||||
FunctionDTO incrementDTO = FunctionDTOFactory.createFunctionDTO(increment, Locale.ENGLISH, stringMessages);
|
||||
Function<Object> increment = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(incrementMethod);
|
||||
FunctionDTO incrementDTO = FunctionTestsUtil.getFunctionDTOFactory().createFunctionDTO(increment, stringMessages, Locale.ENGLISH);
|
||||
|
||||
FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry);
|
||||
assertThat(functionProvider.getFunctionForDTO(incrementDTO), is(nullValue()));
|
||||
|
||||
+6
-7
@@ -9,7 +9,6 @@ import java.util.Locale;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
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.test.functions.test_classes.SimpleClassWithMarkedMethods;
|
||||
@@ -38,13 +37,13 @@ public class TestMethodWrappingFunction {
|
||||
|
||||
@Test
|
||||
public void testIsDimension() {
|
||||
Function<?> dimension = FunctionFactory.createMethodWrappingFunction(dimensionMethod);
|
||||
Function<?> dimension = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(dimensionMethod);
|
||||
assertThat(dimension.isDimension(), is(true));
|
||||
|
||||
Function<?> sideEffectFreeValue = FunctionFactory.createMethodWrappingFunction(sideEffectFreeValueMethod);
|
||||
Function<?> sideEffectFreeValue = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(sideEffectFreeValueMethod);
|
||||
assertThat(sideEffectFreeValue.isDimension(), is(false));
|
||||
|
||||
Function<?> externalLibraryFunction = FunctionFactory.createMethodWrappingFunction(externalLibraryMethod);
|
||||
Function<?> externalLibraryFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(externalLibraryMethod);
|
||||
assertThat(externalLibraryFunction.isDimension(), is(false));
|
||||
}
|
||||
|
||||
@@ -52,19 +51,19 @@ public class TestMethodWrappingFunction {
|
||||
public void testGetLocalizedName() {
|
||||
DataMiningStringMessages stringMessages = TestsUtil.getTestStringMessages();
|
||||
|
||||
Function<?> dimension = FunctionFactory.createMethodWrappingFunction(dimensionMethod);
|
||||
Function<?> dimension = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(dimensionMethod);
|
||||
String expectedEnglishName = "dimension-english";
|
||||
assertThat(dimension.getLocalizedName(Locale.ENGLISH, stringMessages), is(expectedEnglishName));
|
||||
String expectedGermanName = "dimension-deutsch";
|
||||
assertThat(dimension.getLocalizedName(Locale.GERMAN, stringMessages), is(expectedGermanName));
|
||||
|
||||
Function<?> sideEffectFreeValue = FunctionFactory.createMethodWrappingFunction(sideEffectFreeValueMethod);
|
||||
Function<?> sideEffectFreeValue = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(sideEffectFreeValueMethod);
|
||||
expectedEnglishName = "sideEffectFreeValue-english";
|
||||
assertThat(sideEffectFreeValue.getLocalizedName(Locale.ENGLISH, stringMessages), is(expectedEnglishName));
|
||||
expectedGermanName = "sideEffectFreeValue-deutsch";
|
||||
assertThat(sideEffectFreeValue.getLocalizedName(Locale.GERMAN, stringMessages), is(expectedGermanName));
|
||||
|
||||
Function<?> externalLibraryFunction = FunctionFactory.createMethodWrappingFunction(externalLibraryMethod);
|
||||
Function<?> externalLibraryFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(externalLibraryMethod);
|
||||
String expectedName = "foo";
|
||||
assertThat(externalLibraryFunction.getLocalizedName(Locale.ENGLISH, stringMessages), is(expectedName));
|
||||
assertThat(externalLibraryFunction.getLocalizedName(Locale.GERMAN, stringMessages), is(expectedName));
|
||||
|
||||
+2
-3
@@ -7,7 +7,6 @@ import static org.junit.Assert.assertThat;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl;
|
||||
@@ -21,8 +20,8 @@ public class TestMethodWrappingFunctionInvocation {
|
||||
|
||||
@Before
|
||||
public void setUpFunctions() {
|
||||
getRegattaName = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName"));
|
||||
increment = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "increment", int.class));
|
||||
getRegattaName = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName"));
|
||||
increment = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "increment", int.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
+7
-7
@@ -14,7 +14,7 @@ import org.junit.Test;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionRegistry;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasContextWithDeadConnectorEnd;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass;
|
||||
import com.sap.sse.datamining.test.util.ExpectedFunctionRegistryUtil;
|
||||
@@ -35,7 +35,7 @@ public class TestSimpleFunctionRegistry {
|
||||
@Before
|
||||
public void initializeClassesToScan() {
|
||||
internalClassesToScan = new HashSet<>();
|
||||
internalClassesToScan.add(Test_HasLegContext.class);
|
||||
internalClassesToScan.add(Test_HasLegOfCompetitorContext.class);
|
||||
internalClassesToScan.add(Test_HasRaceContext.class);
|
||||
internalClassesToScan.add(Test_HasContextWithDeadConnectorEnd.class);
|
||||
|
||||
@@ -50,11 +50,11 @@ public class TestSimpleFunctionRegistry {
|
||||
registry.registerAllWithExternalFunctionPolicy(externalClassesToScan);
|
||||
|
||||
Collection<Function<?>> expectedDimensions = new HashSet<>();
|
||||
expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class));
|
||||
expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegOfCompetitorContext.class));
|
||||
expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class));
|
||||
assertThat(registry.getDimensions(), is(expectedDimensions));
|
||||
|
||||
Collection<Function<?>> expectedStatistics = expectedFunctionRegistryUtil.getExpectedStatisticsFor(Test_HasLegContext.class);
|
||||
Collection<Function<?>> expectedStatistics = expectedFunctionRegistryUtil.getExpectedStatisticsFor(Test_HasLegOfCompetitorContext.class);
|
||||
assertThat(registry.getStatistics(), is(expectedStatistics));
|
||||
|
||||
Collection<Function<?>> expectedExternalFunctions = expectedFunctionRegistryUtil.getExpectedExternalFunctionsFor(Test_ExternalLibraryClass.class);
|
||||
@@ -67,12 +67,12 @@ public class TestSimpleFunctionRegistry {
|
||||
registry.registerAllWithInternalFunctionPolicy(internalClassesToScan);
|
||||
|
||||
Collection<Function<?>> expectedDimensions = new HashSet<>();
|
||||
expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class));
|
||||
expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegOfCompetitorContext.class));
|
||||
expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class));
|
||||
assertThat(registry.getDimensions(), is(expectedDimensions));
|
||||
|
||||
Set<Class<?>> classesToUnregister = new HashSet<>();
|
||||
classesToUnregister.add(Test_HasLegContext.class);
|
||||
classesToUnregister.add(Test_HasLegOfCompetitorContext.class);
|
||||
registry.unregisterAllFunctionsOf(classesToUnregister);
|
||||
|
||||
expectedDimensions = expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class);
|
||||
@@ -83,7 +83,7 @@ public class TestSimpleFunctionRegistry {
|
||||
classesToUnregister.add(Test_HasRaceContext.class);
|
||||
registry.unregisterAllFunctionsOf(classesToUnregister);
|
||||
|
||||
expectedDimensions = expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class);
|
||||
expectedDimensions = expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegOfCompetitorContext.class);
|
||||
assertThat(registry.getDimensions(), is(expectedDimensions));
|
||||
}
|
||||
|
||||
|
||||
+10
-5
@@ -7,7 +7,6 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeInterface;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext;
|
||||
@@ -26,11 +25,11 @@ public class TestDeclaringTypeOrParameterTypeCriteria {
|
||||
|
||||
@Before
|
||||
public void setUpFunctions() {
|
||||
getSpeedInKnotsValue = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeInterface.class, "getSpeedInKnots"));
|
||||
getRaceNameLengthValue = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(ExtendingInterface.class, "getRaceNameLength"));
|
||||
getRegattaNameDimension = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName"));
|
||||
getSpeedInKnotsValue = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeInterface.class, "getSpeedInKnots"));
|
||||
getRaceNameLengthValue = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(ExtendingInterface.class, "getRaceNameLength"));
|
||||
getRegattaNameDimension = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName"));
|
||||
|
||||
libraryFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo"));
|
||||
libraryFunction = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -43,5 +42,11 @@ public class TestDeclaringTypeOrParameterTypeCriteria {
|
||||
|
||||
assertThat(criteria.matches(libraryFunction), is(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetElementType() {
|
||||
FilterCriterion<Function<?>> criteria = new IsDeclaringTypeFilterCriterion(DataTypeWithContextImpl.class);
|
||||
assertThat(criteria.getElementType().equals(Function.class), is(true));
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -10,7 +10,7 @@ import org.junit.Test;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.test.util.FunctionTestsUtil;
|
||||
|
||||
public class TestFunctionFilterCriterias {
|
||||
public class TestMethodFilterCriterias {
|
||||
|
||||
@Test
|
||||
public void testMethodIsCorrectDimensionFilterCriteria() {
|
||||
+17
-6
@@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.MissingResourceException;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -16,23 +17,23 @@ public class TestI18N {
|
||||
private static final String SIMPLE_TEST_MESSAGE_KEY = "SimpleTestMessage";
|
||||
private static final String TEST_MESSAGE_WITH_PARAMETERS = "TestMessageWithParameters";
|
||||
|
||||
private DataMiningStringMessages bundleManager;
|
||||
private DataMiningStringMessages testStringMessages;
|
||||
|
||||
@Before
|
||||
public void initializeBundleManager() {
|
||||
bundleManager = TestsUtil.getTestStringMessages();
|
||||
testStringMessages = TestsUtil.getTestStringMessages();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGettingASimpleMessage() {
|
||||
assertThat(bundleManager.get(Locale.ENGLISH, SIMPLE_TEST_MESSAGE_KEY), is("English"));
|
||||
assertThat(bundleManager.get(Locale.GERMAN, SIMPLE_TEST_MESSAGE_KEY), is("Deutsch"));
|
||||
assertThat(testStringMessages.get(Locale.ENGLISH, SIMPLE_TEST_MESSAGE_KEY), is("English"));
|
||||
assertThat(testStringMessages.get(Locale.GERMAN, SIMPLE_TEST_MESSAGE_KEY), is("Deutsch"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGettingAMessageWithParameters() {
|
||||
assertThat(bundleManager.get(Locale.ENGLISH, TEST_MESSAGE_WITH_PARAMETERS, "Param0", "Param1"), is("English Param0 - Param1"));
|
||||
assertThat(bundleManager.get(Locale.GERMAN, TEST_MESSAGE_WITH_PARAMETERS, "Param0", "Param1"), is("Deutsch Param0 - Param1"));
|
||||
assertThat(testStringMessages.get(Locale.ENGLISH, TEST_MESSAGE_WITH_PARAMETERS, "Param0", "Param1"), is("English Param0 - Param1"));
|
||||
assertThat(testStringMessages.get(Locale.GERMAN, TEST_MESSAGE_WITH_PARAMETERS, "Param0", "Param1"), is("Deutsch Param0 - Param1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -43,5 +44,15 @@ public class TestI18N {
|
||||
|
||||
assertThat(DataMiningStringMessages.Util.getLocaleFor("Unsupported locale info name"), is(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
@Test(expected=MissingResourceException.class)
|
||||
public void testGettingAMessageForAMissingKeyFromSimpleStringMessages() {
|
||||
testStringMessages.get(Locale.ENGLISH, "$%&MissingKey/()");
|
||||
}
|
||||
|
||||
@Test(expected=MissingResourceException.class)
|
||||
public void testGettingAMessageForAMissingKeyFromCompoundStringMessages() {
|
||||
TestsUtil.getTestStringMessagesWithProductiveMessages().get(Locale.ENGLISH, "$%&MissingKey/()");
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -5,7 +5,7 @@ import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg;
|
||||
|
||||
public interface Test_HasLegContext extends Test_HasRaceContext {
|
||||
public interface Test_HasLegOfCompetitorContext extends Test_HasRaceContext {
|
||||
|
||||
@Connector
|
||||
public Test_Leg getLeg();
|
||||
+2
-2
@@ -6,13 +6,13 @@ import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
|
||||
public class Test_HasLegContextImpl extends Test_HasRaceContextImpl implements Test_HasLegContext {
|
||||
public class Test_HasLegOfCompetitorContextImpl extends Test_HasRaceContextImpl implements Test_HasLegOfCompetitorContext {
|
||||
|
||||
private Test_Leg leg;
|
||||
private int legNumber;
|
||||
private Test_Competitor competitor;
|
||||
|
||||
public Test_HasLegContextImpl(Test_Regatta regatta, Test_Race race, Test_BoatClass boatClass, int year,
|
||||
public Test_HasLegOfCompetitorContextImpl(Test_Regatta regatta, Test_Race race, Test_BoatClass boatClass, int year,
|
||||
Test_Leg leg, int legNumber, Test_Competitor competitor) {
|
||||
super(regatta, race, boatClass, year);
|
||||
this.leg = leg;
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
package com.sap.sse.datamining.test.functions.test_classes;
|
||||
|
||||
public class DataTypeWithContextImpl implements DataTypeWithContext, ExtendingInterface {
|
||||
//This class needs to extend SuperType to increase the test coverage
|
||||
public class DataTypeWithContextImpl extends SuperType implements DataTypeWithContext, ExtendingInterface {
|
||||
|
||||
private String regattaName;
|
||||
private String raceName;
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package com.sap.sse.datamining.test.functions.test_classes;
|
||||
|
||||
public class SuperType {
|
||||
|
||||
}
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
package com.sap.sse.datamining.test.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sse.datamining.factories.ProcessorFactory;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Boat;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Team;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_BoatClassImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_BoatImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_CompetitorImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_LegImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_RaceImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_RegattaImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_TeamImpl;
|
||||
|
||||
public final class ComponentTestsUtil {
|
||||
|
||||
private final static ProcessorFactory processorFactory = new ProcessorFactory(ConcurrencyTestsUtil.getExecutor());
|
||||
|
||||
public static ProcessorFactory getProcessorFactory() {
|
||||
return processorFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a collection of {@link Test_Regatta Test_Regattas} containing the two regattas
|
||||
* <ul>
|
||||
* <li>KW 2014 49er
|
||||
* <ul>
|
||||
* <li>with the {@link Test_BoatClass} 49er</li>
|
||||
* <li>and 3 {@link Test_Race Test_Races} (Race 1-3)
|
||||
* <ul>
|
||||
* <li>with 5 {@link Test_Leg Test_Legs} (with a value 0.0 as distance traveled)</li>
|
||||
* <li>and the competitors
|
||||
* <ul>
|
||||
* <li>GER1 (49er Team 1)</li>
|
||||
* <li>GER2 (49er Team 2)</li>
|
||||
* <li>GER3 (49er Team 3)</li>
|
||||
* <li>GER4 (49er Team 4)</li>
|
||||
* </ul>
|
||||
* </li>
|
||||
* </ul>
|
||||
* </li>
|
||||
* </ul>
|
||||
* </li>
|
||||
* <li>KW 2014 505 (with the {@link Test_BoatClass} 505)
|
||||
* <ul>
|
||||
* <li>with the {@link Test_BoatClass} 505</li>
|
||||
* <li>and 2 {@link Test_Race Test_Races} (Race 1-2)
|
||||
* <ul>
|
||||
* <li>with 5 {@link Test_Leg Test_Legs} (with a value 0.0 as distance traveled)</li>
|
||||
* <li>and the competitors
|
||||
* <ul>
|
||||
* <li>ENG1 (505 Team 1)</li>
|
||||
* <li>ENG2 (505 Team 2)</li>
|
||||
* <li>ENG3 (505 Team 3)</li>
|
||||
* </ul>
|
||||
* </li>
|
||||
* </ul>
|
||||
* </li>
|
||||
* </ul></li>
|
||||
* </ul>
|
||||
* @return an example data source for testing
|
||||
*/
|
||||
public static Collection<Test_Regatta> createExampleDataSource() {
|
||||
//Initialize 49er competitors
|
||||
Test_Team team1_49er = new Test_TeamImpl("49er Team 1");
|
||||
Test_Boat boatGER1 = new Test_BoatImpl("GER1");
|
||||
Test_Competitor competitor1_49er = new Test_CompetitorImpl(team1_49er, boatGER1);
|
||||
|
||||
Test_Team team2_49er = new Test_TeamImpl("49er Team 2");
|
||||
Test_Boat boatGER2 = new Test_BoatImpl("GER2");
|
||||
Test_Competitor competitor2_49er = new Test_CompetitorImpl(team2_49er, boatGER2);
|
||||
|
||||
Test_Team team3_49er = new Test_TeamImpl("49er Team 3");
|
||||
Test_Boat boatGER3 = new Test_BoatImpl("GER3");
|
||||
Test_Competitor competitor3_49er = new Test_CompetitorImpl(team3_49er, boatGER3);
|
||||
|
||||
Test_Team team4_49er = new Test_TeamImpl("49er Team 4");
|
||||
Test_Boat boatGER4 = new Test_BoatImpl("GER4");
|
||||
Test_Competitor competitor4_49er = new Test_CompetitorImpl(team4_49er, boatGER4);
|
||||
|
||||
Collection<Test_Competitor> competitors49er = Arrays.asList(competitor1_49er, competitor2_49er, competitor3_49er, competitor4_49er);
|
||||
|
||||
//Initialize 505 competitors
|
||||
Test_Team team1_505 = new Test_TeamImpl("505 Team 1");
|
||||
Test_Boat boatENG1 = new Test_BoatImpl("ENG1");
|
||||
Test_Competitor competitor1_505 = new Test_CompetitorImpl(team1_505, boatENG1);
|
||||
|
||||
Test_Team team2_505 = new Test_TeamImpl("505 Team 2");
|
||||
Test_Boat boatENG2 = new Test_BoatImpl("ENG2");
|
||||
Test_Competitor competitor2_505 = new Test_CompetitorImpl(team2_505, boatENG2);
|
||||
|
||||
Test_Team team3_505 = new Test_TeamImpl("505 Team 3");
|
||||
Test_Boat boatENG3 = new Test_BoatImpl("ENG3");
|
||||
Test_Competitor competitor3_505 = new Test_CompetitorImpl(team3_505, boatENG3);
|
||||
|
||||
Collection<Test_Competitor> competitors505 = Arrays.asList(competitor1_505, competitor2_505, competitor3_505);
|
||||
|
||||
// Test_Leg has only the statistic distance traveled
|
||||
// This test requires only the dimensions, so only one leg is necessary
|
||||
Test_Leg leg = new Test_LegImpl(0.0);
|
||||
Collection<Test_Leg> legs = Arrays.asList(leg, leg, leg, leg, leg);
|
||||
|
||||
//Initialize races, boat classes and regattas
|
||||
Test_Race race1_49er = new Test_RaceImpl("Race 1", competitors49er, legs);
|
||||
Test_Race race2_49er = new Test_RaceImpl("Race 2", competitors49er, legs);
|
||||
Test_Race race3_49er = new Test_RaceImpl("Race 3", competitors49er, legs);
|
||||
Test_Race race1_505 = new Test_RaceImpl("Race 1", competitors505, legs);
|
||||
Test_Race race2_505 = new Test_RaceImpl("Race 2", competitors505, legs);
|
||||
|
||||
Test_BoatClass boatClass49er = new Test_BoatClassImpl("49er");
|
||||
Test_BoatClass boatClass505 = new Test_BoatClassImpl("505");
|
||||
|
||||
Test_Regatta regatta49er = new Test_RegattaImpl("KW 2014 49er", boatClass49er, 2014, race1_49er, race2_49er, race3_49er);
|
||||
Test_Regatta regatta505 = new Test_RegattaImpl("KW 2014 505", boatClass505, 2014, race1_505, race2_505);
|
||||
|
||||
Collection<Test_Regatta> dataSource = new ArrayList<>();
|
||||
dataSource.add(regatta49er);
|
||||
dataSource.add(regatta505);
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
}
|
||||
+2
-2
@@ -39,7 +39,7 @@ public class ConcurrencyTestsUtil extends TestsUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> void processElements(Processor<T> processor, Collection<T> elements) {
|
||||
public static <T> void processElements(Processor<T, ?> processor, Collection<T> elements) {
|
||||
for (T element : elements) {
|
||||
processor.processElement(element);
|
||||
}
|
||||
@@ -56,7 +56,7 @@ public class ConcurrencyTestsUtil extends TestsUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static void tryToFinishTheProcessorInAnotherThread(final Processor<?> processor) {
|
||||
public static void tryToFinishTheProcessorInAnotherThread(final Processor<?, ?> processor) {
|
||||
Runnable finishingRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
+23
-24
@@ -8,13 +8,12 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Boat;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass;
|
||||
|
||||
@@ -40,38 +39,38 @@ public class ExpectedFunctionRegistryUtil {
|
||||
|
||||
private void buildExpectedDimensions() throws NoSuchMethodException, SecurityException {
|
||||
Method getNameMethod = Test_Named.class.getMethod("getName", new Class<?>[0]);
|
||||
Function<?> getName = FunctionFactory.createMethodWrappingFunction(getNameMethod);
|
||||
Function<?> getName = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getNameMethod);
|
||||
|
||||
Method getRegattaMethod = Test_HasRaceContext.class.getMethod("getRegatta", new Class<?>[0]);
|
||||
Function<?> getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod);
|
||||
addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getRegatta, getName)));
|
||||
Function<?> getRegatta = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getRegattaMethod);
|
||||
addExpectedDimension(FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getRegatta, getName)));
|
||||
|
||||
Method getRaceMethod = Test_HasRaceContext.class.getMethod("getRace", new Class<?>[0]);
|
||||
Function<?> getRace = FunctionFactory.createMethodWrappingFunction(getRaceMethod);
|
||||
addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getRace, getName)));
|
||||
Function<?> getRace = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getRaceMethod);
|
||||
addExpectedDimension(FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getRace, getName)));
|
||||
|
||||
Method getBoatClassMethod = Test_HasRaceContext.class.getMethod("getBoatClass", new Class<?>[0]);
|
||||
Function<?> getBoatClass = FunctionFactory.createMethodWrappingFunction(getBoatClassMethod);
|
||||
addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getBoatClass, getName)));
|
||||
Function<?> getBoatClass = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getBoatClassMethod);
|
||||
addExpectedDimension(FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getBoatClass, getName)));
|
||||
|
||||
Method getYearMethod = Test_HasRaceContext.class.getMethod("getYear", new Class<?>[0]);
|
||||
addExpectedDimension(FunctionFactory.createMethodWrappingFunction(getYearMethod));
|
||||
addExpectedDimension(FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getYearMethod));
|
||||
|
||||
Method getLegNumberMethod = Test_HasLegContext.class.getMethod("getLegNumber", new Class<?>[0]);
|
||||
addExpectedDimension(FunctionFactory.createMethodWrappingFunction(getLegNumberMethod));
|
||||
Method getLegNumberMethod = Test_HasLegOfCompetitorContext.class.getMethod("getLegNumber", new Class<?>[0]);
|
||||
addExpectedDimension(FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getLegNumberMethod));
|
||||
|
||||
Method getCompetitorMethod = Test_HasLegContext.class.getMethod("getCompetitor", new Class<?>[0]);
|
||||
Function<?> getCompetitor = FunctionFactory.createMethodWrappingFunction(getCompetitorMethod);
|
||||
Method getCompetitorMethod = Test_HasLegOfCompetitorContext.class.getMethod("getCompetitor", new Class<?>[0]);
|
||||
Function<?> getCompetitor = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getCompetitorMethod);
|
||||
|
||||
Method getTeamMethod = Test_Competitor.class.getMethod("getTeam", new Class<?>[0]);
|
||||
Function<?> getTeam = FunctionFactory.createMethodWrappingFunction(getTeamMethod);
|
||||
addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getTeam, getName)));
|
||||
Function<?> getTeam = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getTeamMethod);
|
||||
addExpectedDimension(FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getCompetitor, getTeam, getName)));
|
||||
|
||||
Method getBoatMethod = Test_Competitor.class.getMethod("getBoat", new Class<?>[0]);
|
||||
Function<?> getBoat = FunctionFactory.createMethodWrappingFunction(getBoatMethod);
|
||||
Function<?> getBoat = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getBoatMethod);
|
||||
Method getSailIDMethod = Test_Boat.class.getMethod("getSailID", new Class<?>[0]);
|
||||
Function<?> getSailID = FunctionFactory.createMethodWrappingFunction(getSailIDMethod);
|
||||
addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getBoat, getSailID)));
|
||||
Function<?> getSailID = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getSailIDMethod);
|
||||
addExpectedDimension(FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getCompetitor, getBoat, getSailID)));
|
||||
}
|
||||
|
||||
private void addExpectedDimension(Function<?> dimension) {
|
||||
@@ -83,11 +82,11 @@ public class ExpectedFunctionRegistryUtil {
|
||||
}
|
||||
|
||||
private void buildExpectedStatistics() throws NoSuchMethodException, SecurityException {
|
||||
Method getLegMethod = Test_HasLegContext.class.getMethod("getLeg", new Class<?>[0]);
|
||||
Function<?> getLeg = FunctionFactory.createMethodWrappingFunction(getLegMethod);
|
||||
Method getLegMethod = Test_HasLegOfCompetitorContext.class.getMethod("getLeg", new Class<?>[0]);
|
||||
Function<?> getLeg = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getLegMethod);
|
||||
Method getDistanceTraveledMethod = Test_Leg.class.getMethod("getDistanceTraveled", new Class<?>[0]);
|
||||
Function<?> getDistanceTraveled = FunctionFactory.createMethodWrappingFunction(getDistanceTraveledMethod);
|
||||
addExpectedStatistic(FunctionFactory.createCompoundFunction(null, Arrays.asList(getLeg, getDistanceTraveled)));
|
||||
Function<?> getDistanceTraveled = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(getDistanceTraveledMethod);
|
||||
addExpectedStatistic(FunctionTestsUtil.getFunctionFactory().createCompoundFunction(null, Arrays.asList(getLeg, getDistanceTraveled)));
|
||||
}
|
||||
|
||||
private void addExpectedStatistic(Function<?> statistic) {
|
||||
@@ -100,7 +99,7 @@ public class ExpectedFunctionRegistryUtil {
|
||||
|
||||
private void buildExpectedExternalFunctions() throws NoSuchMethodException, SecurityException {
|
||||
Method fooMethod = Test_ExternalLibraryClass.class.getMethod("foo", new Class<?>[0]);
|
||||
Function<?> foo = FunctionFactory.createMethodWrappingFunction(fooMethod);
|
||||
Function<?> foo = FunctionTestsUtil.getFunctionFactory().createMethodWrappingFunction(fooMethod);
|
||||
addExpectedExternalFunction(foo);
|
||||
}
|
||||
|
||||
|
||||
+24
-12
@@ -7,6 +7,7 @@ import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sse.datamining.factories.FunctionDTOFactory;
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.test.functions.test_classes.DataTypeInterface;
|
||||
@@ -17,11 +18,22 @@ import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedM
|
||||
import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass;
|
||||
|
||||
public class FunctionTestsUtil extends ConcurrencyTestsUtil {
|
||||
|
||||
private static final FunctionFactory functionFactory = new FunctionFactory();
|
||||
private static final FunctionDTOFactory functionDTOFactory = new FunctionDTOFactory();
|
||||
|
||||
public static FunctionFactory getFunctionFactory() {
|
||||
return functionFactory;
|
||||
}
|
||||
|
||||
public static FunctionDTOFactory getFunctionDTOFactory() {
|
||||
return functionDTOFactory;
|
||||
}
|
||||
|
||||
public static Collection<Function<?>> getMarkedMethodsOfSimpleClassWithMarkedMethod() {
|
||||
Set<Function<?>> markedMethods = new HashSet<>();
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromSimpleClassWithMarkedMethod("dimension")));
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromSimpleClassWithMarkedMethod("sideEffectFreeValue")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromSimpleClassWithMarkedMethod("dimension")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromSimpleClassWithMarkedMethod("sideEffectFreeValue")));
|
||||
return markedMethods;
|
||||
}
|
||||
|
||||
@@ -31,7 +43,7 @@ public class FunctionTestsUtil extends ConcurrencyTestsUtil {
|
||||
|
||||
public static Collection<Function<?>> getMethodsOfExternalLibraryClass() {
|
||||
Set<Function<?>> markedMethods = new HashSet<>();
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromExternalLibraryClass("foo")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromExternalLibraryClass("foo")));
|
||||
return markedMethods;
|
||||
}
|
||||
|
||||
@@ -41,16 +53,16 @@ public class FunctionTestsUtil extends ConcurrencyTestsUtil {
|
||||
|
||||
public static Collection<Function<?>> getMarkedMethodsOfDataTypeWithContextImplAndItsSupertypes() {
|
||||
Collection<Function<?>> markedMethods = getMarkedMethodsOfDataTypeWithContextAndItsSupertypes();
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(ExtendingInterface.class, "getRaceNameLength")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(ExtendingInterface.class, "getRaceNameLength")));
|
||||
return markedMethods;
|
||||
}
|
||||
|
||||
public static Collection<Function<?>> getMarkedMethodsOfDataTypeWithContextAndItsSupertypes() {
|
||||
Collection<Function<?>> markedMethods = new HashSet<>();
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeInterface.class, "getSpeedInKnots")));
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRegattaName")));
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRaceName")));
|
||||
markedMethods.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getLegNumber")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeInterface.class, "getSpeedInKnots")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRegattaName")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRaceName")));
|
||||
markedMethods.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getLegNumber")));
|
||||
return markedMethods;
|
||||
}
|
||||
|
||||
@@ -80,15 +92,15 @@ public class FunctionTestsUtil extends ConcurrencyTestsUtil {
|
||||
|
||||
private static Collection<Function<?>> getDimensionsForSimpleClassWithMarkedMethods() {
|
||||
Collection<Function<?>> dimensions = new HashSet<>();
|
||||
dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromSimpleClassWithMarkedMethod("dimension")));
|
||||
dimensions.add(functionFactory.createMethodWrappingFunction(getMethodFromSimpleClassWithMarkedMethod("dimension")));
|
||||
return dimensions;
|
||||
}
|
||||
|
||||
private static Collection<Function<?>> getDimensionsForDataTypeWithContext() {
|
||||
Collection<Function<?>> dimensions = new HashSet<>();
|
||||
dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRegattaName")));
|
||||
dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRaceName")));
|
||||
dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getLegNumber")));
|
||||
dimensions.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRegattaName")));
|
||||
dimensions.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRaceName")));
|
||||
dimensions.add(functionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getLegNumber")));
|
||||
return dimensions;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import com.sap.sse.datamining.impl.criterias.RegexFilterCriterion;
|
||||
public class StringRegexFilterCriterion extends RegexFilterCriterion<String> {
|
||||
|
||||
public StringRegexFilterCriterion(String regex) {
|
||||
super(regex);
|
||||
super(String.class, regex);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+3
-1
@@ -6,8 +6,10 @@ public class TestsUtil {
|
||||
|
||||
private static final String TEST_STRING_MESSAGES_BASE_NAME = "stringmessages/Test_StringMessages";
|
||||
private static final DataMiningStringMessages TEST_STRING_MESSAGES = DataMiningStringMessages.Util.getInstanceFor(TEST_STRING_MESSAGES_BASE_NAME);
|
||||
|
||||
private static final String PRODUCTIVE_STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages";
|
||||
private static final DataMiningStringMessages EXTENDED_STRING_MESSAGES = DataMiningStringMessages.Util.getCompoundStringMessages(
|
||||
DataMiningStringMessages.Util.getDefaultStringMessagesBaseName(),
|
||||
PRODUCTIVE_STRING_MESSAGES_BASE_NAME,
|
||||
TEST_STRING_MESSAGES_BASE_NAME);
|
||||
|
||||
public static DataMiningStringMessages getTestStringMessages() {
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sse.datamining.test.components.util;
|
||||
package com.sap.sse.datamining.test.util.components;
|
||||
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
|
||||
+5
-3
@@ -1,4 +1,4 @@
|
||||
package com.sap.sse.datamining.test.components.util;
|
||||
package com.sap.sse.datamining.test.util.components;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.Callable;
|
||||
@@ -11,8 +11,10 @@ import com.sap.sse.datamining.impl.components.AbstractSimpleParallelProcessor;
|
||||
public class BlockingProcessor<InputType, ResultType> extends AbstractSimpleParallelProcessor<InputType, ResultType> {
|
||||
private final long timeToBlockInMillis;
|
||||
|
||||
public BlockingProcessor(ExecutorService executor, Collection<Processor<ResultType>> resultReceivers, long timeToBlockInMillis) {
|
||||
super(executor, resultReceivers);
|
||||
public BlockingProcessor(Class<InputType> inputType, Class<ResultType> resultType,
|
||||
ExecutorService executor, Collection<Processor<ResultType, ?>> resultReceivers,
|
||||
long timeToBlockInMillis) {
|
||||
super(inputType, resultType, executor, resultReceivers);
|
||||
this.timeToBlockInMillis = timeToBlockInMillis;
|
||||
}
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
package com.sap.sse.datamining.test.util.components;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.impl.components.AbstractProcessor;
|
||||
|
||||
public class NullProcessor<InputType, ResultType> extends AbstractProcessor<InputType, ResultType> {
|
||||
|
||||
public NullProcessor(Class<InputType> inputType, Class<ResultType> resultType) {
|
||||
super(inputType, resultType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processElement(InputType element) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void abort() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) {
|
||||
return additionalDataBuilder;
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sse.datamining.test.components.util;
|
||||
package com.sap.sse.datamining.test.util.components;
|
||||
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package com.sap.sse.datamining.test.util.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContextImpl;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
|
||||
public class TestLegOfCompetitorWithContextRetrievalProcessor extends
|
||||
AbstractSimpleRetrievalProcessor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>{
|
||||
|
||||
public TestLegOfCompetitorWithContextRetrievalProcessor(ExecutorService executor, Collection<Processor<Test_HasLegOfCompetitorContext, ?>> resultReceivers) {
|
||||
super(Test_HasRaceContext.class, Test_HasLegOfCompetitorContext.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<Test_HasLegOfCompetitorContext> retrieveData(Test_HasRaceContext raceWithContext) {
|
||||
Collection<Test_HasLegOfCompetitorContext> legsWithContext = new ArrayList<>();
|
||||
int legNumber = 0;
|
||||
for (Test_Leg leg : raceWithContext.getRace().getLegs()) {
|
||||
legNumber++;
|
||||
for (Test_Competitor competitor : raceWithContext.getRace().getCompetitors()) {
|
||||
legsWithContext.add(new Test_HasLegOfCompetitorContextImpl(raceWithContext.getRegatta(), raceWithContext.getRace(), raceWithContext.getBoatClass(),
|
||||
raceWithContext.getYear(), leg, legNumber, competitor));
|
||||
}
|
||||
}
|
||||
return legsWithContext;
|
||||
}
|
||||
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.sap.sse.datamining.test.util.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContextImpl;
|
||||
|
||||
public class TestRaceWithContextRetrievalProcessor extends
|
||||
AbstractSimpleRetrievalProcessor<Test_Regatta, Test_HasRaceContext> {
|
||||
|
||||
public TestRaceWithContextRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<Test_HasRaceContext, ?>> resultReceivers) {
|
||||
super(Test_Regatta.class, Test_HasRaceContext.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<Test_HasRaceContext> retrieveData(Test_Regatta regatta) {
|
||||
Collection<Test_HasRaceContext> racesWithContext = new ArrayList<>();
|
||||
for (Test_Race race : regatta.getRaces()) {
|
||||
racesWithContext.add(new Test_HasRaceContextImpl(regatta, race, regatta.getBoatClass(), regatta.getYear()));
|
||||
}
|
||||
return racesWithContext;
|
||||
}
|
||||
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package com.sap.sse.datamining.test.util.components;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta;
|
||||
|
||||
public class TestRegattaRetrievalProcessor extends
|
||||
AbstractSimpleRetrievalProcessor<Collection<Test_Regatta>, Test_Regatta> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public TestRegattaRetrievalProcessor(ExecutorService executor, Collection<Processor<Test_Regatta, ?>> resultReceivers) {
|
||||
super((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, Test_Regatta.class, executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<Test_Regatta> retrieveData(Collection<Test_Regatta> regattas) {
|
||||
return regattas;
|
||||
}
|
||||
|
||||
}
|
||||
Loaded 100 of 169 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user