math_func_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. package plans
  2. import (
  3. "encoding/json"
  4. "engine/xsql"
  5. "fmt"
  6. "reflect"
  7. "strings"
  8. "testing"
  9. )
  10. func TestMathAndConversionFunc_Apply1(t *testing.T) {
  11. var tests = []struct {
  12. sql string
  13. data *xsql.Tuple
  14. result []map[string]interface{}
  15. }{
  16. {
  17. sql: "SELECT abs(a) AS a FROM test",
  18. data: &xsql.Tuple{
  19. Emitter: "test",
  20. Message: xsql.Message{
  21. "a" : -1,
  22. },
  23. },
  24. result: []map[string]interface{}{{
  25. "a": float64(1), //Actually it should be 1, it's caused by json Unmarshal method, which convert int to float64
  26. }},
  27. },
  28. {
  29. sql: "SELECT abs(a) AS a FROM test",
  30. data: &xsql.Tuple{
  31. Emitter: "test",
  32. Message: xsql.Message{
  33. "a" : -1.1,
  34. },
  35. },
  36. result: []map[string]interface{}{{
  37. "a": 1.1,
  38. }},
  39. },
  40. {
  41. sql: "SELECT abs(a) AS a FROM test",
  42. data: &xsql.Tuple{
  43. Emitter: "test",
  44. Message: xsql.Message{
  45. "a" : 1.1,
  46. },
  47. },
  48. result: []map[string]interface{}{{
  49. "a": 1.1,
  50. }},
  51. },
  52. {
  53. sql: "SELECT acos(1) AS a FROM test",
  54. data: &xsql.Tuple{
  55. Emitter: "test",
  56. Message: nil,
  57. },
  58. result: []map[string]interface{}{{
  59. "a": float64(0),
  60. }},
  61. },
  62. {
  63. sql: "SELECT asin(1) AS a FROM test",
  64. data: &xsql.Tuple{
  65. Emitter: "test",
  66. Message: nil,
  67. },
  68. result: []map[string]interface{}{{
  69. "a": float64(1.5707963267948966),
  70. }},
  71. },
  72. {
  73. sql: "SELECT atan(1) AS a FROM test",
  74. data: &xsql.Tuple{
  75. Emitter: "test",
  76. Message: nil,
  77. },
  78. result: []map[string]interface{}{{
  79. "a": float64(0.7853981633974483),
  80. }},
  81. },
  82. {
  83. sql: "SELECT atan2(1,1) AS a FROM test",
  84. data: &xsql.Tuple{
  85. Emitter: "test",
  86. Message: nil,
  87. },
  88. result: []map[string]interface{}{{
  89. "a": float64(0.7853981633974483),
  90. }},
  91. },
  92. {
  93. sql: "SELECT bitand(1,1) AS a FROM test",
  94. data: &xsql.Tuple{
  95. Emitter: "test",
  96. Message: nil,
  97. },
  98. result: []map[string]interface{}{{
  99. "a": float64(1),
  100. }},
  101. },
  102. {
  103. sql: "SELECT bitand(1.0,1) AS a FROM test",
  104. data: &xsql.Tuple{
  105. Emitter: "test",
  106. Message: nil,
  107. },
  108. result: nil,
  109. },
  110. {
  111. sql: "SELECT bitor(1,1) AS a FROM test",
  112. data: &xsql.Tuple{
  113. Emitter: "test",
  114. Message: nil,
  115. },
  116. result: []map[string]interface{}{{
  117. "a": float64(1),
  118. }},
  119. },
  120. {
  121. sql: "SELECT bitxor(1,1) AS a FROM test",
  122. data: &xsql.Tuple{
  123. Emitter: "test",
  124. Message: nil,
  125. },
  126. result: []map[string]interface{}{{
  127. "a": float64(0),
  128. }},
  129. },
  130. {
  131. sql: "SELECT bitnot(1) AS a FROM test",
  132. data: &xsql.Tuple{
  133. Emitter: "test",
  134. Message: nil,
  135. },
  136. result: []map[string]interface{}{{
  137. "a": float64(-2),
  138. }},
  139. },
  140. {
  141. sql: "SELECT ceil(1.6) AS a FROM test",
  142. data: &xsql.Tuple{
  143. Emitter: "test",
  144. Message: nil,
  145. },
  146. result: []map[string]interface{}{{
  147. "a": float64(2),
  148. }},
  149. },
  150. {
  151. sql: "SELECT cos(0) AS a FROM test",
  152. data: &xsql.Tuple{
  153. Emitter: "test",
  154. Message: nil,
  155. },
  156. result: []map[string]interface{}{{
  157. "a": float64(1),
  158. }},
  159. },
  160. {
  161. sql: "SELECT cosh(0) AS a FROM test",
  162. data: &xsql.Tuple{
  163. Emitter: "test",
  164. Message: nil,
  165. },
  166. result: []map[string]interface{}{{
  167. "a": float64(1),
  168. }},
  169. },
  170. {
  171. sql: "SELECT exp(1.2) AS a FROM test",
  172. data: &xsql.Tuple{
  173. Emitter: "test",
  174. Message: nil,
  175. },
  176. result: []map[string]interface{}{{
  177. "a": float64(3.3201169227365472),
  178. }},
  179. },
  180. {
  181. sql: "SELECT ln(1) AS a FROM test",
  182. data: &xsql.Tuple{
  183. Emitter: "test",
  184. Message: nil,
  185. },
  186. result: []map[string]interface{}{{
  187. "a": float64(0),
  188. }},
  189. },
  190. {
  191. sql: "SELECT log(10) AS a FROM test",
  192. data: &xsql.Tuple{
  193. Emitter: "test",
  194. Message: nil,
  195. },
  196. result: []map[string]interface{}{{
  197. "a": float64(1),
  198. }},
  199. },
  200. {
  201. sql: "SELECT mod(10, 3) AS a FROM test",
  202. data: &xsql.Tuple{
  203. Emitter: "test",
  204. Message: nil,
  205. },
  206. result: []map[string]interface{}{{
  207. "a": float64(1),
  208. }},
  209. },
  210. {
  211. sql: "SELECT power(10, 3) AS a FROM test",
  212. data: &xsql.Tuple{
  213. Emitter: "test",
  214. Message: nil,
  215. },
  216. result: []map[string]interface{}{{
  217. "a": float64(1000),
  218. }},
  219. },
  220. {
  221. sql: "SELECT round(10.2) AS a FROM test",
  222. data: &xsql.Tuple{
  223. Emitter: "test",
  224. Message: nil,
  225. },
  226. result: []map[string]interface{}{{
  227. "a": float64(10),
  228. }},
  229. },
  230. {
  231. sql: "SELECT sign(10.2) AS a, sign(-2) as b, sign(0) as c FROM test",
  232. data: &xsql.Tuple{
  233. Emitter: "test",
  234. Message: nil,
  235. },
  236. result: []map[string]interface{}{{
  237. "a": float64(1),
  238. "b": float64(-1),
  239. "c": float64(0),
  240. }},
  241. },
  242. {
  243. sql: "SELECT sin(0) as a FROM test",
  244. data: &xsql.Tuple{
  245. Emitter: "test",
  246. Message: nil,
  247. },
  248. result: []map[string]interface{}{{
  249. "a": float64(0),
  250. }},
  251. },
  252. {
  253. sql: "SELECT sinh(0) as a FROM test",
  254. data: &xsql.Tuple{
  255. Emitter: "test",
  256. Message: nil,
  257. },
  258. result: []map[string]interface{}{{
  259. "a": float64(0),
  260. }},
  261. },
  262. {
  263. sql: "SELECT sqrt(4) as a FROM test",
  264. data: &xsql.Tuple{
  265. Emitter: "test",
  266. Message: nil,
  267. },
  268. result: []map[string]interface{}{{
  269. "a": float64(2),
  270. }},
  271. },
  272. {
  273. sql: "SELECT tan(0) as a FROM test",
  274. data: &xsql.Tuple{
  275. Emitter: "test",
  276. Message: nil,
  277. },
  278. result: []map[string]interface{}{{
  279. "a": float64(0),
  280. }},
  281. },
  282. {
  283. sql: "SELECT tanh(1) as a FROM test",
  284. data: &xsql.Tuple{
  285. Emitter: "test",
  286. Message: nil,
  287. },
  288. result: []map[string]interface{}{{
  289. "a": float64(0.7615941559557649),
  290. }},
  291. },
  292. {
  293. sql: `SELECT cast(1.2, "bigint") as a FROM test`,
  294. data: &xsql.Tuple{
  295. Emitter: "test",
  296. Message: nil,
  297. },
  298. result: []map[string]interface{}{{
  299. "a": float64(1),
  300. }},
  301. },
  302. {
  303. sql: `SELECT cast(5, "bigint") as a FROM test`,
  304. data: &xsql.Tuple{
  305. Emitter: "test",
  306. Message: nil,
  307. },
  308. result: []map[string]interface{}{{
  309. "a": float64(5),
  310. }},
  311. },
  312. {
  313. sql: `SELECT cast(1.2, "string") as a FROM test`,
  314. data: &xsql.Tuple{
  315. Emitter: "test",
  316. Message: nil,
  317. },
  318. result: []map[string]interface{}{{
  319. "a": "1.2",
  320. }},
  321. },
  322. {
  323. sql: `SELECT cast(true, "string") as a FROM test`,
  324. data: &xsql.Tuple{
  325. Emitter: "test",
  326. Message: nil,
  327. },
  328. result: []map[string]interface{}{{
  329. "a": "true",
  330. }},
  331. },
  332. {
  333. sql: `SELECT cast("true", "boolean") as a FROM test`,
  334. data: &xsql.Tuple{
  335. Emitter: "test",
  336. Message: nil,
  337. },
  338. result: []map[string]interface{}{{
  339. "a": true,
  340. }},
  341. },
  342. {
  343. sql: `SELECT cast("1", "boolean") as a FROM test`,
  344. data: &xsql.Tuple{
  345. Emitter: "test",
  346. Message: nil,
  347. },
  348. result: []map[string]interface{}{{
  349. "a": true,
  350. }},
  351. },
  352. {
  353. sql: `SELECT cast(0.0, "boolean") as a FROM test`,
  354. data: &xsql.Tuple{
  355. Emitter: "test",
  356. Message: nil,
  357. },
  358. result: []map[string]interface{}{{
  359. "a": false,
  360. }},
  361. },
  362. {
  363. sql: `SELECT chr(0) as a FROM test`,
  364. data: &xsql.Tuple{
  365. Emitter: "test",
  366. Message: nil,
  367. },
  368. result: []map[string]interface{}{{
  369. "a": float64(0),
  370. }},
  371. },
  372. {
  373. sql: `SELECT chr("a") as a FROM test`,
  374. data: &xsql.Tuple{
  375. Emitter: "test",
  376. Message: nil,
  377. },
  378. result: []map[string]interface{}{{
  379. "a": float64(97),
  380. }},
  381. },
  382. {
  383. sql: `SELECT encode("hello", "base64") as a FROM test`,
  384. data: &xsql.Tuple{
  385. Emitter: "test",
  386. Message: nil,
  387. },
  388. result: []map[string]interface{}{{
  389. "a": "aGVsbG8=",
  390. }},
  391. },
  392. {
  393. sql: `SELECT trunc(3.1415, 2) as a FROM test`,
  394. data: &xsql.Tuple{
  395. Emitter: "test",
  396. Message: nil,
  397. },
  398. result: []map[string]interface{}{{
  399. "a": float64(3.14),
  400. }},
  401. },
  402. {
  403. sql: `SELECT trunc(3, 2) as a FROM test`,
  404. data: &xsql.Tuple{
  405. Emitter: "test",
  406. Message: nil,
  407. },
  408. result: []map[string]interface{}{{
  409. "a": float64(3.00),
  410. }},
  411. },
  412. }
  413. fmt.Printf("The test bucket size is %d.\n\n", len(tests))
  414. for i, tt := range tests {
  415. //fmt.Println("Running test " + strconv.Itoa(i))
  416. stmt, err := xsql.NewParser(strings.NewReader(tt.sql)).Parse()
  417. if err != nil && tt.result == nil {
  418. continue
  419. } else if err != nil && tt.result != nil{
  420. t.Errorf("%q", err)
  421. continue
  422. }
  423. pp := &ProjectPlan{Fields:stmt.Fields}
  424. result := pp.Apply(nil, tt.data)
  425. var mapRes []map[string]interface{}
  426. if v, ok := result.([]byte); ok {
  427. err := json.Unmarshal(v, &mapRes)
  428. if err != nil {
  429. t.Errorf("Failed to parse the input into map.\n")
  430. continue
  431. }
  432. //fmt.Printf("%t\n", mapRes["rengine_field_0"])
  433. if !reflect.DeepEqual(tt.result, mapRes) {
  434. t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.result, mapRes)
  435. }
  436. } else {
  437. t.Errorf("The returned result is not type of []byte\n")
  438. }
  439. }
  440. }