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 }