Skip to content

Commit dbbd254

Browse files
zzylolclaude
andcommitted
refactor: own SDS stored-state decoding and dataset-bound semantic identity
Backend now owns SDS frame decoding, delta reconstruction, sketch readouts and native batch frames, and the stored-definition semantic fragment. The logical dataset is recorded on the materialization and in `SummarySemantics::Planner`, so equal fragments over different datasets get different definition IDs. Planner stays deployment-agnostic. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 54067d4 commit dbbd254

20 files changed

Lines changed: 2830 additions & 32 deletions

File tree

‎control_plane/src/main.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ struct CompileAndPublishPhysicalPlanRequest {
199199
workload_cost_evidence: Option<physical::workload_cost::WorkloadCostEvidence>,
200200
queries: Vec<PhysicalPlanQueryRequest>,
201201
data_workload: planner_types::workload::DataWorkload,
202-
dataset_identity: planner_types::post_asap::LogicalDatasetIdentity,
202+
dataset_identity: asap_types::semantic_fragment::LogicalDatasetIdentity,
203203
#[serde(rename = "collector_ids")]
204204
target_collector_ids: Vec<String>,
205205
capability_snapshot_id: String,

‎control_plane/src/physical/compiler.rs‎

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ pub struct TopKMembershipEvidence {
200200
#[serde(deny_unknown_fields)]
201201
pub struct PhysicalDeploymentContext {
202202
/// Semantic dataset served by this deployment's input channel; never an endpoint.
203-
pub dataset_identity: planner_types::post_asap::LogicalDatasetIdentity,
203+
pub dataset_identity: asap_types::semantic_fragment::LogicalDatasetIdentity,
204204
pub target: PhysicalDeploymentTarget,
205205
#[serde(rename = "collector_ids")]
206206
pub target_collector_ids: Vec<String>,
@@ -1493,11 +1493,12 @@ impl DeploymentPlanCompiler {
14931493
query_id: query.query_id.clone(),
14941494
reason: "persisted semantic root is absent".into(),
14951495
})?;
1496+
runtime_materialization.dataset_identity =
1497+
Some(environment.dataset_identity.clone());
14961498
runtime_materialization.semantic_fragment = Some(
1497-
asap_types::semantic_fragment::SemanticFragment::from_stored_output_in_dataset(
1499+
asap_types::semantic_fragment::SemanticFragment::from_stored_output(
14981500
&compiled_dag.dag,
14991501
semantic_root,
1500-
environment.dataset_identity.clone(),
15011502
)
15021503
.map_err(|reason| CompileError::Query {
15031504
query_id: query.query_id.clone(),
@@ -4690,6 +4691,7 @@ pub(crate) mod tests {
46904691
first.summary_catalog.definitions,
46914692
relocated.summary_catalog.definitions
46924693
);
4694+
// An ingest binding forged to another dataset is rejected, as is a missing one.
46934695
let mut forged = first.precompute_plan.clone();
46944696
forged.ingest.dataset_identity.as_mut().unwrap().namespace = "other-tenant".into();
46954697
assert!(forged
@@ -4699,11 +4701,28 @@ pub(crate) mod tests {
46994701
.contains("dataset"));
47004702
forged.ingest.dataset_identity = None;
47014703
assert!(forged.validate().is_err());
4704+
// A materialization whose recorded dataset differs from the installed ingest binding is rejected.
4705+
let mut forged = first.precompute_plan.clone();
4706+
let materialization = forged
4707+
.materializations
4708+
.iter_mut()
4709+
.find(|m| m.semantic_fragment.is_some())
4710+
.expect("planner materialization");
4711+
assert_eq!(
4712+
materialization.dataset_identity,
4713+
forged.ingest.dataset_identity
4714+
);
4715+
materialization.dataset_identity.as_mut().unwrap().dataset = "other-metrics".into();
4716+
assert!(forged
4717+
.validate()
4718+
.unwrap_err()
4719+
.to_string()
4720+
.contains("dataset"));
47024721
}
47034722

47044723
fn environment(now: u64) -> PhysicalDeploymentContext {
47054724
PhysicalDeploymentContext {
4706-
dataset_identity: planner_types::post_asap::LogicalDatasetIdentity {
4725+
dataset_identity: asap_types::semantic_fragment::LogicalDatasetIdentity {
47074726
namespace: "test".into(),
47084727
dataset: "metrics".into(),
47094728
},

‎crates/asap_types/src/aggregation_config.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ pub struct PrecomputeMaterialization {
9898
/// Planner-selected dependency closure ending at the persisted output.
9999
#[serde(default, skip_serializing_if = "Option::is_none")]
100100
pub semantic_fragment: Option<crate::semantic_fragment::SemanticFragment>,
101+
/// Logical dataset that the fragment's source names resolve in.
102+
#[serde(default, skip_serializing_if = "Option::is_none")]
103+
pub dataset_identity: Option<crate::semantic_fragment::LogicalDatasetIdentity>,
101104
pub aggregation_type: AggregationType,
102105
pub aggregation_sub_type: String,
103106
pub parameters: HashMap<String, Value>,
@@ -279,6 +282,7 @@ impl PrecomputeMaterialization {
279282
Self {
280283
stored_output_id: None,
281284
semantic_fragment: None,
285+
dataset_identity: None,
282286
aggregation_type,
283287
aggregation_sub_type,
284288
parameters,

‎crates/asap_types/src/precompute_plan.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ pub enum TimestampUnit {
139139
#[serde(deny_unknown_fields)]
140140
pub struct IngestContract {
141141
#[serde(default, skip_serializing_if = "Option::is_none")]
142-
pub dataset_identity: Option<planner_types::post_asap::LogicalDatasetIdentity>,
142+
pub dataset_identity: Option<crate::semantic_fragment::LogicalDatasetIdentity>,
143143
pub protocol: IngestProtocol,
144144
pub endpoint_path: String,
145145
pub timestamp_unit: TimestampUnit,
@@ -366,7 +366,7 @@ impl PrecomputePlan {
366366
.collect();
367367
let dataset_identity = materializations
368368
.iter()
369-
.filter_map(|m| m.semantic_fragment.as_ref()?.dataset_identity.clone())
369+
.filter_map(|m| m.dataset_identity.clone())
370370
.next();
371371
let plan = Self {
372372
summary_catalog: None,
@@ -484,7 +484,7 @@ impl PrecomputePlan {
484484
fragment
485485
.validate()
486486
.map_err(PrecomputePlanError::CatalogContract)?;
487-
if fragment.dataset_identity != self.ingest.dataset_identity {
487+
if materialization.dataset_identity != self.ingest.dataset_identity {
488488
return Err(PrecomputePlanError::CatalogContract(
489489
"semantic dataset differs from installed input binding".into(),
490490
));

‎crates/asap_types/src/precompute_plan/catalog.rs‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ impl PrecomputePlan {
7070
if stored_output.fingerprint() == config.policy_fingerprint())
7171
{
7272
found = true;
73-
let actual = match &self.ingest.dataset_identity {
74-
Some(dataset) => crate::semantic_fragment::SemanticFragment::from_stored_output_in_dataset(&dag, *id, dataset.clone()),
75-
None => crate::semantic_fragment::SemanticFragment::from_stored_output(&dag, *id),
76-
}.map_err(invalid)?;
73+
let actual =
74+
crate::semantic_fragment::SemanticFragment::from_stored_output(
75+
&dag, *id,
76+
)
77+
.map_err(invalid)?;
7778
if &actual != expected {
7879
return Err(invalid(
7980
"semantic definition differs from Planner-selected producer",

0 commit comments

Comments
 (0)