Module: Lutaml::Xml::PlanCompiler
- Defined in:
- lib/lutaml/xml/plan_compiler.rb
Overview
Phase 5 slice: compile a model's XML mapping into a Leptris::XML::Descriptor plan and materialize whole documents in one native pass (leptris_plan_walk) — no moxml wrapper tree, no per-element Ruby dispatch. Measured on the 200-item probe: walk+hydrate 8.7x faster, 82% fewer allocations than the interpretive path, hydration-equal output.
A model compiles when EVERY rule is plan-shaped; richer rows defer their subtree verbatim and interpret post-walk rather than opting the whole model out:
- map_attribute / map_element / content / raw rows
- Value-scalar types or nested Serializables
- custom methods, polymorphism, unions, and ordered/mixed
children capture :raw and interpret post-walk
- ordered/mixed root mappings compile; the entry points
reconstruct element_order from the node surface
- attributes not derived/union/polymorphic
The fast path is opt-in (Config.xml_plan_fast_path) while the full semantics audit (parent links, consolidation, ordering metadata) completes.
Constant Summary collapse
- PLAN_CACHE =
Isolated holder: suites freeze model classes; a cache on a frozen constant would be immutable (TypeProbeCache precedent).
::Class.new do class << self def cache @cache ||= {} end end end.cache
Class Method Summary collapse
Class Method Details
.compile(model_class, register) ⇒ Object
38 39 40 41 42 43 |
# File 'lib/lutaml/xml/plan_compiler.rb', line 38 def compile(model_class, register) key = [model_class, register] return PLAN_CACHE[key] if PLAN_CACHE.key?(key) PLAN_CACHE[key] = build(model_class, register) end |