order_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. // Copyright 2021-2023 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 operator
  15. import (
  16. "errors"
  17. "fmt"
  18. "reflect"
  19. "strings"
  20. "testing"
  21. "github.com/lf-edge/ekuiper/internal/conf"
  22. "github.com/lf-edge/ekuiper/internal/topo/context"
  23. "github.com/lf-edge/ekuiper/internal/xsql"
  24. "github.com/lf-edge/ekuiper/pkg/cast"
  25. )
  26. func TestOrderPlan_Apply(t *testing.T) {
  27. tests := []struct {
  28. sql string
  29. data interface{}
  30. result interface{}
  31. }{
  32. {
  33. sql: "SELECT * FROM tbl WHERE abc*2+3 > 12 AND abc < 20 ORDER BY abc",
  34. data: &xsql.Tuple{
  35. Emitter: "tbl",
  36. Message: xsql.Message{
  37. "abc": int64(6),
  38. },
  39. },
  40. result: &xsql.Tuple{
  41. Emitter: "tbl",
  42. Message: xsql.Message{
  43. "abc": int64(6),
  44. },
  45. },
  46. },
  47. {
  48. sql: "SELECT abc FROM tbl WHERE abc*2+3 > 12 OR def = \"hello\"",
  49. data: &xsql.Tuple{
  50. Emitter: "tbl",
  51. Message: xsql.Message{
  52. "abc": int64(34),
  53. "def": "hello",
  54. },
  55. },
  56. result: &xsql.Tuple{
  57. Emitter: "tbl",
  58. Message: xsql.Message{
  59. "abc": int64(34),
  60. "def": "hello",
  61. },
  62. },
  63. },
  64. {
  65. sql: "SELECT id1 FROM src1 WHERE f1 = \"v1\" GROUP BY TUMBLINGWINDOW(ss, 10) ORDER BY id1 DESC",
  66. data: &xsql.WindowTuples{
  67. Content: []xsql.TupleRow{
  68. &xsql.Tuple{
  69. Emitter: "src1",
  70. Message: xsql.Message{"id1": 1, "f1": "v1"},
  71. }, &xsql.Tuple{
  72. Emitter: "src1",
  73. Message: xsql.Message{"id1": 2, "f1": "v2"},
  74. }, &xsql.Tuple{
  75. Emitter: "src1",
  76. Message: xsql.Message{"id1": 3, "f1": "v1"},
  77. },
  78. },
  79. },
  80. result: &xsql.WindowTuples{
  81. Content: []xsql.TupleRow{
  82. &xsql.Tuple{
  83. Emitter: "src1",
  84. Message: xsql.Message{"id1": 3, "f1": "v1"},
  85. }, &xsql.Tuple{
  86. Emitter: "src1",
  87. Message: xsql.Message{"id1": 2, "f1": "v2"},
  88. }, &xsql.Tuple{
  89. Emitter: "src1",
  90. Message: xsql.Message{"id1": 1, "f1": "v1"},
  91. },
  92. },
  93. },
  94. },
  95. {
  96. sql: "SELECT id1 FROM src1 WHERE f1 = \"v1\" GROUP BY TUMBLINGWINDOW(ss, 10) ORDER BY id1 DESC",
  97. data: &xsql.WindowTuples{
  98. Content: []xsql.TupleRow{
  99. &xsql.Tuple{
  100. Emitter: "src1",
  101. Message: xsql.Message{"id1": 1, "f1": "v1"},
  102. }, &xsql.Tuple{
  103. Emitter: "src1",
  104. Message: xsql.Message{"f1": "v2"},
  105. }, &xsql.Tuple{
  106. Emitter: "src1",
  107. Message: xsql.Message{"id1": 3, "f1": "v1"},
  108. },
  109. },
  110. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  111. },
  112. result: &xsql.WindowTuples{
  113. Content: []xsql.TupleRow{
  114. &xsql.Tuple{
  115. Emitter: "src1",
  116. Message: xsql.Message{"id1": 3, "f1": "v1"},
  117. }, &xsql.Tuple{
  118. Emitter: "src1",
  119. Message: xsql.Message{"id1": 1, "f1": "v1"},
  120. }, &xsql.Tuple{
  121. Emitter: "src1",
  122. Message: xsql.Message{"f1": "v2"},
  123. },
  124. },
  125. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  126. },
  127. },
  128. {
  129. sql: "SELECT id1 FROM src1 WHERE f1 = \"v1\" GROUP BY TUMBLINGWINDOW(ss, 10) ORDER BY id1 DESC",
  130. data: &xsql.WindowTuples{
  131. Content: []xsql.TupleRow{
  132. &xsql.Tuple{
  133. Emitter: "src1",
  134. Message: xsql.Message{"id1": 1, "f1": "v1"},
  135. }, &xsql.Tuple{
  136. Emitter: "src1",
  137. Message: xsql.Message{"id1": "2string", "f1": "v2"},
  138. }, &xsql.Tuple{
  139. Emitter: "src1",
  140. Message: xsql.Message{"id1": 3, "f1": "v1"},
  141. },
  142. },
  143. },
  144. result: errors.New("run Order By error: incompatible types for comparison: int and string"),
  145. },
  146. {
  147. sql: "SELECT * FROM src1 WHERE f1 = \"v1\" GROUP BY TUMBLINGWINDOW(ss, 10) ORDER BY f1, id1 DESC",
  148. data: &xsql.WindowTuples{
  149. Content: []xsql.TupleRow{
  150. &xsql.Tuple{
  151. Emitter: "src1",
  152. Message: xsql.Message{"id1": 1, "f1": "v1"},
  153. }, &xsql.Tuple{
  154. Emitter: "src1",
  155. Message: xsql.Message{"id1": 2, "f1": "v2"},
  156. }, &xsql.Tuple{
  157. Emitter: "src1",
  158. Message: xsql.Message{"id1": 3, "f1": "v1"},
  159. },
  160. },
  161. },
  162. result: &xsql.WindowTuples{
  163. Content: []xsql.TupleRow{
  164. &xsql.Tuple{
  165. Emitter: "src1",
  166. Message: xsql.Message{"id1": 3, "f1": "v1"},
  167. }, &xsql.Tuple{
  168. Emitter: "src1",
  169. Message: xsql.Message{"id1": 1, "f1": "v1"},
  170. }, &xsql.Tuple{
  171. Emitter: "src1",
  172. Message: xsql.Message{"id1": 2, "f1": "v2"},
  173. },
  174. },
  175. },
  176. },
  177. {
  178. sql: "SELECT * FROM src1 GROUP BY TUMBLINGWINDOW(ss, 10) ORDER BY ts DESC",
  179. data: &xsql.WindowTuples{
  180. Content: []xsql.TupleRow{
  181. &xsql.Tuple{
  182. Emitter: "src1",
  183. Message: xsql.Message{"id1": 1, "f1": "v1", "ts": cast.TimeFromUnixMilli(1568854515000)},
  184. }, &xsql.Tuple{
  185. Emitter: "src1",
  186. Message: xsql.Message{"id1": 2, "f1": "v2", "ts": cast.TimeFromUnixMilli(1568854525000)},
  187. }, &xsql.Tuple{
  188. Emitter: "src1",
  189. Message: xsql.Message{"id1": 3, "f1": "v1", "ts": cast.TimeFromUnixMilli(1568854535000)},
  190. },
  191. },
  192. },
  193. result: &xsql.WindowTuples{
  194. Content: []xsql.TupleRow{
  195. &xsql.Tuple{
  196. Emitter: "src1",
  197. Message: xsql.Message{"id1": 3, "f1": "v1", "ts": cast.TimeFromUnixMilli(1568854535000)},
  198. }, &xsql.Tuple{
  199. Emitter: "src1",
  200. Message: xsql.Message{"id1": 2, "f1": "v2", "ts": cast.TimeFromUnixMilli(1568854525000)},
  201. }, &xsql.Tuple{
  202. Emitter: "src1",
  203. Message: xsql.Message{"id1": 1, "f1": "v1", "ts": cast.TimeFromUnixMilli(1568854515000)},
  204. },
  205. },
  206. },
  207. },
  208. {
  209. sql: "SELECT id1 FROM src1 left join src2 on src1.id1 = src2.id2 WHERE src1.f1 = \"v1\" GROUP BY TUMBLINGWINDOW(ss, 10) ORDER BY src1.id1 desc",
  210. data: &xsql.JoinTuples{
  211. Content: []*xsql.JoinTuple{
  212. {
  213. Tuples: []xsql.TupleRow{
  214. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
  215. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
  216. },
  217. },
  218. {
  219. Tuples: []xsql.TupleRow{
  220. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
  221. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
  222. },
  223. },
  224. {
  225. Tuples: []xsql.TupleRow{
  226. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v1"}},
  227. },
  228. },
  229. },
  230. },
  231. result: &xsql.JoinTuples{
  232. Content: []*xsql.JoinTuple{
  233. {
  234. Tuples: []xsql.TupleRow{
  235. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v1"}},
  236. },
  237. },
  238. {
  239. Tuples: []xsql.TupleRow{
  240. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
  241. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
  242. },
  243. },
  244. {
  245. Tuples: []xsql.TupleRow{
  246. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
  247. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
  248. },
  249. },
  250. },
  251. },
  252. },
  253. {
  254. sql: "SELECT id1 FROM src1 left join src2 on src1.id1 = src2.id2 WHERE src1.f1 = \"v1\" GROUP BY TUMBLINGWINDOW(ss, 10) ORDER BY src2.id2",
  255. data: &xsql.JoinTuples{
  256. Content: []*xsql.JoinTuple{
  257. {
  258. Tuples: []xsql.TupleRow{
  259. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
  260. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
  261. },
  262. },
  263. {
  264. Tuples: []xsql.TupleRow{
  265. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
  266. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
  267. },
  268. },
  269. {
  270. Tuples: []xsql.TupleRow{
  271. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v1"}},
  272. },
  273. },
  274. },
  275. },
  276. result: &xsql.JoinTuples{
  277. Content: []*xsql.JoinTuple{
  278. {
  279. Tuples: []xsql.TupleRow{
  280. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
  281. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
  282. },
  283. },
  284. {
  285. Tuples: []xsql.TupleRow{
  286. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
  287. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
  288. },
  289. },
  290. {
  291. Tuples: []xsql.TupleRow{
  292. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v1"}},
  293. },
  294. },
  295. },
  296. },
  297. },
  298. {
  299. sql: "SELECT abc FROM tbl group by abc ORDER BY def",
  300. data: &xsql.GroupedTuplesSet{
  301. Groups: []*xsql.GroupedTuples{
  302. {
  303. Content: []xsql.TupleRow{
  304. &xsql.Tuple{
  305. Emitter: "tbl",
  306. Message: xsql.Message{
  307. "abc": int64(6),
  308. "def": "hello",
  309. },
  310. },
  311. },
  312. },
  313. },
  314. },
  315. result: &xsql.GroupedTuplesSet{
  316. Groups: []*xsql.GroupedTuples{
  317. {
  318. Content: []xsql.TupleRow{
  319. &xsql.Tuple{
  320. Emitter: "tbl",
  321. Message: xsql.Message{
  322. "abc": int64(6),
  323. "def": "hello",
  324. },
  325. },
  326. },
  327. },
  328. },
  329. },
  330. },
  331. {
  332. sql: "SELECT id1 FROM src1 GROUP BY TUMBLINGWINDOW(ss, 10), f1 ORDER BY id1 desc",
  333. data: &xsql.GroupedTuplesSet{
  334. Groups: []*xsql.GroupedTuples{
  335. {
  336. Content: []xsql.TupleRow{
  337. &xsql.Tuple{
  338. Emitter: "src1",
  339. Message: xsql.Message{"id1": 1, "f1": "v1"},
  340. },
  341. &xsql.Tuple{
  342. Emitter: "src1",
  343. Message: xsql.Message{"id1": 3, "f1": "v1"},
  344. },
  345. },
  346. },
  347. {
  348. Content: []xsql.TupleRow{
  349. &xsql.Tuple{
  350. Emitter: "src1",
  351. Message: xsql.Message{"id1": 2, "f1": "v2"},
  352. },
  353. },
  354. },
  355. },
  356. },
  357. result: &xsql.GroupedTuplesSet{
  358. Groups: []*xsql.GroupedTuples{
  359. {
  360. Content: []xsql.TupleRow{
  361. &xsql.Tuple{
  362. Emitter: "src1",
  363. Message: xsql.Message{"id1": 2, "f1": "v2"},
  364. },
  365. },
  366. },
  367. {
  368. Content: []xsql.TupleRow{
  369. &xsql.Tuple{
  370. Emitter: "src1",
  371. Message: xsql.Message{"id1": 1, "f1": "v1"},
  372. },
  373. &xsql.Tuple{
  374. Emitter: "src1",
  375. Message: xsql.Message{"id1": 3, "f1": "v1"},
  376. },
  377. },
  378. },
  379. },
  380. },
  381. },
  382. {
  383. sql: "SELECT count(*) as c FROM src1 GROUP BY TUMBLINGWINDOW(ss, 10), f1 ORDER BY c",
  384. data: &xsql.GroupedTuplesSet{
  385. Groups: []*xsql.GroupedTuples{
  386. {
  387. Content: []xsql.TupleRow{
  388. &xsql.Tuple{
  389. Emitter: "src1",
  390. Message: xsql.Message{"id1": 1, "f1": "v1", "c": 2},
  391. },
  392. &xsql.Tuple{
  393. Emitter: "src1",
  394. Message: xsql.Message{"id1": 3, "f1": "v1"},
  395. },
  396. },
  397. },
  398. {
  399. Content: []xsql.TupleRow{
  400. &xsql.Tuple{
  401. Emitter: "src1",
  402. Message: xsql.Message{"id1": 2, "f1": "v2", "c": 1},
  403. },
  404. },
  405. },
  406. },
  407. },
  408. result: &xsql.GroupedTuplesSet{
  409. Groups: []*xsql.GroupedTuples{
  410. {
  411. Content: []xsql.TupleRow{
  412. &xsql.Tuple{
  413. Emitter: "src1",
  414. Message: xsql.Message{"id1": 2, "f1": "v2", "c": 1},
  415. },
  416. },
  417. },
  418. {
  419. Content: []xsql.TupleRow{
  420. &xsql.Tuple{
  421. Emitter: "src1",
  422. Message: xsql.Message{"id1": 1, "f1": "v1", "c": 2},
  423. },
  424. &xsql.Tuple{
  425. Emitter: "src1",
  426. Message: xsql.Message{"id1": 3, "f1": "v1"},
  427. },
  428. },
  429. },
  430. },
  431. },
  432. },
  433. {
  434. sql: "SELECT src2.id2 FROM src1 left join src2 on src1.id1 = src2.id2 GROUP BY src2.f2, TUMBLINGWINDOW(ss, 10) ORDER BY src2.id2 DESC",
  435. data: &xsql.GroupedTuplesSet{
  436. Groups: []*xsql.GroupedTuples{
  437. {
  438. Content: []xsql.TupleRow{
  439. &xsql.JoinTuple{
  440. Tuples: []xsql.TupleRow{
  441. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
  442. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
  443. },
  444. },
  445. },
  446. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  447. },
  448. {
  449. Content: []xsql.TupleRow{
  450. &xsql.JoinTuple{
  451. Tuples: []xsql.TupleRow{
  452. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
  453. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
  454. },
  455. },
  456. },
  457. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  458. },
  459. {
  460. Content: []xsql.TupleRow{
  461. &xsql.JoinTuple{
  462. Tuples: []xsql.TupleRow{
  463. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v1"}},
  464. },
  465. },
  466. },
  467. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  468. },
  469. },
  470. },
  471. result: &xsql.GroupedTuplesSet{
  472. Groups: []*xsql.GroupedTuples{
  473. {
  474. Content: []xsql.TupleRow{
  475. &xsql.JoinTuple{
  476. Tuples: []xsql.TupleRow{
  477. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 2, "f1": "v2"}},
  478. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 4, "f2": "w3"}},
  479. },
  480. },
  481. },
  482. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  483. },
  484. {
  485. Content: []xsql.TupleRow{
  486. &xsql.JoinTuple{
  487. Tuples: []xsql.TupleRow{
  488. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 1, "f1": "v1"}},
  489. &xsql.Tuple{Emitter: "src2", Message: xsql.Message{"id2": 2, "f2": "w2"}},
  490. },
  491. },
  492. },
  493. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  494. },
  495. {
  496. Content: []xsql.TupleRow{
  497. &xsql.JoinTuple{
  498. Tuples: []xsql.TupleRow{
  499. &xsql.Tuple{Emitter: "src1", Message: xsql.Message{"id1": 3, "f1": "v1"}},
  500. },
  501. },
  502. },
  503. WindowRange: xsql.NewWindowRange(1541152486013, 1541152487013),
  504. },
  505. },
  506. },
  507. },
  508. {
  509. sql: "SELECT a FROM demo GROUP BY a, TUMBLINGWINDOW(ss, 10) ORDER BY a ASC",
  510. data: &xsql.WindowTuples{
  511. Content: []xsql.TupleRow{
  512. &xsql.Tuple{
  513. Emitter: "demo",
  514. Message: xsql.Message{"a": 4},
  515. }, &xsql.Tuple{
  516. Emitter: "demo",
  517. Message: xsql.Message{"a": 5},
  518. }, &xsql.Tuple{
  519. Emitter: "demo",
  520. Message: xsql.Message{"a": 3},
  521. },
  522. &xsql.Tuple{
  523. Emitter: "demo",
  524. Message: xsql.Message{"a": 7},
  525. }, &xsql.Tuple{
  526. Emitter: "demo",
  527. Message: xsql.Message{"a": 1},
  528. }, &xsql.Tuple{
  529. Emitter: "demo",
  530. Message: xsql.Message{"a": 9},
  531. },
  532. &xsql.Tuple{
  533. Emitter: "demo",
  534. Message: xsql.Message{"a": 10},
  535. }, &xsql.Tuple{
  536. Emitter: "demo",
  537. Message: xsql.Message{"a": 2},
  538. }, &xsql.Tuple{
  539. Emitter: "demo",
  540. Message: xsql.Message{"a": 6},
  541. },
  542. &xsql.Tuple{
  543. Emitter: "demo",
  544. Message: xsql.Message{"a": 8},
  545. }, &xsql.Tuple{
  546. Emitter: "demo",
  547. Message: xsql.Message{"a": 15},
  548. }, &xsql.Tuple{
  549. Emitter: "demo",
  550. Message: xsql.Message{"a": 11},
  551. },
  552. &xsql.Tuple{
  553. Emitter: "demo",
  554. Message: xsql.Message{"a": 13},
  555. }, &xsql.Tuple{
  556. Emitter: "demo",
  557. Message: xsql.Message{"a": 14},
  558. }, &xsql.Tuple{
  559. Emitter: "demo",
  560. Message: xsql.Message{"a": 12},
  561. },
  562. },
  563. },
  564. result: &xsql.WindowTuples{
  565. Content: []xsql.TupleRow{
  566. &xsql.Tuple{
  567. Emitter: "demo",
  568. Message: xsql.Message{"a": 1},
  569. }, &xsql.Tuple{
  570. Emitter: "demo",
  571. Message: xsql.Message{"a": 2},
  572. }, &xsql.Tuple{
  573. Emitter: "demo",
  574. Message: xsql.Message{"a": 3},
  575. },
  576. &xsql.Tuple{
  577. Emitter: "demo",
  578. Message: xsql.Message{"a": 4},
  579. }, &xsql.Tuple{
  580. Emitter: "demo",
  581. Message: xsql.Message{"a": 5},
  582. }, &xsql.Tuple{
  583. Emitter: "demo",
  584. Message: xsql.Message{"a": 6},
  585. },
  586. &xsql.Tuple{
  587. Emitter: "demo",
  588. Message: xsql.Message{"a": 7},
  589. }, &xsql.Tuple{
  590. Emitter: "demo",
  591. Message: xsql.Message{"a": 8},
  592. }, &xsql.Tuple{
  593. Emitter: "demo",
  594. Message: xsql.Message{"a": 9},
  595. },
  596. &xsql.Tuple{
  597. Emitter: "demo",
  598. Message: xsql.Message{"a": 10},
  599. }, &xsql.Tuple{
  600. Emitter: "demo",
  601. Message: xsql.Message{"a": 11},
  602. }, &xsql.Tuple{
  603. Emitter: "demo",
  604. Message: xsql.Message{"a": 12},
  605. },
  606. &xsql.Tuple{
  607. Emitter: "demo",
  608. Message: xsql.Message{"a": 13},
  609. }, &xsql.Tuple{
  610. Emitter: "demo",
  611. Message: xsql.Message{"a": 14},
  612. }, &xsql.Tuple{
  613. Emitter: "demo",
  614. Message: xsql.Message{"a": 15},
  615. },
  616. },
  617. },
  618. },
  619. }
  620. fmt.Printf("The test bucket size is %d.\n\n", len(tests))
  621. contextLogger := conf.Log.WithField("rule", "TestOrderPlan_Apply")
  622. ctx := context.WithValue(context.Background(), context.LoggerKey, contextLogger)
  623. for i, tt := range tests {
  624. stmt, err := xsql.NewParser(strings.NewReader(tt.sql)).Parse()
  625. if err != nil {
  626. t.Errorf("statement parse error %s", err)
  627. break
  628. }
  629. pp := &OrderOp{SortFields: stmt.SortFields}
  630. fv, afv := xsql.NewFunctionValuersForOp(nil)
  631. result := pp.Apply(ctx, tt.data, fv, afv)
  632. if !reflect.DeepEqual(tt.result, result) {
  633. t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.result, result)
  634. }
  635. }
  636. }