@@ -758,3 +758,116 @@ func ConvertValueToString(val interface{}) string {
758758 }
759759 return jsonutils .Marshal (val ).String ()
760760}
761+
762+ func getFloatValue (val interface {}) (float64 , error ) {
763+ switch v := val .(type ) {
764+ case float32 :
765+ return float64 (v ), nil
766+ case float64 :
767+ return v , nil
768+ case int :
769+ return float64 (v ), nil
770+ case int8 :
771+ return float64 (v ), nil
772+ case int16 :
773+ return float64 (v ), nil
774+ case int32 :
775+ return float64 (v ), nil
776+ case int64 :
777+ return float64 (v ), nil
778+ case uint :
779+ return float64 (v ), nil
780+ case uint8 :
781+ return float64 (v ), nil
782+ case uint16 :
783+ return float64 (v ), nil
784+ case uint32 :
785+ return float64 (v ), nil
786+ case uint64 :
787+ return float64 (v ), nil
788+ case * float32 :
789+ return float64 (* v ), nil
790+ case * float64 :
791+ return * v , nil
792+ case * int :
793+ return float64 (* v ), nil
794+ case * int8 :
795+ return float64 (* v ), nil
796+ case * int16 :
797+ return float64 (* v ), nil
798+ case * int32 :
799+ return float64 (* v ), nil
800+ case * int64 :
801+ return float64 (* v ), nil
802+ case * uint :
803+ return float64 (* v ), nil
804+ case * uint8 :
805+ return float64 (* v ), nil
806+ case * uint16 :
807+ return float64 (* v ), nil
808+ case * uint32 :
809+ return float64 (* v ), nil
810+ case * uint64 :
811+ return float64 (* v ), nil
812+ case string :
813+ return strconv .ParseFloat (v , 64 )
814+ case * string :
815+ return strconv .ParseFloat (* v , 64 )
816+ }
817+ return 0 , errors .ErrInvalidFormat
818+ }
819+
820+ func getTimeValue (val interface {}) (time.Time , error ) {
821+ switch v := val .(type ) {
822+ case time.Time :
823+ return v , nil
824+ case * time.Time :
825+ return * v , nil
826+ case string :
827+ return timeutils .ParseTimeStr (v )
828+ case * string :
829+ return timeutils .ParseTimeStr (* v )
830+ }
831+ return time.Time {}, errors .ErrInvalidFormat
832+ }
833+
834+ const MIN_FLOAT_EQUAL_DIFF = float64 (0.000001 )
835+
836+ func floatEqual (of , nf float64 ) bool {
837+ if of > nf {
838+ return of < MIN_FLOAT_EQUAL_DIFF + nf
839+ } else if of < nf {
840+ return of + MIN_FLOAT_EQUAL_DIFF > nf
841+ } else {
842+ return true
843+ }
844+ }
845+
846+ const MIN_MICRO_SECOND_EQUAL_DIFF = 1000000
847+
848+ func timeEqual (of , nf time.Time ) bool {
849+ ofUnix := of .UnixMicro ()
850+ nfUnix := nf .UnixMicro ()
851+ if ofUnix == nfUnix {
852+ return true
853+ }
854+ if ofUnix > nfUnix {
855+ return ofUnix < MIN_MICRO_SECOND_EQUAL_DIFF + nfUnix
856+ } else {
857+ return ofUnix + MIN_MICRO_SECOND_EQUAL_DIFF > nfUnix
858+ }
859+ }
860+
861+ func EqualsGrossValue (of , nf interface {}) bool {
862+ ofFloat , ofErr := getFloatValue (of )
863+ nfFloat , nfErr := getFloatValue (nf )
864+ if ofErr == nil && nfErr == nil {
865+ return floatEqual (ofFloat , nfFloat )
866+ }
867+ ofTime , ofErr := getTimeValue (of )
868+ nfTime , nfErr := getTimeValue (nf )
869+ if ofErr == nil && nfErr == nil {
870+ return timeEqual (ofTime , nfTime )
871+ }
872+ return false
873+ }
0 commit comments