f7
f7 is a spreadsheet formula execution library
git clone https://git.vogt.world/f7.git
Log | Files | README.md | LICENSE.md
← All files
name: src/main/java/io/protobase/f7/formulas/FormulaCaller.java
-rw-r--r--
11552
  1package io.protobase.f7.formulas;
  2
  3import com.google.common.collect.ImmutableMap;
  4import io.protobase.f7.errors.NameException;
  5import io.protobase.f7.formulas.info.ERRORTYPE;
  6import io.protobase.f7.formulas.info.ISBLANK;
  7import io.protobase.f7.formulas.info.ISERR;
  8import io.protobase.f7.formulas.info.ISERROR;
  9import io.protobase.f7.formulas.info.ISLOGICAL;
 10import io.protobase.f7.formulas.info.ISNA;
 11import io.protobase.f7.formulas.info.ISNONTEXT;
 12import io.protobase.f7.formulas.info.ISNUMBER;
 13import io.protobase.f7.formulas.info.ISTEXT;
 14import io.protobase.f7.formulas.info.N;
 15import io.protobase.f7.formulas.info.NA;
 16import io.protobase.f7.formulas.info.TYPE;
 17import io.protobase.f7.formulas.logic.AND;
 18import io.protobase.f7.formulas.logic.EQ;
 19import io.protobase.f7.formulas.logic.EXACT;
 20import io.protobase.f7.formulas.logic.FALSE;
 21import io.protobase.f7.formulas.logic.GT;
 22import io.protobase.f7.formulas.logic.GTE;
 23import io.protobase.f7.formulas.logic.IF;
 24import io.protobase.f7.formulas.logic.IFERROR;
 25import io.protobase.f7.formulas.logic.IFNA;
 26import io.protobase.f7.formulas.logic.LT;
 27import io.protobase.f7.formulas.logic.LTE;
 28import io.protobase.f7.formulas.logic.NE;
 29import io.protobase.f7.formulas.logic.NOT;
 30import io.protobase.f7.formulas.logic.OR;
 31import io.protobase.f7.formulas.logic.TRUE;
 32import io.protobase.f7.formulas.lookup.CHOOSE;
 33import io.protobase.f7.formulas.math.ABS;
 34import io.protobase.f7.formulas.math.ACOS;
 35import io.protobase.f7.formulas.math.ACOSH;
 36import io.protobase.f7.formulas.math.ACOT;
 37import io.protobase.f7.formulas.math.ACOTH;
 38import io.protobase.f7.formulas.math.ADD;
 39import io.protobase.f7.formulas.math.ASIN;
 40import io.protobase.f7.formulas.math.ASINH;
 41import io.protobase.f7.formulas.math.ATAN;
 42import io.protobase.f7.formulas.math.ATAN2;
 43import io.protobase.f7.formulas.math.ATANH;
 44import io.protobase.f7.formulas.math.COS;
 45import io.protobase.f7.formulas.math.COSH;
 46import io.protobase.f7.formulas.math.COT;
 47import io.protobase.f7.formulas.math.DIVIDE;
 48import io.protobase.f7.formulas.math.EVEN;
 49import io.protobase.f7.formulas.math.INT;
 50import io.protobase.f7.formulas.math.ISEVEN;
 51import io.protobase.f7.formulas.math.ISODD;
 52import io.protobase.f7.formulas.math.LN;
 53import io.protobase.f7.formulas.math.LOG;
 54import io.protobase.f7.formulas.math.LOG10;
 55import io.protobase.f7.formulas.math.MINUS;
 56import io.protobase.f7.formulas.math.MOD;
 57import io.protobase.f7.formulas.math.MULTIPLY;
 58import io.protobase.f7.formulas.math.ODD;
 59import io.protobase.f7.formulas.math.PI;
 60import io.protobase.f7.formulas.math.POW;
 61import io.protobase.f7.formulas.math.PRODUCT;
 62import io.protobase.f7.formulas.math.QUOTIENT;
 63import io.protobase.f7.formulas.math.RAND;
 64import io.protobase.f7.formulas.math.RANDBETWEEN;
 65import io.protobase.f7.formulas.math.ROUND;
 66import io.protobase.f7.formulas.math.ROUNDDOWN;
 67import io.protobase.f7.formulas.math.ROUNDUP;
 68import io.protobase.f7.formulas.math.SIGN;
 69import io.protobase.f7.formulas.math.SIN;
 70import io.protobase.f7.formulas.math.SINH;
 71import io.protobase.f7.formulas.math.SQRT;
 72import io.protobase.f7.formulas.math.SQRTPI;
 73import io.protobase.f7.formulas.math.SUM;
 74import io.protobase.f7.formulas.math.TAN;
 75import io.protobase.f7.formulas.math.TANH;
 76import io.protobase.f7.formulas.math.UMINUS;
 77import io.protobase.f7.formulas.math.UNARY_PERCENT;
 78import io.protobase.f7.formulas.math.UPLUS;
 79import io.protobase.f7.formulas.parser.TO_PERCENT;
 80import io.protobase.f7.formulas.parser.TO_TEXT;
 81import io.protobase.f7.formulas.statistical.AVEDEV;
 82import io.protobase.f7.formulas.statistical.AVERAGE;
 83import io.protobase.f7.formulas.statistical.AVERAGEA;
 84import io.protobase.f7.formulas.statistical.COUNT;
 85import io.protobase.f7.formulas.statistical.COUNTA;
 86import io.protobase.f7.formulas.statistical.COUNTBLANK;
 87import io.protobase.f7.formulas.statistical.MAX;
 88import io.protobase.f7.formulas.statistical.MAXA;
 89import io.protobase.f7.formulas.statistical.MIN;
 90import io.protobase.f7.formulas.statistical.MINA;
 91import io.protobase.f7.formulas.statistical.STDEV;
 92import io.protobase.f7.formulas.text.CONCAT;
 93import io.protobase.f7.formulas.text.CONCATENATE;
 94import io.protobase.f7.formulas.text.LEN;
 95import io.protobase.f7.formulas.text.T;
 96import io.protobase.f7.models.GridColumnRowKey;
 97
 98import java.util.function.BiFunction;
 99import java.util.function.Function;
