funcsMath.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright 2021 EMQ Technologies Co., Ltd.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package xsql
  15. import (
  16. "fmt"
  17. "math"
  18. "math/rand"
  19. )
  20. func mathCall(name string, args []interface{}) (interface{}, bool) {
  21. switch name {
  22. case "abs":
  23. if v, ok := args[0].(int); ok {
  24. t := float64(v)
  25. var ret = int(math.Abs(t))
  26. return ret, true
  27. } else if v, ok := args[0].(float64); ok {
  28. return math.Abs(v), true
  29. } else {
  30. return fmt.Errorf("only float64 & int type are supported"), false
  31. }
  32. case "acos":
  33. if v, e := toF64(args[0]); e == nil {
  34. return math.Acos(v), true
  35. } else {
  36. return e, false
  37. }
  38. case "asin":
  39. if v, e := toF64(args[0]); e == nil {
  40. return math.Asin(v), true
  41. } else {
  42. return e, false
  43. }
  44. case "atan":
  45. if v, e := toF64(args[0]); e == nil {
  46. return math.Atan(v), true
  47. } else {
  48. return e, false
  49. }
  50. case "atan2":
  51. if v1, e := toF64(args[0]); e == nil {
  52. if v2, e1 := toF64(args[1]); e1 == nil {
  53. return math.Atan2(v1, v2), true
  54. } else {
  55. return e1, false
  56. }
  57. } else {
  58. return e, false
  59. }
  60. case "bitand":
  61. v1, ok1 := args[0].(int)
  62. v2, ok2 := args[1].(int)
  63. if ok1 && ok2 {
  64. return v1 & v2, true
  65. } else {
  66. return fmt.Errorf("Expect int type for both operands."), false
  67. }
  68. case "bitor":
  69. v1, ok1 := args[0].(int)
  70. v2, ok2 := args[1].(int)
  71. if ok1 && ok2 {
  72. return v1 | v2, true
  73. } else {
  74. return fmt.Errorf("Expect int type for both operands."), false
  75. }
  76. case "bitxor":
  77. v1, ok1 := args[0].(int)
  78. v2, ok2 := args[1].(int)
  79. if ok1 && ok2 {
  80. return v1 ^ v2, true
  81. } else {
  82. return fmt.Errorf("Expect int type for both operands."), false
  83. }
  84. case "bitnot":
  85. v1, ok1 := args[0].(int)
  86. if ok1 {
  87. return ^v1, true
  88. } else {
  89. return fmt.Errorf("Expect int type for operand."), false
  90. }
  91. case "ceil":
  92. if v, e := toF64(args[0]); e == nil {
  93. return math.Ceil(v), true
  94. } else {
  95. return e, false
  96. }
  97. case "cos":
  98. if v, e := toF64(args[0]); e == nil {
  99. return math.Cos(v), true
  100. } else {
  101. return e, false
  102. }
  103. case "cosh":
  104. if v, e := toF64(args[0]); e == nil {
  105. return math.Cosh(v), true
  106. } else {
  107. return e, false
  108. }
  109. case "exp":
  110. if v, e := toF64(args[0]); e == nil {
  111. return math.Exp(v), true
  112. } else {
  113. return e, false
  114. }
  115. case "ln":
  116. if v, e := toF64(args[0]); e == nil {
  117. return math.Log2(v), true
  118. } else {
  119. return e, false
  120. }
  121. case "log":
  122. if v, e := toF64(args[0]); e == nil {
  123. return math.Log10(v), true
  124. } else {
  125. return e, false
  126. }
  127. case "mod":
  128. if v, e := toF64(args[0]); e == nil {
  129. if v1, e1 := toF64(args[1]); e == nil {
  130. return math.Mod(v, v1), true
  131. } else {
  132. return e1, false
  133. }
  134. } else {
  135. return e, false
  136. }
  137. case "power":
  138. if v1, e := toF64(args[0]); e == nil {
  139. if v2, e2 := toF64(args[1]); e2 == nil {
  140. return math.Pow(v1, v2), true
  141. } else {
  142. return e2, false
  143. }
  144. } else {
  145. return e, false
  146. }
  147. case "rand":
  148. return rand.Float64(), true
  149. case "round":
  150. if v, e := toF64(args[0]); e == nil {
  151. return math.Round(v), true
  152. } else {
  153. return e, false
  154. }
  155. case "sign":
  156. if v, e := toF64(args[0]); e == nil {
  157. if v > 0 {
  158. return 1, true
  159. } else if v < 0 {
  160. return -1, true
  161. } else {
  162. return 0, true
  163. }
  164. } else {
  165. return e, false
  166. }
  167. case "sin":
  168. if v, e := toF64(args[0]); e == nil {
  169. return math.Sin(v), true
  170. } else {
  171. return e, false
  172. }
  173. case "sinh":
  174. if v, e := toF64(args[0]); e == nil {
  175. return math.Sinh(v), true
  176. } else {
  177. return e, false
  178. }
  179. case "sqrt":
  180. if v, e := toF64(args[0]); e == nil {
  181. return math.Sqrt(v), true
  182. } else {
  183. return e, false
  184. }
  185. case "tan":
  186. if v, e := toF64(args[0]); e == nil {
  187. return math.Tan(v), true
  188. } else {
  189. return e, false
  190. }
  191. case "tanh":
  192. if v, e := toF64(args[0]); e == nil {
  193. return math.Tanh(v), true
  194. } else {
  195. return e, false
  196. }
  197. }
  198. return fmt.Errorf("Unknown math function name."), false
  199. }
  200. func toF64(arg interface{}) (float64, error) {
  201. if v, ok := arg.(float64); ok {
  202. return v, nil
  203. } else if v, ok := arg.(int); ok {
  204. return float64(v), nil
  205. }
  206. return 0, fmt.Errorf("only float64 & int type are supported")
  207. }