expressir 2.4.29-arm-linux

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 (426) hide show
  1. checksums.yaml +7 -0
  2. data/.cargo/config.toml +3 -0
  3. data/.github/scripts/test_installed_gem.rb +34 -0
  4. data/.github/workflows/codeql.yml +35 -0
  5. data/.github/workflows/docs.yml +99 -0
  6. data/.github/workflows/links.yml +100 -0
  7. data/.github/workflows/native-gems.yml +201 -0
  8. data/.github/workflows/rake.yml +19 -0
  9. data/.github/workflows/release.yml +37 -0
  10. data/.github/workflows/rust-ext.yml +41 -0
  11. data/.github/workflows/stress.yml +36 -0
  12. data/.github/workflows/validate_schemas.yml +48 -0
  13. data/.github/workflows/verify_remarks.yml +33 -0
  14. data/.gitignore +55 -0
  15. data/.hound.yml +3 -0
  16. data/.rspec +2 -0
  17. data/.rubocop.yml +18 -0
  18. data/.rubocop_todo.yml +297 -0
  19. data/CHANGELOG.md +159 -0
  20. data/Gemfile +18 -0
  21. data/README.adoc +2783 -0
  22. data/Rakefile +41 -0
  23. data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
  24. data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
  25. data/TODO.bugs/03-builder-mutable-state.md +43 -0
  26. data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
  27. data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
  28. data/TODO.bugs/06-collection-registry-single-source.md +53 -0
  29. data/TODO.bugs/07-require-relative-cleanup.md +42 -0
  30. data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
  31. data/TODO.bugs/09-parser-split.md +53 -0
  32. data/TODO.bugs/10-to-s-override.md +42 -0
  33. data/TODO.bugs/11-parser-class-variables.md +39 -0
  34. data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
  35. data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
  36. data/TODO.bugs/14-model-formatting-leak.md +30 -0
  37. data/TODO.bugs/15-expression-children-macro.md +27 -0
  38. data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
  39. data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
  40. data/TODO.bugs/18-const-get-private-constants.md +30 -0
  41. data/TODO.bugs/19-format-methods-public.md +22 -0
  42. data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
  43. data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
  44. data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
  45. data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
  46. data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
  47. data/TODO.bugs/25-debug-puts-in-production.md +21 -0
  48. data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
  49. data/TODO.bugs/27-package-build-god-method.md +19 -0
  50. data/TODO.bugs/28-package-god-class.md +30 -0
  51. data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
  52. data/TODO.bugs/30-unicode-map-extraction.md +19 -0
  53. data/TODO.bugs/README.md +43 -0
  54. data/TODO.max-perf/01-restore-ci-green.md +36 -0
  55. data/TODO.max-perf/02-streaming-parse-path.md +31 -0
  56. data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
  57. data/TODO.max-perf/04-benchmark-harness.md +28 -0
  58. data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
  59. data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
  60. data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
  61. data/TODO.max-perf/08-builder-build-perf.md +45 -0
  62. data/TODO.max-perf/09-grammar-cold-start.md +25 -0
  63. data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
  64. data/TODO.max-perf/11-ci-green-closeout.md +25 -0
  65. data/TODO.max-perf/12-require-boot-profile.md +25 -0
  66. data/TODO.max-perf/13-key-conversion-specs.md +26 -0
  67. data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
  68. data/TODO.parity-ee/00-overview.md +76 -0
  69. data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
  70. data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
  71. data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
  72. data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
  73. data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
  74. data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
  75. data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
  76. data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
  77. data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
  78. data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
  79. data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
  80. data/TODO.parity-ee/12-full-check-catalog.md +67 -0
  81. data/TODO.parity-ee/13-population-p21.md +54 -0
  82. data/TODO.parity-ee/14-shtolo-completion.md +44 -0
  83. data/TODO.parity-ee/15-part28-xml.md +51 -0
  84. data/TODO.parity-ee/16-compare-patch.md +48 -0
  85. data/TODO.parity-ee/17-official-tests.md +42 -0
  86. data/TODO.parity-ee/18-mim-mapping.md +47 -0
  87. data/TODO.parity-ee/19-architecture.md +97 -0
  88. data/TODO.parity-ee/parity-matrix.md +108 -0
  89. data/TODO.refpath-v2/00-overview.md +64 -0
  90. data/TODO.suma-improvements/00-overview.md +23 -0
  91. data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
  92. data/TODO.suma-improvements/02-suma-e2e.md +39 -0
  93. data/TODO.suma-improvements/03-item-graph.md +22 -0
  94. data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
  95. data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
  96. data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
  97. data/TODO.suma-improvements/07-part28-xml.md +15 -0
  98. data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
  99. data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
  100. data/TODO.suma-improvements/10-expressdoc.md +8 -0
  101. data/benchmark/srl_benchmark.rb +458 -0
  102. data/benchmark/srl_native_benchmark.rb +146 -0
  103. data/benchmark/srl_ruby_benchmark.rb +132 -0
  104. data/bin/console +11 -0
  105. data/bin/rspec +30 -0
  106. data/bin/setup +8 -0
  107. data/docs/Gemfile +12 -0
  108. data/docs/_config.yml +141 -0
  109. data/docs/_guides/changes/changes-format.adoc +778 -0
  110. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  111. data/docs/_guides/changes/index.adoc +396 -0
  112. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  113. data/docs/_guides/changes/validating-changes.adoc +681 -0
  114. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  115. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  116. data/docs/_guides/cli/format-schemas.adoc +547 -0
  117. data/docs/_guides/cli/index.adoc +8 -0
  118. data/docs/_guides/cli/managing-changes.adoc +927 -0
  119. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  120. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  121. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  122. data/docs/_guides/index.adoc +165 -0
  123. data/docs/_guides/ler/creating-packages.adoc +664 -0
  124. data/docs/_guides/ler/index.adoc +305 -0
  125. data/docs/_guides/ler/loading-packages.adoc +707 -0
  126. data/docs/_guides/ler/package-formats.adoc +748 -0
  127. data/docs/_guides/ler/querying-packages.adoc +826 -0
  128. data/docs/_guides/ler/step-packages.adoc +385 -0
  129. data/docs/_guides/ler/validating-packages.adoc +750 -0
  130. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  131. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  132. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  133. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  134. data/docs/_guides/liquid/index.adoc +468 -0
  135. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  136. data/docs/_guides/manifests/index.adoc +307 -0
  137. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  138. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  139. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  140. data/docs/_guides/ruby-api/index.adoc +257 -0
  141. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  142. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  143. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  144. data/docs/_pages/data-model.adoc +665 -0
  145. data/docs/_pages/express-language.adoc +506 -0
  146. data/docs/_pages/getting-started.adoc +414 -0
  147. data/docs/_pages/index.adoc +116 -0
  148. data/docs/_pages/introduction.adoc +256 -0
  149. data/docs/_pages/ler-packages.adoc +837 -0
  150. data/docs/_pages/parsers.adoc +709 -0
  151. data/docs/_pages/schema-manifests.adoc +431 -0
  152. data/docs/_references/index.adoc +228 -0
  153. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  154. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  155. data/docs/_tutorials/formatting-schemas.adoc +89 -0
  156. data/docs/_tutorials/index.adoc +231 -0
  157. data/docs/_tutorials/liquid-templates.adoc +806 -0
  158. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  159. data/docs/_tutorials/querying-schemas.adoc +751 -0
  160. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  161. data/docs/index.adoc +242 -0
  162. data/docs/lychee.toml +90 -0
  163. data/examples/demo_ler_usage.sh +86 -0
  164. data/examples/ler/README.md +111 -0
  165. data/examples/ler/simple_example.ler +0 -0
  166. data/examples/ler/simple_schema.exp +33 -0
  167. data/examples/ler_build.rb +75 -0
  168. data/examples/ler_cli.rb +79 -0
  169. data/examples/ler_demo_complete.rb +276 -0
  170. data/examples/ler_query.rb +91 -0
  171. data/examples/ler_query_examples.rb +305 -0
  172. data/examples/ler_stats.rb +81 -0
  173. data/examples/phase3_demo.rb +159 -0
  174. data/examples/query_demo_simple.rb +131 -0
  175. data/exe/expressir +11 -0
  176. data/exe/expressir-format +14 -0
  177. data/exe/expressir-format-test +82 -0
  178. data/expressir.gemspec +61 -0
  179. data/lib/expressir/3.2/expressir_core.so +0 -0
  180. data/lib/expressir/3.3/expressir_core.so +0 -0
  181. data/lib/expressir/3.4/expressir_core.so +0 -0
  182. data/lib/expressir/4.0/expressir_core.so +0 -0
  183. data/lib/expressir/benchmark.rb +310 -0
  184. data/lib/expressir/changes/item_change.rb +20 -0
  185. data/lib/expressir/changes/mapping_change.rb +16 -0
  186. data/lib/expressir/changes/schema_change.rb +85 -0
  187. data/lib/expressir/changes/version_change.rb +26 -0
  188. data/lib/expressir/changes.rb +9 -0
  189. data/lib/expressir/cli.rb +148 -0
  190. data/lib/expressir/commands/base.rb +25 -0
  191. data/lib/expressir/commands/benchmark.rb +59 -0
  192. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  193. data/lib/expressir/commands/changes.rb +34 -0
  194. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  195. data/lib/expressir/commands/changes_validate.rb +63 -0
  196. data/lib/expressir/commands/check.rb +56 -0
  197. data/lib/expressir/commands/clean.rb +20 -0
  198. data/lib/expressir/commands/coverage.rb +458 -0
  199. data/lib/expressir/commands/expand.rb +26 -0
  200. data/lib/expressir/commands/file_violations.rb +70 -0
  201. data/lib/expressir/commands/fix.rb +33 -0
  202. data/lib/expressir/commands/flatten.rb +29 -0
  203. data/lib/expressir/commands/format.rb +43 -0
  204. data/lib/expressir/commands/manifest.rb +420 -0
  205. data/lib/expressir/commands/mapping_validate.rb +68 -0
  206. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  207. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  208. data/lib/expressir/commands/package.rb +1222 -0
  209. data/lib/expressir/commands/parity_inputs.rb +160 -0
  210. data/lib/expressir/commands/validate.rb +106 -0
  211. data/lib/expressir/commands/validate_ascii.rb +94 -0
  212. data/lib/expressir/commands/validate_load.rb +91 -0
  213. data/lib/expressir/commands/version.rb +9 -0
  214. data/lib/expressir/commands/xsd.rb +23 -0
  215. data/lib/expressir/commands.rb +30 -0
  216. data/lib/expressir/config.rb +60 -0
  217. data/lib/expressir/coverage.rb +510 -0
  218. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  219. data/lib/expressir/eengine/changes_section.rb +16 -0
  220. data/lib/expressir/eengine/compare_report.rb +69 -0
  221. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  222. data/lib/expressir/eengine/modified_object.rb +21 -0
  223. data/lib/expressir/eengine.rb +9 -0
  224. data/lib/expressir/errors.rb +113 -0
  225. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  226. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  227. data/lib/expressir/express/ast_key_converter.rb +114 -0
  228. data/lib/expressir/express/builder.rb +277 -0
  229. data/lib/expressir/express/builder_context.rb +22 -0
  230. data/lib/expressir/express/builder_registry.rb +397 -0
  231. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  232. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  233. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  234. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  235. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  236. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  237. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  238. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  239. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  240. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  241. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  242. data/lib/expressir/express/builders/helpers.rb +148 -0
  243. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  244. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  245. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  246. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  247. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  248. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  249. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  250. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  251. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  252. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  253. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  254. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  255. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  256. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  257. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  258. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  259. data/lib/expressir/express/builders/type_builder.rb +238 -0
  260. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  261. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  262. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  263. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  264. data/lib/expressir/express/builders.rb +55 -0
  265. data/lib/expressir/express/cache.rb +76 -0
  266. data/lib/expressir/express/checker.rb +812 -0
  267. data/lib/expressir/express/concatenator.rb +79 -0
  268. data/lib/expressir/express/core.rb +95 -0
  269. data/lib/expressir/express/error.rb +124 -0
  270. data/lib/expressir/express/formatter.rb +149 -0
  271. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  272. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  273. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  274. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  275. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  276. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  277. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  278. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  279. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  280. data/lib/expressir/express/formatters.rb +22 -0
  281. data/lib/expressir/express/grammar/parser.rb +712 -0
  282. data/lib/expressir/express/grammar.rb +11 -0
  283. data/lib/expressir/express/hyperlink_formatter.rb +35 -0
  284. data/lib/expressir/express/interface_dot.rb +105 -0
  285. data/lib/expressir/express/lazy_repository.rb +211 -0
  286. data/lib/expressir/express/line_map.rb +48 -0
  287. data/lib/expressir/express/listing.rb +174 -0
  288. data/lib/expressir/express/model_traversal.rb +42 -0
  289. data/lib/expressir/express/model_visitor.rb +25 -0
  290. data/lib/expressir/express/node_position_index.rb +342 -0
  291. data/lib/expressir/express/parallel_files.rb +229 -0
  292. data/lib/expressir/express/parser.rb +523 -0
  293. data/lib/expressir/express/pretty_formatter.rb +586 -0
  294. data/lib/expressir/express/pretty_gate.rb +61 -0
  295. data/lib/expressir/express/refs_overlay.rb +47 -0
  296. data/lib/expressir/express/remark_attacher.rb +1098 -0
  297. data/lib/expressir/express/remark_overlay.rb +86 -0
  298. data/lib/expressir/express/remark_scanner.rb +245 -0
  299. data/lib/expressir/express/resolve_references_model_visitor.rb +29 -0
  300. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  301. data/lib/expressir/express/schema_head_formatter.rb +22 -0
  302. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  303. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  304. data/lib/expressir/express/scope_resolver.rb +223 -0
  305. data/lib/expressir/express/self_schema_reference.rb +126 -0
  306. data/lib/expressir/express/shtolo.rb +679 -0
  307. data/lib/expressir/express/smrl_xml.rb +125 -0
  308. data/lib/expressir/express/source_formatter.rb +15 -0
  309. data/lib/expressir/express/streaming_builder.rb +435 -0
  310. data/lib/expressir/express/xsd.rb +259 -0
  311. data/lib/expressir/express.rb +53 -0
  312. data/lib/expressir/liquid.rb +1 -0
  313. data/lib/expressir/manifest/resolver.rb +210 -0
  314. data/lib/expressir/manifest/validator.rb +192 -0
  315. data/lib/expressir/manifest.rb +6 -0
  316. data/lib/expressir/mapping/refpath.rb +857 -0
  317. data/lib/expressir/mapping.rb +253 -0
  318. data/lib/expressir/model/cache.rb +18 -0
  319. data/lib/expressir/model/concerns.rb +42 -0
  320. data/lib/expressir/model/data_types/aggregate.rb +26 -0
  321. data/lib/expressir/model/data_types/array.rb +25 -0
  322. data/lib/expressir/model/data_types/bag.rb +21 -0
  323. data/lib/expressir/model/data_types/binary.rb +19 -0
  324. data/lib/expressir/model/data_types/boolean.rb +15 -0
  325. data/lib/expressir/model/data_types/enumeration.rb +21 -0
  326. data/lib/expressir/model/data_types/enumeration_item.rb +24 -0
  327. data/lib/expressir/model/data_types/generic.rb +24 -0
  328. data/lib/expressir/model/data_types/generic_entity.rb +24 -0
  329. data/lib/expressir/model/data_types/integer.rb +15 -0
  330. data/lib/expressir/model/data_types/list.rb +23 -0
  331. data/lib/expressir/model/data_types/logical.rb +15 -0
  332. data/lib/expressir/model/data_types/number.rb +15 -0
  333. data/lib/expressir/model/data_types/real.rb +17 -0
  334. data/lib/expressir/model/data_types/select.rb +23 -0
  335. data/lib/expressir/model/data_types/set.rb +21 -0
  336. data/lib/expressir/model/data_types/string.rb +19 -0
  337. data/lib/expressir/model/data_types.rb +25 -0
  338. data/lib/expressir/model/declarations/attribute.rb +38 -0
  339. data/lib/expressir/model/declarations/constant.rb +28 -0
  340. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  341. data/lib/expressir/model/declarations/entity.rb +62 -0
  342. data/lib/expressir/model/declarations/function.rb +59 -0
  343. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  344. data/lib/expressir/model/declarations/interface.rb +37 -0
  345. data/lib/expressir/model/declarations/interface_item.rb +21 -0
  346. data/lib/expressir/model/declarations/interfaced_item.rb +33 -0
  347. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  348. data/lib/expressir/model/declarations/parameter.rb +28 -0
  349. data/lib/expressir/model/declarations/procedure.rb +57 -0
  350. data/lib/expressir/model/declarations/remark_item.rb +21 -0
  351. data/lib/expressir/model/declarations/rule.rb +66 -0
  352. data/lib/expressir/model/declarations/schema.rb +215 -0
  353. data/lib/expressir/model/declarations/schema_version.rb +19 -0
  354. data/lib/expressir/model/declarations/schema_version_item.rb +19 -0
  355. data/lib/expressir/model/declarations/subtype_constraint.rb +32 -0
  356. data/lib/expressir/model/declarations/type.rb +45 -0
  357. data/lib/expressir/model/declarations/unique_rule.rb +26 -0
  358. data/lib/expressir/model/declarations/variable.rb +28 -0
  359. data/lib/expressir/model/declarations/where_rule.rb +26 -0
  360. data/lib/expressir/model/declarations.rb +31 -0
  361. data/lib/expressir/model/dependency_resolver.rb +268 -0
  362. data/lib/expressir/model/exp_file.rb +42 -0
  363. data/lib/expressir/model/expressions/aggregate_initializer.rb +18 -0
  364. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +20 -0
  365. data/lib/expressir/model/expressions/binary_expression.rb +59 -0
  366. data/lib/expressir/model/expressions/entity_constructor.rb +20 -0
  367. data/lib/expressir/model/expressions/function_call.rb +20 -0
  368. data/lib/expressir/model/expressions/interval.rb +29 -0
  369. data/lib/expressir/model/expressions/query_expression.rb +31 -0
  370. data/lib/expressir/model/expressions/unary_expression.rb +25 -0
  371. data/lib/expressir/model/expressions.rb +18 -0
  372. data/lib/expressir/model/identifier.rb +26 -0
  373. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  374. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  375. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  376. data/lib/expressir/model/indexes/type_index.rb +149 -0
  377. data/lib/expressir/model/indexes.rb +12 -0
  378. data/lib/expressir/model/interface_validator.rb +384 -0
  379. data/lib/expressir/model/literals/binary.rb +17 -0
  380. data/lib/expressir/model/literals/integer.rb +17 -0
  381. data/lib/expressir/model/literals/logical.rb +21 -0
  382. data/lib/expressir/model/literals/real.rb +17 -0
  383. data/lib/expressir/model/literals/string.rb +20 -0
  384. data/lib/expressir/model/literals.rb +13 -0
  385. data/lib/expressir/model/model_element.rb +377 -0
  386. data/lib/expressir/model/references/attribute_reference.rb +19 -0
  387. data/lib/expressir/model/references/group_reference.rb +19 -0
  388. data/lib/expressir/model/references/index_reference.rb +23 -0
  389. data/lib/expressir/model/references/simple_reference.rb +21 -0
  390. data/lib/expressir/model/references.rb +12 -0
  391. data/lib/expressir/model/remark_format.rb +17 -0
  392. data/lib/expressir/model/remark_info.rb +92 -0
  393. data/lib/expressir/model/remark_placement.rb +42 -0
  394. data/lib/expressir/model/repository.rb +483 -0
  395. data/lib/expressir/model/repository_validator.rb +293 -0
  396. data/lib/expressir/model/search_engine.rb +551 -0
  397. data/lib/expressir/model/statements/alias.rb +31 -0
  398. data/lib/expressir/model/statements/assignment.rb +23 -0
  399. data/lib/expressir/model/statements/case.rb +42 -0
  400. data/lib/expressir/model/statements/case_action.rb +20 -0
  401. data/lib/expressir/model/statements/compound.rb +21 -0
  402. data/lib/expressir/model/statements/escape.rb +18 -0
  403. data/lib/expressir/model/statements/if.rb +26 -0
  404. data/lib/expressir/model/statements/null.rb +18 -0
  405. data/lib/expressir/model/statements/procedure_call.rb +22 -0
  406. data/lib/expressir/model/statements/repeat.rb +40 -0
  407. data/lib/expressir/model/statements/return.rb +20 -0
  408. data/lib/expressir/model/statements/skip.rb +18 -0
  409. data/lib/expressir/model/statements.rb +20 -0
  410. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +25 -0
  411. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +17 -0
  412. data/lib/expressir/model/supertype_expressions.rb +12 -0
  413. data/lib/expressir/model.rb +39 -0
  414. data/lib/expressir/package/builder.rb +231 -0
  415. data/lib/expressir/package/metadata.rb +79 -0
  416. data/lib/expressir/package/reader.rb +149 -0
  417. data/lib/expressir/package.rb +8 -0
  418. data/lib/expressir/schema_manifest.rb +159 -0
  419. data/lib/expressir/schema_manifest_entry.rb +15 -0
  420. data/lib/expressir/version.rb +8 -0
  421. data/lib/expressir.rb +94 -0
  422. data/lib/tasks/verify_remarks.rake +16 -0
  423. data/rakelib/native.rake +24 -0
  424. data/rakelib/oracle.rake +52 -0
  425. data/rakelib/verify_remarks.rake +16 -0
  426. metadata +692 -0