100
101/**
102 * Static class for calling formulas by name.
103 */
104public class FormulaCaller {
105  private ImmutableMap<FormulaName, AbstractFormula> formulas;
106
107  public FormulaCaller(Function<Object, Object> lookup, BiFunction<GridColumnRowKey, Object, Object> collateralLookup) {
108    formulas = ImmutableMap.<FormulaName, AbstractFormula>builder()
109        .put(FormulaName.ERRORTYPE, new ERRORTYPE(lookup, collateralLookup))
110        .put(FormulaName.ISERR, new ISERR(lookup, collateralLookup))
111        .put(FormulaName.ISERROR, new ISERROR(lookup, collateralLookup))
112        .put(FormulaName.ISNA, new ISNA(lookup, collateralLookup))
113        .put(FormulaName.ISLOGICAL, new ISLOGICAL(lookup, collateralLookup))
114        .put(FormulaName.ISNONTEXT, new ISNONTEXT(lookup, collateralLookup))
115        .put(FormulaName.ISNUMBER, new ISNUMBER(lookup, collateralLookup))
116        .put(FormulaName.ISTEXT, new ISTEXT(lookup, collateralLookup))
117        .put(FormulaName.ISBLANK, new ISBLANK(lookup, collateralLookup))
118        .put(FormulaName.N, new N(lookup, collateralLookup))
119        .put(FormulaName.NA, new NA(lookup, collateralLookup))
120        .put(FormulaName.TYPE, new TYPE(lookup, collateralLookup))
121        .put(FormulaName.AND, new AND(lookup, collateralLookup))
122        .put(FormulaName.EQ, new EQ(lookup, collateralLookup))
123        .put(FormulaName.EXACT, new EXACT(lookup, collateralLookup))
124        .put(FormulaName.FALSE, FALSE.SELF)
125        .put(FormulaName.GT, new GT(lookup, collateralLookup))
126        .put(FormulaName.GTE, new GTE(lookup, collateralLookup))
127        .put(FormulaName.LT, new LT(lookup, collateralLookup))
128        .put(FormulaName.LTE, new LTE(lookup, collateralLookup))
129        .put(FormulaName.NE, new NE(lookup, collateralLookup))
130        .put(FormulaName.OR, new OR(lookup, collateralLookup))
131        .put(FormulaName.XOR, new OR(lookup, collateralLookup))
132        .put(FormulaName.NOT, new NOT(lookup, collateralLookup))
133        .put(FormulaName.IF, new IF(lookup, collateralLookup))
134        .put(FormulaName.IFERROR, new IFERROR(lookup, collateralLookup))
135        .put(FormulaName.IFNA, new IFNA(lookup, collateralLookup))
136        .put(FormulaName.TRUE, TRUE.SELF)
137        .put(FormulaName.DIVIDE, new DIVIDE(lookup, collateralLookup))
138        .put(FormulaName.QUOTIENT, new QUOTIENT(lookup, collateralLookup))
139        .put(FormulaName.MINUS, new MINUS(lookup, collateralLookup))
140        .put(FormulaName.MULTIPLY, new MULTIPLY(lookup, collateralLookup))
141        .put(FormulaName.MOD, new MOD(lookup, collateralLookup))
142        .put(FormulaName.INT, new INT(lookup, collateralLookup))
143        .put(FormulaName.ODD, new ODD(lookup, collateralLookup))
144        .put(FormulaName.EVEN, new EVEN(lookup, collateralLookup))
145        .put(FormulaName.SIGN, new SIGN(lookup, collateralLookup))
146        .put(FormulaName.PI, new PI(lookup, collateralLookup))
147        .put(FormulaName.ISODD, new ISODD(lookup, collateralLookup))
148        .put(FormulaName.ISEVEN, new ISEVEN(lookup, collateralLookup))
149        .put(FormulaName.POW, new POW(lookup, collateralLookup))
150        .put(FormulaName.POWER, new POW(lookup, collateralLookup))
151        .put(FormulaName.PRODUCT, new PRODUCT(lookup, collateralLookup))
152        .put(FormulaName.ADD, new ADD(lookup, collateralLookup))
153        .put(FormulaName.UNARY_PERCENT, new UNARY_PERCENT(lookup, collateralLookup))
154        .put(FormulaName.UMINUS, new UMINUS(lookup, collateralLookup))
155        .put(FormulaName.UPLUS, new UPLUS(lookup, collateralLookup))
156        .put(FormulaName.ABS, new ABS(lookup, collateralLookup))
157        .put(FormulaName.LN, new LN(lookup, collateralLookup))
158        .put(FormulaName.LOG, new LOG(lookup, collateralLookup))
159        .put(FormulaName.LOG10, new LOG10(lookup, collateralLookup))
160        .put(FormulaName.RAND, RAND.SELF)
161        .put(FormulaName.RANDBETWEEN, new RANDBETWEEN(lookup, collateralLookup))
162        .put(FormulaName.ROUND, new ROUND(lookup, collateralLookup))
163        .put(FormulaName.ROUNDUP, new ROUNDUP(lookup, collateralLookup))
164        .put(FormulaName.ROUNDDOWN, new ROUNDDOWN(lookup, collateralLookup))
165        .put(FormulaName.SUM, new SUM(lookup, collateralLookup))
166        .put(FormulaName.ASIN, new ASIN(lookup, collateralLookup))
167        .put(FormulaName.ASINH, new ASINH(lookup, collateralLookup))
168        .put(FormulaName.SIN, new SIN(lookup, collateralLookup))
169        .put(FormulaName.SINH, new SINH(lookup, collateralLookup))
170        .put(FormulaName.ACOS, new ACOS(lookup, collateralLookup))
171        .put(FormulaName.ACOSH, new ACOSH(lookup, collateralLookup))
172        .put(FormulaName.ACOT, new ACOT(lookup, collateralLookup))
173        .put(FormulaName.ACOTH, new ACOTH(lookup, collateralLookup))
174        .put(FormulaName.COS, new COS(lookup, collateralLookup))
175        .put(FormulaName.COSH, new COSH(lookup, collateralLookup))
176        .put(FormulaName.COT, new COT(lookup, collateralLookup))
177        .put(FormulaName.ATAN, new ATAN(lookup, collateralLookup))
178        .put(FormulaName.ATANH, new ATANH(lookup, collateralLookup))
179        .put(FormulaName.ATAN2, new ATAN2(lookup, collateralLookup))
180        .put(FormulaName.TAN, new TAN(lookup, collateralLookup))
181        .put(FormulaName.TANH, new TANH(lookup, collateralLookup))
182        .put(FormulaName.SQRT, new SQRT(lookup, collateralLookup))
183        .put(FormulaName.SQRTPI, new SQRTPI(lookup, collateralLookup))
184        .put(FormulaName.AVEDEV, new AVEDEV(lookup, collateralLookup))
185        .put(FormulaName.AVERAGE, new AVERAGE(lookup, collateralLookup))
186        .put(FormulaName.AVERAGEA, new AVERAGEA(lookup, collateralLookup))
187        .put(FormulaName.COUNT, new COUNT(lookup, collateralLookup))
188        .put(FormulaName.COUNTA, new COUNTA(lookup, collateralLookup))
189        .put(FormulaName.COUNTBLANK, new COUNTBLANK(lookup, collateralLookup))
190        .put(FormulaName.MAX, new MAX(lookup, collateralLookup))
191        .put(FormulaName.MAXA, new MAXA(lookup, collateralLookup))
192        .put(FormulaName.MIN, new MIN(lookup, collateralLookup))
193        .put(FormulaName.MINA, new MINA(lookup, collateralLookup))
194        .put(FormulaName.STDEV, new STDEV(lookup, collateralLookup))
195        .put(FormulaName.CONCAT, new CONCAT(lookup, collateralLookup))
196        .put(FormulaName.CONCATENATE, new CONCATENATE(lookup, collateralLookup))
197        .put(FormulaName.T, new T(lookup, collateralLookup))
198        .put(FormulaName.LEN, new LEN(lookup, collateralLookup))
199        .put(FormulaName.TO_PERCENT, new TO_PERCENT(lookup, collateralLookup))
200        .put(FormulaName.TO_TEXT, new TO_TEXT(lookup, collateralLookup))
201        .put(FormulaName.CHOOSE, new CHOOSE(lookup, collateralLookup))
202        .build();
203  }
204
205  /**
206   * Call a formula by name.
207   *
208   * @param origin    - origin cell that is calling this formula.
209   * @param name      - of formula.
210   * @param arguments - arguments to pass to formula.
211   * @return result of formula or return error.
212   */
213  public Object call(GridColumnRowKey origin, FormulaName name, Object... arguments) {
214    if (formulas.containsKey(name)) {
215      return formulas.get(name).apply(origin, arguments);
216    }
217    return new NameException(String.format("Unknown formula: '%s'.", name.getName()));
218  }
219}