@@ -348,6 +348,7 @@ func (f *Expression) run(left interface{}, op OPERATIOR, right interface{}) (int
348
348
case MULTIPLICATION :
349
349
return multiplication (left , right )
350
350
case DIVISION :
351
+ //TODO
351
352
return div (left , right )
352
353
case INT_DIVISTION :
353
354
//TODO....
@@ -398,17 +399,34 @@ func ConvertToSameType(left interface{}, right interface{}) (interface{}, interf
398
399
var err error
399
400
switch t := left .(type ) {
400
401
case int :
401
- rightValue , err = data .CoerceToInteger (right )
402
- if err != nil {
403
- err = fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
402
+ if isDoubleType (right ) {
403
+ leftValue , err = data .CoerceToDouble (left )
404
+ if err != nil {
405
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
406
+ }
407
+ rightValue = right
408
+ } else {
409
+ rightValue , err = data .CoerceToInteger (right )
410
+ if err != nil {
411
+ err = fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
412
+ }
413
+ leftValue = t
404
414
}
405
- leftValue = t
415
+
406
416
case int64 :
407
- rightValue , err = data .CoerceToInteger (right )
408
- if err != nil {
409
- err = fmt .Errorf ("Convert right expression to type int64 failed, due to %s" , err .Error ())
417
+ if isDoubleType (right ) {
418
+ leftValue , err = data .CoerceToDouble (left )
419
+ if err != nil {
420
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
421
+ }
422
+ rightValue = right
423
+ } else {
424
+ rightValue , err = data .CoerceToInteger (right )
425
+ if err != nil {
426
+ err = fmt .Errorf ("Convert right expression to type int64 failed, due to %s" , err .Error ())
427
+ }
428
+ leftValue = t
410
429
}
411
- leftValue = t
412
430
case float64 :
413
431
rightValue , err = data .CoerceToNumber (right )
414
432
if err != nil {
@@ -483,28 +501,59 @@ func gt(left interface{}, right interface{}, includeEquals bool) (bool, error) {
483
501
rightType := getType (right )
484
502
switch le := left .(type ) {
485
503
case int :
486
- //We should conver to int first
487
- rightValue , err := data .CoerceToInteger (right )
488
- if err != nil {
489
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
490
- }
491
- if includeEquals {
492
- return le >= rightValue , nil
504
+ //For int float compare, convert int to float to compare
505
+ if isDoubleType (right ) {
506
+ leftValue , err := data .CoerceToDouble (left )
507
+ if err != nil {
508
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
509
+ }
510
+ rightValue := right .(float64 )
511
+ if includeEquals {
512
+ return leftValue >= rightValue , nil
513
+
514
+ } else {
515
+ return leftValue > rightValue , nil
516
+ }
493
517
494
518
} else {
495
- return le > rightValue , nil
519
+ //We should conver to int first
520
+ rightValue , err := data .CoerceToInteger (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
+ }
496
530
}
497
531
498
532
case int64 :
499
- rightValue , err := data .CoerceToInteger (right )
500
- if err != nil {
501
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
502
- }
503
- if includeEquals {
504
- return int (le ) >= rightValue , nil
533
+ if isDoubleType (right ) {
534
+ leftValue , err := data .CoerceToDouble (left )
535
+ if err != nil {
536
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
537
+ }
538
+ rightValue := right .(float64 )
539
+ if includeEquals {
540
+ return leftValue >= rightValue , nil
541
+
542
+ } else {
543
+ return leftValue > rightValue , nil
544
+ }
505
545
506
546
} else {
507
- return int (le ) > rightValue , nil
547
+ rightValue , err := data .CoerceToInteger (right )
548
+ if err != nil {
549
+ return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
550
+ }
551
+ if includeEquals {
552
+ return int (le ) >= rightValue , nil
553
+
554
+ } else {
555
+ return int (le ) > rightValue , nil
556
+ }
508
557
}
509
558
case float64 :
510
559
rightValue , err := data .CoerceToNumber (right )
@@ -555,26 +604,54 @@ func lt(left interface{}, right interface{}, includeEquals bool) (bool, error) {
555
604
556
605
switch le := left .(type ) {
557
606
case int :
558
- rightValue , err := data .CoerceToInteger (right )
559
- if err != nil {
560
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
561
- }
562
- if includeEquals {
563
- return le <= rightValue , nil
564
-
607
+ if isDoubleType (right ) {
608
+ leftValue , err := data .CoerceToDouble (left )
609
+ if err != nil {
610
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
611
+ }
612
+ rightValue := right .(float64 )
613
+ if includeEquals {
614
+ return leftValue <= rightValue , nil
615
+
616
+ } else {
617
+ return leftValue < rightValue , nil
618
+ }
565
619
} else {
566
- return le < rightValue , nil
620
+ rightValue , err := data .CoerceToInteger (right )
621
+ if err != nil {
622
+ return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
623
+ }
624
+ if includeEquals {
625
+ return le <= rightValue , nil
626
+
627
+ } else {
628
+ return le < rightValue , nil
629
+ }
567
630
}
568
631
case int64 :
569
- rightValue , err := data .CoerceToInteger (right )
570
- if err != nil {
571
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
572
- }
573
- if includeEquals {
574
- return int (le ) <= rightValue , nil
575
-
632
+ if isDoubleType (right ) {
633
+ leftValue , err := data .CoerceToDouble (left )
634
+ if err != nil {
635
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
636
+ }
637
+ rightValue := right .(float64 )
638
+ if includeEquals {
639
+ return leftValue <= rightValue , nil
640
+
641
+ } else {
642
+ return leftValue < rightValue , nil
643
+ }
576
644
} else {
577
- return int (le ) < rightValue , nil
645
+ rightValue , err := data .CoerceToInteger (right )
646
+ if err != nil {
647
+ return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
648
+ }
649
+ if includeEquals {
650
+ return int (le ) <= rightValue , nil
651
+
652
+ } else {
653
+ return int (le ) < rightValue , nil
654
+ }
578
655
}
579
656
case float64 :
580
657
rightValue , err := data .CoerceToNumber (right )
@@ -660,20 +737,37 @@ func additon(left interface{}, right interface{}) (interface{}, error) {
660
737
661
738
switch le := left .(type ) {
662
739
case int :
663
- rightValue , err := data .CoerceToInteger (right )
664
- if err != nil {
665
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
666
- }
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
+ }
667
752
668
- return le + rightValue , nil
753
+ return le + rightValue , nil
754
+ }
669
755
670
756
case int64 :
671
- rightValue , err := data .CoerceToInteger (right )
672
- if err != nil {
673
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
757
+ if isDoubleType (right ) {
758
+ leftValue , err := data .CoerceToDouble (left )
759
+ if err != nil {
760
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
761
+ }
762
+ rightValue := right .(float64 )
763
+ return leftValue + rightValue , nil
764
+ } else {
765
+ rightValue , err := data .CoerceToInteger (right )
766
+ if err != nil {
767
+ return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
768
+ }
769
+ return int (le ) + rightValue , nil
674
770
}
675
-
676
- return int (le ) + rightValue , nil
677
771
case float64 :
678
772
rightValue , err := data .CoerceToNumber (right )
679
773
if err != nil {
@@ -712,19 +806,35 @@ func sub(left interface{}, right interface{}) (interface{}, error) {
712
806
713
807
switch le := left .(type ) {
714
808
case int :
715
- rightValue , err := data .CoerceToInteger (right )
716
- if err != nil {
717
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
809
+ if isDoubleType (right ) {
810
+ leftValue , err := data .CoerceToDouble (left )
811
+ if err != nil {
812
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
813
+ }
814
+ rightValue := right .(float64 )
815
+ return leftValue - rightValue , nil
816
+ } else {
817
+ rightValue , err := data .CoerceToInteger (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
718
822
}
719
-
720
- return le - rightValue , nil
721
823
case int64 :
722
- rightValue , err := data .CoerceToInteger (right )
723
- if err != nil {
724
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
824
+ if isDoubleType (right ) {
825
+ leftValue , err := data .CoerceToDouble (left )
826
+ if err != nil {
827
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
828
+ }
829
+ rightValue := right .(float64 )
830
+ return leftValue - rightValue , nil
831
+ } else {
832
+ rightValue , err := data .CoerceToInteger (right )
833
+ if err != nil {
834
+ return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
835
+ }
836
+ return int (le ) - rightValue , nil
725
837
}
726
-
727
- return int (le ) - rightValue , nil
728
838
case float64 :
729
839
rightValue , err := data .CoerceToNumber (right )
730
840
if err != nil {
@@ -764,19 +874,36 @@ func multiplication(left interface{}, right interface{}) (interface{}, error) {
764
874
765
875
switch le := left .(type ) {
766
876
case int :
767
- rightValue , err := data .CoerceToInteger (right )
768
- if err != nil {
769
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
877
+ if isDoubleType (right ) {
878
+ leftValue , err := data .CoerceToDouble (left )
879
+ if err != nil {
880
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
881
+ }
882
+ rightValue := right .(float64 )
883
+ return leftValue * rightValue , nil
884
+ } else {
885
+ rightValue , err := data .CoerceToInteger (right )
886
+ if err != nil {
887
+ return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
888
+ }
889
+ return le * rightValue , nil
770
890
}
771
-
772
- return le * rightValue , nil
773
891
case int64 :
774
- rightValue , err := data .CoerceToInteger (right )
775
- if err != nil {
776
- return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
777
- }
892
+ if isDoubleType (right ) {
893
+ leftValue , err := data .CoerceToDouble (left )
894
+ if err != nil {
895
+ err = fmt .Errorf ("Convert left expression to type float64 failed, due to %s" , err .Error ())
896
+ }
897
+ rightValue := right .(float64 )
898
+ return leftValue * rightValue , nil
899
+ } else {
900
+ rightValue , err := data .CoerceToInteger (right )
901
+ if err != nil {
902
+ return false , fmt .Errorf ("Convert right expression to type int failed, due to %s" , err .Error ())
903
+ }
778
904
779
- return int (le ) * rightValue , nil
905
+ return int (le ) * rightValue , nil
906
+ }
780
907
case float64 :
781
908
rightValue , err := data .CoerceToNumber (right )
782
909
if err != nil {
@@ -855,3 +982,11 @@ func div(left interface{}, right interface{}) (interface{}, error) {
855
982
func getType (in interface {}) reflect.Type {
856
983
return reflect .TypeOf (in )
857
984
}
985
+
986
+ func isDoubleType (in interface {}) bool {
987
+ switch in .(type ) {
988
+ case float64 :
989
+ return true
990
+ }
991
+ return false
992
+ }
0 commit comments