in wayang-commons/wayang-core/src/main/java/org/apache/wayang/core/optimizer/costs/LoadProfileEstimators.java [411:447]
private static Context createMathContext(final EstimationContext context,
final long[] inputCardinalities,
final long[] outputCardinalities) {
return new Context() {
@Override
public double getVariable(String variableName) throws EvaluationException {
// Serve "in999" and "out999" variables directly from the cardinality arrays.
if (variableName.startsWith("in") && variableName.length() > 2) {
int accu = 0;
int i;
for (i = 2; i < variableName.length(); i++) {
char c = variableName.charAt(i);
if (!Character.isDigit(c)) break;
accu = 10 * accu + (c - '0');
}
if (i == variableName.length()) return inputCardinalities[accu];
} else if (variableName.startsWith("out") && variableName.length() > 3) {
int accu = 0;
int i;
for (i = 3; i < variableName.length(); i++) {
char c = variableName.charAt(i);
if (!Character.isDigit(c)) break;
accu = 10 * accu + (c - '0');
}
if (i == variableName.length()) return outputCardinalities[accu];
}
// Otherwise, ask the context for the property.
return context.getDoubleProperty(variableName, Double.NaN);
}
@Override
public ToDoubleFunction<double[]> getFunction(String functionName) throws EvaluationException {
throw new EvaluationException("This context does not provide any functions.");
}
};
}