X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.spreadsheet%2Fsrc%2Forg%2Fsimantics%2Fspreadsheet%2Fsolver%2Fformula%2FCountifFormulaFunction.java;fp=bundles%2Forg.simantics.spreadsheet%2Fsrc%2Forg%2Fsimantics%2Fspreadsheet%2Fsolver%2Fformula%2FCountifFormulaFunction.java;h=82a3ac16a2f5a8f1e3f5b0c09e46fb4055ee99ba;hb=c07a3818f0024e932a27eb85cbfd3f2291475a65;hp=0000000000000000000000000000000000000000;hpb=6c99e980d250fb9201aba93be7dcb1f55564dccd;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/CountifFormulaFunction.java b/bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/CountifFormulaFunction.java new file mode 100644 index 000000000..82a3ac16a --- /dev/null +++ b/bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/CountifFormulaFunction.java @@ -0,0 +1,31 @@ +package org.simantics.spreadsheet.solver.formula; + +import org.simantics.spreadsheet.SpreadsheetMatrix; +import org.simantics.spreadsheet.Spreadsheets; +import org.simantics.spreadsheet.solver.formula.parser.ast.AstArgList; +import org.simantics.spreadsheet.solver.formula.parser.ast.AstRange; + +public class CountifFormulaFunction implements CellFormulaFunction { + + @Override + public Integer evaluate(CellValueVisitor visitor, AstArgList args) { + if (args.values.size() != 2) throw new IllegalStateException(); + + AstRange range = (AstRange) args.values.get(0); + SpreadsheetMatrix matrix = (SpreadsheetMatrix) range.accept(visitor); + Object crit = null; + try { + crit = args.values.get(1).accept(visitor); + } catch (IllegalStateException e){ + return 0; + } + + String criteria = Spreadsheets.asString(crit); + int result = 0; + for (Object value : matrix.values) { + if (Spreadsheets.matchCriteria(value, criteria)) + result++; + } + return Integer.valueOf(result); + } +}