funcs_math.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package xsql
  2. import (
  3. "fmt"
  4. "math"
  5. "math/rand"
  6. )
  7. func mathCall(name string, args []interface{}) (interface{}, bool) {
  8. switch name {
  9. case "abs":
  10. if v, ok := args[0].(int); ok {
  11. t := float64(v)
  12. var ret int = int(math.Abs(t))
  13. return ret, true
  14. } else if v, ok := args[0].(float64); ok {
  15. return math.Abs(v), true
  16. } else {
  17. return fmt.Errorf("only float64 & int type are supported"), false
  18. }
  19. case "acos":
  20. if v, e := toF64(args[0]); e == nil {
  21. return math.Acos(v), true
  22. } else {
  23. return e, false
  24. }
  25. case "asin":
  26. if v, e := toF64(args[0]); e == nil {
  27. return math.Asin(v), true
  28. } else {
  29. return e, false
  30. }
  31. case "atan":
  32. if v, e := toF64(args[0]); e == nil {
  33. return math.Atan(v), true
  34. } else {
  35. return e, false
  36. }
  37. case "atan2":
  38. if v1, e := toF64(args[0]); e == nil {
  39. if v2, e1 := toF64(args[1]); e1 == nil {
  40. return math.Atan2(v1, v2), true
  41. } else {
  42. return e1, false
  43. }
  44. } else {
  45. return e, false
  46. }
  47. case "bitand":
  48. v1, ok1 := args[0].(int)
  49. v2, ok2 := args[1].(int)
  50. if ok1 && ok2 {
  51. return v1 & v2, true
  52. } else {
  53. return fmt.Errorf("Expect int type for both operands."), false
  54. }
  55. case "bitor":
  56. v1, ok1 := args[0].(int)
  57. v2, ok2 := args[1].(int)
  58. if ok1 && ok2 {
  59. return v1 | v2, true
  60. } else {
  61. return fmt.Errorf("Expect int type for both operands."), false
  62. }
  63. case "bitxor":
  64. v1, ok1 := args[0].(int)
  65. v2, ok2 := args[1].(int)
  66. if ok1 && ok2 {
  67. return v1 ^ v2, true
  68. } else {
  69. return fmt.Errorf("Expect int type for both operands."), false
  70. }
  71. case "bitnot":
  72. v1, ok1 := args[0].(int)
  73. if ok1 {
  74. return ^v1, true
  75. } else {
  76. return fmt.Errorf("Expect int type for operand."), false
  77. }
  78. case "ceil":
  79. if v, e := toF64(args[0]); e == nil {
  80. return math.Ceil(v), true
  81. } else {
  82. return e, false
  83. }
  84. case "cos":
  85. if v, e := toF64(args[0]); e == nil {
  86. return math.Cos(v), true
  87. } else {
  88. return e, false
  89. }
  90. case "cosh":
  91. if v, e := toF64(args[0]); e == nil {
  92. return math.Cosh(v), true
  93. } else {
  94. return e, false
  95. }
  96. case "exp":
  97. if v, e := toF64(args[0]); e == nil {
  98. return math.Exp(v), true
  99. } else {
  100. return e, false
  101. }
  102. case "ln":
  103. if v, e := toF64(args[0]); e == nil {
  104. return math.Log2(v), true
  105. } else {
  106. return e, false
  107. }
  108. case "log":
  109. if v, e := toF64(args[0]); e == nil {
  110. return math.Log10(v), true
  111. } else {
  112. return e, false
  113. }
  114. case "mod":
  115. if v, e := toF64(args[0]); e == nil {
  116. if v1, e1 := toF64(args[1]); e == nil {
  117. return math.Mod(v, v1), true
  118. } else {
  119. return e1, false
  120. }
  121. } else {
  122. return e, false
  123. }
  124. case "power":
  125. if v1, e := toF64(args[0]); e == nil {
  126. if v2, e2 := toF64(args[1]); e2 == nil {
  127. return math.Pow(v1, v2), true
  128. } else {
  129. return e2, false
  130. }
  131. } else {
  132. return e, false
  133. }
  134. case "rand":
  135. return rand.Float64(), true
  136. case "round":
  137. if v, e := toF64(args[0]); e == nil {
  138. return math.Round(v), true
  139. } else {
  140. return e, false
  141. }
  142. case "sign":
  143. if v, e := toF64(args[0]); e == nil {
  144. if v > 0 {
  145. return 1, true
  146. } else if v < 0 {
  147. return -1, true
  148. } else {
  149. return 0, true
  150. }
  151. } else {
  152. return e, false
  153. }
  154. case "sin":
  155. if v, e := toF64(args[0]); e == nil {
  156. return math.Sin(v), true
  157. } else {
  158. return e, false
  159. }
  160. case "sinh":
  161. if v, e := toF64(args[0]); e == nil {
  162. return math.Sinh(v), true
  163. } else {
  164. return e, false
  165. }
  166. case "sqrt":
  167. if v, e := toF64(args[0]); e == nil {
  168. return math.Sqrt(v), true
  169. } else {
  170. return e, false
  171. }
  172. case "tan":
  173. if v, e := toF64(args[0]); e == nil {
  174. return math.Tan(v), true
  175. } else {
  176. return e, false
  177. }
  178. case "tanh":
  179. if v, e := toF64(args[0]); e == nil {
  180. return math.Tanh(v), true
  181. } else {
  182. return e, false
  183. }
  184. }
  185. return fmt.Errorf("Unknown math function name."), false
  186. }
  187. func toF64(arg interface{}) (float64, error) {
  188. if v, ok := arg.(float64); ok {
  189. return v, nil
  190. } else if v, ok := arg.(int); ok {
  191. return float64(v), nil
  192. }
  193. return 0, fmt.Errorf("only float64 & int type are supported")
  194. }