You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2022/05/25 14:53:42 UTC
svn commit: r1901242 - in /poi/trunk/poi/src: main/java/org/apache/poi/ss/formula/functions/ test/java/org/apache/poi/ss/formula/functions/
Author: fanningpj
Date: Wed May 25 14:53:42 2022
New Revision: 1901242
URL: http://svn.apache.org/viewvc?rev=1901242&view=rev
Log:
support empty param for DCount
Modified:
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DCount.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DGet.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMax.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMin.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DStarRunner.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DSum.java
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java
poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDCount.java
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DCount.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DCount.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DCount.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DCount.java Wed May 25 14:53:42 2022
@@ -18,6 +18,7 @@
package org.apache.poi.ss.formula.functions;
import org.apache.poi.ss.formula.eval.NumberEval;
+import org.apache.poi.ss.formula.eval.NumericValueEval;
import org.apache.poi.ss.formula.eval.ValueEval;
/**
@@ -28,8 +29,10 @@ public final class DCount implements IDS
private int count;
@Override
- public boolean processMatch(ValueEval eval) {
- count++;
+ public boolean processMatch(ValueEval eval, String field) {
+ if (field == null || eval instanceof NumericValueEval) {
+ count++;
+ }
return true;
}
@@ -37,4 +40,9 @@ public final class DCount implements IDS
public ValueEval getResult() {
return new NumberEval(count);
}
+
+ @Override
+ public boolean allowEmptyMatchField() {
+ return true;
+ }
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DGet.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DGet.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DGet.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DGet.java Wed May 25 14:53:42 2022
@@ -31,7 +31,7 @@ public final class DGet implements IDSta
private ValueEval result;
@Override
- public boolean processMatch(ValueEval eval) {
+ public boolean processMatch(ValueEval eval, String field) {
if(result == null) // First match, just set the value.
{
result = eval;
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMax.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMax.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMax.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMax.java Wed May 25 14:53:42 2022
@@ -33,7 +33,7 @@ public final class DMax implements IDSta
private ValueEval maximumValue;
@Override
- public boolean processMatch(ValueEval eval) {
+ public boolean processMatch(ValueEval eval, String field) {
if(eval instanceof NumericValueEval) {
if(maximumValue == null) { // First match, just set the value.
maximumValue = eval;
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMin.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMin.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMin.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DMin.java Wed May 25 14:53:42 2022
@@ -33,7 +33,7 @@ public final class DMin implements IDSta
private ValueEval minimumValue;
@Override
- public boolean processMatch(ValueEval eval) {
+ public boolean processMatch(ValueEval eval, String field) {
if(eval instanceof NumericValueEval) {
if(minimumValue == null) { // First match, just set the value.
minimumValue = eval;
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DStarRunner.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DStarRunner.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DStarRunner.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DStarRunner.java Wed May 25 14:53:42 2022
@@ -80,7 +80,7 @@ public final class DStarRunner implement
this.algoType = algorithm;
}
- public final ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
+ public ValueEval evaluate(ValueEval[] args, int srcRowIndex, int srcColumnIndex) {
if(args.length == 3) {
return evaluate(srcRowIndex, srcColumnIndex, args[0], args[1], args[2]);
}
@@ -98,25 +98,31 @@ public final class DStarRunner implement
AreaEval db = (AreaEval)database;
AreaEval cdb = (AreaEval)conditionDatabase;
- try {
- filterColumn = OperandResolver.getSingleValue(filterColumn, srcRowIndex, srcColumnIndex);
- } catch (EvaluationException e) {
- return e.getErrorEval();
- }
+ // Create an algorithm runner.
+ final IDStarAlgorithm algorithm = algoType.newInstance();
- int fc;
+ int fc = -1;
+ String field = null;
try {
+ filterColumn = OperandResolver.getSingleValue(filterColumn, srcRowIndex, srcColumnIndex);
fc = getColumnForName(filterColumn, db);
- }
- catch (EvaluationException e) {
- return ErrorEval.VALUE_INVALID;
- }
- if(fc == -1) { // column not found
- return ErrorEval.VALUE_INVALID;
+ if (filterColumn instanceof StringEval) {
+ field = ((StringEval)filterColumn).getStringValue();
+ }
+ if(fc == -1 && !algorithm.allowEmptyMatchField()) {
+ // column not found
+ return ErrorEval.VALUE_INVALID;
+ }
+ } catch (EvaluationException e) {
+ if (!algorithm.allowEmptyMatchField()) {
+ return e.getErrorEval();
+ }
+ } catch (Exception e) {
+ if (!algorithm.allowEmptyMatchField()) {
+ return ErrorEval.VALUE_INVALID;
+ }
}
- // Create an algorithm runner.
- IDStarAlgorithm algorithm = algoType.newInstance();
// Iterate over all DB entries.
final int height = db.getHeight();
@@ -132,7 +138,7 @@ public final class DStarRunner implement
if(matches) {
ValueEval currentValueEval = resolveReference(db, row, fc);
// Pass the match to the algorithm and conditionally abort the search.
- boolean shouldContinue = algorithm.processMatch(currentValueEval);
+ boolean shouldContinue = algorithm.processMatch(currentValueEval, field);
if(! shouldContinue) {
break;
}
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DSum.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DSum.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DSum.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/DSum.java Wed May 25 14:53:42 2022
@@ -33,7 +33,7 @@ public final class DSum implements IDSta
private double totalValue = 0;
@Override
- public boolean processMatch(ValueEval eval) {
+ public boolean processMatch(ValueEval eval, String field) {
if(eval instanceof NumericValueEval) {
double currentValue = ((NumericValueEval)eval).getNumberValue();
totalValue += currentValue;
Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/functions/IDStarAlgorithm.java Wed May 25 14:53:42 2022
@@ -27,13 +27,24 @@ public interface IDStarAlgorithm {
/**
* Process a match that is found during a run through a database.
* @param eval ValueEval of the cell in the matching row. References will already be resolved.
+ * @param field the field name (added in POI 5.2.3)
* @return Whether we should continue iterating through the database.
*/
- boolean processMatch(ValueEval eval);
+ boolean processMatch(ValueEval eval, String field);
+
/**
* Return a result ValueEval that will be the result of the calculation.
* This is always called at the end of a run through the database.
* @return a ValueEval
*/
ValueEval getResult();
+
+ /**
+ * Whether the field value (the 2nd param in DCOUNT, DGET, etc.) can evaluate to empty. It
+ * is allowed to evaluate to empty for DCOUNT.
+ * @return whether the field value can evaluate to empty
+ */
+ default boolean allowEmptyMatchField() {
+ return false;
+ }
}
Modified: poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDCount.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDCount.java?rev=1901242&r1=1901241&r2=1901242&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDCount.java (original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDCount.java Wed May 25 14:53:42 2022
@@ -39,7 +39,8 @@ public class TestDCount {
try (HSSFWorkbook wb = initWorkbook1()) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100);
- assertDouble(fe, cell, "DCOUNT(A5:E11, \"Age\", A1:A2)", 3);
+ assertDouble(fe, cell, "DCOUNT(A5:E11,,A1:A2)", 3);
+ assertDouble(fe, cell, "DCOUNT(A5:E11, \"Age\", A1:A2)", 2);
//next one returns 0 in error
//assertDouble(fe, cell, "DCOUNT(A5:E11, \"Age\", A1:F2)", 1);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org