--- /dev/null
+package org.simantics.spreadsheet.graph.formula;\r
+\r
+import org.simantics.spreadsheet.graph.CellFormulaFunction;\r
+import org.simantics.spreadsheet.graph.CellValueVisitor;\r
+import org.simantics.spreadsheet.graph.SpreadsheetGraphUtils;\r
+import org.simantics.spreadsheet.graph.SpreadsheetMatrix;\r
+import org.simantics.spreadsheet.graph.parser.ast.AstArgList;\r
+\r
+class SumifFormulaFunction implements CellFormulaFunction<Object> {\r
+\r
+ @Override\r
+ public Object evaluate(CellValueVisitor visitor, AstArgList args) {\r
+ if (args.values.size() == 2) {\r
+ Object test = args.values.get(0).accept(visitor);\r
+ Object criteria = null;\r
+ try {\r
+ criteria = args.values.get(1).accept(visitor);\r
+ } catch (IllegalStateException e){\r
+ return 0;\r
+ }\r
+ FormulaError2 error = FormulaError2.forObject(criteria);\r
+ if(error!=null) return error.getString();\r
+ \r
+ if (test instanceof SpreadsheetMatrix) {\r
+ double sum = 0.0;\r
+ SpreadsheetMatrix tm = (SpreadsheetMatrix) test;\r
+ for (int i = 0; i < tm.values.length; i++) {\r
+ if (SpreadsheetGraphUtils.matchCriteria(tm.values[i], criteria)) {\r
+ double d = SpreadsheetGraphUtils.asNumber(tm.values[i]);\r
+ if (Double.isFinite(d))\r
+ sum += d;\r
+ }\r
+ }\r
+ return sum;\r
+ } else {\r
+ Double d = SpreadsheetGraphUtils.asNumber(test);\r
+ return d;\r
+ }\r
+ }\r
+\r
+ if (args.values.size() == 3) {\r
+ Object test = args.values.get(0).accept(visitor);\r
+ Object criteria = null;\r
+ try {\r
+ criteria = args.values.get(1).accept(visitor);\r
+ } catch (IllegalStateException e){\r
+ return 0;\r
+ }\r
+ FormulaError2 error = FormulaError2.forObject(criteria);\r
+ if(error!=null) return error.getString();\r
+ \r
+ Object range = args.values.get(2).accept(visitor);\r
+\r
+ if (test instanceof SpreadsheetMatrix) {\r
+ Double sum = 0.0;\r
+ SpreadsheetMatrix tm = (SpreadsheetMatrix) test;\r
+ SpreadsheetMatrix rm = (SpreadsheetMatrix) range;\r
+ for (int i = 0; i < tm.values.length; i++) {\r
+ if (SpreadsheetGraphUtils.matchCriteria(tm.values[i], criteria)) {\r
+ double d = SpreadsheetGraphUtils.asNumber(rm.values[i]);\r
+ if (Double.isFinite(d))\r
+ sum += d;\r
+ }\r
+ }\r
+ return sum;\r
+ } else {\r
+ Double d = SpreadsheetGraphUtils.asNumber(test);\r
+ return d;\r
+ }\r
+\r
+ }\r
+ throw new IllegalStateException();\r
+ }\r
+}
\ No newline at end of file