]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/SumifFormulaFunction.java
Introduce new DiagramViewer.getRuntimeFromManager()
[simantics/platform.git] / bundles / org.simantics.spreadsheet / src / org / simantics / spreadsheet / solver / formula / SumifFormulaFunction.java
1 package org.simantics.spreadsheet.solver.formula;
2
3 import org.simantics.spreadsheet.SpreadsheetMatrix;
4 import org.simantics.spreadsheet.Spreadsheets;
5 import org.simantics.spreadsheet.solver.formula.parser.ast.AstArgList;
6
7 class SumifFormulaFunction implements CellFormulaFunction<Object> {
8
9     @Override
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;
14             try {
15                 criteria = args.values.get(1).accept(visitor);
16             } catch (IllegalStateException e){
17                 return 0;
18             }
19             FormulaError2 error = FormulaError2.forObject(criteria);
20             if(error!=null) return error.getString();
21
22             if (test instanceof SpreadsheetMatrix) {
23                 double sum = 0.0;
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))
29                             sum += d;
30                     }
31                 }
32                 return sum;
33             } else {
34                 Double d = Spreadsheets.asNumber(test);
35                 return d;
36             }
37         }
38
39         if (args.values.size() == 3) {
40             Object test = args.values.get(0).accept(visitor);
41             Object criteria = null;
42             try {
43                 criteria = args.values.get(1).accept(visitor);
44             } catch (IllegalStateException e){
45                 return 0;
46             }
47             FormulaError2 error = FormulaError2.forObject(criteria);
48             if(error!=null) return error.getString();
49
50             Object range = args.values.get(2).accept(visitor);
51
52             if (test instanceof SpreadsheetMatrix) {
53                 Double sum = 0.0;
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))
60                             sum += d;
61                     }
62                 }
63                 return sum;
64             } else {
65                 Double d = Spreadsheets.asNumber(test);
66                 return d;
67             }
68
69         }
70         throw new IllegalStateException();
71     }
72 }