Implemented a method in the function provider to get transitive dimensions

This commit is contained in:
Lennart Hensler committed 2014-03-26 18:27:20 +01:00
1 parent dd4fa0c310
commit 009a19708c
10 files changed
+60 -11

No files matched your search

@@ -50,7 +50,7 @@ public class TestCompoundFunction {
assertThat(compoundFunction.isDimension(), is(true)); assertThat(compoundFunction.isDimension(), is(true));
//This is a workaround, because the assertion, that to types are equal checks for an instance of the given class instead. //This is a workaround, because the assertion, that to types are equal checks for an instance of the given class instead.
assertThat("The actual declaring class did'nt match the expected one.", assertThat("The actual declaring class did'nt match the expected one.",
compoundFunction.getDeclaringClass().equals(MarkedContainer.class), is(true)); compoundFunction.getDeclaringType().equals(MarkedContainer.class), is(true));
assertThat(compoundFunction.getSimpleName(), is("TestCompoundFunction")); assertThat(compoundFunction.getSimpleName(), is("TestCompoundFunction"));
assertThat(compoundFunction.getLocalizedName(Locale.ENGLISH, TestsUtil.getTestStringMessages()), is("TestCompoundFunction")); assertThat(compoundFunction.getLocalizedName(Locale.ENGLISH, TestsUtil.getTestStringMessages()), is("TestCompoundFunction"));
assertThat(compoundFunction.getResultUnit(), is(Unit.None)); assertThat(compoundFunction.getResultUnit(), is(Unit.None));
@@ -24,11 +24,13 @@ import com.sap.sse.datamining.impl.functions.PartitioningParallelMarkedFunctionR
import com.sap.sse.datamining.impl.functions.RegistryFunctionsProvider; import com.sap.sse.datamining.impl.functions.RegistryFunctionsProvider;
import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry;
import com.sap.sse.datamining.shared.dto.FunctionDTO; import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.test.function.test_classes.ContainerElement;
import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext; import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext;
import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextImpl; import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextImpl;
import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextProcessor; import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextProcessor;
import com.sap.sse.datamining.test.function.test_classes.ExtendingInterface; import com.sap.sse.datamining.test.function.test_classes.ExtendingInterface;
import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass;
import com.sap.sse.datamining.test.function.test_classes.MarkedContainer;
import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods;
import com.sap.sse.datamining.test.util.FunctionTestsUtil; import com.sap.sse.datamining.test.util.FunctionTestsUtil;
import com.sap.sse.datamining.test.util.TestsUtil; import com.sap.sse.datamining.test.util.TestsUtil;
@@ -48,6 +50,8 @@ public class TestFunctionProvider {
classesToScan.add(DataTypeWithContext.class); classesToScan.add(DataTypeWithContext.class);
classesToScan.add(DataTypeWithContextProcessor.class); classesToScan.add(DataTypeWithContextProcessor.class);
classesToScan.add(ExtendingInterface.class); classesToScan.add(ExtendingInterface.class);
classesToScan.add(MarkedContainer.class);
classesToScan.add(ContainerElement.class);
ParallelFunctionRetriever markedFunctionRetriever = new PartitioningParallelMarkedFunctionRetriever(classesToScan, FunctionTestsUtil.getExecutor()); ParallelFunctionRetriever markedFunctionRetriever = new PartitioningParallelMarkedFunctionRetriever(classesToScan, FunctionTestsUtil.getExecutor());
functionRegistry.registerFunctionsRetrievedBy(markedFunctionRetriever); functionRegistry.registerFunctionsRetrievedBy(markedFunctionRetriever);
@@ -115,5 +119,15 @@ public class TestFunctionProvider {
FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor()); FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor());
assertThat(functionProvider.getFunctionFor(null), is(nullValue())); assertThat(functionProvider.getFunctionFor(null), is(nullValue()));
} }
@Test
public void testGetTransitiveDimension() throws ClassCastException, NoSuchMethodException, SecurityException {
FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor());
Collection<Function<?>> expectedDimensions = new HashSet<>();
expectedDimensions.add(FunctionFactory.createMethodWrappingFunction(ContainerElement.class.getMethod("getName",
new Class<?>[0])));
assertThat(functionProvider.getTransitiveDimensionsFor(MarkedContainer.class, 1), is(expectedDimensions));
}
} }
@@ -32,7 +32,7 @@ public class FunctionDTOFactory {
private static FunctionDTO createFunctionDTO(Function<?> function, String displayName) { private static FunctionDTO createFunctionDTO(Function<?> function, String displayName) {
String functionName = function.getSimpleName(); String functionName = function.getSimpleName();
String sourceTypeName = function.getDeclaringClass().getSimpleName(); String sourceTypeName = function.getDeclaringType().getSimpleName();
String returnTypeName = function.getReturnType().getSimpleName(); String returnTypeName = function.getReturnType().getSimpleName();
List<String> parameterTypeNames = getParameterTypeNames(function); List<String> parameterTypeNames = getParameterTypeNames(function);
return new FunctionDTOImpl(functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, function.isDimension()); return new FunctionDTOImpl(functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, function.isDimension());
@@ -8,7 +8,7 @@ import com.sap.sse.datamining.shared.Unit;
public interface Function<ReturnType> { public interface Function<ReturnType> {
public Class<?> getDeclaringClass(); public Class<?> getDeclaringType();
public Iterable<Class<?>> getParameters(); public Iterable<Class<?>> getParameters();
public Class<ReturnType> getReturnType(); public Class<ReturnType> getReturnType();
@@ -8,6 +8,18 @@ public interface FunctionProvider {
public Collection<Function<?>> getDimensionsFor(Class<?> dataType); public Collection<Function<?>> getDimensionsFor(Class<?> dataType);
/**
* Collects all dimensions for the given data type, where transitive dimensions will also be
* collected. A transitive dimension is a dimension, that can be reached with functions of the
* given data type.<br />
* The depth defines the maximum amount of functions that can be between the data type and the
* collected dimensions. A depth of 0 would collect only the dimensions of the given data type.
* @param dataType
* @param depth
* @return
*/
public Collection<Function<?>> getTransitiveDimensionsFor(Class<?> dataType, int depth);
public Collection<Function<?>> getFunctionsFor(Class<?> sourceType); public Collection<Function<?>> getFunctionsFor(Class<?> sourceType);
/** /**
@@ -37,8 +37,8 @@ public class CompoundFunction<ReturnType> extends AbstractFunction<ReturnType> {
} }
@Override @Override
public Class<?> getDeclaringClass() { public Class<?> getDeclaringType() {
return getFirstFunction().getDeclaringClass(); return getFirstFunction().getDeclaringType();
} }
@Override @Override
@@ -65,7 +65,7 @@ public class DeclaringTypeOrParameterTypeCriteria implements FilterCriteria<Func
} }
public boolean isDeclaringTypeMatching(Function<?> function, Class<?> expectingType) { public boolean isDeclaringTypeMatching(Function<?> function, Class<?> expectingType) {
return function.getDeclaringClass().equals(expectingType); return function.getDeclaringType().equals(expectingType);
} }
} }
@@ -53,7 +53,7 @@ public class MethodWrappingFunction<ReturnType> extends AbstractFunction<ReturnT
} }
@Override @Override
public Class<?> getDeclaringClass() { public Class<?> getDeclaringType() {
return method.getDeclaringClass(); return method.getDeclaringClass();
} }
@@ -112,7 +112,7 @@ public class MethodWrappingFunction<ReturnType> extends AbstractFunction<ReturnT
@Override @Override
public String toString() { public String toString() {
return getDeclaringClass().getSimpleName() + "." + getMethodName() + "(" + parametersAsString() + ") : " + method.getReturnType().getSimpleName(); return getDeclaringType().getSimpleName() + "." + getMethodName() + "(" + parametersAsString() + ") : " + method.getReturnType().getSimpleName();
} }
private String parametersAsString() { private String parametersAsString() {
@@ -35,6 +35,29 @@ public class RegistryFunctionsProvider implements FunctionProvider {
return filterForDeclaringType(functionRegistry.getAllDimensions(), dataType); return filterForDeclaringType(functionRegistry.getAllDimensions(), dataType);
} }
@Override
public Collection<Function<?>> getTransitiveDimensionsFor(Class<?> dataType, int depth) {
Collection<Function<?>> dimensions = new HashSet<>();
Collection<Class<?>> typesToCheck = new HashSet<>();
Collection<Class<?>> typesToAdd = new HashSet<>();
typesToCheck.add(dataType);
for (int i = 0; i <= depth; i++) {
for (Class<?> type : typesToCheck) {
for (Function<?> function : getFunctionsFor(type)) {
if (function.isDimension()) {
dimensions.add(function);
}
typesToAdd.add(function.getReturnType());
}
}
typesToCheck.clear();
typesToCheck.addAll(typesToAdd);
typesToAdd.clear();
}
return dimensions;
}
@Override @Override
public Collection<Function<?>> getFunctionsFor(Class<?> sourceType) { public Collection<Function<?>> getFunctionsFor(Class<?> sourceType) {
return filterForDeclaringType(functionRegistry.getAllRegisteredFunctions(), sourceType); return filterForDeclaringType(functionRegistry.getAllRegisteredFunctions(), sourceType);
@@ -62,10 +62,10 @@ public class SimpleFunctionRegistry implements FunctionRegistry {
} }
private void putFunctionIntoMap(Function<?> function) { private void putFunctionIntoMap(Function<?> function) {
if (!registeredFunctionsMappedByDeclaringClass.containsKey(function.getDeclaringClass())) { if (!registeredFunctionsMappedByDeclaringClass.containsKey(function.getDeclaringType())) {
registeredFunctionsMappedByDeclaringClass.put(function.getDeclaringClass(), new HashSet<Function<?>>()); registeredFunctionsMappedByDeclaringClass.put(function.getDeclaringType(), new HashSet<Function<?>>());
} }
registeredFunctionsMappedByDeclaringClass.get(function.getDeclaringClass()).add(function); registeredFunctionsMappedByDeclaringClass.get(function.getDeclaringType()).add(function);
} }
@Override @Override