kumi 0.0.18 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (676) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +27 -0
  5. data/CLAUDE.md +26 -139
  6. data/README.md +143 -372
  7. data/data/functions/agg/boolean.yaml +14 -0
  8. data/data/functions/agg/numeric.yaml +80 -0
  9. data/data/functions/agg/string.yaml +8 -0
  10. data/data/functions/core/arithmetic.yaml +50 -0
  11. data/data/functions/core/boolean.yaml +18 -0
  12. data/data/functions/core/comparison.yaml +42 -0
  13. data/data/functions/core/constructor.yaml +32 -0
  14. data/data/functions/core/select.yaml +7 -0
  15. data/data/functions/core/stencil.yaml +21 -0
  16. data/data/functions/core/string.yaml +19 -0
  17. data/data/kernels/javascript/agg/boolean.yaml +12 -0
  18. data/data/kernels/javascript/agg/numeric.yaml +27 -0
  19. data/data/kernels/javascript/agg/string.yaml +5 -0
  20. data/data/kernels/javascript/core/arithmetic.yaml +32 -0
  21. data/data/kernels/javascript/core/boolean.yaml +12 -0
  22. data/data/kernels/javascript/core/comparison.yaml +24 -0
  23. data/data/kernels/javascript/core/constructor.yaml +15 -0
  24. data/data/kernels/javascript/core/select.yaml +7 -0
  25. data/data/kernels/javascript/core/string.yaml +12 -0
  26. data/data/kernels/ruby/agg/boolean.yaml +18 -0
  27. data/data/kernels/ruby/agg/numeric.yaml +29 -0
  28. data/data/kernels/ruby/agg/string.yaml +5 -0
  29. data/data/kernels/ruby/core/arithmetic.yaml +38 -0
  30. data/data/kernels/ruby/core/boolean.yaml +15 -0
  31. data/data/kernels/ruby/core/comparison.yaml +30 -0
  32. data/data/kernels/ruby/core/constructor.yaml +17 -0
  33. data/data/kernels/ruby/core/select.yaml +4 -0
  34. data/data/kernels/ruby/core/string.yaml +15 -0
  35. data/debug_ordering.rb +52 -0
  36. data/docs/FORM_SCHEMA.md +85 -0
  37. data/docs/OUTPUT_SCHEMA.md +69 -0
  38. data/docs/SYNTAX.md +626 -373
  39. data/golden/array_element/expected/ast.txt +21 -0
  40. data/golden/array_element/expected/input_plan.txt +5 -0
  41. data/golden/array_element/expected/lir_00_unoptimized.txt +13 -0
  42. data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +13 -0
  43. data/golden/array_element/expected/lir_02_inlined.txt +13 -0
  44. data/golden/array_element/expected/lir_03_cse.txt +13 -0
  45. data/golden/array_element/expected/lir_04_1_loop_fusion.txt +13 -0
  46. data/golden/array_element/expected/lir_04_loop_invcm.txt +13 -0
  47. data/golden/array_element/expected/lir_06_const_prop.txt +13 -0
  48. data/golden/array_element/expected/nast.txt +7 -0
  49. data/golden/array_element/expected/schema_javascript.mjs +13 -0
  50. data/golden/array_element/expected/schema_ruby.rb +41 -0
  51. data/golden/array_element/expected/snast.txt +7 -0
  52. data/golden/array_element/expected.json +5 -0
  53. data/golden/array_element/input.json +9 -0
  54. data/golden/array_element/schema.kumi +11 -0
  55. data/golden/array_index/expected/ast.txt +59 -0
  56. data/golden/array_index/expected/input_plan.txt +5 -0
  57. data/golden/array_index/expected/lir_00_unoptimized.txt +41 -0
  58. data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +41 -0
  59. data/golden/array_index/expected/lir_02_inlined.txt +42 -0
  60. data/golden/array_index/expected/lir_03_cse.txt +40 -0
  61. data/golden/array_index/expected/lir_04_1_loop_fusion.txt +40 -0
  62. data/golden/array_index/expected/lir_04_loop_invcm.txt +40 -0
  63. data/golden/array_index/expected/lir_06_const_prop.txt +40 -0
  64. data/golden/array_index/expected/nast.txt +33 -0
  65. data/golden/array_index/expected/schema_javascript.mjs +46 -0
  66. data/golden/array_index/expected/schema_ruby.rb +75 -0
  67. data/golden/array_index/expected/snast.txt +33 -0
  68. data/golden/array_index/expected.json +5 -0
  69. data/golden/array_index/input.json +1 -0
  70. data/golden/array_index/schema.kumi +19 -0
  71. data/golden/array_operations/expected/ast.txt +50 -0
  72. data/golden/array_operations/expected/input_plan.txt +10 -0
  73. data/golden/array_operations/expected/lir_00_unoptimized.txt +47 -0
  74. data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +47 -0
  75. data/golden/array_operations/expected/lir_02_inlined.txt +47 -0
  76. data/golden/array_operations/expected/lir_03_cse.txt +47 -0
  77. data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +47 -0
  78. data/golden/array_operations/expected/lir_04_loop_invcm.txt +47 -0
  79. data/golden/array_operations/expected/lir_06_const_prop.txt +47 -0
  80. data/golden/array_operations/expected/nast.txt +32 -0
  81. data/golden/array_operations/expected/schema_javascript.mjs +60 -0
  82. data/golden/array_operations/expected/schema_ruby.rb +91 -0
  83. data/golden/array_operations/expected/snast.txt +32 -0
  84. data/golden/array_operations/expected.json +27 -0
  85. data/golden/array_operations/input.json +8 -0
  86. data/golden/array_operations/schema.kumi +12 -10
  87. data/golden/cascade_logic/expected/ast.txt +37 -0
  88. data/golden/cascade_logic/expected/input_plan.txt +2 -0
  89. data/golden/cascade_logic/expected/lir_00_unoptimized.txt +29 -0
  90. data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +29 -0
  91. data/golden/cascade_logic/expected/lir_02_inlined.txt +37 -0
  92. data/golden/cascade_logic/expected/lir_03_cse.txt +30 -0
  93. data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +30 -0
  94. data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +30 -0
  95. data/golden/cascade_logic/expected/lir_06_const_prop.txt +30 -0
  96. data/golden/cascade_logic/expected/nast.txt +32 -0
  97. data/golden/cascade_logic/expected/schema_javascript.mjs +31 -0
  98. data/golden/cascade_logic/expected/schema_ruby.rb +57 -0
  99. data/golden/cascade_logic/expected/snast.txt +32 -0
  100. data/golden/cascade_logic/expected.json +5 -0
  101. data/golden/cascade_logic/input.json +4 -0
  102. data/golden/cascade_logic/schema.kumi +1 -3
  103. data/golden/chained_fusion/expected/ast.txt +57 -0
  104. data/golden/chained_fusion/expected/input_plan.txt +13 -0
  105. data/golden/chained_fusion/expected/lir_00_unoptimized.txt +76 -0
  106. data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +76 -0
  107. data/golden/chained_fusion/expected/lir_02_inlined.txt +114 -0
  108. data/golden/chained_fusion/expected/lir_03_cse.txt +97 -0
  109. data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +99 -0
  110. data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +97 -0
  111. data/golden/chained_fusion/expected/lir_06_const_prop.txt +97 -0
  112. data/golden/chained_fusion/expected/nast.txt +55 -0
  113. data/golden/chained_fusion/expected/schema_javascript.mjs +116 -0
  114. data/golden/chained_fusion/expected/schema_ruby.rb +149 -0
  115. data/golden/chained_fusion/expected/snast.txt +55 -0
  116. data/golden/chained_fusion/expected.json +45 -0
  117. data/golden/chained_fusion/input.json +51 -0
  118. data/golden/chained_fusion/schema.kumi +52 -0
  119. data/golden/element_arrays/expected/ast.txt +55 -0
  120. data/golden/element_arrays/expected/input_plan.txt +7 -0
  121. data/golden/element_arrays/expected/lir_00_unoptimized.txt +81 -0
  122. data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +81 -0
  123. data/golden/element_arrays/expected/lir_02_inlined.txt +85 -0
  124. data/golden/element_arrays/expected/lir_03_cse.txt +83 -0
  125. data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +83 -0
  126. data/golden/element_arrays/expected/lir_04_loop_invcm.txt +83 -0
  127. data/golden/element_arrays/expected/lir_06_const_prop.txt +83 -0
  128. data/golden/element_arrays/expected/nast.txt +42 -0
  129. data/golden/element_arrays/expected/schema_javascript.mjs +106 -0
  130. data/golden/element_arrays/expected/schema_ruby.rb +141 -0
  131. data/golden/element_arrays/expected/snast.txt +42 -0
  132. data/golden/element_arrays/expected.json +55 -0
  133. data/golden/element_arrays/input.json +12 -0
  134. data/golden/element_arrays/schema.kumi +21 -0
  135. data/golden/empty_and_null_inputs/expected/ast.txt +42 -0
  136. data/golden/empty_and_null_inputs/expected/input_plan.txt +12 -0
  137. data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +31 -0
  138. data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +31 -0
  139. data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +51 -0
  140. data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +49 -0
  141. data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +49 -0
  142. data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +49 -0
  143. data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +49 -0
  144. data/golden/empty_and_null_inputs/expected/nast.txt +18 -0
  145. data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +47 -0
  146. data/golden/empty_and_null_inputs/expected/schema_ruby.rb +79 -0
  147. data/golden/empty_and_null_inputs/expected/snast.txt +18 -0
  148. data/golden/empty_and_null_inputs/expected.json +8 -0
  149. data/golden/empty_and_null_inputs/input.json +16 -0
  150. data/golden/empty_and_null_inputs/schema.kumi +30 -0
  151. data/golden/game_of_life/expected/ast.txt +118 -0
  152. data/golden/game_of_life/expected/input_plan.txt +5 -0
  153. data/golden/game_of_life/expected/lir_00_unoptimized.txt +343 -0
  154. data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +343 -0
  155. data/golden/game_of_life/expected/lir_02_inlined.txt +1918 -0
  156. data/golden/game_of_life/expected/lir_03_cse.txt +766 -0
  157. data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +766 -0
  158. data/golden/game_of_life/expected/lir_04_loop_invcm.txt +766 -0
  159. data/golden/game_of_life/expected/lir_06_const_prop.txt +766 -0
  160. data/golden/game_of_life/expected/nast.txt +104 -0
  161. data/golden/game_of_life/expected/schema_javascript.mjs +98 -0
  162. data/golden/game_of_life/expected/schema_ruby.rb +125 -0
  163. data/golden/game_of_life/expected/snast.txt +104 -0
  164. data/golden/game_of_life/expected.json +3 -0
  165. data/golden/game_of_life/input.json +8 -0
  166. data/golden/game_of_life/schema.kumi +33 -0
  167. data/golden/hash_keys/expected/ast.txt +29 -0
  168. data/golden/hash_keys/expected/input_plan.txt +2 -0
  169. data/golden/hash_keys/expected/lir_00_unoptimized.txt +18 -0
  170. data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +18 -0
  171. data/golden/hash_keys/expected/lir_02_inlined.txt +18 -0
  172. data/golden/hash_keys/expected/lir_03_cse.txt +18 -0
  173. data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +18 -0
  174. data/golden/hash_keys/expected/lir_04_loop_invcm.txt +18 -0
  175. data/golden/hash_keys/expected/lir_06_const_prop.txt +18 -0
  176. data/golden/hash_keys/expected/nast.txt +46 -0
  177. data/golden/hash_keys/expected/schema_javascript.mjs +34 -0
  178. data/golden/hash_keys/expected/schema_ruby.rb +61 -0
  179. data/golden/hash_keys/expected/snast.txt +46 -0
  180. data/golden/hash_keys/expected.json +20 -0
  181. data/golden/hash_keys/input.json +4 -0
  182. data/golden/hash_keys/schema.kumi +14 -0
  183. data/golden/hash_value/expected/ast.txt +37 -0
  184. data/golden/hash_value/expected/input_plan.txt +7 -0
  185. data/golden/hash_value/expected/lir_00_unoptimized.txt +30 -0
  186. data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +30 -0
  187. data/golden/hash_value/expected/lir_02_inlined.txt +36 -0
  188. data/golden/hash_value/expected/lir_03_cse.txt +33 -0
  189. data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +33 -0
  190. data/golden/hash_value/expected/lir_04_loop_invcm.txt +33 -0
  191. data/golden/hash_value/expected/lir_06_const_prop.txt +33 -0
  192. data/golden/hash_value/expected/nast.txt +25 -0
  193. data/golden/hash_value/expected/schema_javascript.mjs +46 -0
  194. data/golden/hash_value/expected/schema_ruby.rb +75 -0
  195. data/golden/hash_value/expected/snast.txt +25 -0
  196. data/golden/hash_value/expected.json +19 -0
  197. data/golden/hash_value/input.json +12 -0
  198. data/golden/hash_value/schema.kumi +19 -0
  199. data/golden/hierarchical_complex/expected/ast.txt +85 -0
  200. data/golden/hierarchical_complex/expected/input_plan.txt +23 -0
  201. data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +87 -0
  202. data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +87 -0
  203. data/golden/hierarchical_complex/expected/lir_02_inlined.txt +115 -0
  204. data/golden/hierarchical_complex/expected/lir_03_cse.txt +89 -0
  205. data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +89 -0
  206. data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +89 -0
  207. data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +89 -0
  208. data/golden/hierarchical_complex/expected/nast.txt +49 -0
  209. data/golden/hierarchical_complex/expected/schema_javascript.mjs +121 -0
  210. data/golden/hierarchical_complex/expected/schema_ruby.rb +151 -0
  211. data/golden/hierarchical_complex/expected/snast.txt +49 -0
  212. data/golden/hierarchical_complex/expected.json +34 -0
  213. data/golden/hierarchical_complex/input.json +26 -0
  214. data/golden/hierarchical_complex/schema.kumi +38 -0
  215. data/golden/input_reference/expected/ast.txt +46 -0
  216. data/golden/input_reference/expected/input_plan.txt +15 -0
  217. data/golden/input_reference/expected/lir_00_unoptimized.txt +39 -0
  218. data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +39 -0
  219. data/golden/input_reference/expected/lir_02_inlined.txt +39 -0
  220. data/golden/input_reference/expected/lir_03_cse.txt +39 -0
  221. data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +39 -0
  222. data/golden/input_reference/expected/lir_04_loop_invcm.txt +39 -0
  223. data/golden/input_reference/expected/lir_06_const_prop.txt +39 -0
  224. data/golden/input_reference/expected/nast.txt +21 -0
  225. data/golden/input_reference/expected/schema_javascript.mjs +45 -0
  226. data/golden/input_reference/expected/schema_ruby.rb +74 -0
  227. data/golden/input_reference/expected/snast.txt +21 -0
  228. data/golden/input_reference/expected.json +7 -0
  229. data/golden/input_reference/input.json +11 -0
  230. data/golden/input_reference/schema.kumi +22 -0
  231. data/golden/interleaved_fusion/expected/ast.txt +51 -0
  232. data/golden/interleaved_fusion/expected/input_plan.txt +13 -0
  233. data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +53 -0
  234. data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +53 -0
  235. data/golden/interleaved_fusion/expected/lir_02_inlined.txt +89 -0
  236. data/golden/interleaved_fusion/expected/lir_03_cse.txt +77 -0
  237. data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +77 -0
  238. data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +77 -0
  239. data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +77 -0
  240. data/golden/interleaved_fusion/expected/nast.txt +41 -0
  241. data/golden/interleaved_fusion/expected/schema_javascript.mjs +86 -0
  242. data/golden/interleaved_fusion/expected/schema_ruby.rb +122 -0
  243. data/golden/interleaved_fusion/expected/snast.txt +41 -0
  244. data/golden/interleaved_fusion/expected.json +37 -0
  245. data/golden/interleaved_fusion/input.json +26 -0
  246. data/golden/interleaved_fusion/schema.kumi +57 -0
  247. data/golden/let_inline/expected/ast.txt +33 -0
  248. data/golden/let_inline/expected/input_plan.txt +2 -0
  249. data/golden/let_inline/expected/lir_00_unoptimized.txt +26 -0
  250. data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +26 -0
  251. data/golden/let_inline/expected/lir_02_inlined.txt +36 -0
  252. data/golden/let_inline/expected/lir_03_cse.txt +30 -0
  253. data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +30 -0
  254. data/golden/let_inline/expected/lir_04_loop_invcm.txt +30 -0
  255. data/golden/let_inline/expected/lir_06_const_prop.txt +30 -0
  256. data/golden/let_inline/expected/nast.txt +26 -0
  257. data/golden/let_inline/expected/schema_javascript.mjs +11 -0
  258. data/golden/let_inline/expected/schema_ruby.rb +37 -0
  259. data/golden/let_inline/expected/snast.txt +26 -0
  260. data/golden/let_inline/expected.json +1 -0
  261. data/golden/let_inline/input.json +1 -0
  262. data/golden/let_inline/schema.kumi +11 -0
  263. data/golden/loop_fusion/expected/ast.txt +44 -0
  264. data/golden/loop_fusion/expected/input_plan.txt +13 -0
  265. data/golden/loop_fusion/expected/lir_00_unoptimized.txt +43 -0
  266. data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +43 -0
  267. data/golden/loop_fusion/expected/lir_02_inlined.txt +62 -0
  268. data/golden/loop_fusion/expected/lir_03_cse.txt +57 -0
  269. data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +57 -0
  270. data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +57 -0
  271. data/golden/loop_fusion/expected/lir_06_const_prop.txt +57 -0
  272. data/golden/loop_fusion/expected/nast.txt +32 -0
  273. data/golden/loop_fusion/expected/schema_javascript.mjs +64 -0
  274. data/golden/loop_fusion/expected/schema_ruby.rb +97 -0
  275. data/golden/loop_fusion/expected/snast.txt +32 -0
  276. data/golden/loop_fusion/expected.json +30 -0
  277. data/golden/loop_fusion/input.json +28 -0
  278. data/golden/loop_fusion/schema.kumi +32 -0
  279. data/golden/min_reduce_scope/expected/ast.txt +49 -0
  280. data/golden/min_reduce_scope/expected/input_plan.txt +9 -0
  281. data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +59 -0
  282. data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +59 -0
  283. data/golden/min_reduce_scope/expected/lir_02_inlined.txt +63 -0
  284. data/golden/min_reduce_scope/expected/lir_03_cse.txt +60 -0
  285. data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +60 -0
  286. data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +60 -0
  287. data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +60 -0
  288. data/golden/min_reduce_scope/expected/nast.txt +29 -0
  289. data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -0
  290. data/golden/min_reduce_scope/expected/schema_ruby.rb +99 -0
  291. data/golden/min_reduce_scope/expected/snast.txt +29 -0
  292. data/golden/min_reduce_scope/expected.json +9 -0
  293. data/golden/min_reduce_scope/input.json +18 -0
  294. data/golden/min_reduce_scope/schema.kumi +25 -0
  295. data/golden/mixed_dimensions/expected/ast.txt +54 -0
  296. data/golden/mixed_dimensions/expected/input_plan.txt +15 -0
  297. data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +42 -0
  298. data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +42 -0
  299. data/golden/mixed_dimensions/expected/lir_02_inlined.txt +48 -0
  300. data/golden/mixed_dimensions/expected/lir_03_cse.txt +48 -0
  301. data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +48 -0
  302. data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +48 -0
  303. data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +48 -0
  304. data/golden/mixed_dimensions/expected/nast.txt +22 -0
  305. data/golden/mixed_dimensions/expected/schema_javascript.mjs +53 -0
  306. data/golden/mixed_dimensions/expected/schema_ruby.rb +84 -0
  307. data/golden/mixed_dimensions/expected/snast.txt +22 -0
  308. data/golden/mixed_dimensions/expected.json +6 -0
  309. data/golden/mixed_dimensions/input.json +22 -0
  310. data/golden/mixed_dimensions/schema.kumi +35 -0
  311. data/golden/multirank_hoisting/expected/ast.txt +72 -0
  312. data/golden/multirank_hoisting/expected/input_plan.txt +18 -0
  313. data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +75 -0
  314. data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +75 -0
  315. data/golden/multirank_hoisting/expected/lir_02_inlined.txt +126 -0
  316. data/golden/multirank_hoisting/expected/lir_03_cse.txt +109 -0
  317. data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +109 -0
  318. data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +109 -0
  319. data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +109 -0
  320. data/golden/multirank_hoisting/expected/nast.txt +39 -0
  321. data/golden/multirank_hoisting/expected/schema_javascript.mjs +128 -0
  322. data/golden/multirank_hoisting/expected/schema_ruby.rb +162 -0
  323. data/golden/multirank_hoisting/expected/snast.txt +39 -0
  324. data/golden/multirank_hoisting/expected.json +15 -0
  325. data/golden/multirank_hoisting/input.json +19 -0
  326. data/golden/multirank_hoisting/schema.kumi +38 -0
  327. data/golden/nested_hash/expected/ast.txt +22 -0
  328. data/golden/nested_hash/expected/input_plan.txt +5 -0
  329. data/golden/nested_hash/expected/lir_00_unoptimized.txt +10 -0
  330. data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +10 -0
  331. data/golden/nested_hash/expected/lir_02_inlined.txt +10 -0
  332. data/golden/nested_hash/expected/lir_03_cse.txt +10 -0
  333. data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +10 -0
  334. data/golden/nested_hash/expected/lir_04_loop_invcm.txt +10 -0
  335. data/golden/nested_hash/expected/lir_06_const_prop.txt +10 -0
  336. data/golden/nested_hash/expected/nast.txt +8 -0
  337. data/golden/nested_hash/expected/schema_javascript.mjs +9 -0
  338. data/golden/nested_hash/expected/schema_ruby.rb +35 -0
  339. data/golden/nested_hash/expected/snast.txt +8 -0
  340. data/golden/nested_hash/expected.json +3 -0
  341. data/golden/nested_hash/input.json +7 -0
  342. data/golden/nested_hash/schema.kumi +11 -0
  343. data/golden/reduction_broadcast/expected/ast.txt +49 -0
  344. data/golden/reduction_broadcast/expected/input_plan.txt +13 -0
  345. data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +49 -0
  346. data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +49 -0
  347. data/golden/reduction_broadcast/expected/lir_02_inlined.txt +80 -0
  348. data/golden/reduction_broadcast/expected/lir_03_cse.txt +68 -0
  349. data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +68 -0
  350. data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +68 -0
  351. data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +68 -0
  352. data/golden/reduction_broadcast/expected/nast.txt +24 -0
  353. data/golden/reduction_broadcast/expected/schema_javascript.mjs +74 -0
  354. data/golden/reduction_broadcast/expected/schema_ruby.rb +110 -0
  355. data/golden/reduction_broadcast/expected/snast.txt +24 -0
  356. data/golden/reduction_broadcast/expected.json +25 -0
  357. data/golden/reduction_broadcast/input.json +19 -0
  358. data/golden/reduction_broadcast/schema.kumi +34 -0
  359. data/golden/roll/expected/ast.txt +36 -0
  360. data/golden/roll/expected/input_plan.txt +3 -0
  361. data/golden/roll/expected/lir_00_unoptimized.txt +56 -0
  362. data/golden/roll/expected/lir_01_hoist_scalar_references.txt +56 -0
  363. data/golden/roll/expected/lir_02_inlined.txt +56 -0
  364. data/golden/roll/expected/lir_03_cse.txt +55 -0
  365. data/golden/roll/expected/lir_04_1_loop_fusion.txt +55 -0
  366. data/golden/roll/expected/lir_04_loop_invcm.txt +55 -0
  367. data/golden/roll/expected/lir_06_const_prop.txt +55 -0
  368. data/golden/roll/expected/nast.txt +26 -0
  369. data/golden/roll/expected/schema_javascript.mjs +65 -0
  370. data/golden/roll/expected/schema_ruby.rb +95 -0
  371. data/golden/roll/expected/snast.txt +26 -0
  372. data/golden/roll/expected.json +6 -0
  373. data/golden/roll/input.json +1 -0
  374. data/golden/roll/schema.kumi +13 -0
  375. data/golden/shift/expected/ast.txt +48 -0
  376. data/golden/shift/expected/input_plan.txt +3 -0
  377. data/golden/shift/expected/lir_00_unoptimized.txt +96 -0
  378. data/golden/shift/expected/lir_01_hoist_scalar_references.txt +96 -0
  379. data/golden/shift/expected/lir_02_inlined.txt +96 -0
  380. data/golden/shift/expected/lir_03_cse.txt +90 -0
  381. data/golden/shift/expected/lir_04_1_loop_fusion.txt +90 -0
  382. data/golden/shift/expected/lir_04_loop_invcm.txt +90 -0
  383. data/golden/shift/expected/lir_06_const_prop.txt +90 -0
  384. data/golden/shift/expected/nast.txt +38 -0
  385. data/golden/shift/expected/schema_javascript.mjs +106 -0
  386. data/golden/shift/expected/schema_ruby.rb +138 -0
  387. data/golden/shift/expected/snast.txt +38 -0
  388. data/golden/shift/expected.json +8 -0
  389. data/golden/shift/input.json +1 -0
  390. data/golden/shift/schema.kumi +15 -0
  391. data/golden/shift_2d/expected/ast.txt +88 -0
  392. data/golden/shift_2d/expected/input_plan.txt +5 -0
  393. data/golden/shift_2d/expected/lir_00_unoptimized.txt +274 -0
  394. data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +274 -0
  395. data/golden/shift_2d/expected/lir_02_inlined.txt +274 -0
  396. data/golden/shift_2d/expected/lir_03_cse.txt +262 -0
  397. data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +262 -0
  398. data/golden/shift_2d/expected/lir_04_loop_invcm.txt +262 -0
  399. data/golden/shift_2d/expected/lir_06_const_prop.txt +262 -0
  400. data/golden/shift_2d/expected/nast.txt +74 -0
  401. data/golden/shift_2d/expected/schema_javascript.mjs +320 -0
  402. data/golden/shift_2d/expected/schema_ruby.rb +358 -0
  403. data/golden/shift_2d/expected/snast.txt +74 -0
  404. data/golden/shift_2d/expected.json +15 -0
  405. data/golden/shift_2d/input.json +14 -0
  406. data/golden/shift_2d/schema.kumi +25 -0
  407. data/golden/simple_math/expected/ast.txt +40 -0
  408. data/golden/simple_math/expected/input_plan.txt +2 -0
  409. data/golden/simple_math/expected/lir_00_unoptimized.txt +31 -0
  410. data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +31 -0
  411. data/golden/simple_math/expected/lir_02_inlined.txt +31 -0
  412. data/golden/simple_math/expected/lir_03_cse.txt +31 -0
  413. data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +31 -0
  414. data/golden/simple_math/expected/lir_04_loop_invcm.txt +31 -0
  415. data/golden/simple_math/expected/lir_06_const_prop.txt +31 -0
  416. data/golden/simple_math/expected/nast.txt +33 -0
  417. data/golden/simple_math/expected/schema_javascript.mjs +33 -0
  418. data/golden/simple_math/expected/schema_ruby.rb +59 -0
  419. data/golden/simple_math/expected/snast.txt +33 -0
  420. data/golden/simple_math/expected.json +1 -0
  421. data/golden/simple_math/input.json +4 -0
  422. data/golden/simple_math/schema.kumi +2 -1
  423. data/golden/streaming_basics/expected/ast.txt +64 -0
  424. data/golden/streaming_basics/expected/input_plan.txt +8 -0
  425. data/golden/streaming_basics/expected/lir_00_unoptimized.txt +73 -0
  426. data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +73 -0
  427. data/golden/streaming_basics/expected/lir_02_inlined.txt +100 -0
  428. data/golden/streaming_basics/expected/lir_03_cse.txt +84 -0
  429. data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +84 -0
  430. data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +84 -0
  431. data/golden/streaming_basics/expected/lir_06_const_prop.txt +84 -0
  432. data/golden/streaming_basics/expected/nast.txt +48 -0
  433. data/golden/streaming_basics/expected/schema_javascript.mjs +94 -0
  434. data/golden/streaming_basics/expected/schema_ruby.rb +127 -0
  435. data/golden/streaming_basics/expected/snast.txt +48 -0
  436. data/golden/streaming_basics/expected.json +10 -0
  437. data/golden/streaming_basics/input.json +8 -0
  438. data/golden/streaming_basics/schema.kumi +24 -0
  439. data/golden/tuples/expected/ast.txt +48 -0
  440. data/golden/tuples/expected/input_plan.txt +1 -0
  441. data/golden/tuples/expected/lir_00_unoptimized.txt +40 -0
  442. data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +40 -0
  443. data/golden/tuples/expected/lir_02_inlined.txt +48 -0
  444. data/golden/tuples/expected/lir_03_cse.txt +48 -0
  445. data/golden/tuples/expected/lir_04_1_loop_fusion.txt +48 -0
  446. data/golden/tuples/expected/lir_04_loop_invcm.txt +48 -0
  447. data/golden/tuples/expected/lir_06_const_prop.txt +48 -0
  448. data/golden/tuples/expected/nast.txt +42 -0
  449. data/golden/tuples/expected/schema_javascript.mjs +51 -0
  450. data/golden/tuples/expected/schema_ruby.rb +77 -0
  451. data/golden/tuples/expected/snast.txt +42 -0
  452. data/golden/tuples/expected.json +7 -0
  453. data/golden/tuples/input.json +3 -0
  454. data/golden/tuples/schema.kumi +11 -0
  455. data/golden/tuples_and_arrays/expected/ast.txt +44 -0
  456. data/golden/tuples_and_arrays/expected/input_plan.txt +7 -0
  457. data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +41 -0
  458. data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +41 -0
  459. data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +62 -0
  460. data/golden/tuples_and_arrays/expected/lir_03_cse.txt +51 -0
  461. data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +51 -0
  462. data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +51 -0
  463. data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +51 -0
  464. data/golden/tuples_and_arrays/expected/nast.txt +28 -0
  465. data/golden/tuples_and_arrays/expected/schema_javascript.mjs +58 -0
  466. data/golden/tuples_and_arrays/expected/schema_ruby.rb +88 -0
  467. data/golden/tuples_and_arrays/expected/snast.txt +28 -0
  468. data/golden/tuples_and_arrays/expected.json +18 -0
  469. data/golden/tuples_and_arrays/input.json +7 -0
  470. data/golden/tuples_and_arrays/schema.kumi +38 -0
  471. data/golden/with_constants/expected/ast.txt +28 -0
  472. data/golden/with_constants/expected/input_plan.txt +2 -0
  473. data/golden/with_constants/expected/lir_00_unoptimized.txt +17 -0
  474. data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +17 -0
  475. data/golden/with_constants/expected/lir_02_inlined.txt +17 -0
  476. data/golden/with_constants/expected/lir_03_cse.txt +17 -0
  477. data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +17 -0
  478. data/golden/with_constants/expected/lir_04_loop_invcm.txt +17 -0
  479. data/golden/with_constants/expected/lir_06_const_prop.txt +17 -0
  480. data/golden/with_constants/expected/nast.txt +21 -0
  481. data/golden/with_constants/expected/schema_javascript.mjs +18 -0
  482. data/golden/with_constants/expected/schema_ruby.rb +44 -0
  483. data/golden/with_constants/expected/snast.txt +15 -0
  484. data/golden/with_constants/schema.kumi +10 -0
  485. data/lib/kumi/analyzer.rb +76 -24
  486. data/lib/kumi/configuration.rb +60 -0
  487. data/lib/kumi/core/analyzer/binder.rb +121 -0
  488. data/lib/kumi/core/analyzer/checkpoint.rb +15 -9
  489. data/lib/kumi/core/analyzer/constant_evaluator.rb +32 -37
  490. data/lib/kumi/core/analyzer/constant_folding_helpers.rb +55 -0
  491. data/lib/kumi/core/analyzer/debug.rb +14 -16
  492. data/lib/kumi/core/analyzer/fn_aliases.rb +46 -0
  493. data/lib/kumi/core/analyzer/folder.rb +94 -0
  494. data/lib/kumi/core/analyzer/macro_expander.rb +69 -0
  495. data/lib/kumi/core/analyzer/passes/assemble_irv2_pass.rb +130 -0
  496. data/lib/kumi/core/analyzer/passes/attach_anchors_pass.rb +71 -0
  497. data/lib/kumi/core/analyzer/passes/attach_terminal_info_pass.rb +181 -0
  498. data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +317 -0
  499. data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +75 -0
  500. data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +103 -0
  501. data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +27 -0
  502. data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +321 -0
  503. data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +85 -0
  504. data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +111 -0
  505. data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +32 -0
  506. data/lib/kumi/core/analyzer/passes/constant_folding_pass.rb +33 -0
  507. data/lib/kumi/core/analyzer/passes/contract_checker_pass.rb +220 -0
  508. data/lib/kumi/core/analyzer/passes/dependency_resolver.rb +5 -6
  509. data/lib/kumi/core/analyzer/passes/input_access_planner_pass.rb +7 -3
  510. data/lib/kumi/core/analyzer/passes/input_collector.rb +74 -122
  511. data/lib/kumi/core/analyzer/passes/input_form_schema_pass.rb +43 -0
  512. data/lib/kumi/core/analyzer/passes/ir_dependency_pass.rb +1 -1
  513. data/lib/kumi/core/analyzer/passes/ir_execution_schedule_pass.rb +1 -1
  514. data/lib/kumi/core/analyzer/passes/join_reduce_planning_pass.rb +21 -23
  515. data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +84 -0
  516. data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +93 -0
  517. data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +115 -0
  518. data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +274 -0
  519. data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +198 -0
  520. data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +30 -0
  521. data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +121 -0
  522. data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +156 -0
  523. data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +148 -0
  524. data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +407 -0
  525. data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +243 -0
  526. data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +83 -0
  527. data/lib/kumi/core/analyzer/passes/load_input_cse.rb +17 -16
  528. data/lib/kumi/core/analyzer/passes/lower_to_ir_pass.rb +4 -2
  529. data/lib/kumi/core/analyzer/passes/lower_to_irv2_pass.rb +197 -0
  530. data/lib/kumi/core/analyzer/passes/name_indexer.rb +4 -1
  531. data/lib/kumi/core/analyzer/passes/nast_dimensional_analyzer_pass.rb +237 -0
  532. data/lib/kumi/core/analyzer/passes/normalize_to_nast_pass.rb +156 -0
  533. data/lib/kumi/core/analyzer/passes/output_schema_pass.rb +38 -0
  534. data/lib/kumi/core/analyzer/passes/pass_base.rb +30 -4
  535. data/lib/kumi/core/analyzer/passes/precompute_access_paths_pass.rb +93 -0
  536. data/lib/kumi/core/analyzer/passes/scope_resolution_pass.rb +33 -30
  537. data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +5 -26
  538. data/lib/kumi/core/analyzer/passes/snast_pass.rb +229 -0
  539. data/lib/kumi/core/analyzer/passes/toposorter.rb +1 -0
  540. data/lib/kumi/core/analyzer/passes/type_checker.rb +13 -0
  541. data/lib/kumi/core/analyzer/passes/type_inferencer_pass.rb +14 -16
  542. data/lib/kumi/core/analyzer/passes/unsat_detector.rb +2 -1
  543. data/lib/kumi/core/analyzer/plans.rb +12 -0
  544. data/lib/kumi/core/analyzer/state_serde.rb +4 -4
  545. data/lib/kumi/core/analyzer/structs/access_plan.rb +2 -2
  546. data/lib/kumi/core/analyzer/unsat_constant_evaluator.rb +59 -0
  547. data/lib/kumi/core/compiler/access_codegen.rb +1 -1
  548. data/lib/kumi/core/compiler/access_emit/base.rb +9 -5
  549. data/lib/kumi/core/compiler/access_emit/each_indexed.rb +10 -3
  550. data/lib/kumi/core/compiler/access_emit/materialize.rb +12 -5
  551. data/lib/kumi/core/compiler/access_emit/ravel.rb +10 -3
  552. data/lib/kumi/core/compiler/access_emit/read.rb +4 -1
  553. data/lib/kumi/core/compiler/access_planner.rb +42 -4
  554. data/lib/kumi/core/compiler/access_planner_v2.rb +164 -0
  555. data/lib/kumi/core/explain.rb +18 -11
  556. data/lib/kumi/core/functions/loader.rb +47 -0
  557. data/lib/kumi/core/functions/model.rb +10 -0
  558. data/lib/kumi/core/functions/type_rules.rb +108 -0
  559. data/lib/kumi/core/ir/execution_engine/interpreter.rb +1 -1
  560. data/lib/kumi/core/ir/execution_engine/profiler.rb +107 -97
  561. data/lib/kumi/core/ir.rb +6 -2
  562. data/lib/kumi/core/irv2/builder.rb +48 -0
  563. data/lib/kumi/core/irv2/declaration.rb +28 -0
  564. data/lib/kumi/core/irv2/module.rb +108 -0
  565. data/lib/kumi/core/irv2/value.rb +28 -0
  566. data/lib/kumi/core/lir/analyze.rb +64 -0
  567. data/lib/kumi/core/lir/build.rb +363 -0
  568. data/lib/kumi/core/lir/emit.rb +62 -0
  569. data/lib/kumi/core/lir/structs/instruction.rb +44 -0
  570. data/lib/kumi/core/lir/structs/literal.rb +14 -0
  571. data/lib/kumi/core/lir/structs/stamp.rb +13 -0
  572. data/lib/kumi/core/lir/support/error.rb +9 -0
  573. data/lib/kumi/core/lir/support/ids.rb +34 -0
  574. data/lib/kumi/core/lir/validate.rb +74 -0
  575. data/lib/kumi/core/lir.rb +34 -0
  576. data/lib/kumi/core/nast.rb +216 -0
  577. data/lib/kumi/core/ruby_parser/dsl.rb +2 -2
  578. data/lib/kumi/core/ruby_parser/dsl_cascade_builder.rb +1 -1
  579. data/lib/kumi/core/ruby_parser/expression_converter.rb +10 -0
  580. data/lib/kumi/core/ruby_parser/input_builder.rb +16 -17
  581. data/lib/kumi/core/ruby_parser/schema_builder.rb +36 -10
  582. data/lib/kumi/core/ruby_parser/sugar.rb +64 -0
  583. data/lib/kumi/core/types/builder.rb +2 -2
  584. data/lib/kumi/core/types/normalizer.rb +2 -0
  585. data/lib/kumi/core/types/validator.rb +10 -3
  586. data/lib/kumi/core/types.rb +7 -0
  587. data/lib/kumi/dev/codegen.rb +194 -0
  588. data/lib/kumi/dev/golden/generator.rb +105 -0
  589. data/lib/kumi/dev/golden/reporter.rb +160 -0
  590. data/lib/kumi/dev/golden/representation.rb +45 -0
  591. data/lib/kumi/dev/golden/result.rb +98 -0
  592. data/lib/kumi/dev/golden/runtime_test.rb +93 -0
  593. data/lib/kumi/dev/golden/suite.rb +131 -0
  594. data/lib/kumi/dev/golden/verifier.rb +76 -0
  595. data/lib/kumi/dev/golden.rb +75 -0
  596. data/lib/kumi/dev/ir.rb +4 -4
  597. data/lib/kumi/dev/parse.rb +1 -1
  598. data/lib/kumi/dev/pretty_printer.rb +229 -0
  599. data/lib/kumi/dev/printer/irv2_formatter.rb +163 -0
  600. data/lib/kumi/dev/printer/width_aware_json.rb +44 -0
  601. data/lib/kumi/dev/profile_aggregator.rb +36 -38
  602. data/lib/kumi/dev/profile_runner.rb +19 -23
  603. data/lib/kumi/dev/runner.rb +12 -22
  604. data/lib/kumi/dev/support/kumi_runner.mjs +39 -0
  605. data/lib/kumi/dev.rb +3 -3
  606. data/lib/kumi/frontends/ruby.rb +12 -12
  607. data/lib/kumi/frontends/text.rb +26 -21
  608. data/lib/kumi/frontends.rb +6 -8
  609. data/lib/kumi/kernel_registry.rb +59 -0
  610. data/lib/kumi/pack/builder.rb +229 -0
  611. data/lib/kumi/pack.rb +15 -0
  612. data/lib/kumi/registry_v2/loader.rb +81 -0
  613. data/lib/kumi/registry_v2.rb +118 -0
  614. data/lib/kumi/schema.rb +83 -43
  615. data/lib/kumi/support/diff.rb +3 -2
  616. data/lib/kumi/support/ir_render.rb +1 -1
  617. data/lib/kumi/support/lir_printer.rb +143 -0
  618. data/lib/kumi/support/nast_printer.rb +93 -0
  619. data/lib/kumi/support/s_expression_printer.rb +5 -4
  620. data/lib/kumi/support/snast_printer.rb +111 -0
  621. data/lib/kumi/syntax/call_expression.rb +1 -1
  622. data/lib/kumi/syntax/input_declaration.rb +2 -2
  623. data/lib/kumi/syntax/node.rb +4 -12
  624. data/lib/kumi/syntax/root.rb +10 -0
  625. data/lib/kumi/syntax/trait_declaration.rb +1 -0
  626. data/lib/kumi/syntax/value_declaration.rb +1 -0
  627. data/lib/kumi/version.rb +1 -1
  628. data/lib/kumi.rb +46 -4
  629. metadata +571 -54
  630. data/docs/AST.md +0 -133
  631. data/docs/DSL.md +0 -154
  632. data/docs/FUNCTIONS.md +0 -176
  633. data/docs/VECTOR_SEMANTICS.md +0 -286
  634. data/docs/compiler_design_principles.md +0 -86
  635. data/docs/dev/analyzer-debug.md +0 -52
  636. data/docs/dev/parse-command.md +0 -64
  637. data/docs/dev/vm-profiling.md +0 -95
  638. data/docs/development/README.md +0 -120
  639. data/docs/development/error-reporting.md +0 -361
  640. data/docs/features/README.md +0 -58
  641. data/docs/features/analysis-type-inference.md +0 -42
  642. data/docs/features/analysis-unsat-detection.md +0 -71
  643. data/docs/features/hierarchical-broadcasting.md +0 -415
  644. data/docs/features/input-declaration-system.md +0 -58
  645. data/docs/features/performance.md +0 -14
  646. data/docs/features/s-expression-printer.md +0 -77
  647. data/docs/schema_metadata/broadcasts.md +0 -53
  648. data/docs/schema_metadata/cascades.md +0 -45
  649. data/docs/schema_metadata/declarations.md +0 -54
  650. data/docs/schema_metadata/dependencies.md +0 -57
  651. data/docs/schema_metadata/evaluation_order.md +0 -29
  652. data/docs/schema_metadata/examples.md +0 -95
  653. data/docs/schema_metadata/inferred_types.md +0 -46
  654. data/docs/schema_metadata/inputs.md +0 -86
  655. data/docs/schema_metadata.md +0 -108
  656. data/golden/mixed_nesting/schema.kumi +0 -42
  657. data/lib/kumi/core/function_registry/collection_functions.rb +0 -298
  658. data/lib/kumi/core/function_registry/comparison_functions.rb +0 -33
  659. data/lib/kumi/core/function_registry/conditional_functions.rb +0 -48
  660. data/lib/kumi/core/function_registry/function_builder.rb +0 -184
  661. data/lib/kumi/core/function_registry/logical_functions.rb +0 -214
  662. data/lib/kumi/core/function_registry/math_functions.rb +0 -74
  663. data/lib/kumi/core/function_registry/stat_functions.rb +0 -156
  664. data/lib/kumi/core/function_registry/string_functions.rb +0 -57
  665. data/lib/kumi/core/function_registry/type_functions.rb +0 -53
  666. data/lib/kumi/core/function_registry.rb +0 -176
  667. data/lib/kumi/registry.rb +0 -32
  668. data/lib/kumi/runtime/executable.rb +0 -135
  669. data/lib/kumi/runtime/run.rb +0 -105
  670. data/performance_results.txt +0 -63
  671. data/scripts/analyze_broadcast_methods.rb +0 -68
  672. data/scripts/analyze_cascade_methods.rb +0 -74
  673. data/scripts/check_broadcasting_coverage.rb +0 -51
  674. data/scripts/find_dead_code.rb +0 -114
  675. data/scripts/generate_function_docs.rb +0 -71
  676. data/scripts/test_mixed_nesting_performance.rb +0 -206
