mirror of https://github.com/apache/poi.git
Bug 63700: Make D* functions work with numeric result column
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1872136 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3cc54a8dff
commit
821e164041
|
@ -54,13 +54,13 @@ public final class DStarRunner implements Function3Arg {
|
|||
/** @see DSum */
|
||||
DSUM(DSum::new),
|
||||
;
|
||||
|
||||
|
||||
private final Supplier<IDStarAlgorithm> implSupplier;
|
||||
|
||||
private DStarAlgorithmEnum(Supplier<IDStarAlgorithm> implSupplier) {
|
||||
DStarAlgorithmEnum(Supplier<IDStarAlgorithm> implSupplier) {
|
||||
this.implSupplier = implSupplier;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return a new function implementation instance
|
||||
*/
|
||||
|
@ -94,7 +94,7 @@ public final class DStarRunner implements Function3Arg {
|
|||
}
|
||||
AreaEval db = (AreaEval)database;
|
||||
AreaEval cdb = (AreaEval)conditionDatabase;
|
||||
|
||||
|
||||
try {
|
||||
filterColumn = OperandResolver.getSingleValue(filterColumn, srcRowIndex, srcColumnIndex);
|
||||
} catch (EvaluationException e) {
|
||||
|
@ -149,7 +149,7 @@ public final class DStarRunner implements Function3Arg {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param nameValueEval Must not be a RefEval or AreaEval. Thus make sure resolveReference() is called on the value first!
|
||||
* @param db Database
|
||||
|
@ -158,8 +158,17 @@ public final class DStarRunner implements Function3Arg {
|
|||
*/
|
||||
private static int getColumnForName(ValueEval nameValueEval, AreaEval db)
|
||||
throws EvaluationException {
|
||||
String name = OperandResolver.coerceValueToString(nameValueEval);
|
||||
return getColumnForString(db, name);
|
||||
if (nameValueEval instanceof NumericValueEval) {
|
||||
int columnNo = OperandResolver.coerceValueToInt(nameValueEval) - 1;
|
||||
if (columnNo < 0 || columnNo >= db.getWidth()) {
|
||||
return -1;
|
||||
}
|
||||
return columnNo;
|
||||
}
|
||||
else {
|
||||
String name = OperandResolver.coerceValueToString(nameValueEval);
|
||||
return getColumnForString(db, name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -169,10 +178,8 @@ public final class DStarRunner implements Function3Arg {
|
|||
* @param db Database.
|
||||
* @param name Column heading.
|
||||
* @return Corresponding column number.
|
||||
* @throws EvaluationException If it's not possible to turn all headings into strings.
|
||||
*/
|
||||
private static int getColumnForString(AreaEval db,String name)
|
||||
throws EvaluationException {
|
||||
private static int getColumnForString(AreaEval db,String name) {
|
||||
int resultColumn = -1;
|
||||
final int width = db.getWidth();
|
||||
for(int column = 0; column < width; ++column) {
|
||||
|
@ -216,10 +223,10 @@ public final class DStarRunner implements Function3Arg {
|
|||
// special column that accepts formulas.
|
||||
boolean columnCondition = true;
|
||||
ValueEval condition;
|
||||
|
||||
|
||||
// The condition to apply.
|
||||
condition = resolveReference(cdb, conditionRow, column);
|
||||
|
||||
|
||||
// If the condition is empty it matches.
|
||||
if(condition instanceof BlankEval)
|
||||
continue;
|
||||
|
@ -229,7 +236,7 @@ public final class DStarRunner implements Function3Arg {
|
|||
if(!(targetHeader instanceof StringValueEval)) {
|
||||
throw new EvaluationException(ErrorEval.VALUE_INVALID);
|
||||
}
|
||||
|
||||
|
||||
if (getColumnForName(targetHeader, db) == -1)
|
||||
// No column found, it's again a special column that accepts formulas.
|
||||
columnCondition = false;
|
||||
|
@ -269,7 +276,7 @@ public final class DStarRunner implements Function3Arg {
|
|||
throws EvaluationException {
|
||||
if(condition instanceof StringEval) {
|
||||
String conditionString = ((StringEval)condition).getStringValue();
|
||||
|
||||
|
||||
if(conditionString.startsWith("<")) { // It's a </<= condition.
|
||||
String number = conditionString.substring(1);
|
||||
if(number.startsWith("=")) {
|
||||
|
@ -378,7 +385,7 @@ public final class DStarRunner implements Function3Arg {
|
|||
}
|
||||
return false; // Can not be reached.
|
||||
}
|
||||
|
||||
|
||||
private static Double getNumberFromValueEval(ValueEval value) {
|
||||
if(value instanceof NumericValueEval) {
|
||||
return ((NumericValueEval)value).getNumberValue();
|
||||
|
@ -395,11 +402,11 @@ public final class DStarRunner implements Function3Arg {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resolve a ValueEval that's in an AreaEval.
|
||||
*
|
||||
* @param db AreaEval from which the cell to resolve is retrieved.
|
||||
* @param db AreaEval from which the cell to resolve is retrieved.
|
||||
* @param dbRow Relative row in the AreaEval.
|
||||
* @param dbCol Relative column in the AreaEval.
|
||||
* @return A ValueEval that is a NumberEval, StringEval, BoolEval, BlankEval or ErrorEval.
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue