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,62 @@
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
+ loop departments id=L3 in %t10 as el=%departments_el_11, idx=%departments_i_12
18
+ %acc_13 = decl_acc :: integer
19
+ %t14 = load_field departments_el_11["employees"] :: any
20
+ loop employees id=L4 in %t14 as el=%employees_el_15, idx=%employees_i_16
21
+ %t17 = load_field employees_el_15["role"] :: string
22
+ %t18 = const "manager" :: string
23
+ %t19 = call core.eq(%t17, %t18) :: boolean
24
+ %t20 = const 1 :: integer
25
+ %t21 = const 0 :: integer
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 department_summary
34
+ %t24 = load_input "departments" :: array
35
+ loop departments id=L5 in %t24 as el=%departments_el_25, idx=%departments_i_26
36
+ %t27 = load_field departments_el_25["name"] :: string
37
+ %t31 = load_input "departments" :: array
38
+ %acc33 = decl_acc :: integer
39
+ %t34 = load_field departments_el_25["employees"] :: any
40
+ loop employees id=L6 in %t34 as el=%employees_el_6, idx=%employees_i_7
41
+ %t35 = load_field employees_el_6["salary"] :: integer
42
+ %acc33 = acc_add agg.sum(%acc33, %t35) :: integer
43
+ end_loop
44
+ %t36 = acc_load %acc33 :: integer
45
+ %t37 = load_input "departments" :: array
46
+ %acc39 = decl_acc :: integer
47
+ %t40 = load_field departments_el_25["employees"] :: any
48
+ loop employees id=L7 in %t40 as el=%employees_el_15, idx=%employees_i_16
49
+ %t41 = load_field employees_el_15["role"] :: string
50
+ %t42 = const "manager" :: string
51
+ %t43 = call core.eq(%t41, %t42) :: boolean
52
+ %t44 = const 1 :: integer
53
+ %t45 = const 0 :: integer
54
+ %t46 = select %t43, %t44, %t45 :: integer
55
+ %acc39 = acc_add agg.sum(%acc39, %t46) :: integer
56
+ end_loop
57
+ %t47 = acc_load %acc39 :: integer
58
+ %t30 = make_object{name: %t27, total_payroll: %t36, manager_count: %t47} :: object
59
+ yield %t30
60
+ end_loop
61
+ )
62
+ )
@@ -0,0 +1,57 @@
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
+ loop departments id=L3 in %t10 as el=%departments_el_11, idx=%departments_i_12
18
+ %acc_13 = decl_acc :: integer
19
+ %t14 = load_field departments_el_11["employees"] :: any
20
+ loop employees id=L4 in %t14 as el=%employees_el_15, idx=%employees_i_16
21
+ %t17 = load_field employees_el_15["role"] :: string
22
+ %t18 = const "manager" :: string
23
+ %t19 = call core.eq(%t17, %t18) :: boolean
24
+ %t20 = const 1 :: integer
25
+ %t21 = const 0 :: integer
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 department_summary
34
+ %t24 = load_input "departments" :: array
35
+ loop departments id=L5 in %t24 as el=%departments_el_25, idx=%departments_i_26
36
+ %t27 = load_field departments_el_25["name"] :: string
37
+ %acc33 = decl_acc :: integer
38
+ %t34 = load_field departments_el_25["employees"] :: any
39
+ %acc39 = decl_acc :: integer
40
+ loop employees id=L6 in %t34 as el=%employees_el_6, idx=%employees_i_7
41
+ %t35 = load_field employees_el_6["salary"] :: integer
42
+ %acc33 = acc_add agg.sum(%acc33, %t35) :: integer
43
+ %t41 = load_field employees_el_6["role"] :: string
44
+ %t42 = const "manager" :: string
45
+ %t43 = call core.eq(%t41, %t42) :: boolean
46
+ %t44 = const 1 :: integer
47
+ %t45 = const 0 :: integer
48
+ %t46 = select %t43, %t44, %t45 :: integer
49
+ %acc39 = acc_add agg.sum(%acc39, %t46) :: integer
50
+ end_loop
51
+ %t36 = acc_load %acc33 :: integer
52
+ %t47 = acc_load %acc39 :: integer
53
+ %t30 = make_object{name: %t27, total_payroll: %t36, manager_count: %t47} :: object
54
+ yield %t30
55
+ end_loop
56
+ )
57
+ )
@@ -0,0 +1,57 @@
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
+ loop departments id=L3 in %t10 as el=%departments_el_11, idx=%departments_i_12
18
+ %acc_13 = decl_acc :: integer
19
+ %t14 = load_field departments_el_11["employees"] :: any
20
+ loop employees id=L4 in %t14 as el=%employees_el_15, idx=%employees_i_16
21
+ %t17 = load_field employees_el_15["role"] :: string
22
+ %t18 = const "manager" :: string
23
+ %t19 = call core.eq(%t17, %t18) :: boolean
24
+ %t20 = const 1 :: integer
25
+ %t21 = const 0 :: integer
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 department_summary
34
+ %t24 = load_input "departments" :: array
35
+ loop departments id=L5 in %t24 as el=%departments_el_25, idx=%departments_i_26
36
+ %t27 = load_field departments_el_25["name"] :: string
37
+ %acc33 = decl_acc :: integer
38
+ %t34 = load_field departments_el_25["employees"] :: any
39
+ %acc39 = decl_acc :: integer
40
+ loop employees id=L6 in %t34 as el=%employees_el_6, idx=%employees_i_7
41
+ %t35 = load_field employees_el_6["salary"] :: integer
42
+ %acc33 = acc_add agg.sum(%acc33, %t35) :: integer
43
+ %t41 = load_field employees_el_6["role"] :: string
44
+ %t42 = const "manager" :: string
45
+ %t43 = call core.eq(%t41, %t42) :: boolean
46
+ %t44 = const 1 :: integer
47
+ %t45 = const 0 :: integer
48
+ %t46 = select %t43, %t44, %t45 :: integer
49
+ %acc39 = acc_add agg.sum(%acc39, %t46) :: integer
50
+ end_loop
51
+ %t36 = acc_load %acc33 :: integer
52
+ %t47 = acc_load %acc39 :: integer
53
+ %t30 = make_object{name: %t27, total_payroll: %t36, manager_count: %t47} :: object
54
+ yield %t30
55
+ end_loop
56
+ )
57
+ )
@@ -0,0 +1,57 @@
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 department_summary
34
+ %t24 = load_input "departments" :: array
35
+ %t42 = const "manager" :: string
36
+ %t44 = const 1 :: integer
37
+ %t45 = const 0 :: integer
38
+ loop departments id=L5 in %t24 as el=%departments_el_25, idx=%departments_i_26
39
+ %t27 = load_field departments_el_25["name"] :: string
40
+ %acc33 = decl_acc :: integer
41
+ %t34 = load_field departments_el_25["employees"] :: any
42
+ %acc39 = decl_acc :: integer
43
+ loop employees id=L6 in %t34 as el=%employees_el_6, idx=%employees_i_7
44
+ %t35 = load_field employees_el_6["salary"] :: integer
45
+ %acc33 = acc_add agg.sum(%acc33, %t35) :: integer
46
+ %t41 = load_field employees_el_6["role"] :: string
47
+ %t43 = call core.eq(%t41, %t42) :: boolean
48
+ %t46 = select %t43, %t44, %t45 :: integer
49
+ %acc39 = acc_add agg.sum(%acc39, %t46) :: integer
50
+ end_loop
51
+ %t36 = acc_load %acc33 :: integer
52
+ %t47 = acc_load %acc39 :: integer
53
+ %t30 = make_object{name: %t27, total_payroll: %t36, manager_count: %t47} :: object
54
+ yield %t30
55
+ end_loop
56
+ )
57
+ )
@@ -0,0 +1,57 @@
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 department_summary
34
+ %t24 = load_input "departments" :: array
35
+ %t42 = const "manager" :: string
36
+ %t44 = const 1 :: integer
37
+ %t45 = const 0 :: integer
38
+ loop departments id=L5 in %t24 as el=%departments_el_25, idx=%departments_i_26
39
+ %t27 = load_field departments_el_25["name"] :: string
40
+ %acc33 = decl_acc :: integer
41
+ %t34 = load_field departments_el_25["employees"] :: any
42
+ %acc39 = decl_acc :: integer
43
+ loop employees id=L6 in %t34 as el=%employees_el_6, idx=%employees_i_7
44
+ %t35 = load_field employees_el_6["salary"] :: integer
45
+ %acc33 = acc_add agg.sum(%acc33, %t35) :: integer
46
+ %t41 = load_field employees_el_6["role"] :: string
47
+ %t43 = call core.eq(%t41, %t42) :: boolean
48
+ %t46 = select %t43, %t44, %t45 :: integer
49
+ %acc39 = acc_add agg.sum(%acc39, %t46) :: integer
50
+ end_loop
51
+ %t36 = acc_load %acc33 :: integer
52
+ %t47 = acc_load %acc39 :: integer
53
+ %t30 = make_object{name: %t27, total_payroll: %t36, manager_count: %t47} :: object
54
+ yield %t30
55
+ end_loop
56
+ )
57
+ )
@@ -0,0 +1,32 @@
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 department_summary
20
+ (Hash
21
+ (Pair name
22
+ (InputRef [:departments, :dept, :name])
23
+ )
24
+ (Pair total_payroll
25
+ (Ref total_payroll)
26
+ )
27
+ (Pair manager_count
28
+ (Ref manager_count)
29
+ )
30
+ )
31
+ )
32
+ )
@@ -0,0 +1,64 @@
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 _department_summary(input) {
37
+ let out = [];
38
+ let t24 = input["departments"];
39
+ const t42 = "manager";
40
+ const t44 = 1;
41
+ const t45 = 0;
42
+ t24.forEach((departments_el_25, departments_i_26) => {
43
+ let t27 = departments_el_25["name"];
44
+ let acc33 = 0;
45
+ let t34 = departments_el_25["employees"];
46
+ let acc39 = 0;
47
+ t34.forEach((employees_el_6, employees_i_7) => {
48
+ let t35 = employees_el_6["salary"];
49
+ acc33 += t35;
50
+ let t41 = employees_el_6["role"];
51
+ let t43 = t41 == t42;
52
+ let t46 = t43 ? t44 : t45;
53
+ acc39 += t46;
54
+ });
55
+ let t30 = {
56
+ "name": t27,
57
+ "total_payroll": acc33,
58
+ "manager_count": acc39
59
+ };
60
+ out.push(t30);
61
+ });
62
+ return out;
63
+ }
64
+
@@ -0,0 +1,97 @@
1
+ # Autogenerated by Kumi Codegen
2
+ module Kumi::Compiled::KUMI_41f6e269d8de923ee6a1de8aef241075923042855e9ac9437d981767ab15a457
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 :department_summary then _department_summary
26
+ else raise KeyError, "Unknown declaration"
27
+ end
28
+ end
29
+
30
+ def _total_payroll(input = @input)
31
+ out = []
32
+ t1 = input["departments"] || input[:departments]
33
+ t1.each_with_index do |departments_el_2, departments_i_3|
34
+ acc_4 = 0
35
+ t5 = departments_el_2["employees"] || departments_el_2[:employees]
36
+ t5.each_with_index do |employees_el_6, employees_i_7|
37
+ t8 = employees_el_6["salary"] || employees_el_6[:salary]
38
+ acc_4 += t8
39
+ end
40
+ t9 = acc_4
41
+ out << t9
42
+ end
43
+ out
44
+ end
45
+
46
+ def _manager_count(input = @input)
47
+ out = []
48
+ t10 = input["departments"] || input[:departments]
49
+ t18 = "manager"
50
+ t20 = 1
51
+ t21 = 0
52
+ t10.each_with_index do |departments_el_11, departments_i_12|
53
+ acc_13 = 0
54
+ t14 = departments_el_11["employees"] || departments_el_11[:employees]
55
+ t14.each_with_index do |employees_el_15, employees_i_16|
56
+ t17 = employees_el_15["role"] || employees_el_15[:role]
57
+ t19 = t17 == t18
58
+ t22 = t19 ? t20 : t21
59
+ acc_13 += t22
60
+ end
61
+ t23 = acc_13
62
+ out << t23
63
+ end
64
+ out
65
+ end
66
+
67
+ def _department_summary(input = @input)
68
+ out = []
69
+ t24 = input["departments"] || input[:departments]
70
+ t42 = "manager"
71
+ t44 = 1
72
+ t45 = 0
73
+ t24.each_with_index do |departments_el_25, departments_i_26|
74
+ t27 = departments_el_25["name"] || departments_el_25[:name]
75
+ acc33 = 0
76
+ t34 = departments_el_25["employees"] || departments_el_25[:employees]
77
+ acc39 = 0
78
+ t34.each_with_index do |employees_el_6, employees_i_7|
79
+ t35 = employees_el_6["salary"] || employees_el_6[:salary]
80
+ acc33 += t35
81
+ t41 = employees_el_6["role"] || employees_el_6[:role]
82
+ t43 = t41 == t42
83
+ t46 = t43 ? t44 : t45
84
+ acc39 += t46
85
+ end
86
+ t36 = acc33
87
+ t47 = acc39
88
+ t30 = {
89
+ "name" => t27,
90
+ "total_payroll" => t36,
91
+ "manager_count" => t47
92
+ }
93
+ out << t30
94
+ end
95
+ out
96
+ end
97
+ end
@@ -0,0 +1,32 @@
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 department_summary
20
+ (Hash
21
+ (Pair name
22
+ (InputRef departments.dept.name key_chain=[]) :: [departments] -> string
23
+ ) :: [departments] -> pair
24
+ (Pair total_payroll
25
+ (Ref total_payroll) :: [departments] -> integer
26
+ ) :: [departments] -> pair
27
+ (Pair manager_count
28
+ (Ref manager_count) :: [departments] -> integer
29
+ ) :: [departments] -> pair
30
+ ) :: [departments] -> hash
31
+ ) :: [departments] -> hash
32
+ )
@@ -0,0 +1,30 @@
1
+ {
2
+ "total_payroll": [
3
+ 400000,
4
+ 285000,
5
+ 75000
6
+ ],
7
+ "manager_count": [
8
+ 1,
9
+ 1,
10
+ 0
11
+ ],
12
+ "department_summary": [
13
+ {
14
+ "name": "Engineering",
15
+ "total_payroll": 400000,
16
+ "manager_count": 1
17
+ },
18
+ {
19
+ "name": "Sales",
20
+ "total_payroll": 285000,
21
+ "manager_count": 1
22
+ },
23
+ {
24
+ "name": "HR",
25
+ "total_payroll": 75000,
26
+ "manager_count": 0
27
+ }
28
+ ]
29
+ }
30
+
@@ -0,0 +1,28 @@
1
+ {
2
+ "departments": [
3
+ {
4
+ "name": "Engineering",
5
+ "employees": [
6
+ { "salary": 120000, "role": "manager" },
7
+ { "salary": 95000, "role": "developer" },
8
+ { "salary": 105000, "role": "developer" },
9
+ { "salary": 80000, "role": "qa" }
10
+ ]
11
+ },
12
+ {
13
+ "name": "Sales",
14
+ "employees": [
15
+ { "salary": 110000, "role": "manager" },
16
+ { "salary": 85000, "role": "associate" },
17
+ { "salary": 90000, "role": "associate" }
18
+ ]
19
+ },
20
+ {
21
+ "name": "HR",
22
+ "employees": [
23
+ { "salary": 75000, "role": "specialist" }
24
+ ]
25
+ }
26
+ ]
27
+ }
28
+
@@ -0,0 +1,32 @@
1
+ schema do
2
+ input do
3
+ array :departments do
4
+ hash :dept do
5
+ string :name
6
+ array :employees do
7
+ hash :emp do
8
+ integer :salary
9
+ string :role
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ # VALUE 1: Requires a loop over all employees to sum their salaries.
17
+ # Scope: [:departments]
18
+ value :total_payroll, fn(:sum, input.departments.dept.employees.emp.salary)
19
+ value :manager_count, fn(:count_if, input.departments.dept.employees.emp.role, "manager")
20
+
21
+ # VALUE 2: Requires a separate loop over all employees to count managers.
22
+ # Scope: [:departments]
23
+
24
+ # This value depends on the two aggregations above.
25
+ # When the inliner expands this, it will create two back-to-back loops
26
+ # over the `employees` array inside the main `departments` loop.
27
+ value :department_summary, {
28
+ name: input.departments.dept.name,
29
+ total_payroll: total_payroll,
30
+ manager_count: manager_count
31
+ }
32
+ end
@@ -0,0 +1,49 @@
1
+ (Root
2
+ inputs: [
3
+ (InputDeclaration :depts :array
4
+ [
5
+ (InputDeclaration :dept :hash
6
+ [
7
+ (InputDeclaration :teams :array
8
+ [
9
+ (InputDeclaration :team :hash
10
+ [
11
+ (InputDeclaration :headcount :integer)
12
+ ]
13
+ )
14
+ ]
15
+ )
16
+ ]
17
+ )
18
+ ]
19
+ )
20
+ ]
21
+ values: [
22
+ (ValueDeclaration :dept_total
23
+ (CallExpression :sum
24
+ (InputElementReference depts.dept.teams.team.headcount)
25
+ )
26
+ )
27
+ (ValueDeclaration :company_total
28
+ (CallExpression :sum
29
+ (CallExpression :sum
30
+ (InputElementReference depts.dept.teams.team.headcount)
31
+ )
32
+ )
33
+ )
34
+ (ValueDeclaration :dept_total_masked
35
+ (CallExpression :sum_if
36
+ (InputElementReference depts.dept.teams.team.headcount)
37
+ (DeclarationReference :big_team)
38
+ )
39
+ )
40
+ ]
41
+ traits: [
42
+ (TraitDeclaration :big_team
43
+ (CallExpression :>
44
+ (InputElementReference depts.dept.teams.team.headcount)
45
+ (Literal 10)
46
+ )
47
+ )
48
+ ]
49
+ )
@@ -0,0 +1,9 @@
1
+ depts: array (array) access_mode=element
2
+ └─> dept: element_access
3
+ dept: hash (hash)
4
+ └─> teams: property_access → array_loop
5
+ teams: array (array) access_mode=element
6
+ └─> team: element_access
7
+ team: hash (hash)
8
+ └─> headcount: property_access
9
+ headcount: integer