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 15:54:29 UTC

svn commit: r1901250 - 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 15:54:29 2022
New Revision: 1901250

URL: http://svn.apache.org/viewvc?rev=1901250&view=rev
Log:
DStar functions need to support field params provided as numbers as well as field names

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
    poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDGet.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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -29,8 +29,8 @@ public final class DCount implements IDS
     private int count;
 
     @Override
-    public boolean processMatch(ValueEval eval, String field) {
-        if (field == null || eval instanceof NumericValueEval) {
+    public boolean processMatch(ValueEval eval, int fieldNumber) {
+        if (fieldNumber < 0 || eval instanceof NumericValueEval) {
             count++;
         }
         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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -31,7 +31,7 @@ public final class DGet implements IDSta
     private ValueEval result;
 
     @Override
-    public boolean processMatch(ValueEval eval, String field) {
+    public boolean processMatch(ValueEval eval, int fieldNumber) {
         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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -33,7 +33,7 @@ public final class DMax implements IDSta
     private ValueEval maximumValue;
 
     @Override
-    public boolean processMatch(ValueEval eval, String field) {
+    public boolean processMatch(ValueEval eval, int fieldNumber) {
         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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -33,7 +33,7 @@ public final class DMin implements IDSta
     private ValueEval minimumValue;
 
     @Override
-    public boolean processMatch(ValueEval eval, String field) {
+    public boolean processMatch(ValueEval eval, int fieldNumber) {
         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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -104,12 +104,13 @@ public final class DStarRunner implement
         final IDStarAlgorithm algorithm = algoType.newInstance();
 
         int fc = -1;
-        String field = null;
         try {
             filterColumn = OperandResolver.getSingleValue(filterColumn, srcRowIndex, srcColumnIndex);
-            fc = getColumnForName(filterColumn, db);
-            if (filterColumn instanceof StringEval) {
-                field = ((StringEval)filterColumn).getStringValue();
+            if (filterColumn instanceof NumericValueEval) {
+                //fc is zero based while Excel uses 1 based column numbering
+                fc = (int) Math.round(((NumericValueEval)filterColumn).getNumberValue()) - 1;
+            } else {
+                fc = getColumnForName(filterColumn, db);
             }
             if(fc == -1 && !algorithm.allowEmptyMatchField()) {
                 // column not found
@@ -140,7 +141,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, field);
+                boolean shouldContinue = algorithm.processMatch(currentValueEval, fc);
                 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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -33,7 +33,7 @@ public final class DSum implements IDSta
     private double totalValue = 0;
 
     @Override
-    public boolean processMatch(ValueEval eval, String field) {
+    public boolean processMatch(ValueEval eval, int fieldNumber) {
         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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -27,10 +27,10 @@ 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)
+     * @param fieldNumber the field number (added in POI 5.2.3)
      * @return Whether we should continue iterating through the database.
      */
-    boolean processMatch(ValueEval eval, String field);
+    boolean processMatch(ValueEval eval, int fieldNumber);
 
     /**
      * Return a result ValueEval that will be the result of the calculation.

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=1901250&r1=1901249&r2=1901250&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 15:54:29 2022
@@ -42,6 +42,7 @@ public class TestDCount {
             assertDouble(fe, cell, "DCOUNT(A5:E11,,A1:A2)", 3);
             assertDouble(fe, cell, "DCOUNT(A5:E11, \"Age\", A1:A2)", 2);
             assertDouble(fe, cell, "DCOUNT(A5:E11, \"Age\", A1:F2)", 1);
+            assertDouble(fe, cell, "DCOUNT(A5:E11, 3, A1:F2)", 1);
         }
     }
 

Modified: poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDGet.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDGet.java?rev=1901250&r1=1901249&r2=1901250&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDGet.java (original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/ss/formula/functions/TestDGet.java Wed May 25 15:54:29 2022
@@ -43,6 +43,7 @@ public class TestDGet {
             HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100);
             assertError(fe, cell, "DGET(A5:E11, \"Yield\", A1:A3)", FormulaError.NUM);
             assertDouble(fe, cell, "DGET(A5:E11, \"Yield\", A1:F3)", 10);
+            assertDouble(fe, cell, "DGET(A5:E11, 4, A1:F3)", 10);
         }
     }
 
@@ -52,6 +53,7 @@ public class TestDGet {
             HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
             HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(100);
             assertDouble(fe, cell, "DGET(A5:E11, \"Yield\", A1:F3)", 6);
+            assertDouble(fe, cell, "DGET(A5:E11, 4, A1:F3)", 6);
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org