]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/formula/GeomeanFormulaFunction.java
88689850182c092bea261137a65df23b591dbc9e
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / formula / GeomeanFormulaFunction.java
1 package org.simantics.spreadsheet.graph.formula;
2
3 import org.simantics.spreadsheet.graph.CellFormulaFunction;
4 import org.simantics.spreadsheet.graph.CellValueVisitor;
5 import org.simantics.spreadsheet.graph.SpreadsheetGraphUtils;
6 import org.simantics.spreadsheet.graph.SpreadsheetMatrix;
7 import org.simantics.spreadsheet.graph.parser.ast.AstArgList;
8 import org.simantics.spreadsheet.graph.parser.ast.AstValue;
9
10 public class GeomeanFormulaFunction implements CellFormulaFunction<Object> {
11
12     @Override
13     public Object evaluate(CellValueVisitor visitor, AstArgList args) {
14         if (args.values.size() == 0)
15             throw new IllegalStateException();
16         double result = 1.0;
17         double count = 0.0;
18         for (AstValue value : args.values){
19                 Object r = value.accept(visitor);
20                 if (r instanceof SpreadsheetMatrix) {
21               Object v = ((SpreadsheetMatrix) r).productWithFormulaError();
22               if(v instanceof String) return v;
23               double dval = ((Number)v).doubleValue();
24               if(dval!=0.0){
25                   result = result*dval;
26                   count += ((SpreadsheetMatrix) r).countOfActualDoubleValues();
27               }
28                 } else {
29                                 FormulaError2 error = FormulaError2.forObject(r);
30                                 if(error!=null) return error.getString();
31                         
32                                 Number vNum = SpreadsheetGraphUtils.asValidNumber(r);
33                                 Double v = null;
34                                 if(vNum!=null) v = vNum.doubleValue();
35                                 
36                         if(v!=null){
37                                 if(v<=0) return FormulaError2.NUM.getString();
38                                 result = result*v;
39                                 count++;
40                         }
41                 }
42         }
43         if(result==0.0 || count==0.0) return FormulaError2.NUM.getString();
44         return Double.valueOf(Math.pow(result, (1.0/count)));
45     }
46
47 }