@@ -0,0 +1,97 @@
1
+ (LIR
2
+ (Declaration total_payroll
3
+ %t1 = load_input "departments" :: array
4
+ loop departments id=L1 in %t1 as el=%departments_el_2, idx=%departments_i_3
5
+ %acc_4 = decl_acc :: integer
6
+ %t5 = load_field departments_el_2["employees"] :: any
7
+ loop employees id=L2 in %t5 as el=%employees_el_6, idx=%employees_i_7
8
+ %t8 = load_field employees_el_6["salary"] :: integer
9
+ %acc_4 = acc_add agg.sum(%acc_4, %t8) :: integer
10
+ end_loop
11
+ %t9 = acc_load %acc_4 :: integer
12
+ yield %t9
13
+ end_loop
14
+ )
15
+ (Declaration manager_count
16
+ %t10 = load_input "departments" :: array
17
+ %t18 = const "manager" :: string
18
+ %t20 = const 1 :: integer
19
+ %t21 = const 0 :: integer
20
+ loop departments id=L3 in %t10 as el=%departments_el_11, idx=%departments_i_12
21
+ %acc_13 = decl_acc :: integer
22
+ %t14 = load_field departments_el_11["employees"] :: any
23
+ loop employees id=L4 in %t14 as el=%employees_el_15, idx=%employees_i_16
24
+ %t17 = load_field employees_el_15["role"] :: string
25
+ %t19 = call core.eq(%t17, %t18) :: boolean
26
+ %t22 = select %t19, %t20, %t21 :: integer
27
+ %acc_13 = acc_add agg.sum(%acc_13, %t22) :: integer
28
+ end_loop
29
+ %t23 = acc_load %acc_13 :: integer
30
+ yield %t23
31
+ end_loop
32
+ )
33
+ (Declaration senior_employee_count
34
+ %t24 = load_input "departments" :: array
35
+ %t32 = const "senior" :: string
36
+ %t34 = const 1 :: integer
37
+ %t35 = const 0 :: integer
38
+ loop departments id=L5 in %t24 as el=%departments_el_25, idx=%departments_i_26
39
+ %acc_27 = decl_acc :: integer
40
+ %t28 = load_field departments_el_25["employees"] :: any
41
+ loop employees id=L6 in %t28 as el=%employees_el_29, idx=%employees_i_30
42
+ %t31 = load_field employees_el_29["role"] :: string
43
+ %t33 = call core.eq(%t31, %t32) :: boolean
44
+ %t36 = select %t33, %t34, %t35 :: integer
45
+ %acc_27 = acc_add agg.sum(%acc_27, %t36) :: integer
46
+ end_loop
47
+ %t37 = acc_load %acc_27 :: integer
48
+ yield %t37
49
+ end_loop
50
+ )
51
+ (Declaration max_salary
52
+ %t38 = load_input "departments" :: array
53
+ loop departments id=L7 in %t38 as el=%departments_el_39, idx=%departments_i_40
54
+ %acc_41 = decl_acc :: integer
55
+ %t42 = load_field departments_el_39["employees"] :: any
56
+ loop employees id=L8 in %t42 as el=%employees_el_43, idx=%employees_i_44
57
+ %t45 = load_field employees_el_43["salary"] :: integer
58
+ %acc_41 = acc_add agg.max(%acc_41, %t45) :: integer
59
+ end_loop
60
+ %t46 = acc_load %acc_41 :: integer
61
+ yield %t46
62
+ end_loop
63
+ )
64
+ (Declaration department_summary
65
+ %t47 = load_input "departments" :: array
66
+ %t67 = const "manager" :: string
67
+ %t69 = const 1 :: integer
68
+ %t70 = const 0 :: integer
69
+ %t78 = const "senior" :: string
70
+ loop departments id=L9 in %t47 as el=%departments_el_48, idx=%departments_i_49
71
+ %t50 = load_field departments_el_48["name"] :: string
72
+ %acc58 = decl_acc :: integer
73
+ %t59 = load_field departments_el_48["employees"] :: any
74
+ %acc64 = decl_acc :: integer
75
+ %acc75 = decl_acc :: integer
76
+ %acc86 = decl_acc :: integer
77
+ loop employees id=L10 in %t59 as el=%employees_el_6, idx=%employees_i_7
78
+ %t60 = load_field employees_el_6["salary"] :: integer
79
+ %acc58 = acc_add agg.sum(%acc58, %t60) :: integer
80
+ %t66 = load_field employees_el_6["role"] :: string
81
+ %t68 = call core.eq(%t66, %t67) :: boolean
82
+ %t71 = select %t68, %t69, %t70 :: integer
83
+ %acc64 = acc_add agg.sum(%acc64, %t71) :: integer
84
+ %acc86 = acc_add agg.max(%acc86, %t60) :: integer
85
+ %t79 = call core.eq(%t66, %t78) :: boolean
86
+ %t82 = select %t79, %t69, %t70 :: integer
87
+ %acc75 = acc_add agg.sum(%acc75, %t82) :: integer
88
+ end_loop
89
+ %t61 = acc_load %acc58 :: integer
90
+ %t72 = acc_load %acc64 :: integer
91
+ %t89 = acc_load %acc86 :: integer
92
+ %t83 = acc_load %acc75 :: integer
93
+ %t55 = make_object{name: %t50, total_payroll: %t61, manager_count: %t72, senior_count: %t83, top_salary: %t89} :: object
94
+ yield %t55
95
+ end_loop
96
+ )
97
+ )
@@ -0,0 +1,55 @@
1
+ (NAST
2
+ (VALUE total_payroll
3
+ (Call :"agg.sum"
4
+ (InputRef [:departments, :dept, :employees, :emp, :salary])
5
+ )
6
+ )
7
+ (VALUE manager_count
8
+ (Call :sum
9
+ (Call :__select__
10
+ (Call :eq
11
+ (InputRef [:departments, :dept, :employees, :emp, :role])
12
+ (Const "manager")
13
+ )
14
+ (Const 1)
15
+ (Const 0)
16
+ )
17
+ )
18
+ )
19
+ (VALUE senior_employee_count
20
+ (Call :sum
21
+ (Call :__select__
22
+ (Call :eq
23
+ (InputRef [:departments, :dept, :employees, :emp, :role])
24
+ (Const "senior")
25
+ )
26
+ (Const 1)
27
+ (Const 0)
28
+ )
29
+ )
30
+ )
31
+ (VALUE max_salary
32
+ (Call :"agg.max"
33
+ (InputRef [:departments, :dept, :employees, :emp, :salary])
34
+ )
35
+ )
36
+ (VALUE department_summary
37
+ (Hash
38
+ (Pair name
39
+ (InputRef [:departments, :dept, :name])
40
+ )
41
+ (Pair total_payroll
42
+ (Ref total_payroll)
43
+ )
44
+ (Pair manager_count
45
+ (Ref manager_count)
46
+ )
47
+ (Pair senior_count
48
+ (Ref senior_employee_count)
49
+ )
50
+ (Pair top_salary
51
+ (Ref max_salary)
52
+ )
53
+ )
54
+ )
55
+ )
@@ -0,0 +1,116 @@
1
+ export function _total_payroll(input) {
2
+ let out = [];
3
+ let t1 = input["departments"];
4
+ t1.forEach((departments_el_2, departments_i_3) => {
5
+ let acc_4 = 0;
6
+ let t5 = departments_el_2["employees"];
7
+ t5.forEach((employees_el_6, employees_i_7) => {
8
+ let t8 = employees_el_6["salary"];
9
+ acc_4 += t8;
10
+ });
11
+ out.push(acc_4);
12
+ });
13
+ return out;
14
+ }
15
+
16
+ export function _manager_count(input) {
17
+ let out = [];
18
+ let t10 = input["departments"];
19
+ const t18 = "manager";
20
+ const t20 = 1;
21
+ const t21 = 0;
22
+ t10.forEach((departments_el_11, departments_i_12) => {
23
+ let acc_13 = 0;
24
+ let t14 = departments_el_11["employees"];
25
+ t14.forEach((employees_el_15, employees_i_16) => {
26
+ let t17 = employees_el_15["role"];
27
+ let t19 = t17 == t18;
28
+ let t22 = t19 ? t20 : t21;
29
+ acc_13 += t22;
30
+ });
31
+ out.push(acc_13);
32
+ });
33
+ return out;
34
+ }
35
+
36
+ export function _senior_employee_count(input) {
37
+ let out = [];
38
+ let t24 = input["departments"];
39
+ const t32 = "senior";
40
+ const t34 = 1;
41
+ const t35 = 0;
42
+ t24.forEach((departments_el_25, departments_i_26) => {
43
+ let acc_27 = 0;
44
+ let t28 = departments_el_25["employees"];
45
+ t28.forEach((employees_el_29, employees_i_30) => {
46
+ let t31 = employees_el_29["role"];
47
+ let t33 = t31 == t32;
48
+ let t36 = t33 ? t34 : t35;
49
+ acc_27 += t36;
50
+ });
51
+ out.push(acc_27);
52
+ });
53
+ return out;
54
+ }
55
+
56
+ export function _max_salary(input) {
57
+ let out = [];
58
+ let t38 = input["departments"];
59
+ t38.forEach((departments_el_39, departments_i_40) => {
60
+ let acc_41 = null;
61
+ let t42 = departments_el_39["employees"];
62
+ t42.forEach((employees_el_43, employees_i_44) => {
63
+ let t45 = employees_el_43["salary"];
64
+ if (acc_41 === null || acc_41 === undefined) {
65
+ acc_41 = t45;
66
+ } else {
67
+ acc_41 = (acc_41 === null || t45 > acc_41) ? t45 : acc_41;
68
+ }
69
+ });
70
+ out.push(acc_41);
71
+ });
72
+ return out;
73
+ }
74
+
75
+ export function _department_summary(input) {
76
+ let out = [];
77
+ let t47 = input["departments"];
78
+ const t67 = "manager";
79
+ const t69 = 1;
80
+ const t70 = 0;
81
+ const t78 = "senior";
82
+ t47.forEach((departments_el_48, departments_i_49) => {
83
+ let t50 = departments_el_48["name"];
84
+ let acc58 = 0;
85
+ let t59 = departments_el_48["employees"];
86
+ let acc64 = 0;
87
+ let acc75 = 0;
88
+ let acc86 = null;
89
+ t59.forEach((employees_el_6, employees_i_7) => {
90
+ let t60 = employees_el_6["salary"];
91
+ acc58 += t60;
92
+ let t66 = employees_el_6["role"];
93
+ let t68 = t66 == t67;
94
+ let t71 = t68 ? t69 : t70;
95
+ acc64 += t71;
96
+ if (acc86 === null || acc86 === undefined) {
97
+ acc86 = t60;
98
+ } else {
99
+ acc86 = (acc86 === null || t60 > acc86) ? t60 : acc86;
100
+ }
101
+ let t79 = t66 == t78;
102
+ let t82 = t79 ? t69 : t70;
103
+ acc75 += t82;
104
+ });
105
+ let t55 = {
106
+ "name": t50,
107
+ "total_payroll": acc58,
108
+ "manager_count": acc64,
109
+ "senior_count": acc75,
110
+ "top_salary": acc86
111
+ };
112
+ out.push(t55);
113
+ });
114
+ return out;
115
+ }
116
+
@@ -0,0 +1,149 @@
1
+ # Autogenerated by Kumi Codegen
2
+ module Kumi::Compiled::KUMI_509c7b2dc9bbeff658a7cc53b4102928b79f1ea86c21bf5f477bd596a2b47bb4
3
+ def self.from(input_data = nil)
4
+ instance = Object.new
5
+ instance.extend(self)
6
+ instance.instance_variable_set(:@input, input_data)
7
+ instance
8
+ end
9
+
10
+ def self.__kumi_executable__
11
+ instance = Object.new
12
+ instance.extend(self)
13
+ instance
14
+ end
15
+
16
+ def update(input_data)
17
+ @input = @input.merge(input_data)
18
+ self
19
+ end
20
+
21
+ def [](name)
22
+ case name
23
+ when :total_payroll then _total_payroll
24
+ when :manager_count then _manager_count
25
+ when :senior_employee_count then _senior_employee_count
26
+ when :max_salary then _max_salary
27
+ when :department_summary then _department_summary
28
+ else raise KeyError, "Unknown declaration"
29
+ end
30
+ end
31
+
32
+ def _total_payroll(input = @input)
33
+ out = []
34
+ t1 = input["departments"] || input[:departments]
35
+ t1.each_with_index do |departments_el_2, departments_i_3|
36
+ acc_4 = 0
37
+ t5 = departments_el_2["employees"] || departments_el_2[:employees]
38
+ t5.each_with_index do |employees_el_6, employees_i_7|
39
+ t8 = employees_el_6["salary"] || employees_el_6[:salary]
40
+ acc_4 += t8
41
+ end
42
+ t9 = acc_4
43
+ out << t9
44
+ end
45
+ out
46
+ end
47
+
48
+ def _manager_count(input = @input)
49
+ out = []
50
+ t10 = input["departments"] || input[:departments]
51
+ t18 = "manager"
52
+ t20 = 1
53
+ t21 = 0
54
+ t10.each_with_index do |departments_el_11, departments_i_12|
55
+ acc_13 = 0
56
+ t14 = departments_el_11["employees"] || departments_el_11[:employees]
57
+ t14.each_with_index do |employees_el_15, employees_i_16|
58
+ t17 = employees_el_15["role"] || employees_el_15[:role]
59
+ t19 = t17 == t18
60
+ t22 = t19 ? t20 : t21
61
+ acc_13 += t22
62
+ end
63
+ t23 = acc_13
64
+ out << t23
65
+ end
66
+ out
67
+ end
68
+
69
+ def _senior_employee_count(input = @input)
70
+ out = []
71
+ t24 = input["departments"] || input[:departments]
72
+ t32 = "senior"
73
+ t34 = 1
74
+ t35 = 0
75
+ t24.each_with_index do |departments_el_25, departments_i_26|
76
+ acc_27 = 0
77
+ t28 = departments_el_25["employees"] || departments_el_25[:employees]
78
+ t28.each_with_index do |employees_el_29, employees_i_30|
79
+ t31 = employees_el_29["role"] || employees_el_29[:role]
80
+ t33 = t31 == t32
81
+ t36 = t33 ? t34 : t35
82
+ acc_27 += t36
83
+ end
84
+ t37 = acc_27
85
+ out << t37
86
+ end
87
+ out
88
+ end
89
+
90
+ def _max_salary(input = @input)
91
+ out = []
92
+ t38 = input["departments"] || input[:departments]
93
+ t38.each_with_index do |departments_el_39, departments_i_40|
94
+ acc_41 = nil
95
+ t42 = departments_el_39["employees"] || departments_el_39[:employees]
96
+ t42.each_with_index do |employees_el_43, employees_i_44|
97
+ t45 = employees_el_43["salary"] || employees_el_43[:salary]
98
+ acc_41 ||= t45
99
+ acc_41 = t45 if t45 > acc_41
100
+ end
101
+ t46 = acc_41
102
+ out << t46
103
+ end
104
+ out
105
+ end
106
+
107
+ def _department_summary(input = @input)
108
+ out = []
109
+ t47 = input["departments"] || input[:departments]
110
+ t67 = "manager"
111
+ t69 = 1
112
+ t70 = 0
113
+ t78 = "senior"
114
+ t47.each_with_index do |departments_el_48, departments_i_49|
115
+ t50 = departments_el_48["name"] || departments_el_48[:name]
116
+ acc58 = 0
117
+ t59 = departments_el_48["employees"] || departments_el_48[:employees]
118
+ acc64 = 0
119
+ acc75 = 0
120
+ acc86 = nil
121
+ t59.each_with_index do |employees_el_6, employees_i_7|
122
+ t60 = employees_el_6["salary"] || employees_el_6[:salary]
123
+ acc58 += t60
124
+ t66 = employees_el_6["role"] || employees_el_6[:role]
125
+ t68 = t66 == t67
126
+ t71 = t68 ? t69 : t70
127
+ acc64 += t71
128
+ acc86 ||= t60
129
+ acc86 = t60 if t60 > acc86
130
+ t79 = t66 == t78
131
+ t82 = t79 ? t69 : t70
132
+ acc75 += t82
133
+ end
134
+ t61 = acc58
135
+ t72 = acc64
136
+ t89 = acc86
137
+ t83 = acc75
138
+ t55 = {
139
+ "name" => t50,
140
+ "total_payroll" => t61,
141
+ "manager_count" => t72,
142
+ "senior_count" => t83,
143
+ "top_salary" => t89
144
+ }
145
+ out << t55
146
+ end
147
+ out
148
+ end
149
+ end
@@ -0,0 +1,55 @@
1
+ (SNAST
2
+ (VALUE total_payroll
3
+ (Reduce :agg.sum over [employees]
4
+ (InputRef departments.dept.employees.emp.salary key_chain=[]) :: [departments, employees] -> integer
5
+ ) :: [departments] -> integer
6
+ ) :: [departments] -> integer
7
+ (VALUE manager_count
8
+ (Reduce :agg.sum over [employees]
9
+ (Select
10
+ (Call :core.eq
11
+ (InputRef departments.dept.employees.emp.role key_chain=[]) :: [departments, employees] -> string
12
+ (Const "manager") :: [] -> string
13
+ ) :: [departments, employees] -> boolean
14
+ (Const 1) :: [] -> integer
15
+ (Const 0) :: [] -> integer
16
+ ) :: [departments, employees] -> integer
17
+ ) :: [departments] -> integer
18
+ ) :: [departments] -> integer
19
+ (VALUE senior_employee_count
20
+ (Reduce :agg.sum over [employees]
21
+ (Select
22
+ (Call :core.eq
23
+ (InputRef departments.dept.employees.emp.role key_chain=[]) :: [departments, employees] -> string
24
+ (Const "senior") :: [] -> string
25
+ ) :: [departments, employees] -> boolean
26
+ (Const 1) :: [] -> integer
27
+ (Const 0) :: [] -> integer
28
+ ) :: [departments, employees] -> integer
29
+ ) :: [departments] -> integer
30
+ ) :: [departments] -> integer
31
+ (VALUE max_salary
32
+ (Reduce :agg.max over [employees]
33
+ (InputRef departments.dept.employees.emp.salary key_chain=[]) :: [departments, employees] -> integer
34
+ ) :: [departments] -> integer
35
+ ) :: [departments] -> integer
36
+ (VALUE department_summary
37
+ (Hash
38
+ (Pair name
39
+ (InputRef departments.dept.name key_chain=[]) :: [departments] -> string
40
+ ) :: [departments] -> pair
41
+ (Pair total_payroll
42
+ (Ref total_payroll) :: [departments] -> integer
43
+ ) :: [departments] -> pair
44
+ (Pair manager_count
45
+ (Ref manager_count) :: [departments] -> integer
46
+ ) :: [departments] -> pair
47
+ (Pair senior_count
48
+ (Ref senior_employee_count) :: [departments] -> integer
49
+ ) :: [departments] -> pair
50
+ (Pair top_salary
51
+ (Ref max_salary) :: [departments] -> integer
52
+ ) :: [departments] -> pair
53
+ ) :: [departments] -> hash
54
+ ) :: [departments] -> hash
55
+ )
@@ -0,0 +1,45 @@
1
+ {
2
+ "total_payroll": [
3
+ 400000,
4
+ 395000,
5
+ 75000
6
+ ],
7
+ "manager_count": [
8
+ 1,
9
+ 1,
10
+ 0
11
+ ],
12
+ "senior_employee_count": [
13
+ 1,
14
+ 1,
15
+ 0
16
+ ],
17
+ "max_salary": [
18
+ 150000,
19
+ 120000,
20
+ 75000
21
+ ],
22
+ "department_summary": [
23
+ {
24
+ "name": "Engineering",
25
+ "total_payroll": 400000,
26
+ "manager_count": 1,
27
+ "senior_count": 1,
28
+ "top_salary": 150000
29
+ },
30
+ {
31
+ "name": "Sales",
32
+ "total_payroll": 395000,
33
+ "manager_count": 1,
34
+ "senior_count": 1,
35
+ "top_salary": 120000
36
+ },
37
+ {
38
+ "name": "HR",
39
+ "total_payroll": 75000,
40
+ "manager_count": 0,
41
+ "senior_count": 0,
42
+ "top_salary": 75000
43
+ }
44
+ ]
45
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "departments": [
3
+ {
4
+ "name": "Engineering",
5
+ "employees": [
6
+ {
7
+ "salary": 150000,
8
+ "role": "manager"
9
+ },
10
+ {
11
+ "salary": 100000,
12
+ "role": "engineer"
13
+ },
14
+ {
15
+ "salary": 150000,
16
+ "role": "senior"
17
+ }
18
+ ]
19
+ },
20
+ {
21
+ "name": "Sales",
22
+ "employees": [
23
+ {
24
+ "salary": 120000,
25
+ "role": "manager"
26
+ },
27
+ {
28
+ "salary": 90000,
29
+ "role": "associate"
30
+ },
31
+ {
32
+ "salary": 75000,
33
+ "role": "associate"
34
+ },
35
+ {
36
+ "salary": 110000,
37
+ "role": "senior"
38
+ }
39
+ ]
40
+ },
41
+ {
42
+ "name": "HR",
43
+ "employees": [
44
+ {
45
+ "salary": 75000,
46
+ "role": "generalist"
47
+ }
48
+ ]
49
+ }
50
+ ]
51
+ }
@@ -0,0 +1,52 @@
1
+ # This schema is designed to test "chained" loop fusion.
2
+ #
3
+ # The `department_summary` value depends on FOUR other values, each
4
+ # requiring a separate aggregation over the nested `employees` array.
5
+ #
6
+ # After the inlining and CSE passes, the LIR for `department_summary` will
7
+ # contain four adjacent, independent loops over `employees`. A robust
8
+ # LoopFusionPass should be able to detect this chain and merge all four
9
+ # loops into a single, highly efficient pass over the data.
10
+
11
+ schema do
12
+ input do
13
+ array :departments do
14
+ hash :dept do
15
+ string :name
16
+ array :employees do
17
+ hash :emp do
18
+ integer :salary
19
+ string :role
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ # --- Intermediate Aggregations (Four distinct loops will be created) ---
27
+
28
+ # Aggregation 1: Sum of all salaries.
29
+ value :total_payroll, fn(:sum, input.departments.dept.employees.emp.salary)
30
+
31
+ # Aggregation 2: Count of employees with the "manager" role.
32
+ value :manager_count, fn(:count_if, input.departments.dept.employees.emp.role, "manager")
33
+
34
+ # Aggregation 3: Count of employees with the "senior" role.
35
+ value :senior_employee_count, fn(:count_if, input.departments.dept.employees.emp.role, "senior")
36
+
37
+ # Aggregation 4: The maximum salary in the department.
38
+ value :max_salary, fn(:max, input.departments.dept.employees.emp.salary)
39
+
40
+
41
+ # --- Final Value ---
42
+
43
+ # This value depends on all four aggregations above.
44
+ # The inliner will expand this, creating the chain of four fusable loops.
45
+ value :department_summary, {
46
+ name: input.departments.dept.name,
47
+ total_payroll: total_payroll,
48
+ manager_count: manager_count,
49
+ senior_count: senior_employee_count,
50
+ top_salary: max_salary
51
+ }
52
+ end
@@ -0,0 +1,55 @@
1
+ (Root
2
+ inputs: [
3
+ (InputDeclaration :cube :array
4
+ [
5
+ (InputDeclaration :layer :array
6
+ [
7
+ (InputDeclaration :row :array
8
+ [
9
+ (InputDeclaration :cell :integer)
10
+ ]
11
+ )
12
+ ]
13
+ )
14
+ ]
15
+ )
16
+ ]
17
+ values: [
18
+ (ValueDeclaration :cube
19
+ (InputReference :cube)
20
+ )
21
+ (ValueDeclaration :layer
22
+ (InputElementReference cube.layer)
23
+ )
24
+ (ValueDeclaration :row
25
+ (InputElementReference cube.layer.row)
26
+ )
27
+ (ValueDeclaration :cell
28
+ (InputElementReference cube.layer.row.cell)
29
+ )
30
+ (ValueDeclaration :cell_sum
31
+ (CallExpression :sum_if
32
+ (InputElementReference cube.layer.row.cell)
33
+ (DeclarationReference :cell_over_limit)
34
+ )
35
+ )
36
+ (ValueDeclaration :count_over_limit
37
+ (CallExpression :sum
38
+ (CallExpression :sum
39
+ (CallExpression :sum_if
40
+ (Literal 1)
41
+ (DeclarationReference :cell_over_limit)
42
+ )
43
+ )
44
+ )
45
+ )
46
+ ]
47
+ traits: [
48
+ (TraitDeclaration :cell_over_limit
49
+ (CallExpression :>
50
+ (InputElementReference cube.layer.row.cell)
51
+ (Literal 100)
52
+ )
53
+ )
54
+ ]
55
+ )
@@ -0,0 +1,7 @@
1
+ cube: array (array) access_mode=element
2
+ └─> layer: element_access → array_loop
3
+ layer: array (array) access_mode=element
4
+ └─> row: element_access → array_loop
5
+ row: array (array) access_mode=element
6
+ └─> cell: element_access
7
+ cell: integer