aoc_1223.slt 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. # https://github.com/MaterializeInc/advent-of-code-2023/blob/main/week1/aoc_1223.md
  10. mode cockroach
  11. statement ok
  12. CREATE TABLE input (input TEXT);
  13. statement ok
  14. INSERT INTO input VALUES (
  15. '##############.###################################################################
  16. #....#.#...#....>..#...######..#.#..#.#.#.#..#..#...#.#...###..##.###...##........
  17. #####..#.v##....v...#....#.#....#.###......<..#...#....#>..#.........#.##...#.....
  18. .##..#.##...#..........#...#...#..#.#..^#..#...#.#..#.#.##<.#.<.##.#..#.#......###
  19. ..#.##.#.##..v..................#...#.##.#.##.>#.#........#....##.....#..#...#....
  20. #..<#.##..............#..#.......^##.#.#.......v....##...###.#.##.<..#....#.......
  21. .#....#.#^..#.......####.#^........>........##.........###..#.#.#...#...#...##....
  22. ##......#.#......#..#.#.##^..#....^...###.#..#.#.<.........<...##..#.#....<.#.##.#
  23. #.#.#...................>....#..##....#....##......#...^....#.#....#.#..v.##.#..##
  24. ###.#...#..##.#.#.......#....v#.###.............#...##.###......#.#.#.#.....#..#^.
  25. ##.#..........#.#.#.#...#....#......#.....#.#....##...##.....^.###.#.......###.<..
  26. ...........#..#...#^.#..........#..##..##..#....###...>#.<#..>.##..#......##.#....
  27. .>..##.#.....#.....####..#.#.#............##><.....#...###..#.....###.##.........#
  28. ...#.....>....#.v>^#...##......#..###..#...##...^###.#........#..#...#.#..#.....#>
  29. ^..^...........#.#.#.#.##.##.....#.....#.##....#.##............#.##...#..#......^.
  30. .#........#.<#.....v.......#...#v......#.#........#...#..#.#...#>.###....#v....##.
  31. .##.....#v....#^#v#.#.........#^#......<...#..##...#.#.v.###....##..#...#.#......#
  32. .#..#.##..#.##..#>..#.......<......##..#.##..###.##...#...#.#...#.#....#..##..#..#
  33. .v.#.#....>..............#.####.#...>......v#.####..#......v....##^.##.#...#...^##
  34. ##############.###################################################################');
  35. query IIII
  36. WITH MUTUALLY RECURSIVE
  37. lines(r INT, line TEXT) AS (
  38. SELECT r, regexp_split_to_array(input, '\n')[r] as line
  39. FROM input, generate_series(1, array_length(regexp_split_to_array(input, '\n'), 1)) r
  40. ),
  41. cells(r INT, c INT, symbol TEXT) AS (
  42. SELECT r, c, substring(line, c, 1)
  43. FROM lines, generate_series(1, length(line)) c
  44. ),
  45. -- Part one: longest path (on probably a DAG)
  46. paths(r INT, c INT) AS (
  47. SELECT r, c FROM cells WHERE symbol = '.'
  48. ),
  49. steps(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  50. SELECT r, c, r + 1, c FROM paths WHERE (r + 1, c) IN (SELECT * FROM PATHS) UNION
  51. SELECT r, c, r - 1, c FROM paths WHERE (r - 1, c) IN (SELECT * FROM PATHS) UNION
  52. SELECT r, c, r, c + 1 FROM paths WHERE (r, c + 1) IN (SELECT * FROM PATHS) UNION
  53. SELECT r, c, r, c - 1 FROM paths WHERE (r, c - 1) IN (SELECT * FROM PATHS)
  54. ),
  55. -- A directional trip, forced by a slope and the no-revisting rule.
  56. force(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  57. SELECT r-1, c, r+1, c FROM cells WHERE symbol = 'v' UNION ALL
  58. SELECT r+1, c, r-1, c FROM cells WHERE symbol = '^' UNION ALL
  59. SELECT r, c-1, r, c+1 FROM cells WHERE symbol = '>' UNION ALL
  60. SELECT r, c+1, r, c-1 FROM cells WHERE symbol = '<'
  61. ),
  62. dists(r INT, c INT, d INT) AS (
  63. SELECT 1, 2, 0
  64. UNION
  65. SELECT steps.r2, steps.c2, 1 + MIN(d)
  66. FROM dists, steps
  67. WHERE dists.r = steps.r1
  68. AND dists.c = steps.c1
  69. GROUP BY steps.r2, steps.c2
  70. UNION
  71. SELECT force.r2, force.c2, 2 + MAX(d)
  72. FROM dists, force
  73. WHERE dists.r = force.r1
  74. AND dists.c = force.c1
  75. GROUP BY force.r2, force.c2
  76. ),
  77. -- Part two: longest path on definitely not a DAG.
  78. -- There are 32 optional nodes (not including first and last nodes)
  79. -- Clearly meant to pack in to an int and avoid duplication.
  80. paths2(r INT, c INT) AS (
  81. SELECT r, c FROM cells WHERE symbol != '#'
  82. ),
  83. steps2(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  84. SELECT r, c, r + 1, c FROM paths2 WHERE (r + 1, c) IN (SELECT * FROM paths2) UNION
  85. SELECT r, c, r - 1, c FROM paths2 WHERE (r - 1, c) IN (SELECT * FROM paths2) UNION
  86. SELECT r, c, r, c + 1 FROM paths2 WHERE (r, c + 1) IN (SELECT * FROM paths2) UNION
  87. SELECT r, c, r, c - 1 FROM paths2 WHERE (r, c - 1) IN (SELECT * FROM paths2)
  88. ),
  89. -- Locations where a choice exists (or start/end).
  90. nodes(r INT, c INT) AS (
  91. SELECT r1, c1 FROM steps2 GROUP BY r1, c1 HAVING COUNT(*) != 2
  92. ),
  93. -- Determine node-to-node path lengths. Do not cross nodes.
  94. trail(r1 INT, c1 INT, d INT, r2 INT, c2 INT) AS (
  95. SELECT r1, c1, MIN(d), r2, c2
  96. FROM (
  97. SELECT r1, c1, 1 d, r2, c2 FROM steps2 WHERE (r1, c1) IN (SELECT * FROM nodes)
  98. UNION ALL
  99. SELECT trail.r1, trail.c1, d + 1, steps2.r2, steps2.c2
  100. FROM trail, steps2
  101. WHERE trail.r2 = steps2.r1
  102. AND trail.c2 = steps2.c1
  103. AND (trail.r1 != steps2.r2 OR trail.c1 != steps2.c2)
  104. AND (steps2.r1, steps2.c1) NOT IN (SELECT * FROM nodes)
  105. )
  106. GROUP BY r1, c1, r2, c2
  107. ),
  108. links(r1 INT, c1 INT, d INT, r2 INT, c2 INT) AS (
  109. SELECT * FROM trail WHERE (r2, c2) IN (SELECT * FROM nodes)
  110. ),
  111. -- These rows in links show that (12, 20) and (130, 126) are mandatory,
  112. -- and are the first moments we have a choice. The remaining 32 nodes
  113. -- can each get a number, and be used in a bit pattern somewhere.
  114. --
  115. -- 1 | 2 | 105 | 12 | 20
  116. -- 141 | 140 | 121 | 130 | 126
  117. -- Re-key nodes to dense integers.
  118. internal(r INT, c INT, id INT) AS (
  119. SELECT r, c, (
  120. SELECT COUNT(*)
  121. FROM nodes n1
  122. WHERE (n1.r < n2.r OR (n1.r = n2.r AND n1.c < n2.c))
  123. AND (n1.r, n1.c) NOT IN (VALUES (1,2), (12,20), (130,126), (141,140))
  124. )
  125. FROM nodes n2
  126. WHERE (r, c) NOT IN (VALUES (1,2), (12,20), (130,126), (141,140))
  127. ),
  128. longest(r INT, c INT, d INT, v BIGINT) AS (
  129. SELECT r, c, MAX(d), v
  130. FROM (
  131. SELECT 12 r, 20 c, 0 d, 0 v
  132. UNION ALL
  133. SELECT r2, c2, longest.d + links.d, v + (1::BIGINT << internal.id)
  134. FROM longest, links, internal
  135. WHERE longest.r = links.r1
  136. AND longest.c = links.c1
  137. AND links.r2 = internal.r
  138. AND links.c2 = internal.c
  139. AND ((v >> internal.id) % 2) != 1
  140. )
  141. GROUP BY r, c, v
  142. ),
  143. potato(x INT) AS ( SELECT 1 )
  144. SELECT * FROM longest ORDER BY d DESC;
  145. ----
  146. 12 20 0 0
  147. query T multiline
  148. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR
  149. WITH MUTUALLY RECURSIVE
  150. lines(r INT, line TEXT) AS (
  151. SELECT r, regexp_split_to_array(input, '\n')[r] as line
  152. FROM input, generate_series(1, array_length(regexp_split_to_array(input, '\n'), 1)) r
  153. ),
  154. cells(r INT, c INT, symbol TEXT) AS (
  155. SELECT r, c, substring(line, c, 1)
  156. FROM lines, generate_series(1, length(line)) c
  157. ),
  158. -- Part one: longest path (on probably a DAG)
  159. paths(r INT, c INT) AS (
  160. SELECT r, c FROM cells WHERE symbol = '.'
  161. ),
  162. steps(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  163. SELECT r, c, r + 1, c FROM paths WHERE (r + 1, c) IN (SELECT * FROM PATHS) UNION
  164. SELECT r, c, r - 1, c FROM paths WHERE (r - 1, c) IN (SELECT * FROM PATHS) UNION
  165. SELECT r, c, r, c + 1 FROM paths WHERE (r, c + 1) IN (SELECT * FROM PATHS) UNION
  166. SELECT r, c, r, c - 1 FROM paths WHERE (r, c - 1) IN (SELECT * FROM PATHS)
  167. ),
  168. -- A directional trip, forced by a slope and the no-revisting rule.
  169. force(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  170. SELECT r-1, c, r+1, c FROM cells WHERE symbol = 'v' UNION ALL
  171. SELECT r+1, c, r-1, c FROM cells WHERE symbol = '^' UNION ALL
  172. SELECT r, c-1, r, c+1 FROM cells WHERE symbol = '>' UNION ALL
  173. SELECT r, c+1, r, c-1 FROM cells WHERE symbol = '<'
  174. ),
  175. dists(r INT, c INT, d INT) AS (
  176. SELECT 1, 2, 0
  177. UNION
  178. SELECT steps.r2, steps.c2, 1 + MIN(d)
  179. FROM dists, steps
  180. WHERE dists.r = steps.r1
  181. AND dists.c = steps.c1
  182. GROUP BY steps.r2, steps.c2
  183. UNION
  184. SELECT force.r2, force.c2, 2 + MAX(d)
  185. FROM dists, force
  186. WHERE dists.r = force.r1
  187. AND dists.c = force.c1
  188. GROUP BY force.r2, force.c2
  189. ),
  190. -- Part two: longest path on definitely not a DAG.
  191. -- There are 32 optional nodes (not including first and last nodes)
  192. -- Clearly meant to pack in to an int and avoid duplication.
  193. paths2(r INT, c INT) AS (
  194. SELECT r, c FROM cells WHERE symbol != '#'
  195. ),
  196. steps2(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  197. SELECT r, c, r + 1, c FROM paths2 WHERE (r + 1, c) IN (SELECT * FROM paths2) UNION
  198. SELECT r, c, r - 1, c FROM paths2 WHERE (r - 1, c) IN (SELECT * FROM paths2) UNION
  199. SELECT r, c, r, c + 1 FROM paths2 WHERE (r, c + 1) IN (SELECT * FROM paths2) UNION
  200. SELECT r, c, r, c - 1 FROM paths2 WHERE (r, c - 1) IN (SELECT * FROM paths2)
  201. ),
  202. -- Locations where a choice exists (or start/end).
  203. nodes(r INT, c INT) AS (
  204. SELECT r1, c1 FROM steps2 GROUP BY r1, c1 HAVING COUNT(*) != 2
  205. ),
  206. -- Determine node-to-node path lengths. Do not cross nodes.
  207. trail(r1 INT, c1 INT, d INT, r2 INT, c2 INT) AS (
  208. SELECT r1, c1, MIN(d), r2, c2
  209. FROM (
  210. SELECT r1, c1, 1 d, r2, c2 FROM steps2 WHERE (r1, c1) IN (SELECT * FROM nodes)
  211. UNION ALL
  212. SELECT trail.r1, trail.c1, d + 1, steps2.r2, steps2.c2
  213. FROM trail, steps2
  214. WHERE trail.r2 = steps2.r1
  215. AND trail.c2 = steps2.c1
  216. AND (trail.r1 != steps2.r2 OR trail.c1 != steps2.c2)
  217. AND (steps2.r1, steps2.c1) NOT IN (SELECT * FROM nodes)
  218. )
  219. GROUP BY r1, c1, r2, c2
  220. ),
  221. links(r1 INT, c1 INT, d INT, r2 INT, c2 INT) AS (
  222. SELECT * FROM trail WHERE (r2, c2) IN (SELECT * FROM nodes)
  223. ),
  224. -- These rows in links show that (12, 20) and (130, 126) are mandatory,
  225. -- and are the first moments we have a choice. The remainaing 32 nodes
  226. -- can each get a number, and be used in a bit pattern somewhere.
  227. --
  228. -- 1 | 2 | 105 | 12 | 20
  229. -- 141 | 140 | 121 | 130 | 126
  230. -- Re-key nodes to dense integers.
  231. internal(r INT, c INT, id INT) AS (
  232. SELECT r, c, (
  233. SELECT COUNT(*)
  234. FROM nodes n1
  235. WHERE (n1.r < n2.r OR (n1.r = n2.r AND n1.c < n2.c))
  236. AND (n1.r, n1.c) NOT IN (VALUES (1,2), (12,20), (130,126), (141,140))
  237. )
  238. FROM nodes n2
  239. WHERE (r, c) NOT IN (VALUES (1,2), (12,20), (130,126), (141,140))
  240. ),
  241. longest(r INT, c INT, d INT, v BIGINT) AS (
  242. SELECT r, c, MAX(d), v
  243. FROM (
  244. SELECT 12 r, 20 c, 0 d, 0 v
  245. UNION ALL
  246. SELECT r2, c2, longest.d + links.d, v + (1::BIGINT << internal.id)
  247. FROM longest, links, internal
  248. WHERE longest.r = links.r1
  249. AND longest.c = links.c1
  250. AND links.r2 = internal.r
  251. AND links.c2 = internal.c
  252. AND ((v >> internal.id) % 2) != 1
  253. )
  254. GROUP BY r, c, v
  255. ),
  256. potato(x INT) AS ( SELECT 1 )
  257. SELECT * FROM longest ORDER BY d DESC;
  258. ----
  259. Explained Query:
  260. Finish order_by=[#2{max} desc nulls_first] output=[#0..=#3]
  261. With
  262. cte l0 =
  263. Project (#0, #2) // { arity: 2 }
  264. Filter ("#" != substr(#1{line}, #2{c}, 1)) // { arity: 3 }
  265. FlatMap generate_series(1, char_length(#1{line}), 1) // { arity: 3 }
  266. Project (#1, #2) // { arity: 2 }
  267. Map (array_index(regexp_split_to_array["\n", case_insensitive=false](#0{input}), integer_to_bigint(#1{r}))) // { arity: 3 }
  268. FlatMap generate_series(1, (regexp_split_to_array["\n", case_insensitive=false](#0{input}) array_length 1), 1) // { arity: 2 }
  269. ReadStorage materialize.public.input // { arity: 1 }
  270. cte l1 =
  271. Distinct project=[#0, #1] // { arity: 2 }
  272. Get l0 // { arity: 2 }
  273. cte l2 =
  274. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  275. Get l0 // { arity: 2 }
  276. cte l3 =
  277. Distinct project=[#0..=#3] // { arity: 4 }
  278. Union // { arity: 4 }
  279. Project (#0..=#2, #1) // { arity: 4 }
  280. Distinct project=[#0..=#2] // { arity: 3 }
  281. Union // { arity: 3 }
  282. Project (#0, #1, #4) // { arity: 3 }
  283. Map ((#0{r} + 1)) // { arity: 5 }
  284. Join on=(#0 = #2 AND #1 = #3) type=differential // { arity: 4 }
  285. implementation
  286. %1[#0, #1]UKKA » %0:l2[#0, #1]KK
  287. Get l2 // { arity: 2 }
  288. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  289. Distinct project=[#0, #1] // { arity: 2 }
  290. Project (#0, #1) // { arity: 2 }
  291. Join on=(#1{c} = #3{right_col1_13} AND #2{right_col0_12} = (#0{r} + 1)) type=differential // { arity: 4 }
  292. implementation
  293. %0:l1[(#0{r} + 1), #1{c}]KK » %1:l2[#0{right_col0_12}, #1{right_col1_13}]KK
  294. ArrangeBy keys=[[(#0{r} + 1), #1{c}]] // { arity: 2 }
  295. Get l1 // { arity: 2 }
  296. Get l2 // { arity: 2 }
  297. Project (#0, #1, #4) // { arity: 3 }
  298. Map ((#0{r} - 1)) // { arity: 5 }
  299. Join on=(#0 = #2 AND #1 = #3) type=differential // { arity: 4 }
  300. implementation
  301. %1[#0, #1]UKKA » %0:l2[#0, #1]KK
  302. Get l2 // { arity: 2 }
  303. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  304. Distinct project=[#0, #1] // { arity: 2 }
  305. Project (#0, #1) // { arity: 2 }
  306. Join on=(#1{c} = #3{right_col1_16} AND #2{right_col0_15} = (#0{r} - 1)) type=differential // { arity: 4 }
  307. implementation
  308. %0:l1[(#0{r} - 1), #1{c}]KK » %1:l2[#0{right_col0_15}, #1{right_col1_16}]KK
  309. ArrangeBy keys=[[(#0{r} - 1), #1{c}]] // { arity: 2 }
  310. Get l1 // { arity: 2 }
  311. Get l2 // { arity: 2 }
  312. Project (#0, #1, #0, #4) // { arity: 4 }
  313. Map ((#1{c} + 1)) // { arity: 5 }
  314. Join on=(#0 = #2 AND #1 = #3) type=differential // { arity: 4 }
  315. implementation
  316. %1[#0, #1]UKKA » %0:l2[#0, #1]KK
  317. Get l2 // { arity: 2 }
  318. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  319. Distinct project=[#0, #1] // { arity: 2 }
  320. Project (#0, #1) // { arity: 2 }
  321. Join on=(#0{r} = #2{right_col0_18} AND #3{right_col1_19} = (#1{c} + 1)) type=differential // { arity: 4 }
  322. implementation
  323. %0:l1[#0{r}, (#1{c} + 1)]KK » %1:l2[#0{right_col0_18}, #1{right_col1_19}]KK
  324. ArrangeBy keys=[[#0{r}, (#1{c} + 1)]] // { arity: 2 }
  325. Get l1 // { arity: 2 }
  326. Get l2 // { arity: 2 }
  327. Project (#0, #1, #0, #4) // { arity: 4 }
  328. Map ((#1{c} - 1)) // { arity: 5 }
  329. Join on=(#0 = #2 AND #1 = #3) type=differential // { arity: 4 }
  330. implementation
  331. %1[#0, #1]UKKA » %0:l2[#0, #1]KK
  332. Get l2 // { arity: 2 }
  333. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  334. Distinct project=[#0, #1] // { arity: 2 }
  335. Project (#0, #1) // { arity: 2 }
  336. Join on=(#0{r} = #2{right_col0_21} AND #3{right_col1_22} = (#1{c} - 1)) type=differential // { arity: 4 }
  337. implementation
  338. %0:l1[#0{r}, (#1{c} - 1)]KK » %1:l2[#0{right_col0_21}, #1{right_col1_22}]KK
  339. ArrangeBy keys=[[#0{r}, (#1{c} - 1)]] // { arity: 2 }
  340. Get l1 // { arity: 2 }
  341. Get l2 // { arity: 2 }
  342. cte l4 =
  343. Project (#0, #1) // { arity: 2 }
  344. Filter (#2{count} != 2) // { arity: 3 }
  345. Reduce group_by=[#0, #1] aggregates=[count(*)] // { arity: 3 }
  346. Project (#0, #1) // { arity: 2 }
  347. Get l3 // { arity: 4 }
  348. cte l5 =
  349. Union // { arity: 2 }
  350. Negate // { arity: 2 }
  351. Distinct project=[#0, #1] // { arity: 2 }
  352. Project (#0, #1) // { arity: 2 }
  353. Filter (#0{r} = #2{right_col0_36}) AND (#1{c} = #3{right_col1_37}) // { arity: 4 }
  354. FlatMap wrap2(1, 2, 12, 20, 130, 126, 141, 140) // { arity: 4 }
  355. Get l4 // { arity: 2 }
  356. Get l4 // { arity: 2 }
  357. cte l6 =
  358. Distinct project=[#0, #1] // { arity: 2 }
  359. Get l5 // { arity: 2 }
  360. cte l7 =
  361. Filter ((#2{r} < #0{r}) OR ((#0{r} = #2{r}) AND (#3{c} < #1{c}))) // { arity: 4 }
  362. CrossJoin type=differential // { arity: 4 }
  363. implementation
  364. %0:l6[×] » %1:l4[×]
  365. ArrangeBy keys=[[]] // { arity: 2 }
  366. Get l6 // { arity: 2 }
  367. ArrangeBy keys=[[]] // { arity: 2 }
  368. Get l4 // { arity: 2 }
  369. cte l8 =
  370. Distinct project=[#0, #1] // { arity: 2 }
  371. Project (#2, #3) // { arity: 2 }
  372. Get l7 // { arity: 4 }
  373. cte l9 =
  374. Reduce group_by=[#0, #1] aggregates=[count(*)] // { arity: 3 }
  375. Project (#0, #1) // { arity: 2 }
  376. Join on=(#2 = #4 AND #3 = #5) type=differential // { arity: 6 }
  377. implementation
  378. %0:l7[#2, #3]KK » %1[#0, #1]KK
  379. ArrangeBy keys=[[#2, #3]] // { arity: 4 }
  380. Get l7 // { arity: 4 }
  381. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  382. Union // { arity: 2 }
  383. Negate // { arity: 2 }
  384. Distinct project=[#0, #1] // { arity: 2 }
  385. Project (#0, #1) // { arity: 2 }
  386. Filter (#0{r} = #2{right_col0_33}) AND (#1{c} = #3{right_col1_34}) // { arity: 4 }
  387. FlatMap wrap2(1, 2, 12, 20, 130, 126, 141, 140) // { arity: 4 }
  388. Get l8 // { arity: 2 }
  389. Get l8 // { arity: 2 }
  390. cte l10 =
  391. ArrangeBy keys=[[#0{r1}, #1{c1}]] // { arity: 4 }
  392. Get l3 // { arity: 4 }
  393. cte l11 =
  394. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  395. Get l4 // { arity: 2 }
  396. Return // { arity: 4 }
  397. With Mutually Recursive
  398. cte l12 =
  399. Project (#0..=#4, #7, #8) // { arity: 7 }
  400. Filter ((#0{r1} != #7{r2}) OR (#1{c1} != #8{c2})) // { arity: 9 }
  401. Join on=(#3{r2} = #5{r1} AND #4{c2} = #6{c1}) type=differential // { arity: 9 }
  402. implementation
  403. %0:l14[#3{r2}, #4{c2}]KK » %1:l10[#0{r1}, #1{c1}]KK
  404. ArrangeBy keys=[[#3{r2}, #4{c2}]] // { arity: 5 }
  405. Get l14 // { arity: 5 }
  406. Get l10 // { arity: 4 }
  407. cte l13 =
  408. Distinct project=[#0, #1] // { arity: 2 }
  409. Project (#3, #4) // { arity: 2 }
  410. Get l12 // { arity: 7 }
  411. cte l14 =
  412. Project (#0, #1, #4{min}, #2, #3) // { arity: 5 }
  413. Reduce group_by=[#0, #1, #3, #4] aggregates=[min(#2{d})] // { arity: 5 }
  414. Union // { arity: 5 }
  415. Project (#0, #1, #6, #2, #3) // { arity: 5 }
  416. Map (1) // { arity: 7 }
  417. Join on=(#0 = #4 AND #1 = #5) type=differential // { arity: 6 }
  418. implementation
  419. %1:l11[#0, #1]UKK » %0:l10[#0, #1]KK
  420. Get l10 // { arity: 4 }
  421. Get l11 // { arity: 2 }
  422. Project (#0, #1, #9, #5, #6) // { arity: 5 }
  423. Map ((#2{d} + 1)) // { arity: 10 }
  424. Join on=(#3 = #7 AND #4 = #8) type=differential // { arity: 9 }
  425. implementation
  426. %0:l12[#3, #4]KK » %1[#0, #1]KK
  427. ArrangeBy keys=[[#3, #4]] // { arity: 7 }
  428. Get l12 // { arity: 7 }
  429. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  430. Union // { arity: 2 }
  431. Negate // { arity: 2 }
  432. Project (#0, #1) // { arity: 2 }
  433. Join on=(#0 = #2 AND #1 = #3) type=differential // { arity: 4 }
  434. implementation
  435. %0:l13[#0, #1]UKK » %1:l11[#0, #1]UKK
  436. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  437. Get l13 // { arity: 2 }
  438. Get l11 // { arity: 2 }
  439. Get l13 // { arity: 2 }
  440. cte l15 =
  441. Project (#0, #1, #3{max}, #2) // { arity: 4 }
  442. Reduce group_by=[#0, #1, #3] aggregates=[max(#2{d})] // { arity: 4 }
  443. Union // { arity: 4 }
  444. Project (#7, #8, #15, #16) // { arity: 4 }
  445. Filter (1 != ((#3{v} >> #14) % 2)) // { arity: 17 }
  446. Map (bigint_to_integer(#13{count}), (#2{d} + #6{min}), (#3{v} + (1 << #14{id}))) // { arity: 17 }
  447. Join on=(#0{r} = #4{r1} AND #1{c} = #5{c1} AND #7 = #9 = #11 AND #8 = #10 = #12) type=delta // { arity: 14 }
  448. implementation
  449. %0:l15 » %1:l14[#0{r1}, #1{c1}]KK » %3[#0, #1]UKK » %2:l5[#0, #1]KK
  450. %1:l14 » %3[#0, #1]UKK » %0:l15[#0{r}, #1{c}]KK » %2:l5[#0, #1]KK
  451. %2:l5 » %3[#0, #1]UKK » %1:l14[#3, #4]KK » %0:l15[#0{r}, #1{c}]KK
  452. %3 » %1:l14[#3, #4]KK » %0:l15[#0{r}, #1{c}]KK » %2:l5[#0, #1]KK
  453. ArrangeBy keys=[[#0{r}, #1{c}]] // { arity: 4 }
  454. Get l15 // { arity: 4 }
  455. ArrangeBy keys=[[#0{r1}, #1{c1}], [#3, #4]] // { arity: 5 }
  456. Get l14 // { arity: 5 }
  457. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  458. Get l5 // { arity: 2 }
  459. ArrangeBy keys=[[#0, #1]] // { arity: 3 }
  460. Union // { arity: 3 }
  461. Get l9 // { arity: 3 }
  462. Map (0) // { arity: 3 }
  463. Union // { arity: 2 }
  464. Negate // { arity: 2 }
  465. Project (#0, #1) // { arity: 2 }
  466. Get l9 // { arity: 3 }
  467. Get l6 // { arity: 2 }
  468. Constant // { arity: 4 }
  469. - (12, 20, 0, 0)
  470. Return // { arity: 4 }
  471. Get l15 // { arity: 4 }
  472. Source materialize.public.input
  473. Target cluster: quickstart
  474. EOF