I am currently using the golang package github.com/Knetic/govaluate to evaluate formulas from database. Here is an example of a formula I am using in my database
expression, err := govaluate.NewEvaluableExpression("totalCost / .85"); // for markup
parameters := make(map[string]interface{})
parameters["cost"] = 9.99;
parameters["qty"] = 2;
parameters["markup"] = nil // totalCost / .85 (this formula above)
parameters["handlingCharge"] = nil // if(cost > 100, 25, cost * 0.1).
parameters["totalCost"] = nil // (cost * qty) + handlingCharge.
result, err := expression.Evaluate(parameters);
handlingCharge and totalCost are also formulas. There is no limit (except circular references) on formulas containing other formula fields. Think of it like excel formula referencing another formula field.
Instead of coding x amount of for loops to check if each required variable field has another variable field, how can I effectually work each required formula?
// expressions map
var expressionsMap = make(map[string]*govaluate.EvaluableExpression)
var requiredVariables = make(map[string][]string)
// for each table field
for publicID, formula := range fieldsMap {
// get expression into map
if formula != "" {
expression, err := govaluate.NewEvaluableExpressionWithFunctions(formula, functions)
if err != nil {
log.Println(err)
return nil, errInternalServerError
}
// save expression to expressions map
expressionsMap[publicID] = expression
// save required variables to a map of required variables
requiredVariables[publicID] = unique(expression.Vars())
}
}
For this simple example requiredVariables would be
requiredVariables['handlingCharge'] = ['cost']
requiredVariables['markup'] = ['totalCost']
requiredVariables['totalCost'] = ['cost', 'qty', 'handlingCharge']
In total markup requires totalCost and totalCost needs handlingCharge. How can I programmatically calculate these formulas? Thank you for the help.