github.com/TIBCOSoftware/flogo-lib@v0.5.9/core/mapper/exprmapper/expression/expr/expr.go (about)

     1  package expr
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"reflect"
     7  
     8  	"fmt"
     9  
    10  	"github.com/TIBCOSoftware/flogo-lib/core/data"
    11  	"github.com/TIBCOSoftware/flogo-lib/core/mapper/exprmapper/ref"
    12  	"github.com/TIBCOSoftware/flogo-lib/logger"
    13  )
    14  
    15  var log = logger.GetLogger("expr")
    16  
    17  const (
    18  	OR             = "||"
    19  	AND            = "&&"
    20  	EQ             = "=="
    21  	NOT_EQ         = "!="
    22  	GT             = ">"
    23  	LT             = "<"
    24  	GTE            = ">="
    25  	LTE            = "<="
    26  	ADDITION       = "+"
    27  	SUBTRACTION    = "-"
    28  	MULTIPLICATION = "*"
    29  	DIVIDE         = "/"
    30  	MODE           = "%"
    31  )
    32  
    33  type Expr interface {
    34  	EvalWithScope(inputScope data.Scope, resolver data.Resolver) (interface{}, error)
    35  	Eval() (interface{}, error)
    36  	EvalWithData(value interface{}, inputScope data.Scope, resolver data.Resolver) (interface{}, error)
    37  }
    38  
    39  type Expression struct {
    40  	Left     Expr   `json:"left"`
    41  	Operator string `json:"operator"`
    42  	Right    Expr   `json:"right"`
    43  	Value    Expr   `json:"value"`
    44  }
    45  
    46  func (e *Expression) IsNil() bool {
    47  	if e.Left == nil && e.Right == nil {
    48  		return true
    49  	}
    50  	return false
    51  }
    52  
    53  type TernaryExpression struct {
    54  	First  Expr
    55  	Second Expr
    56  	Third  Expr
    57  }
    58  
    59  func (t *TernaryExpression) EvalWithScope(inputScope data.Scope, resolver data.Resolver) (interface{}, error) {
    60  	return t.EvalWithData(nil, inputScope, resolver)
    61  }
    62  
    63  func (t *TernaryExpression) Eval() (interface{}, error) {
    64  	return t.EvalWithScope(nil, data.GetBasicResolver())
    65  }
    66  
    67  func (t *TernaryExpression) EvalWithData(value interface{}, inputScope data.Scope, resolver data.Resolver) (interface{}, error) {
    68  	v, err := t.HandleParameter(t.First, value, inputScope, resolver)
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  	if v.(bool) {
    73  		v2, err2 := t.HandleParameter(t.Second, value, inputScope, resolver)
    74  		if err2 != nil {
    75  			return nil, err2
    76  		}
    77  		return v2, nil
    78  	} else {
    79  		v3, err3 := t.HandleParameter(t.Third, value, inputScope, resolver)
    80  		if err3 != nil {
    81  			return nil, err3
    82  		}
    83  		return v3, nil
    84  	}
    85  }
    86  
    87  func (t *TernaryExpression) HandleParameter(param interface{}, value interface{}, inputScope data.Scope, resolver data.Resolver) (interface{}, error) {
    88  	var firstValue interface{}
    89  	switch t := param.(type) {
    90  	case Expr:
    91  		vss, err := t.EvalWithData(value, inputScope, resolver)
    92  		if err != nil {
    93  			return nil, err
    94  		}
    95  		firstValue = vss
    96  		return firstValue, nil
    97  	case *ref.ArrayRef:
    98  		return handleArrayRef(value, t.GetRef(), inputScope, resolver)
    99  	case *ref.MappingRef:
   100  		return t.Eval(inputScope, resolver)
   101  	default:
   102  		firstValue = t
   103  		return firstValue, nil
   104  	}
   105  }
   106  
   107  func handleArrayRef(edata interface{}, mapref string, inputScope data.Scope, resolver data.Resolver) (interface{}, error) {
   108  	if edata == nil {
   109  		v, err := ref.NewMappingRef(mapref).Eval(inputScope, resolver)
   110  		if err != nil {
   111  			log.Errorf("Mapping ref eva error [%s]", err.Error())
   112  			return nil, fmt.Errorf("Mapping ref eva error [%s]", err.Error())
   113  		}
   114  		return v, nil
   115  	} else {
   116  		arrayRef := ref.NewArrayRef(mapref)
   117  		v, err := arrayRef.EvalFromData(edata)
   118  		if err != nil {
   119  			log.Errorf("Mapping ref eva error [%s]", err.Error())
   120  			return nil, fmt.Errorf("Mapping ref eva error [%s]", err.Error())
   121  		}
   122  		return v, nil
   123  	}
   124  }
   125  
   126  func (e *Expression) String() string {
   127  	v, err := json.Marshal(e)
   128  	if err != nil {
   129  		log.Errorf("Expression to string error [%s]", err.Error())
   130  		return ""
   131  	}
   132  	return string(v)
   133  }
   134  
   135  func NewExpression() *Expression {
   136  	return &Expression{}
   137  }
   138  
   139  func (f *Expression) Eval() (interface{}, error) {
   140  	return f.evaluate(nil, nil, nil)
   141  }
   142  
   143  func (f *Expression) EvalWithScope(inputScope data.Scope, resolver data.Resolver) (interface{}, error) {
   144  	return f.evaluate(nil, inputScope, resolver)
   145  }
   146  
   147  func (f *Expression) EvalWithData(data interface{}, inputScope data.Scope, resolver data.Resolver) (interface{}, error) {
   148  	return f.evaluate(data, inputScope, resolver)
   149  }
   150  
   151  func (f *Expression) evaluate(data interface{}, inputScope data.Scope, resolver data.Resolver) (interface{}, error) {
   152  	//Left
   153  	if f.IsNil() {
   154  		log.Debugf("Expression right and left are nil, return value directly")
   155  		return f.Value.EvalWithData(data, inputScope, resolver)
   156  	}
   157  
   158  	var leftValue interface{}
   159  	var rightValue interface{}
   160  
   161  	if f.Left != nil {
   162  		leftResultChan := make(chan interface{}, 1)
   163  		go do(f.Left, data, inputScope, resolver, leftResultChan)
   164  		leftValue = <-leftResultChan
   165  	}
   166  
   167  	if f.Right != nil {
   168  		rightResultChan := make(chan interface{}, 1)
   169  		go do(f.Right, data, inputScope, resolver, rightResultChan)
   170  		rightValue = <-rightResultChan
   171  	}
   172  
   173  	//Make sure no error returned
   174  	switch leftValue.(type) {
   175  	case error:
   176  		return nil, leftValue.(error)
   177  	}
   178  
   179  	switch rightValue.(type) {
   180  	case error:
   181  		return nil, rightValue.(error)
   182  	}
   183  	//Operator
   184  	operator := f.Operator
   185  
   186  	return f.run(leftValue, operator, rightValue)
   187  }
   188  
   189  func do(f Expr, edata interface{}, inputScope data.Scope, resolver data.Resolver, resultChan chan interface{}) {
   190  	if f == nil {
   191  		resultChan <- nil
   192  	}
   193  	leftValue, err := f.EvalWithData(edata, inputScope, resolver)
   194  	if err != nil {
   195  		resultChan <- errors.New("Eval left expression error: " + err.Error())
   196  	}
   197  	resultChan <- leftValue
   198  }
   199  
   200  func (f *Expression) run(left interface{}, op string, right interface{}) (interface{}, error) {
   201  	switch op {
   202  	case EQ:
   203  		return equals(left, right)
   204  	case OR:
   205  		return or(left, right)
   206  	case AND:
   207  		return and(left, right)
   208  	case NOT_EQ:
   209  		return notEquals(left, right)
   210  	case GT:
   211  		return gt(left, right, false)
   212  	case LT:
   213  		return lt(left, right, false)
   214  	case GTE:
   215  		return gt(left, right, true)
   216  	case LTE:
   217  		return lt(left, right, true)
   218  	case ADDITION:
   219  		return additon(left, right)
   220  	case SUBTRACTION:
   221  		return sub(left, right)
   222  	case MULTIPLICATION:
   223  		return multiplication(left, right)
   224  	case DIVIDE:
   225  		return div(left, right)
   226  	case MODE:
   227  		return mod(left, right)
   228  	default:
   229  		return nil, errors.New("Unknow operator " + op)
   230  	}
   231  
   232  	return nil, nil
   233  
   234  }
   235  
   236  func equals(left interface{}, right interface{}) (bool, error) {
   237  	log.Debugf("Equals condition -> left expression value %+v, right expression value %+v", left, right)
   238  	if left == nil && right == nil {
   239  		return true, nil
   240  	} else if left == nil && right != nil {
   241  		return false, nil
   242  	} else if left != nil && right == nil {
   243  		return false, nil
   244  	}
   245  
   246  	leftValue, rightValue, err := ConvertToSameType(left, right)
   247  	if err != nil {
   248  		return false, err
   249  	}
   250  
   251  	log.Debugf("Equals condition -> right expression value [%s]", rightValue)
   252  
   253  	return leftValue == rightValue, nil
   254  }
   255  
   256  func ConvertToSameType(left interface{}, right interface{}) (interface{}, interface{}, error) {
   257  	if left == nil || right == nil {
   258  		return left, right, nil
   259  	}
   260  	var leftValue interface{}
   261  	var rightValue interface{}
   262  	var err error
   263  	switch t := left.(type) {
   264  	case int:
   265  		if isDoubleType(right) {
   266  			leftValue, err = data.CoerceToDouble(left)
   267  			if err != nil {
   268  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   269  			}
   270  			rightValue = right
   271  		} else {
   272  			rightValue, err = data.CoerceToInteger(right)
   273  			if err != nil {
   274  				err = fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   275  			}
   276  			leftValue = t
   277  		}
   278  
   279  	case int64:
   280  		if isDoubleType(right) {
   281  			leftValue, err = data.CoerceToDouble(left)
   282  			if err != nil {
   283  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   284  			}
   285  			rightValue = right
   286  		} else {
   287  			rightValue, err = data.CoerceToInteger(right)
   288  			if err != nil {
   289  				err = fmt.Errorf("Convert right expression to type int64 failed, due to %s", err.Error())
   290  			}
   291  			leftValue = t
   292  		}
   293  	case float64:
   294  		rightValue, err = data.CoerceToNumber(right)
   295  		if err != nil {
   296  			err = fmt.Errorf("Convert right expression to type float64 failed, due to %s", err.Error())
   297  		}
   298  		leftValue = t
   299  	case string:
   300  		rightValue, err = data.CoerceToString(right)
   301  		if err != nil {
   302  			err = fmt.Errorf("Convert right expression to type string failed, due to %s", err.Error())
   303  		}
   304  		leftValue = t
   305  
   306  	case bool:
   307  		rightValue, err = data.CoerceToBoolean(right)
   308  		if err != nil {
   309  			err = fmt.Errorf("Convert right expression to type boolean failed, due to %s", err.Error())
   310  		}
   311  		leftValue = t
   312  
   313  	case json.Number:
   314  		rightValue, err = data.CoerceToLong(right)
   315  		if err != nil {
   316  			err = fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   317  		}
   318  
   319  		leftValue, err = data.CoerceToLong(left)
   320  		if err != nil {
   321  			err = fmt.Errorf("Convert left expression to type long failed, due to %s", err.Error())
   322  		}
   323  	default:
   324  		err = fmt.Errorf("Unsupport type to compare now")
   325  	}
   326  	return leftValue, rightValue, err
   327  
   328  }
   329  
   330  func notEquals(left interface{}, right interface{}) (bool, error) {
   331  
   332  	log.Debugf("Not equals condition -> left expression value %+v, right expression value %+v", left, right)
   333  	if left == nil && right == nil {
   334  		return false, nil
   335  	} else if left == nil && right != nil {
   336  		return true, nil
   337  	} else if left != nil && right == nil {
   338  		return true, nil
   339  	}
   340  
   341  	leftValue, rightValue, err := ConvertToSameType(left, right)
   342  	if err != nil {
   343  		return false, err
   344  	}
   345  
   346  	log.Debugf("Not equals condition -> right expression value [%s]", rightValue)
   347  
   348  	return leftValue != rightValue, nil
   349  
   350  }
   351  
   352  func gt(left interface{}, right interface{}, includeEquals bool) (bool, error) {
   353  
   354  	log.Debugf("Greater than condition -> left expression value %+v, right expression value %+v", left, right)
   355  	if left == nil && right == nil {
   356  		return false, nil
   357  	} else if left == nil && right != nil {
   358  		return false, nil
   359  	} else if left != nil && right == nil {
   360  		return false, nil
   361  	}
   362  
   363  	log.Debugf("Greater than condition -> left value [%+v] and Right value: [%+v]", left, right)
   364  	rightType := getType(right)
   365  	switch le := left.(type) {
   366  	case int:
   367  		//For int float compare, convert int to float to compare
   368  		if isDoubleType(right) {
   369  			leftValue, err := data.CoerceToDouble(left)
   370  			if err != nil {
   371  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   372  			}
   373  			rightValue := right.(float64)
   374  			if includeEquals {
   375  				return leftValue >= rightValue, nil
   376  
   377  			} else {
   378  				return leftValue > rightValue, nil
   379  			}
   380  
   381  		} else {
   382  			//We should conver to int first
   383  			rightValue, err := data.CoerceToInteger(right)
   384  			if err != nil {
   385  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   386  			}
   387  			if includeEquals {
   388  				return le >= rightValue, nil
   389  
   390  			} else {
   391  				return le > rightValue, nil
   392  			}
   393  		}
   394  
   395  	case int64:
   396  		if isDoubleType(right) {
   397  			leftValue, err := data.CoerceToDouble(left)
   398  			if err != nil {
   399  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   400  			}
   401  			rightValue := right.(float64)
   402  			if includeEquals {
   403  				return leftValue >= rightValue, nil
   404  
   405  			} else {
   406  				return leftValue > rightValue, nil
   407  			}
   408  
   409  		} else {
   410  			rightValue, err := data.CoerceToInteger(right)
   411  			if err != nil {
   412  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   413  			}
   414  			if includeEquals {
   415  				return int(le) >= rightValue, nil
   416  
   417  			} else {
   418  				return int(le) > rightValue, nil
   419  			}
   420  		}
   421  	case float64:
   422  		rightValue, err := data.CoerceToNumber(right)
   423  		if err != nil {
   424  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   425  		}
   426  		if includeEquals {
   427  			return le >= rightValue, nil
   428  
   429  		} else {
   430  			return le > rightValue, nil
   431  		}
   432  	case string, json.Number:
   433  		//In case of string, convert to number and compare
   434  		rightValue, err := data.CoerceToLong(right)
   435  		if err != nil {
   436  			return false, fmt.Errorf("Convert right expression to type int64 failed, due to %s", err.Error())
   437  		}
   438  
   439  		leftValue, err := data.CoerceToLong(left)
   440  		if err != nil {
   441  			return false, fmt.Errorf("Convert left expression to type int64 failed, due to %s", err.Error())
   442  		}
   443  
   444  		if includeEquals {
   445  			return leftValue >= rightValue, nil
   446  
   447  		} else {
   448  			return leftValue > rightValue, nil
   449  		}
   450  	default:
   451  		return false, errors.New(fmt.Sprintf("Unknow type use to greater than, left [%s] and right [%s] ", getType(left).String(), rightType.String()))
   452  	}
   453  
   454  	return false, nil
   455  }
   456  
   457  func lt(left interface{}, right interface{}, includeEquals bool) (bool, error) {
   458  
   459  	log.Debugf("Less than condition -> left expression value %+v, right expression value %+v", left, right)
   460  	if left == nil && right == nil {
   461  		return false, nil
   462  	} else if left == nil && right != nil {
   463  		return false, nil
   464  	} else if left != nil && right == nil {
   465  		return false, nil
   466  	}
   467  
   468  	switch le := left.(type) {
   469  	case int:
   470  		if isDoubleType(right) {
   471  			leftValue, err := data.CoerceToDouble(left)
   472  			if err != nil {
   473  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   474  			}
   475  			rightValue := right.(float64)
   476  			if includeEquals {
   477  				return leftValue <= rightValue, nil
   478  
   479  			} else {
   480  				return leftValue < rightValue, nil
   481  			}
   482  		} else {
   483  			rightValue, err := data.CoerceToInteger(right)
   484  			if err != nil {
   485  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   486  			}
   487  			if includeEquals {
   488  				return le <= rightValue, nil
   489  
   490  			} else {
   491  				return le < rightValue, nil
   492  			}
   493  		}
   494  	case int64:
   495  		if isDoubleType(right) {
   496  			leftValue, err := data.CoerceToDouble(left)
   497  			if err != nil {
   498  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   499  			}
   500  			rightValue := right.(float64)
   501  			if includeEquals {
   502  				return leftValue <= rightValue, nil
   503  
   504  			} else {
   505  				return leftValue < rightValue, nil
   506  			}
   507  		} else {
   508  			rightValue, err := data.CoerceToInteger(right)
   509  			if err != nil {
   510  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   511  			}
   512  			if includeEquals {
   513  				return int(le) <= rightValue, nil
   514  
   515  			} else {
   516  				return int(le) < rightValue, nil
   517  			}
   518  		}
   519  	case float64:
   520  		rightValue, err := data.CoerceToNumber(right)
   521  		if err != nil {
   522  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   523  		}
   524  		if includeEquals {
   525  			return le <= rightValue, nil
   526  
   527  		} else {
   528  			return le < rightValue, nil
   529  		}
   530  	case string, json.Number:
   531  		//In case of string, convert to number and compare
   532  		rightValue, err := data.CoerceToLong(right)
   533  		if err != nil {
   534  			return false, fmt.Errorf("Convert right expression to type int64 failed, due to %s", err.Error())
   535  		}
   536  
   537  		leftValue, err := data.CoerceToLong(left)
   538  		if err != nil {
   539  			return false, fmt.Errorf("Convert left expression to type int64 failed, due to %s", err.Error())
   540  		}
   541  
   542  		if includeEquals {
   543  			return leftValue <= rightValue, nil
   544  
   545  		} else {
   546  			return leftValue < rightValue, nil
   547  		}
   548  	default:
   549  		return false, errors.New(fmt.Sprintf("Unknow type use to <, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   550  	}
   551  
   552  	return false, nil
   553  }
   554  
   555  func and(left interface{}, right interface{}) (bool, error) {
   556  
   557  	log.Debugf("And condition -> left expression value %+v, right expression value %+v", left, right)
   558  
   559  	switch le := left.(type) {
   560  	case bool:
   561  		rightValue, err := data.CoerceToBoolean(right)
   562  		if err != nil {
   563  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   564  		}
   565  		return le && rightValue, nil
   566  	default:
   567  		return false, errors.New(fmt.Sprintf("Unknow type use to &&, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   568  	}
   569  
   570  	return false, nil
   571  }
   572  
   573  func or(left interface{}, right interface{}) (bool, error) {
   574  
   575  	log.Debugf("Or condition -> left expression value %+v, right expression value %+v", left, right)
   576  	switch le := left.(type) {
   577  	case bool:
   578  		rightValue, err := data.CoerceToBoolean(right)
   579  		if err != nil {
   580  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   581  		}
   582  		return le || rightValue, nil
   583  	default:
   584  		return false, errors.New(fmt.Sprintf("Unknow type use to ||, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   585  	}
   586  
   587  	return false, nil
   588  }
   589  
   590  func additon(left interface{}, right interface{}) (interface{}, error) {
   591  
   592  	log.Debugf("Addition condition -> left expression value %+v, right expression value %+v", left, right)
   593  	if left == nil && right == nil {
   594  		return false, nil
   595  	} else if left == nil && right != nil {
   596  		return false, nil
   597  	} else if left != nil && right == nil {
   598  		return false, nil
   599  	}
   600  
   601  	switch le := left.(type) {
   602  	case int:
   603  		if isDoubleType(right) {
   604  			leftValue, err := data.CoerceToDouble(left)
   605  			if err != nil {
   606  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   607  			}
   608  			rightValue := right.(float64)
   609  			return leftValue + rightValue, nil
   610  		} else {
   611  			rightValue, err := data.CoerceToInteger(right)
   612  			if err != nil {
   613  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   614  			}
   615  
   616  			return le + rightValue, nil
   617  		}
   618  
   619  	case int64:
   620  		if isDoubleType(right) {
   621  			leftValue, err := data.CoerceToDouble(left)
   622  			if err != nil {
   623  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   624  			}
   625  			rightValue := right.(float64)
   626  			return leftValue + rightValue, nil
   627  		} else {
   628  			rightValue, err := data.CoerceToInteger(right)
   629  			if err != nil {
   630  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   631  			}
   632  			return int(le) + rightValue, nil
   633  		}
   634  	case float64:
   635  		rightValue, err := data.CoerceToNumber(right)
   636  		if err != nil {
   637  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   638  		}
   639  		return le + rightValue, nil
   640  	case json.Number:
   641  		rightValue, err := data.CoerceToLong(right)
   642  		if err != nil {
   643  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   644  		}
   645  
   646  		leftValue, err := data.CoerceToLong(left)
   647  		if err != nil {
   648  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   649  		}
   650  
   651  		return leftValue * rightValue, nil
   652  	default:
   653  		return false, errors.New(fmt.Sprintf("Unknow type use to additon, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   654  	}
   655  
   656  	return false, nil
   657  }
   658  
   659  func sub(left interface{}, right interface{}) (interface{}, error) {
   660  
   661  	log.Debugf("Sub condition -> left expression value %+v, right expression value %+v", left, right)
   662  	if left == nil && right == nil {
   663  		return false, nil
   664  	} else if left == nil && right != nil {
   665  		return false, nil
   666  	} else if left != nil && right == nil {
   667  		return false, nil
   668  	}
   669  
   670  	switch le := left.(type) {
   671  	case int:
   672  		if isDoubleType(right) {
   673  			leftValue, err := data.CoerceToDouble(left)
   674  			if err != nil {
   675  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   676  			}
   677  			rightValue := right.(float64)
   678  			return leftValue - rightValue, nil
   679  		} else {
   680  			rightValue, err := data.CoerceToInteger(right)
   681  			if err != nil {
   682  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   683  			}
   684  			return le - rightValue, nil
   685  		}
   686  	case int64:
   687  		if isDoubleType(right) {
   688  			leftValue, err := data.CoerceToDouble(left)
   689  			if err != nil {
   690  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   691  			}
   692  			rightValue := right.(float64)
   693  			return leftValue - rightValue, nil
   694  		} else {
   695  			rightValue, err := data.CoerceToInteger(right)
   696  			if err != nil {
   697  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   698  			}
   699  			return int(le) - rightValue, nil
   700  		}
   701  	case float64:
   702  		rightValue, err := data.CoerceToNumber(right)
   703  		if err != nil {
   704  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   705  		}
   706  
   707  		return le - rightValue, nil
   708  	case json.Number:
   709  		rightValue, err := data.CoerceToLong(right)
   710  		if err != nil {
   711  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   712  		}
   713  
   714  		leftValue, err := data.CoerceToLong(left)
   715  		if err != nil {
   716  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   717  		}
   718  
   719  		return leftValue - rightValue, nil
   720  	default:
   721  		return false, errors.New(fmt.Sprintf("Unknow type use to sub, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   722  	}
   723  
   724  	return false, nil
   725  }
   726  
   727  func multiplication(left interface{}, right interface{}) (interface{}, error) {
   728  
   729  	log.Debugf("Multiplication condition -> left expression value %+v, right expression value %+v", left, right)
   730  	if left == nil && right == nil {
   731  		return false, nil
   732  	} else if left == nil && right != nil {
   733  		return false, nil
   734  	} else if left != nil && right == nil {
   735  		return false, nil
   736  	}
   737  
   738  	switch le := left.(type) {
   739  	case int:
   740  		if isDoubleType(right) {
   741  			leftValue, err := data.CoerceToDouble(left)
   742  			if err != nil {
   743  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   744  			}
   745  			rightValue := right.(float64)
   746  			return leftValue * rightValue, nil
   747  		} else {
   748  			rightValue, err := data.CoerceToInteger(right)
   749  			if err != nil {
   750  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   751  			}
   752  			return le * rightValue, nil
   753  		}
   754  	case int64:
   755  		if isDoubleType(right) {
   756  			leftValue, err := data.CoerceToDouble(left)
   757  			if err != nil {
   758  				err = fmt.Errorf("Convert left expression to type float64 failed, due to %s", err.Error())
   759  			}
   760  			rightValue := right.(float64)
   761  			return leftValue * rightValue, nil
   762  		} else {
   763  			rightValue, err := data.CoerceToInteger(right)
   764  			if err != nil {
   765  				return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   766  			}
   767  
   768  			return int(le) * rightValue, nil
   769  		}
   770  	case float64:
   771  		rightValue, err := data.CoerceToNumber(right)
   772  		if err != nil {
   773  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   774  		}
   775  
   776  		return le * rightValue, nil
   777  	case json.Number:
   778  		rightValue, err := data.CoerceToLong(right)
   779  		if err != nil {
   780  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   781  		}
   782  
   783  		leftValue, err := data.CoerceToLong(left)
   784  		if err != nil {
   785  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   786  		}
   787  
   788  		return leftValue * rightValue, nil
   789  	default:
   790  		return false, errors.New(fmt.Sprintf("Unknow type use to multiplication, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   791  	}
   792  
   793  	return false, nil
   794  }
   795  
   796  func div(left interface{}, right interface{}) (interface{}, error) {
   797  
   798  	log.Debugf("Div condition -> left expression value %+v, right expression value %+v", left, right)
   799  	if left == nil || right == nil {
   800  		return nil, fmt.Errorf("Cannot run dividing operation on empty value")
   801  	}
   802  
   803  	switch le := left.(type) {
   804  	case int:
   805  		rightValue, err := data.CoerceToInteger(right)
   806  		if err != nil {
   807  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   808  		}
   809  		return le / rightValue, nil
   810  	case int64:
   811  		rightValue, err := data.CoerceToInteger(right)
   812  		if err != nil {
   813  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   814  		}
   815  		return int(le) / rightValue, nil
   816  	case float64:
   817  		rightValue, err := data.CoerceToNumber(right)
   818  		if err != nil {
   819  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   820  		}
   821  		return le / rightValue, nil
   822  	case json.Number:
   823  		rightValue, err := data.CoerceToLong(right)
   824  		if err != nil {
   825  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   826  		}
   827  
   828  		leftValue, err := data.CoerceToLong(left)
   829  		if err != nil {
   830  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   831  		}
   832  
   833  		return leftValue / rightValue, nil
   834  	default:
   835  		return false, errors.New(fmt.Sprintf("Unknow type use to div, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   836  	}
   837  
   838  	return false, nil
   839  }
   840  
   841  func mod(left interface{}, right interface{}) (interface{}, error) {
   842  
   843  	log.Debugf("% condition -> left expression value %+v, right expression value %+v", left, right)
   844  	if left == nil || right == nil {
   845  		return nil, fmt.Errorf("Cannot run mod operation on empty value")
   846  	}
   847  
   848  	switch le := left.(type) {
   849  	case int:
   850  		rightValue, err := data.CoerceToInteger(right)
   851  		if err != nil {
   852  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   853  		}
   854  		return le % rightValue, nil
   855  	case int64:
   856  		rightValue, err := data.CoerceToInteger(right)
   857  		if err != nil {
   858  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   859  		}
   860  		return int(le) % rightValue, nil
   861  	case float64:
   862  		rightValue, err := data.CoerceToLong(right)
   863  		if err != nil {
   864  			return false, fmt.Errorf("Convert right expression to type int failed, due to %s", err.Error())
   865  		}
   866  		lev := int64(le)
   867  		return lev % rightValue, nil
   868  	case json.Number:
   869  		rightValue, err := data.CoerceToLong(right)
   870  		if err != nil {
   871  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   872  		}
   873  
   874  		leftValue, err := data.CoerceToLong(left)
   875  		if err != nil {
   876  			return false, fmt.Errorf("Convert right expression to type long failed, due to %s", err.Error())
   877  		}
   878  
   879  		return leftValue % rightValue, nil
   880  	default:
   881  		return false, errors.New(fmt.Sprintf("Unknow type use to div, left [%s] and right [%s] ", getType(left).String(), getType(right).String()))
   882  	}
   883  
   884  	return false, nil
   885  }
   886  
   887  func getType(in interface{}) reflect.Type {
   888  	return reflect.TypeOf(in)
   889  }
   890  
   891  func isDoubleType(in interface{}) bool {
   892  	switch in.(type) {
   893  	case float64:
   894  		return true
   895  	}
   896  	return false
   897  }