@@ -0,0 +1,268 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ # Resolves dependencies between EXPRESS schemas
6
+ # Handles USE FROM and REFERENCE FROM interfaces
7
+ # Detects circular dependencies
8
+ class DependencyResolver
9
+ # Exception for circular dependencies
10
+ class CircularDependencyError < StandardError
11
+ attr_reader :dependency_chain
12
+
13
+ def initialize(message, chain)
14
+ super(message)
15
+ @dependency_chain = chain
16
+ end
17
+ end
18
+
19
+ attr_reader :base_dirs, :schema_registry, :verbose, :unresolved
20
+
21
+ # Initialize resolver
22
+ # @param base_dirs [String, Array<String>] Base directories to search
23
+ # @param schema_registry [Hash] Manual schema name => path mappings
24
+ # @param verbose [Boolean] Enable verbose logging
25
+ def initialize(base_dirs: Dir.pwd, schema_registry: {}, verbose: false)
26
+ @base_dirs = Array(base_dirs).map { |d| File.expand_path(d) }
27
+ @schema_registry = schema_registry || {}
28
+ @verbose = verbose
29
+ @resolved_schemas = Set.new
30
+ @resolution_stack = []
31
+ @unresolved = []
32
+ @last_found_base_index = nil
33
+ @last_found_base_dir = nil
34
+ @multiple_matches = []
35
+ end
36
+
37
+ # Resolve all dependencies starting from root schema
38
+ # @param root_schema_path [String] Path to root schema file
39
+ # @return [Array<String>] Ordered list of schema file paths
40
+ def resolve_dependencies(root_schema_path)
41
+ @resolved_schemas.clear
42
+ @resolution_stack.clear
43
+ @unresolved.clear
44
+
45
+ resolve_recursive(File.expand_path(root_schema_path))
46
+ @resolved_schemas.to_a
47
+ end
48
+
49
+ # Extract interfaces from schema file using proper parsing
50
+ # @param schema_path [String] Path to schema file
51
+ # @return [Array<Hash>] List of interfaces with :kind, :schema_name
52
+ def extract_interfaces(schema_path)
53
+ interfaces = []
54
+
55
+ # Parse the schema file properly
56
+ repo = Expressir::Express::Parser.from_file(schema_path)
57
+
58
+ # Extract interfaces from first schema (file should contain one schema)
59
+ schema = repo.schemas.first
60
+ return interfaces unless schema&.interfaces
61
+
62
+ schema.interfaces.each do |interface|
63
+ kind = case interface.kind
64
+ when Expressir::Model::Declarations::Interface::USE
65
+ "USE"
66
+ when Expressir::Model::Declarations::Interface::REFERENCE
67
+ "REFERENCE"
68
+ else
69
+ interface.kind.first
70
+ end
71
+
72
+ interfaces << {
73
+ kind: kind,
74
+ schema_name: interface.schema.id,
75
+ }
76
+ end
77
+
78
+ interfaces
79
+ end
80
+
81
+ # Resolve schema location
82
+ # @param schema_name [String] Schema name to find
83
+ # @param kind [String] Interface kind ("USE" or "REFERENCE")
84
+ # @param current_path [String] Path of schema requesting the reference
85
+ # @return [String, nil] Path to schema file, or nil if not found
86
+ def resolve_schema_location(schema_name, _kind, _current_path)
87
+ # Check schema_registry first
88
+ if @schema_registry[schema_name]
89
+ registry_path = File.expand_path(@schema_registry[schema_name])
90
+ return registry_path if File.exist?(registry_path)
91
+ end
92
+
93
+ # Search ONLY in base_dirs recursively and collect ALL matches
94
+ all_matches = []
95
+ @base_dirs.each_with_index do |base_dir, index|
96
+ candidate = find_schema_in_directory(schema_name, base_dir)
97
+ if candidate
98
+ all_matches << { path: candidate, base_dir: base_dir, index: index }
99
+ end
100
+ end
101
+
102
+ # If no matches found, return nil
103
+ return nil if all_matches.empty?
104
+
105
+ # If multiple matches found, record for warning
106
+ if all_matches.size > 1
107
+ @multiple_matches << {
108
+ schema_name: schema_name,
109
+ matches: all_matches,
110
+ }
111
+ end
112
+
113
+ # Use the first match
114
+ first_match = all_matches.first
115
+ @last_found_base_index = first_match[:index]
116
+ @last_found_base_dir = first_match[:base_dir]
117
+
118
+ first_match[:path]
119
+ end
120
+
121
+ # Get resolution statistics
122
+ # @return [Hash] Statistics about resolved schemas
123
+ def statistics
124
+ {
125
+ total_schemas: @resolved_schemas.size,
126
+ schemas: @resolved_schemas.to_a,
127
+ base_dirs: @base_dirs,
128
+ multiple_matches: @multiple_matches,
129
+ }
130
+ end
131
+
132
+ private
133
+
134
+ # Resolve schema and its dependencies recursively
135
+ # @param schema_path [String] Path to schema file
136
+ # @return [void]
137
+ def resolve_recursive(schema_path)
138
+ return if @resolved_schemas.include?(schema_path)
139
+
140
+ # Check for circular dependency - schema-level circular references are valid in EXPRESS
141
+ if @resolution_stack.include?(schema_path)
142
+ # Schema is already being processed - this is a back-reference
143
+ # Skip re-processing; the schema will be added to resolved_schemas when its original pass completes
144
+ return
145
+ end
146
+
147
+ @resolution_stack.push(schema_path)
148
+
149
+ # Extract and resolve interfaces
150
+ interfaces = extract_interfaces(schema_path)
151
+ interfaces.each do |interface|
152
+ if @verbose
153
+ schema_name = File.basename(schema_path, ".*")
154
+ print " #{interface[:kind]} FROM #{interface[:schema_name]} (in #{schema_name}): "
155
+ end
156
+
157
+ dep_path = resolve_schema_location(
158
+ interface[:schema_name],
159
+ interface[:kind],
160
+ schema_path,
161
+ )
162
+
163
+ if dep_path
164
+ if @verbose
165
+ # Show which source and relative path
166
+ if @last_found_base_dir && @last_found_base_index
167
+ relative_path = dep_path.sub("#{@last_found_base_dir}/", "")
168
+ source_label = "[source #{@last_found_base_index + 1}]"
169
+ puts "\e[32m✓\e[0m #{source_label} #{relative_path}"
170
+ else
171
+ relative_path = File.basename(dep_path)
172
+ puts "\e[32m✓\e[0m #{relative_path}"
173
+ end
174
+ end
175
+ resolve_recursive(dep_path)
176
+ else
177
+ # Track unresolved reference
178
+ @unresolved << {
179
+ from: schema_path,
180
+ kind: interface[:kind],
181
+ schema_name: interface[:schema_name],
182
+ }
183
+
184
+ if @verbose
185
+ puts "\e[31m✗ not found\e[0m"
186
+ end
187
+ end
188
+ end
189
+
190
+ @resolution_stack.pop
191
+ @resolved_schemas.add(schema_path)
192
+ end
193
+
194
+ # Find schema file in directory
195
+ # @param schema_name [String] Schema name to find
196
+ # @param directory [String] Directory to search
197
+ # @param recursive [Boolean] Whether to search subdirectories
198
+ # @return [String, nil] Path to schema file or nil
199
+ def find_schema_in_directory(schema_name, directory)
200
+ return nil unless File.directory?(directory)
201
+
202
+ # Try direct match first (resource pattern: schema_name.exp)
203
+ candidate = File.join(directory, "#{schema_name}.exp")
204
+ return File.expand_path(candidate) if File.exist?(candidate)
205
+
206
+ # Try module pattern: {lower-case-prefix-without-_schema}/{arm|mim}.exp
207
+ # Examples:
208
+ # Activity_method_mim -> activity_method/mim.exp
209
+ # Activity_method_arm -> activity_method/arm.exp
210
+ module_path = try_module_pattern(schema_name, directory)
211
+ return module_path if module_path
212
+
213
+ # Search recursively in subdirectories
214
+ # Only in base_dirs to avoid permission errors in system directories
215
+ begin
216
+ # First try direct name match
217
+ Dir.glob(File.join(directory, "**",
218
+ "#{schema_name}.exp")).each do |file|
219
+ return File.expand_path(file)
220
+ end
221
+
222
+ # Also try module pattern recursively for _arm/_mim schemas
223
+ if schema_name =~ /^(.+)_(arm|mim)$/i
224
+ prefix = Regexp.last_match(1)
225
+ suffix = Regexp.last_match(2).downcase
226
+ prefix = prefix.sub(/_schema$/i, "")
227
+ module_dir = prefix.downcase
228
+
229
+ # Search for **/module_dir/suffix.exp pattern
230
+ Dir.glob(File.join(directory, "**", module_dir,
231
+ "#{suffix}.exp")).each do |file|
232
+ return File.expand_path(file)
233
+ end
234
+ end
235
+ rescue Errno::EACCES, Errno::EPERM
236
+ # Ignore permission errors when searching directories
237
+ nil
238
+ end
239
+
240
+ nil
241
+ end
242
+
243
+ # Try module naming pattern
244
+ # @param schema_name [String] Schema name (e.g., "Activity_method_mim")
245
+ # @param directory [String] Base directory
246
+ # @return [String, nil] Path if found, nil otherwise
247
+ def try_module_pattern(schema_name, directory)
248
+ # Check if schema name ends with _arm or _mim
249
+ if schema_name =~ /^(.+)_(arm|mim)$/i
250
+ prefix = Regexp.last_match(1)
251
+ suffix = Regexp.last_match(2).downcase
252
+
253
+ # Remove trailing _schema if present
254
+ prefix = prefix.sub(/_schema$/i, "")
255
+
256
+ # Convert to lowercase and replace underscores
257
+ module_dir = prefix.downcase
258
+
259
+ # Try: directory/module_dir/suffix.exp
260
+ candidate = File.join(directory, module_dir, "#{suffix}.exp")
261
+ return File.expand_path(candidate) if File.exist?(candidate)
262
+ end
263
+
264
+ nil
265
+ end
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ # Represents a single EXPRESS file containing schemas and preamble remarks.
6
+ # This class preserves file-level information including:
7
+ # - File path for reference
8
+ # - Preamble remarks (comments at the top of the file before any schema)
9
+ # - Schemas defined in this file
10
+ #
11
+ # A Repository contains multiple ExpFile instances when parsing multiple files,
12
+ # or a single ExpFile when parsing a single file.
13
+ class ExpFile < ModelElement
14
+ include HasId
15
+ include ScopeContainer
16
+
17
+ collection_attributes :schemas
18
+
19
+ attribute :path, :string
20
+ attribute :schemas, Declarations::Schema, collection: true,
21
+ initialize_empty: true
22
+ attribute :_class, :string, default: -> { self.class.name }
23
+
24
+ key_value do
25
+ map "_class", to: :_class, render_default: true
26
+ map "path", to: :path
27
+ map "schemas", to: :schemas
28
+ end
29
+
30
+ # Returns the file path as the identifier
31
+ # @return [String, nil] The file path or nil
32
+ def id
33
+ path
34
+ end
35
+
36
+ # @return [Array<Declaration>]
37
+ def children
38
+ schemas
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 12.9 Aggregate initializer
6
+ class AggregateInitializer < ModelElement
7
+ child_attributes :items
8
+ attribute :items, ModelElement, collection: true
9
+ attribute :_class, :string, default: -> { self.class.name }
10
+
11
+ key_value do
12
+ map "_class", to: :_class, render_default: true
13
+ map "items", to: :items
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 12.9 Aggregate initializer
6
+ class AggregateInitializerItem < ModelElement
7
+ child_attributes :expression, :repetition
8
+ attribute :expression, ModelElement
9
+ attribute :repetition, ModelElement
10
+ attribute :_class, :string, default: -> { self.class.name }
11
+
12
+ key_value do
13
+ map "_class", to: :_class, render_default: true
14
+ map "expression", to: :expression
15
+ map "repetition", to: :repetition
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,59 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 12.1 Arithmetic operators
6
+ # - section 12.2 Relational operators
7
+ # - section 12.3 Binary operators
8
+ # - section 12.4 Logical operators
9
+ # - section 12.5 String operators
10
+ # - section 12.6 Aggregate operators
11
+ # - section 12.10 Complex entity instance construction operator
12
+ class BinaryExpression < ModelElement
13
+ child_attributes :operand1, :operand2
14
+ ADDITION = "ADDITION".freeze
15
+ AND = "AND".freeze
16
+ COMBINE = "COMBINE".freeze
17
+ EQUAL = "EQUAL".freeze
18
+ EXPONENTIATION = "EXPONENTIATION".freeze
19
+ GREATER_THAN = "GREATER_THAN".freeze
20
+ GREATER_THAN_OR_EQUAL = "GREATER_THAN_OR_EQUAL".freeze
21
+ IN = "IN".freeze
22
+ INSTANCE_EQUAL = "INSTANCE_EQUAL".freeze
23
+ INSTANCE_NOT_EQUAL = "INSTANCE_NOT_EQUAL".freeze
24
+ INTEGER_DIVISION = "INTEGER_DIVISION".freeze
25
+ LESS_THAN = "LESS_THAN".freeze
26
+ LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL".freeze
27
+ LIKE = "LIKE".freeze
28
+ MODULO = "MODULO".freeze
29
+ MULTIPLICATION = "MULTIPLICATION".freeze
30
+ NOT_EQUAL = "NOT_EQUAL".freeze
31
+ OR = "OR".freeze
32
+ REAL_DIVISION = "REAL_DIVISION".freeze
33
+ SUBTRACTION = "SUBTRACTION".freeze
34
+ XOR = "XOR".freeze
35
+
36
+ attribute :operator, :string,
37
+ values: %w[
38
+ ADDITION AND COMBINE EQUAL EXPONENTIATION
39
+ GREATER_THAN
40
+ GREATER_THAN_OR_EQUAL IN INSTANCE_EQUAL
41
+ INSTANCE_NOT_EQUAL
42
+ INTEGER_DIVISION LESS_THAN LESS_THAN_OR_EQUAL LIKE
43
+ MODULO MULTIPLICATION NOT_EQUAL OR REAL_DIVISION
44
+ SUBTRACTION XOR
45
+ ]
46
+ attribute :operand1, ModelElement
47
+ attribute :operand2, ModelElement
48
+ attribute :_class, :string, default: -> { self.class.name }
49
+
50
+ key_value do
51
+ map "_class", to: :_class, render_default: true
52
+ map "operator", to: :operator
53
+ map "operand1", to: :operand1
54
+ map "operand2", to: :operand2
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,20 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 9.2.6 Implicit declarations
6
+ class EntityConstructor < ModelElement
7
+ child_attributes :parameters
8
+ attribute :entity, ModelElement
9
+ attribute :parameters, ModelElement, collection: true
10
+ attribute :_class, :string, default: -> { self.class.name }
11
+
12
+ key_value do
13
+ map "_class", to: :_class, render_default: true
14
+ map "entity", to: :entity
15
+ map "parameters", to: :parameters
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 12.8 Function call
6
+ class FunctionCall < ModelElement
7
+ child_attributes :parameters
8
+ attribute :function, ModelElement
9
+ attribute :parameters, ModelElement, collection: true
10
+ attribute :_class, :string, default: -> { self.class.name }
11
+
12
+ key_value do
13
+ map "_class", to: :_class, render_default: true
14
+ map "function", to: :function
15
+ map "parameters", to: :parameters
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 12.2.4 Interval expressions
6
+ class Interval < ModelElement
7
+ child_attributes :low, :item, :high
8
+ LESS_THAN = "LESS_THAN".freeze
9
+ LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL".freeze
10
+
11
+ attribute :low, ModelElement
12
+ attribute :operator1, :string, values: %w[LESS_THAN LESS_THAN_OR_EQUAL]
13
+ attribute :item, ModelElement
14
+ attribute :operator2, :string, values: %w[LESS_THAN LESS_THAN_OR_EQUAL]
15
+ attribute :high, ModelElement
16
+ attribute :_class, :string, default: -> { self.class.name }
17
+
18
+ key_value do
19
+ map "_class", to: :_class, render_default: true
20
+ map "low", to: :low
21
+ map "operator1", to: :operator1
22
+ map "item", to: :item
23
+ map "operator2", to: :operator2
24
+ map "high", to: :high
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 12.6.7 Query expression
6
+ class QueryExpression < ModelElement
7
+ include Identifier
8
+
9
+ child_attributes :expression, :aggregate_source
10
+
11
+ attribute :aggregate_source, ModelElement
12
+ attribute :expression, ModelElement
13
+ attribute :_class, :string, default: -> { self.class.name }
14
+
15
+ key_value do
16
+ map "_class", to: :_class, render_default: true
17
+ map "aggregate_source", to: :aggregate_source
18
+ map "expression", to: :expression
19
+ end
20
+
21
+ # @return [Array<Declaration>]
22
+ def children
23
+ [
24
+ self,
25
+ *remark_items,
26
+ ]
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ module Expressir
2
+ module Model
3
+ module Expressions
4
+ # Specified in ISO 10303-11:2004
5
+ # - section 12.1 Arithmetic operators
6
+ # - section 12.4.1 NOT operator
7
+ class UnaryExpression < ModelElement
8
+ child_attributes :operand
9
+ MINUS = "MINUS".freeze
10
+ NOT = "NOT".freeze
11
+ PLUS = "PLUS".freeze
12
+
13
+ attribute :operator, :string, values: %w[MINUS NOT PLUS]
14
+ attribute :operand, ModelElement
15
+ attribute :_class, :string, default: -> { self.class.name }
16
+
17
+ key_value do
18
+ map "_class", to: :_class, render_default: true
19
+ map "operator", to: :operator
20
+ map "operand", to: :operand
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ module Expressions
6
+ autoload :AggregateInitializer,
7
+ "#{__dir__}/expressions/aggregate_initializer"
8
+ autoload :AggregateInitializerItem,
9
+ "#{__dir__}/expressions/aggregate_initializer_item"
10
+ autoload :BinaryExpression, "#{__dir__}/expressions/binary_expression"
11
+ autoload :EntityConstructor, "#{__dir__}/expressions/entity_constructor"
12
+ autoload :FunctionCall, "#{__dir__}/expressions/function_call"
13
+ autoload :Interval, "#{__dir__}/expressions/interval"
14
+ autoload :QueryExpression, "#{__dir__}/expressions/query_expression"
15
+ autoload :UnaryExpression, "#{__dir__}/expressions/unary_expression"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ module Expressir
2
+ module Model
3
+ module Identifier
4
+ def self.included(mod)
5
+ # Auto-include markers - all Identifier types have id and can have remark_items and remarks
6
+ mod.include(HasId)
7
+ mod.include(HasRemarkItems)
8
+ mod.include(HasRemarks)
9
+
10
+ mod.attribute :id, :string
11
+ mod.attribute :remarks, :string, collection: true
12
+ mod.attribute :remark_items,
13
+ ::Expressir::Model::Declarations::RemarkItem, collection: true
14
+ mod.attribute :untagged_remarks, ::Expressir::Model::RemarkInfo,
15
+ collection: true
16
+
17
+ mod.key_value do
18
+ map "id", to: :id
19
+ map "remarks", to: :remarks
20
+ map "remark_items", to: :remark_items
21
+ map "untagged_remarks", to: :untagged_remarks
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Model
5
+ module Indexes
6
+ # Index for fast entity lookup across schemas
7
+ # Maintains indexes by qualified name and by schema for efficient querying
8
+ class EntityIndex
9
+ attr_reader :by_schema, :by_qualified_name
10
+
11
+ # Initialize a new entity index
12
+ # @param schemas [Array<Declarations::Schema>] Schemas to index
13
+ def initialize(schemas = [])
14
+ @by_schema = {}
15
+ @by_qualified_name = {}
16
+ build(schemas) unless schemas.empty?
17
+ end
18
+
19
+ # Build indexes from schemas
20
+ # @param schemas [Array<Declarations::Schema>] Schemas to index
21
+ # @return [void]
22
+ def build(schemas)
23
+ @by_schema = {}
24
+ @by_qualified_name = {}
25
+
26
+ schemas.each do |schema|
27
+ schema_id = schema.id.safe_downcase
28
+ @by_schema[schema_id] = {}
29
+
30
+ next unless schema.entities
31
+
32
+ schema.entities.each do |entity|
33
+ entity_id = entity.id.safe_downcase
34
+ qualified_name = "#{schema_id}.#{entity_id}"
35
+
36
+ @by_schema[schema_id][entity_id] = entity
37
+ @by_qualified_name[qualified_name] = entity
38
+ end
39
+ end
40
+ end
41
+
42
+ # Find entity by qualified name
43
+ # @param qualified_name [String] Entity qualified name (e.g., "schema.entity")
44
+ # @return [Declarations::Entity, nil] Found entity or nil
45
+ def find(qualified_name)
46
+ return nil if qualified_name.nil? || qualified_name.empty?
47
+
48
+ normalized_name = qualified_name.safe_downcase
49
+
50
+ # Try qualified name first
51
+ entity = @by_qualified_name[normalized_name]
52
+ return entity if entity
53
+
54
+ # Try as simple name across all schemas
55
+ schema_name, entity_name = normalized_name.split(".", 2)
56
+ if entity_name.nil?
57
+ # Search all schemas for simple name
58
+ @by_schema.each_value do |entities|
59
+ entity = entities[schema_name]
60
+ return entity if entity
61
+ end
62
+ else
63
+ # Look in specific schema
64
+ schema_entities = @by_schema[schema_name]
65
+ return schema_entities[entity_name] if schema_entities
66
+ end
67
+
68
+ nil
69
+ end
70
+
71
+ # List all entities
72
+ # @param schema [String, nil] Filter by schema name
73
+ # @return [Array<Declarations::Entity>] List of entities
74
+ def list(schema: nil)
75
+ if schema
76
+ @by_schema[schema.safe_downcase]&.values || []
77
+ else
78
+ @by_qualified_name.values
79
+ end
80
+ end
81
+
82
+ # Check if index is empty
83
+ # @return [Boolean] True if no entities indexed
84
+ def empty?
85
+ @by_qualified_name.empty?
86
+ end
87
+
88
+ # Count total entities
89
+ # @return [Integer] Total number of entities
90
+ def count
91
+ @by_qualified_name.size
92
+ end
93
+
94
+ # Get entities for a specific schema
95
+ # @param schema [String] Schema name
96
+ # @return [Hash<String, Declarations::Entity>] Entities in schema
97
+ def schema_entities(schema)
98
+ @by_schema[schema.safe_downcase] || {}
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end