kumi 0.0.17 → 0.0.19

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 +28 -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 +47 -5
  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,15 @@
1
+ config: hash (hash)
2
+ └─> app_name: property_access
3
+ └─> feature_flags: property_access → array_loop
4
+ └─> servers: property_access → array_loop
5
+ app_name: string
6
+ feature_flags: array (array) access_mode=element
7
+ └─> flag_name: element_access
8
+ flag_name: string
9
+ servers: array (array) access_mode=element
10
+ └─> server: element_access
11
+ server: hash (hash)
12
+ └─> hostname: property_access
13
+ └─> port: property_access
14
+ hostname: string
15
+ port: integer
@@ -0,0 +1,39 @@
1
+ (LIR
2
+ (Declaration app_name
3
+ %t1 = load_input "config" :: any
4
+ %t2 = load_field t1["app_name"] :: string
5
+ yield %t2
6
+ )
7
+ (Declaration all_flags
8
+ %t3 = load_input "config" :: array
9
+ %t4 = load_field t3["feature_flags"] :: any
10
+ loop feature_flags id=L1 in %t4 as el=%feature_flags_el_5, idx=%feature_flags_i_6
11
+ yield %feature_flags_el_5
12
+ end_loop
13
+ )
14
+ (Declaration server_hostnames
15
+ %t7 = load_input "config" :: array
16
+ %t8 = load_field t7["servers"] :: any
17
+ loop servers id=L2 in %t8 as el=%servers_el_9, idx=%servers_i_10
18
+ %t11 = load_field servers_el_9["hostname"] :: string
19
+ yield %t11
20
+ end_loop
21
+ )
22
+ (Declaration server_count
23
+ %t12 = load_input "config" :: any
24
+ %t13 = load_field t12["servers"] :: array
25
+ %t14 = call core.array_size(%t13) :: integer
26
+ yield %t14
27
+ )
28
+ (Declaration total_ports
29
+ %acc_15 = decl_acc :: integer
30
+ %t16 = load_input "config" :: array
31
+ %t17 = load_field t16["servers"] :: any
32
+ loop servers id=L3 in %t17 as el=%servers_el_18, idx=%servers_i_19
33
+ %t20 = load_field servers_el_18["port"] :: integer
34
+ %acc_15 = acc_add agg.sum(%acc_15, %t20) :: integer
35
+ end_loop
36
+ %t21 = acc_load %acc_15 :: integer
37
+ yield %t21
38
+ )
39
+ )
@@ -0,0 +1,39 @@
1
+ (LIR
2
+ (Declaration app_name
3
+ %t1 = load_input "config" :: any
4
+ %t2 = load_field t1["app_name"] :: string
5
+ yield %t2
6
+ )
7
+ (Declaration all_flags
8
+ %t3 = load_input "config" :: array
9
+ %t4 = load_field t3["feature_flags"] :: any
10
+ loop feature_flags id=L1 in %t4 as el=%feature_flags_el_5, idx=%feature_flags_i_6
11
+ yield %feature_flags_el_5
12
+ end_loop
13
+ )
14
+ (Declaration server_hostnames
15
+ %t7 = load_input "config" :: array
16
+ %t8 = load_field t7["servers"] :: any
17
+ loop servers id=L2 in %t8 as el=%servers_el_9, idx=%servers_i_10
18
+ %t11 = load_field servers_el_9["hostname"] :: string
19
+ yield %t11
20
+ end_loop
21
+ )
22
+ (Declaration server_count
23
+ %t12 = load_input "config" :: any
24
+ %t13 = load_field t12["servers"] :: array
25
+ %t14 = call core.array_size(%t13) :: integer
26
+ yield %t14
27
+ )
28
+ (Declaration total_ports
29
+ %acc_15 = decl_acc :: integer
30
+ %t16 = load_input "config" :: array
31
+ %t17 = load_field t16["servers"] :: any
32
+ loop servers id=L3 in %t17 as el=%servers_el_18, idx=%servers_i_19
33
+ %t20 = load_field servers_el_18["port"] :: integer
34
+ %acc_15 = acc_add agg.sum(%acc_15, %t20) :: integer
35
+ end_loop
36
+ %t21 = acc_load %acc_15 :: integer
37
+ yield %t21
38
+ )
39
+ )
@@ -0,0 +1,39 @@
1
+ (LIR
2
+ (Declaration app_name
3
+ %t1 = load_input "config" :: any
4
+ %t2 = load_field t1["app_name"] :: string
5
+ yield %t2
6
+ )
7
+ (Declaration all_flags
8
+ %t3 = load_input "config" :: array
9
+ %t4 = load_field t3["feature_flags"] :: any
10
+ loop feature_flags id=L1 in %t4 as el=%feature_flags_el_5, idx=%feature_flags_i_6
11
+ yield %feature_flags_el_5
12
+ end_loop
13
+ )
14
+ (Declaration server_hostnames
15
+ %t7 = load_input "config" :: array
16
+ %t8 = load_field t7["servers"] :: any
17
+ loop servers id=L2 in %t8 as el=%servers_el_9, idx=%servers_i_10
18
+ %t11 = load_field servers_el_9["hostname"] :: string
19
+ yield %t11
20
+ end_loop
21
+ )
22
+ (Declaration server_count
23
+ %t12 = load_input "config" :: any
24
+ %t13 = load_field t12["servers"] :: array
25
+ %t14 = call core.array_size(%t13) :: integer
26
+ yield %t14
27
+ )
28
+ (Declaration total_ports
29
+ %acc_15 = decl_acc :: integer
30
+ %t16 = load_input "config" :: array
31
+ %t17 = load_field t16["servers"] :: any
32
+ loop servers id=L3 in %t17 as el=%servers_el_18, idx=%servers_i_19
33
+ %t20 = load_field servers_el_18["port"] :: integer
34
+ %acc_15 = acc_add agg.sum(%acc_15, %t20) :: integer
35
+ end_loop
36
+ %t21 = acc_load %acc_15 :: integer
37
+ yield %t21
38
+ )
39
+ )
@@ -0,0 +1,39 @@
1
+ (LIR
2
+ (Declaration app_name
3
+ %t1 = load_input "config" :: any
4
+ %t2 = load_field t1["app_name"] :: string
5
+ yield %t2
6
+ )
7
+ (Declaration all_flags
8
+ %t3 = load_input "config" :: array
9
+ %t4 = load_field t3["feature_flags"] :: any
10
+ loop feature_flags id=L1 in %t4 as el=%feature_flags_el_5, idx=%feature_flags_i_6
11
+ yield %feature_flags_el_5
12
+ end_loop
13
+ )
14
+ (Declaration server_hostnames
15
+ %t7 = load_input "config" :: array
16
+ %t8 = load_field t7["servers"] :: any
17
+ loop servers id=L2 in %t8 as el=%servers_el_9, idx=%servers_i_10
18
+ %t11 = load_field servers_el_9["hostname"] :: string
19
+ yield %t11
20
+ end_loop
21
+ )
22
+ (Declaration server_count
23
+ %t12 = load_input "config" :: any
24
+ %t13 = load_field t12["servers"] :: array
25
+ %t14 = call core.array_size(%t13) :: integer
26
+ yield %t14
27
+ )
28
+ (Declaration total_ports
29
+ %acc_15 = decl_acc :: integer
30
+ %t16 = load_input "config" :: array
31
+ %t17 = load_field t16["servers"] :: any
32
+ loop servers id=L3 in %t17 as el=%servers_el_18, idx=%servers_i_19
33
+ %t20 = load_field servers_el_18["port"] :: integer
34
+ %acc_15 = acc_add agg.sum(%acc_15, %t20) :: integer
35
+ end_loop
36
+ %t21 = acc_load %acc_15 :: integer
37
+ yield %t21
38
+ )
39
+ )
@@ -0,0 +1,39 @@
1
+ (LIR
2
+ (Declaration app_name
3
+ %t1 = load_input "config" :: any
4
+ %t2 = load_field t1["app_name"] :: string
5
+ yield %t2
6
+ )
7
+ (Declaration all_flags
8
+ %t3 = load_input "config" :: array
9
+ %t4 = load_field t3["feature_flags"] :: any
10
+ loop feature_flags id=L1 in %t4 as el=%feature_flags_el_5, idx=%feature_flags_i_6
11
+ yield %feature_flags_el_5
12
+ end_loop
13
+ )
14
+ (Declaration server_hostnames
15
+ %t7 = load_input "config" :: array
16
+ %t8 = load_field t7["servers"] :: any
17
+ loop servers id=L2 in %t8 as el=%servers_el_9, idx=%servers_i_10
18
+ %t11 = load_field servers_el_9["hostname"] :: string
19
+ yield %t11
20
+ end_loop
21
+ )
22
+ (Declaration server_count
23
+ %t12 = load_input "config" :: any
24
+ %t13 = load_field t12["servers"] :: array
25
+ %t14 = call core.array_size(%t13) :: integer
26
+ yield %t14
27
+ )
28
+ (Declaration total_ports
29
+ %acc_15 = decl_acc :: integer
30
+ %t16 = load_input "config" :: array
31
+ %t17 = load_field t16["servers"] :: any
32
+ loop servers id=L3 in %t17 as el=%servers_el_18, idx=%servers_i_19
33
+ %t20 = load_field servers_el_18["port"] :: integer
34
+ %acc_15 = acc_add agg.sum(%acc_15, %t20) :: integer
35
+ end_loop
36
+ %t21 = acc_load %acc_15 :: integer
37
+ yield %t21
38
+ )
39
+ )
@@ -0,0 +1,39 @@
1
+ (LIR
2
+ (Declaration app_name
3
+ %t1 = load_input "config" :: any
4
+ %t2 = load_field t1["app_name"] :: string
5
+ yield %t2
6
+ )
7
+ (Declaration all_flags
8
+ %t3 = load_input "config" :: array
9
+ %t4 = load_field t3["feature_flags"] :: any
10
+ loop feature_flags id=L1 in %t4 as el=%feature_flags_el_5, idx=%feature_flags_i_6
11
+ yield %feature_flags_el_5
12
+ end_loop
13
+ )
14
+ (Declaration server_hostnames
15
+ %t7 = load_input "config" :: array
16
+ %t8 = load_field t7["servers"] :: any
17
+ loop servers id=L2 in %t8 as el=%servers_el_9, idx=%servers_i_10
18
+ %t11 = load_field servers_el_9["hostname"] :: string
19
+ yield %t11
20
+ end_loop
21
+ )
22
+ (Declaration server_count
23
+ %t12 = load_input "config" :: any
24
+ %t13 = load_field t12["servers"] :: array
25
+ %t14 = call core.array_size(%t13) :: integer
26
+ yield %t14
27
+ )
28
+ (Declaration total_ports
29
+ %acc_15 = decl_acc :: integer
30
+ %t16 = load_input "config" :: array
31
+ %t17 = load_field t16["servers"] :: any
32
+ loop servers id=L3 in %t17 as el=%servers_el_18, idx=%servers_i_19
33
+ %t20 = load_field servers_el_18["port"] :: integer
34
+ %acc_15 = acc_add agg.sum(%acc_15, %t20) :: integer
35
+ end_loop
36
+ %t21 = acc_load %acc_15 :: integer
37
+ yield %t21
38
+ )
39
+ )
@@ -0,0 +1,39 @@
1
+ (LIR
2
+ (Declaration app_name
3
+ %t1 = load_input "config" :: any
4
+ %t2 = load_field t1["app_name"] :: string
5
+ yield %t2
6
+ )
7
+ (Declaration all_flags
8
+ %t3 = load_input "config" :: array
9
+ %t4 = load_field t3["feature_flags"] :: any
10
+ loop feature_flags id=L1 in %t4 as el=%feature_flags_el_5, idx=%feature_flags_i_6
11
+ yield %feature_flags_el_5
12
+ end_loop
13
+ )
14
+ (Declaration server_hostnames
15
+ %t7 = load_input "config" :: array
16
+ %t8 = load_field t7["servers"] :: any
17
+ loop servers id=L2 in %t8 as el=%servers_el_9, idx=%servers_i_10
18
+ %t11 = load_field servers_el_9["hostname"] :: string
19
+ yield %t11
20
+ end_loop
21
+ )
22
+ (Declaration server_count
23
+ %t12 = load_input "config" :: any
24
+ %t13 = load_field t12["servers"] :: array
25
+ %t14 = call core.array_size(%t13) :: integer
26
+ yield %t14
27
+ )
28
+ (Declaration total_ports
29
+ %acc_15 = decl_acc :: integer
30
+ %t16 = load_input "config" :: array
31
+ %t17 = load_field t16["servers"] :: any
32
+ loop servers id=L3 in %t17 as el=%servers_el_18, idx=%servers_i_19
33
+ %t20 = load_field servers_el_18["port"] :: integer
34
+ %acc_15 = acc_add agg.sum(%acc_15, %t20) :: integer
35
+ end_loop
36
+ %t21 = acc_load %acc_15 :: integer
37
+ yield %t21
38
+ )
39
+ )
@@ -0,0 +1,21 @@
1
+ (NAST
2
+ (VALUE app_name
3
+ (InputRef [:config, :app_name])
4
+ )
5
+ (VALUE all_flags
6
+ (InputRef [:config, :feature_flags, :flag_name])
7
+ )
8
+ (VALUE server_hostnames
9
+ (InputRef [:config, :servers, :server, :hostname])
10
+ )
11
+ (VALUE server_count
12
+ (Call :"core.array_size"
13
+ (InputRef [:config, :servers])
14
+ )
15
+ )
16
+ (VALUE total_ports
17
+ (Call :"agg.sum"
18
+ (InputRef [:config, :servers, :server, :port])
19
+ )
20
+ )
21
+ )
@@ -0,0 +1,45 @@
1
+ export function _app_name(input) {
2
+ let t1 = input["config"];
3
+ let t2 = t1["app_name"];
4
+ return t2;
5
+ }
6
+
7
+ export function _all_flags(input) {
8
+ let out = [];
9
+ let t3 = input["config"];
10
+ let t4 = t3["feature_flags"];
11
+ t4.forEach((feature_flags_el_5, feature_flags_i_6) => {
12
+ out.push(feature_flags_el_5);
13
+ });
14
+ return out;
15
+ }
16
+
17
+ export function _server_hostnames(input) {
18
+ let out = [];
19
+ let t7 = input["config"];
20
+ let t8 = t7["servers"];
21
+ t8.forEach((servers_el_9, servers_i_10) => {
22
+ let t11 = servers_el_9["hostname"];
23
+ out.push(t11);
24
+ });
25
+ return out;
26
+ }
27
+
28
+ export function _server_count(input) {
29
+ let t12 = input["config"];
30
+ let t13 = t12["servers"];
31
+ let t14 = t13.length;
32
+ return t14;
33
+ }
34
+
35
+ export function _total_ports(input) {
36
+ let acc_15 = 0;
37
+ let t16 = input["config"];
38
+ let t17 = t16["servers"];
39
+ t17.forEach((servers_el_18, servers_i_19) => {
40
+ let t20 = servers_el_18["port"];
41
+ acc_15 += t20;
42
+ });
43
+ return acc_15;
44
+ }
45
+
@@ -0,0 +1,74 @@
1
+ # Autogenerated by Kumi Codegen
2
+ module Kumi::Compiled::KUMI_553e66837fe392a06e5de16b6bc32e442b3e71b92f205eae1451b78a49fbac83
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 :app_name then _app_name
24
+ when :all_flags then _all_flags
25
+ when :server_hostnames then _server_hostnames
26
+ when :server_count then _server_count
27
+ when :total_ports then _total_ports
28
+ else raise KeyError, "Unknown declaration"
29
+ end
30
+ end
31
+
32
+ def _app_name(input = @input)
33
+ t1 = input["config"] || input[:config]
34
+ t1["app_name"] || t1[:app_name]
35
+ end
36
+
37
+ def _all_flags(input = @input)
38
+ out = []
39
+ t3 = input["config"] || input[:config]
40
+ t4 = t3["feature_flags"] || t3[:feature_flags]
41
+ t4.each_with_index do |feature_flags_el_5, feature_flags_i_6|
42
+ out << feature_flags_el_5
43
+ end
44
+ out
45
+ end
46
+
47
+ def _server_hostnames(input = @input)
48
+ out = []
49
+ t7 = input["config"] || input[:config]
50
+ t8 = t7["servers"] || t7[:servers]
51
+ t8.each_with_index do |servers_el_9, servers_i_10|
52
+ t11 = servers_el_9["hostname"] || servers_el_9[:hostname]
53
+ out << t11
54
+ end
55
+ out
56
+ end
57
+
58
+ def _server_count(input = @input)
59
+ t12 = input["config"] || input[:config]
60
+ t13 = t12["servers"] || t12[:servers]
61
+ t13.length
62
+ end
63
+
64
+ def _total_ports(input = @input)
65
+ acc_15 = 0
66
+ t16 = input["config"] || input[:config]
67
+ t17 = t16["servers"] || t16[:servers]
68
+ t17.each_with_index do |servers_el_18, servers_i_19|
69
+ t20 = servers_el_18["port"] || servers_el_18[:port]
70
+ acc_15 += t20
71
+ end
72
+ acc_15
73
+ end
74
+ end
@@ -0,0 +1,21 @@
1
+ (SNAST
2
+ (VALUE app_name
3
+ (InputRef config.app_name key_chain=[]) :: [] -> string
4
+ ) :: [] -> string
5
+ (VALUE all_flags
6
+ (InputRef config.feature_flags.flag_name key_chain=[]) :: [feature_flags] -> string
7
+ ) :: [feature_flags] -> string
8
+ (VALUE server_hostnames
9
+ (InputRef config.servers.server.hostname key_chain=[]) :: [servers] -> string
10
+ ) :: [servers] -> string
11
+ (VALUE server_count
12
+ (Call :core.array_size
13
+ (InputRef config.servers key_chain=[]) :: [] -> array
14
+ ) :: [] -> integer
15
+ ) :: [] -> integer
16
+ (VALUE total_ports
17
+ (Reduce :agg.sum over [servers]
18
+ (InputRef config.servers.server.port key_chain=[]) :: [servers] -> integer
19
+ ) :: [] -> integer
20
+ ) :: [] -> integer
21
+ )
@@ -0,0 +1,7 @@
1
+ {
2
+ "app_name": "MyApp",
3
+ "all_flags": ["dark_mode", "beta_features", "analytics"],
4
+ "server_hostnames": ["web-01", "web-02", "api-01"],
5
+ "server_count": 3,
6
+ "total_ports": 19161
7
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "config": {
3
+ "app_name": "MyApp",
4
+ "feature_flags": ["dark_mode", "beta_features", "analytics"],
5
+ "servers": [
6
+ { "hostname": "web-01", "port": 8080 },
7
+ { "hostname": "web-02", "port": 8081 },
8
+ { "hostname": "api-01", "port": 3000 }
9
+ ]
10
+ }
11
+ }
@@ -0,0 +1,22 @@
1
+ schema do
2
+ input do
3
+ hash :config do
4
+ string :app_name
5
+ array :feature_flags do
6
+ string :flag_name
7
+ end
8
+ array :servers do
9
+ hash :server do
10
+ string :hostname
11
+ integer :port
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ value :app_name, input.config.app_name
18
+ value :all_flags, input.config.feature_flags.flag_name
19
+ value :server_hostnames, input.config.servers.server.hostname
20
+ value :server_count, fn(:array_size, input.config.servers)
21
+ value :total_ports, fn(:sum, input.config.servers.server.port)
22
+ end
@@ -0,0 +1,51 @@
1
+ (Root
2
+ inputs: [
3
+ (InputDeclaration :departments :array
4
+ [
5
+ (InputDeclaration :dept :hash
6
+ [
7
+ (InputDeclaration :name :string)
8
+ (InputDeclaration :employees :array
9
+ [
10
+ (InputDeclaration :emp :hash
11
+ [
12
+ (InputDeclaration :salary :integer)
13
+ (InputDeclaration :role :string)
14
+ ]
15
+ )
16
+ ]
17
+ )
18
+ ]
19
+ )
20
+ ]
21
+ )
22
+ ]
23
+ values: [
24
+ (ValueDeclaration :total_payroll
25
+ (CallExpression :sum
26
+ (InputElementReference departments.dept.employees.emp.salary)
27
+ )
28
+ )
29
+ (ValueDeclaration :payroll_tax
30
+ (CallExpression :multiply
31
+ (DeclarationReference :total_payroll)
32
+ (Literal 0.15)
33
+ )
34
+ )
35
+ (ValueDeclaration :manager_count
36
+ (CallExpression :count_if
37
+ (InputElementReference departments.dept.employees.emp.role)
38
+ (Literal "manager")
39
+ )
40
+ )
41
+ (ValueDeclaration :department_summary
42
+ (HashExpression
43
+ ((Literal :name) (InputElementReference departments.dept.name))
44
+ ((Literal :payroll) (DeclarationReference :total_payroll))
45
+ ((Literal :tax) (DeclarationReference :payroll_tax))
46
+ ((Literal :managers) (DeclarationReference :manager_count))
47
+ )
48
+ )
49
+ ]
50
+ traits: []
51
+ )
@@ -0,0 +1,13 @@
1
+ departments: array (array) access_mode=element
2
+ └─> dept: element_access
3
+ dept: hash (hash)
4
+ └─> name: property_access
5
+ └─> employees: property_access → array_loop
6
+ name: string
7
+ employees: array (array) access_mode=element
8
+ └─> emp: element_access
9
+ emp: hash (hash)
10
+ └─> salary: property_access
11
+ └─> role: property_access
12
+ salary: integer
13
+ role: string
@@ -0,0 +1,53 @@
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 payroll_tax
16
+ %t10 = load_input "departments" :: array
17
+ loop departments id=L3 in %t10 as el=%departments_el_11, idx=%departments_i_12
18
+ %t13 = load_decl total_payroll axes=[departments] :: integer
19
+ %t14 = const 0.15 :: float
20
+ %t15 = call core.mul(%t13, %t14) :: float
21
+ yield %t15
22
+ end_loop
23
+ )
24
+ (Declaration manager_count
25
+ %t16 = load_input "departments" :: array
26
+ loop departments id=L4 in %t16 as el=%departments_el_17, idx=%departments_i_18
27
+ %acc_19 = decl_acc :: integer
28
+ %t20 = load_field departments_el_17["employees"] :: any
29
+ loop employees id=L5 in %t20 as el=%employees_el_21, idx=%employees_i_22
30
+ %t23 = load_field employees_el_21["role"] :: string
31
+ %t24 = const "manager" :: string
32
+ %t25 = call core.eq(%t23, %t24) :: boolean
33
+ %t26 = const 1 :: integer
34
+ %t27 = const 0 :: integer
35
+ %t28 = select %t25, %t26, %t27 :: integer
36
+ %acc_19 = acc_add agg.sum(%acc_19, %t28) :: integer
37
+ end_loop
38
+ %t29 = acc_load %acc_19 :: integer
39
+ yield %t29
40
+ end_loop
41
+ )
42
+ (Declaration department_summary
43
+ %t30 = load_input "departments" :: array
44
+ loop departments id=L6 in %t30 as el=%departments_el_31, idx=%departments_i_32
45
+ %t33 = load_field departments_el_31["name"] :: string
46
+ %t34 = load_decl total_payroll axes=[departments] :: integer
47
+ %t35 = load_decl payroll_tax axes=[departments] :: float
48
+ %t36 = load_decl manager_count axes=[departments] :: integer
49
+ %t37 = make_object{name: %t33, payroll: %t34, tax: %t35, managers: %t36} :: object
50
+ yield %t37
51
+ end_loop
52
+ )
53
+ )
@@ -0,0 +1,53 @@
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 payroll_tax
16
+ %t10 = load_input "departments" :: array
17
+ loop departments id=L3 in %t10 as el=%departments_el_11, idx=%departments_i_12
18
+ %t13 = load_decl total_payroll axes=[departments] :: integer
19
+ %t14 = const 0.15 :: float
20
+ %t15 = call core.mul(%t13, %t14) :: float
21
+ yield %t15
22
+ end_loop
23
+ )
24
+ (Declaration manager_count
25
+ %t16 = load_input "departments" :: array
26
+ loop departments id=L4 in %t16 as el=%departments_el_17, idx=%departments_i_18
27
+ %acc_19 = decl_acc :: integer
28
+ %t20 = load_field departments_el_17["employees"] :: any
29
+ loop employees id=L5 in %t20 as el=%employees_el_21, idx=%employees_i_22
30
+ %t23 = load_field employees_el_21["role"] :: string
31
+ %t24 = const "manager" :: string
32
+ %t25 = call core.eq(%t23, %t24) :: boolean
33
+ %t26 = const 1 :: integer
34
+ %t27 = const 0 :: integer
35
+ %t28 = select %t25, %t26, %t27 :: integer
36
+ %acc_19 = acc_add agg.sum(%acc_19, %t28) :: integer
37
+ end_loop
38
+ %t29 = acc_load %acc_19 :: integer
39
+ yield %t29
40
+ end_loop
41
+ )
42
+ (Declaration department_summary
43
+ %t30 = load_input "departments" :: array
44
+ loop departments id=L6 in %t30 as el=%departments_el_31, idx=%departments_i_32
45
+ %t33 = load_field departments_el_31["name"] :: string
46
+ %t34 = load_decl total_payroll axes=[departments] :: integer
47
+ %t35 = load_decl payroll_tax axes=[departments] :: float
48
+ %t36 = load_decl manager_count axes=[departments] :: integer
49
+ %t37 = make_object{name: %t33, payroll: %t34, tax: %t35, managers: %t36} :: object
50
+ yield %t37
51
+ end_loop
52
+ )
53
+ )