feat(sdk): dataset-qualified series name contract + shared split helper (0.26.0) - #183
Closed
Alvvalencia wants to merge 2 commits into
Closed
feat(sdk): dataset-qualified series name contract + shared split helper (0.26.0)#183Alvvalencia wants to merge 2 commits into
Alvvalencia wants to merge 2 commits into
Conversation
…er (0.26.0) pj.data_processors.v1 addressed input series by bare topic/field names and never said what a name means when several loaded datasets share topic names, so conforming hosts filled the gap incompatibly (PJ4's transform path refused duplicates while its marker path silently bound the first-loaded dataset). The contract is now explicit in the PJ_data_processors_host_vtable_t doc block (DATASET-QUALIFIED NAMES), and the new installed header pj_base/sdk/dataset_qualified_name.hpp ships the shared parser/composer (splitDatasetQualifier / qualifiedSeriesName) so hosts and plugins use one implementation instead of the two copies that exist today. MINOR bump to 0.26.0: new installed public header, no ABI change.
Alvvalencia
marked this pull request as draft
September 1, 2026 09:58
Alvvalencia
added a commit
that referenced
this pull request
Sep 1, 2026
Tail-appended MINOR, additions only. Numbered assuming #183 (0.26.0) merges first; renumber at release if the two land in the other order.
…d-names # Conflicts: # CHANGELOG.md
Alvvalencia
added a commit
that referenced
this pull request
Sep 3, 2026
The dataset-qualified naming contract (formerly #183, 0.26.0 → 0.27.0 after GridMap took 0.26.0) and the playback/viewport/plot-tabs services (formerly claiming 0.28.0 on top of it) are one deliverable for one consumer, so they ship as one MINOR: 0.27.0, one CHANGELOG section with both parts.
Contributor
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
pj.data_processors.v1addresses input series by baretopic/fieldnames, and the contract never said what a name means when several loaded datasets share topic names. Conforming hosts filled that gap incompatibly: in PJ4 the transform path refuses a duplicated name while the marker path silently bound the first-loaded dataset (fixed by PlotJuggler/PJ4#619). The parser for the qualified form also exists twice today — in PJ4'spj_runtimeand in a plugin — kept identical only by discipline.What
PJ_data_processors_host_vtable_tdoc block (DATASET-QUALIFIED NAMES): a series' full identity is (dataset, topic, field), and an input MAY carry the qualifierdataset_source:topic/field— the same form hosts print as a series identity, so displayed names round-trip as inputs. The qualifier is matched against the loaded source names (longest match wins), never split blindly at:, so source names like[stream] UDP Serverneed no escaping. The host MUST treat an unknown qualifier as an error (no fallback to the bare reading), MUST refuse a bare name that exists in several datasets by reporting the qualified candidates (never resolve by load order), and MUST require all qualified inputs of one processor to agree on a single dataset. Marker per-series output keys accept the qualifier the same way; transform outputs name new topics and are never qualified.pj_base/sdk/dataset_qualified_name.hpp:splitDatasetQualifier/qualifiedSeriesName, header-only and std-only — the shared parser/composer.DataProcessorsHostView::create/createTransform/createMarkersandpj_plugins/docs/ARCHITECTURE.md.pj_base/tests/dataset_qualified_name_test.cpp.VERSION0.25.0 → 0.26.0 — MINOR: a new installed public header. No ABI change;abi/baseline.abiuntouched, additions only.Verification
./build.sh --debug && ./test.sh: 83/84 locally. The one failure (PluginCatalogTest.DependencySearchExcludesCwdAndPath) is environment-dependent dlopen search; nothing in this PR is in that test binary's dependency closure, and CI onmainis green on the same code.fix/dataset-qualified-inputsbranch was locally rewired so its resolver delegates to this header — all of its dataset-qualification tests pass unchanged, and a GUI end-to-end with two datasets sharing an identical topic layout (a plugin creating markers onrun_b.mcap:/sensor/temperature/data) landed on the correct dataset, with region count and covered time matching an independent decode of the file (7 regions, ~12.9 s; the first-loaded dataset would have produced ~7.7 s).Follow-ups (separate changes, once 0.26.0 is picked up)