github iwe-org/iwe iwe-v0.13.0
v0.13.0

latest releases: iwec-v0.13.0, iwes-v0.13.0
7 hours ago

iwe

Added

  • --filter relational operators gain a $size count predicate — --filter '$includedBy: { $size: 0 }' finds roots, --filter '$includes: { $size: 0 }' finds leaves, --filter '$referencedBy: { $size: { $gte: 5 } }' finds hubs.

Changed

  • --filter relational operators default to direct edges (maxDepth / maxDistance 1) when the bound is omitted; an unbounded walk is now spelled maxDepth: 0 / maxDistance: 0 (was: omitting the bound meant unbounded). The structural anchor flags are unaffected — --included-by KEY was already direct and --included-by KEY:0 is still unbounded.

iwec

Added

  • iwe_query relational operators gain a $size count predicate — $includedBy: { $size: 0 } (roots), $includes: { $size: 0 } (leaves), $referencedBy: { $size: { $gte: 5 } } (hubs). Takes a non-negative integer or a mapping of $eq / $ne / $gt / $gte / $lt / $lte comparisons.

Changed

  • iwe_query relational operators default to direct edges when maxDepth / maxDistance is omitted; an unbounded walk is now spelled maxDepth: 0 / maxDistance: 0 (was unbounded by default). match is now optional, defaulting to any document.

liwe

Added

  • $size cardinality predicate on the relational operators ($includes, $includedBy, $references, $referencedBy) — count the distinct related documents instead of testing for existence, e.g. $includedBy: { $size: 0 } (roots), $referencedBy: { $size: { $gte: 5 } } (hubs). Takes a non-negative integer or a mapping of $eq / $ne / $gt / $gte / $lt / $lte comparisons; CountPred / CountCmp are the new public types and InclusionAnchor / ReferenceAnchor gain a size: Option<CountPred> field.
  • The frontmatter array $size operator now accepts count comparisons ({ $size: { $gte: 3 } }) in addition to an exact integer; FieldOp::Size carries a CountPred (was u64).
  • model::idsalloc_node_id / alloc_line_id back every id from a single process-global atomic counter (starting at 1), so ids are unique for the process lifetime and never re-issued; Ids is the handle type.
  • Tree.line_range: Option<LineRange> — the source line range a tree node was read from, populated when a tree is collected from the graph and preserved across an export/import round-trip.
  • NodeIter::iter_id() and NodeIter::line_range() — a node's id and source line range while iterating; GraphBuilder::insert_from_iter stores each imported node under iter_id() (honoring caller-provided ids instead of allocating fresh ones) and returns the accumulated NodesMap.

Changed

  • Relational operators in the mapping form default maxDepth / maxDistance to direct edges (was: absence meant an unbounded walk); maxDepth: 0 / maxDistance: 0 is the new unbounded sentinel. match is now optional and defaults to any document, so InclusionAnchor::with_match(Filter::all(), ..)-style anchors are expressible from the query language directly.
  • NodeId and LineId are now i64 (were u64 and usize).
  • Tree.id is now a mandatory NodeId (was Option<NodeId>); synthesized tree nodes receive a fresh id. Tree::new takes a NodeId in place of an Option<NodeId>.
  • Tree equality is structural — it compares node and children and ignores id and line_range, so two independently built trees of the same content are equal. Graph equality likewise compares the per-key exported trees rather than raw arena positions.
  • The arena stores nodes and lines in hash maps, so a dangling id resolves to GraphNode::Empty instead of panicking and deleted ids are dropped rather than recycled.
  • Graph::nodes() is replaced by node_count(), node_ids(), and section_ids() — the old accessor returned the backing Vec<GraphNode>, which no longer exists; callers that only need a count or a set of ids avoid materializing every node.
  • Graph::get_line and Arena::get_line return &Line (was an owned Line), so reading a line no longer clones its inlines on every access.

Don't miss a new iwe release

NewReleases is sending notifications on new releases.