expression_evaluator.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package xsql
  2. import (
  3. "github.com/buger/jsonparser"
  4. "github.com/emqx/kuiper/common"
  5. "github.com/golang-collections/collections/stack"
  6. )
  7. type ExpressionEvaluator struct {
  8. *ExpressionVisitorAdaptor
  9. tuple []byte
  10. operands *stack.Stack
  11. }
  12. func newExpressionEvaluator(tuple []byte) *ExpressionEvaluator {
  13. ee := &ExpressionEvaluator{tuple: tuple}
  14. ee.operands = stack.New()
  15. return ee
  16. }
  17. func (ee *ExpressionEvaluator) Visit(expr Node) Visitor {
  18. ee.DoVisit(ee, expr)
  19. return nil
  20. }
  21. func (ee *ExpressionEvaluator) VisitBinaryExpr(expr *BinaryExpr) {
  22. Walk(ee, expr.LHS)
  23. Walk(ee, expr.RHS)
  24. ee.operands.Push(expr.OP)
  25. }
  26. func (ee *ExpressionEvaluator) VisitFieldRef(expr *FieldRef) {
  27. //TODO GetXXX, how to determine the type
  28. if fv, err := jsonparser.GetInt(ee.tuple, expr.Name); err != nil {
  29. common.Log.Printf("Cannot find value in %s with field name %s.\n", string(ee.tuple), expr.Name)
  30. } else {
  31. ee.operands.Push(fv)
  32. }
  33. }
  34. func (ee *ExpressionEvaluator) VisitIntegerLiteral(expr *IntegerLiteral) {
  35. ee.operands.Push(expr.Val)
  36. }