1 package org.simantics.spreadsheet.solver.formula;
3 import org.simantics.spreadsheet.SpreadsheetMatrix;
4 import org.simantics.spreadsheet.Spreadsheets;
5 import org.simantics.spreadsheet.solver.formula.parser.ast.AstArgList;
7 class SumifFormulaFunction implements CellFormulaFunction<Object> {
10 public Object evaluate(CellValueVisitor visitor, AstArgList args) {
11 if (args.values.size() == 2) {
12 Object test = args.values.get(0).accept(visitor);
13 Object criteria = null;
15 criteria = args.values.get(1).accept(visitor);
16 } catch (IllegalStateException e){
19 FormulaError2 error = FormulaError2.forObject(criteria);
20 if(error!=null) return error.getString();
22 if (test instanceof SpreadsheetMatrix) {
24 SpreadsheetMatrix tm = (SpreadsheetMatrix) test;
25 for (int i = 0; i < tm.values.length; i++) {
26 if (Spreadsheets.matchCriteria(tm.values[i], criteria)) {
27 double d = Spreadsheets.asNumber(tm.values[i]);
28 if (Double.isFinite(d))
34 Double d = Spreadsheets.asNumber(test);
39 if (args.values.size() == 3) {
40 Object test = args.values.get(0).accept(visitor);
41 Object criteria = null;
43 criteria = args.values.get(1).accept(visitor);
44 } catch (IllegalStateException e){
47 FormulaError2 error = FormulaError2.forObject(criteria);
48 if(error!=null) return error.getString();
50 Object range = args.values.get(2).accept(visitor);
52 if (test instanceof SpreadsheetMatrix) {
54 SpreadsheetMatrix tm = (SpreadsheetMatrix) test;
55 SpreadsheetMatrix rm = (SpreadsheetMatrix) range;
56 for (int i = 0; i < tm.values.length; i++) {
57 if (Spreadsheets.matchCriteria(tm.values[i], criteria)) {
58 double d = Spreadsheets.asNumber(rm.values[i]);
59 if (Double.isFinite(d))
65 Double d = Spreadsheets.asNumber(test);
70 throw new IllegalStateException();