diff --git a/crates/executor/src/physical_planner/mod.rs b/crates/executor/src/physical_planner/mod.rs index e8ad34441..d126266a3 100644 --- a/crates/executor/src/physical_planner/mod.rs +++ b/crates/executor/src/physical_planner/mod.rs @@ -711,7 +711,11 @@ fn temporal_evaluation_drops_name(node: &PhysicalASAPDAGNode) -> bool { | SketchStatistic::Cardinality | SketchStatistic::PointCount { .. } | SketchStatistic::FrequencyL2 - | SketchStatistic::FrequencyEntropy, + | SketchStatistic::FrequencyEntropy + // A heap ranking series identities over raw samples + // answers a `sum_over_time` or `count_over_time` per + // ranked series. + | SketchStatistic::TopK { .. }, .. }) ) diff --git a/crates/executor/tests/weighted_topk_binding.rs b/crates/executor/tests/weighted_topk_binding.rs index 342cfdb4d..43640b007 100644 --- a/crates/executor/tests/weighted_topk_binding.rs +++ b/crates/executor/tests/weighted_topk_binding.rs @@ -14,10 +14,6 @@ use planner_types::ir::schema::{DataType, *}; use planner_types::ir::ASAPOp; use std::{collections::BTreeMap, rc::Rc, sync::Arc}; #[test] -#[ignore = "the whole-expression heap keeps the outer top-k's keys indexed against the absorbed \ - aggregate, so the physical planner rejects its keyed evaluation shape (#639); the \ - unconfirmed Count-Min heap also has no non-negative weight proof until plan selection \ - confirms one"] fn planner_weighted_topk_binds_at_either_deployment_phase() { assert_weighted_binding(SketchAlgorithm::CmsWithHeap); assert_weighted_binding(SketchAlgorithm::CountSketchWithHeap); @@ -46,13 +42,38 @@ fn heap_candidate( .unwrap_or_else(|| panic!("missing {algorithm:?} candidate")) } +/// `plan` as Stage 3 hands it to the executor when the data declares `m` a +/// counter: its rate weights' open requirement confirmed non-negative. +fn confirmed_as_counter( + plan: Rc, +) -> Rc { + use planner_types::ir::QueryRoot; + use planner_types::workload::{MetricType, SourceFacts}; + let data = DataWorkload { + sources: [( + "m".to_string(), + SourceFacts { + metric_type: Some(MetricType::Counter), + ..SourceFacts::default() + }, + )] + .into(), + ..DataWorkload::default() + }; + match asap_plan_selection::with_confirmed_weights(&[QueryRoot::Operator(plan)], &data).remove(0) + { + QueryRoot::Operator(node) => node, + QueryRoot::Scalar(_) => unreachable!("an operator root"), + } +} + fn assert_weighted_binding(algorithm: SketchAlgorithm) { let root = lower_promql( "topk by(job)(2, sum by(service, job)(rate(m[1m])))", AccuracyTarget::max_error(0.1), ) .unwrap(); - let plan = heap_candidate(root, &algorithm); + let plan = confirmed_as_counter(heap_candidate(root, &algorithm)); let dag = compile_physical_asap_dag(&plan).unwrap(); let rate_id_of = |dag: &PhysicalASAPDAG| { let build=dag.nodes.iter().find(|node|matches!(&node.payload,PhysicalASAPOperatorPayload::ASAP(ASAPOp::SummaryAgg {family:FieldDataType::Sketch(kind,_),..})if kind.algorithm()==&algorithm)).unwrap(); @@ -142,6 +163,8 @@ fn assert_weighted_binding(algorithm: SketchAlgorithm) { output }); // Two items per `job`: the outer `by(job)` partitions the ranking. + // Each row is `[job, topk_2, service]`: the top-k's columns, then + // the ranked item's label. let schema = &dag .nodes .iter() @@ -149,7 +172,8 @@ fn assert_weighted_binding(algorithm: SketchAlgorithm) { .unwrap() .output_schema; let column = |name: &str| schema.fields.iter().position(|f| f.name == name).unwrap(); - let (job, value) = (column("job"), column("value")); + let (job, value) = (column("job"), column("topk_2")); + assert_eq!(column("service"), 2); let mut ranked = output .iter() .map(|row| match (&row[job], &row[value]) { diff --git a/crates/integration-tests/tests/stage1_logical_asap_optimization.rs b/crates/integration-tests/tests/stage1_logical_asap_optimization.rs index f8535f969..75d7a3922 100644 --- a/crates/integration-tests/tests/stage1_logical_asap_optimization.rs +++ b/crates/integration-tests/tests/stage1_logical_asap_optimization.rs @@ -113,7 +113,21 @@ fn compose_all(label: &str, root: QueryRoot) -> usize { let root = &composed[0].1; root.validate_structure() .unwrap_or_else(|e| panic!("{label} {choice:?}: {e}")); - assert_eq!(output_columns(root), expected, "{label} {choice:?}"); + let columns = output_columns(root); + // A heap top-k answers the declared `[keys.., topk_k]` with one row + // per ranked item: `topk_k` its Float64 estimate (the value the + // exact top-k's physical plan answers too), then the item labels. + let heap_topk = expected + .last() + .is_some_and(|(name, _, _)| name.starts_with("topk_")) + && columns.get(expected.len() - 1).map(|c| c.1.as_str()) == Some("Plain(Float64)"); + if heap_topk { + let (ranked, keys) = expected.split_last().unwrap(); + assert_eq!(&columns[..keys.len()], keys, "{label} {choice:?}"); + assert_eq!(columns[keys.len()].0, ranked.0, "{label} {choice:?}"); + } else { + assert_eq!(columns, expected, "{label} {choice:?}"); + } for (digit, radix) in choice.iter_mut().zip(&radix).rev() { *digit += 1; if *digit < *radix { diff --git a/crates/logical-asap-optimization/src/per_computation_candidates.rs b/crates/logical-asap-optimization/src/per_computation_candidates.rs index b5653af72..22b8ab82e 100644 --- a/crates/logical-asap-optimization/src/per_computation_candidates.rs +++ b/crates/logical-asap-optimization/src/per_computation_candidates.rs @@ -961,8 +961,14 @@ fn whole_expression_input( input.item = Some(SummaryInputExpr::Column(ColumnRef::Named( asap_types::ir::schema::PROMQL_SERIES_IDENTITY.into(), ))); - } else if realized.child.schema.closed { - // An encoded label set needs an open PromQL schema. + } else if realized.child.schema.closed + && (matches!(input.item, Some(SummaryInputExpr::EntityIdentity(_))) + || !reads_only_time_series(&realized.child)) + { + // An encoded label set needs an open PromQL schema. PromQL rows that + // carry the series identity are closed, but their inner group labels + // are item columns. (A SQL top-k keeps its heaps over its per-key + // result.) return None; } let partitions = partitions_over(reduction, &child.schema, &realized.child.schema)?; @@ -2722,7 +2728,9 @@ fn with_names_of( .map(|field| field.name.clone()) .collect() }; - if names(&output) == names(target) { + // A top-k's ranked rows may carry their item columns after the + // aggregate's ([`ranked_as_topk`]). + if names(&output).starts_with(&names(target)) { return Ok(output); } if output.schema.fields.len() != target.schema.fields.len() { @@ -2773,10 +2781,67 @@ fn whole_expression( filter: None, }))?; sizing.built.borrow_mut().push((state.clone(), key)); - Ok(OperatorNode::new_shared(Operator::ASAP( - ASAPOp::SummaryEstimate { - summary_input: state, - query: statistic(intent)?, + let estimate = OperatorNode::new_shared(Operator::ASAP(ASAPOp::SummaryEstimate { + summary_input: state, + query: statistic(intent)?, + }))?; + ranked_as_topk(target, estimate) +} + +/// A heap's top-k `estimate` (`[partitions.., items.., topk]`, one row per +/// ranked item) in `target`'s columns: its `[keys.., topk_k]`, with +/// `topk_k` the estimated Float64 weight, then, over PromQL rows, the item +/// columns. This is the exact top-k's physical shape (its ranked rows' +/// value, then their other labels; a SQL result keeps only its logical +/// columns), so readers of `[keys.., topk_k]` find those columns where they +/// were. +fn ranked_as_topk( + target: &OperatorNode, + estimate: Rc, +) -> Result, PerComputationCandidateError> { + let (ranked, keys) = target + .schema + .fields + .split_last() + .expect("an aggregate outputs its measure"); + let fields = &estimate.schema.fields; + let estimated = fields.len() - 1; + let column = |index: usize, name: &str| ProjectItem { + alias: Some(name.to_string()), + expr: ScalarExpr::Column(index), + }; + // Each key by name among the estimate's partition and item columns. + let key_columns = keys + .iter() + .map(|key| { + fields[..estimated] + .iter() + .position(|field| field.name == key.name) + .ok_or(PerComputationCandidateError::Unsupported( + "top-k estimate without a partition column", + )) + }) + .collect::, _>>()?; + let promql = match target.non_asap() { + Some(NonASAPOp::Aggregate { child, .. }) => reads_only_time_series(child), + _ => false, + }; + let cols = key_columns + .iter() + .zip(keys) + .map(|(&index, key)| column(index, &key.name)) + .chain(std::iter::once(column(estimated, &ranked.name))) + .chain( + (0..estimated) + .filter(|index| promql && !key_columns.contains(index)) + .map(|index| column(index, &fields[index].name)), + ) + .collect(); + Ok(OperatorNode::new_shared(Operator::NonASAP( + NonASAPOp::Project { + cols, + qualifier: None, + child: estimate, }, ))?) } @@ -2884,10 +2949,14 @@ fn substitute_measure( measure_input(intent, input, filter.as_ref())?, )?; sizing.built.borrow_mut().push((summary_input.clone(), key)); - OperatorNode::new_shared(Operator::ASAP(ASAPOp::SummaryEstimate { + let estimate = OperatorNode::new_shared(Operator::ASAP(ASAPOp::SummaryEstimate { summary_input, query: statistic(intent)?, - }))? + }))?; + match intent { + AggIntent::TopK { .. } => ranked_as_topk(target, estimate)?, + _ => estimate, + } } ComputationCandidate::ExactAccumulator(kinds) => { let (AggIntent::Avg { col }, [ExactKind::Sum, ExactKind::Count]) = diff --git a/crates/plan-selection/src/lib.rs b/crates/plan-selection/src/lib.rs index 5ca843175..6dc3de7d4 100644 --- a/crates/plan-selection/src/lib.rs +++ b/crates/plan-selection/src/lib.rs @@ -1293,9 +1293,11 @@ impl<'a> PlanSelector<'a> { } } // Only a candidate that may be selected is compiled: the check runs - // the executor's own compiler, the costliest check. + // the executor's own compiler, the costliest check. It compiles the + // plan the executor would run, with each weight requirement Stage 3 + // confirmed made a proof, as `Selection::plan` holds it. if let Some(check) = self.models.executor_compile_check { - if let Err(reason) = check.compiles(&sized.roots) { + if let Err(reason) = check.compiles(&with_confirmed_weights(&sized.roots, self.data)) { self.reject(&candidate.id, RejectionCause::ExecutorCannotCompile, reason); return Ok(()); } diff --git a/crates/planner/tests/runtime_install.rs b/crates/planner/tests/runtime_install.rs index 74340a120..07a3a6322 100644 --- a/crates/planner/tests/runtime_install.rs +++ b/crates/planner/tests/runtime_install.rs @@ -12,11 +12,13 @@ use asap_executor::runtime::{Limits, RunContext, Scope}; use asap_executor::values::{Batch, Value}; use asap_executor::{series_labels_of_output_row, RawSampleSelector, Sample}; use asap_planner::{ - plan_installable, DeploymentCapabilities, FrontendInput, InstallablePlan, InstallablePlanError, - OperatorKind, OptimizationInput, OptimizationPass, OptimizeError, PhysicalASAPDAG, PlanOutput, - PlanSelectionSettings, PlanningModels, PlanningWorkload, SelectionBox, Stage1ToStage3Pass, - StoredOutput, StoredOutputBuild, UserInput, + plan_installable, DeploymentCapabilities, ExecutorCompileCheck, FrontendInput, InstallablePlan, + InstallablePlanError, OperatorKind, OptimizationInput, OptimizationPass, OptimizeError, + PhysicalASAPDAG, PlanOutput, PlanSelectionSettings, PlannerExecutorCompileCheck, + PlanningModels, PlanningWorkload, SelectionBox, Stage1ToStage3Pass, StoredOutput, + StoredOutputBuild, UserInput, }; +use asap_types::ir::schema::{FieldDataType, SketchAlgorithm, SketchParams}; use asap_types::ir::{ apply_materialization_timings_to_roots, split_shared_by_timing, ASAPOp, MaterializationAssignment, OperatorNode, QueryRoot, @@ -2318,3 +2320,377 @@ async fn per_series_answers_beside_a_grouping_share_one_state_and_answer_as_the_ ); } } + +/// A heap top-k query `query` (the ASAPQuery workloads' top-k-sum or +/// counter top-k shape) every 10 s, within 0.05 at failure probability 0.3, +/// over 10,000 series of `metric` sampled every 100 ms, with `facts` (its +/// type and sign, as JSON fields). +fn heap_topk_workload(query: &str, metric: &str, facts: &str) -> PlanningWorkload { + serde_json::from_str(&format!( + r#"{{"query_workload": {{"language": "promql", "repeating_queries": [{{ + "query": {query:?}, + "demand": {{"fixed_interval": 10000}}, + "requirements": {{"accuracy": {{"max_error": 0.05, "failure_probability": 0.3}}}}, + "predictability": {{"predictable": {{"known_at": null}}}}}}]}}, + "data_workload": {{"arrival": {{"ingesting": {{"rows_per_second": 100000.0}}}}, + "sources": {{"{metric}": {{"series_count": 10000, "sample_interval": 100, + {facts}}}}}}}}}"# + )) + .unwrap() +} + +/// Stage 3's executor check for a deployment that runs only top-k plans +/// with a heap of this algorithm: any other plan is refused, and such a +/// plan must compile with the Planner's executor +/// ([`PlannerExecutorCompileCheck`]). It forces the cheapest such plan that +/// compiles. +struct HeapPlansOnly(SketchAlgorithm); + +impl ExecutorCompileCheck for HeapPlansOnly { + fn compiles(&self, roots: &[QueryRoot]) -> Result<(), String> { + let heap = roots + .iter() + .filter_map(|root| match root { + QueryRoot::Operator(node) => Some(node), + QueryRoot::Scalar(_) => None, + }) + .flat_map(|node| OperatorNode::reachable(node)) + .any(|node| { + matches!(node.asap(), Some(ASAPOp::SummaryAgg { family: FieldDataType::Sketch(kind, _), .. } + | ASAPOp::PaneChain { family: FieldDataType::Sketch(kind, _), .. }) + if *kind.algorithm() == self.0) + }); + if !heap { + return Err(format!( + "this deployment runs only {:?} top-k plans", + self.0 + )); + } + PlannerExecutorCompileCheck.compiles(roots) + } +} + +/// `workload` planned with accuracy guarantees ignored (a top-k estimate +/// has none) on a deployment that keeps no raw samples; with `heap`, Stage +/// 3 keeps only plans with a heap of that algorithm ([`HeapPlansOnly`]). +async fn plan_ignoring_guarantees( + workload: &PlanningWorkload, + heap: Option, +) -> Result { + let capabilities = DeploymentCapabilities { + raw_data_retained: false, + ..DeploymentCapabilities::default() + }; + let settings = PlanSelectionSettings { + ignore_accuracy_guarantees: true, + ..PlanSelectionSettings::default() + }; + let models = PlanningModels::builtin() + .with_deployment_capabilities(&capabilities) + .with_plan_selection(&settings); + let check = heap.map(HeapPlansOnly); + let models = match &check { + Some(check) => models.with_executor_compile_check(check), + None => models, + }; + plan_installable(UserInput::new( + workload, + FrontendInput::Promql { histograms: None }, + models, + )) + .await + .map_err(|e| e.to_string()) +} + +/// The heap sketch `plan` builds: its algorithm and width. +fn heap_of(plan: &InstallablePlan) -> Option<(SketchAlgorithm, u32)> { + plan.dag + .dag + .nodes + .iter() + .find_map(|node| match &node.payload { + asap_executor::planner::ir::physical_export::PhysicalASAPOperatorPayload::ASAP( + ASAPOp::SummaryAgg { family, .. } | ASAPOp::PaneChain { family, .. }, + ) => match family { + FieldDataType::Sketch(kind, _) => match kind.params() { + SketchParams::CmsWithHeap { width, .. } + | SketchParams::CountSketchWithHeap { width, .. } => { + Some((kind.algorithm().clone(), *width)) + } + _ => None, + }, + _ => None, + }, + _ => None, + }) +} + +/// The heap of `algorithm`'s point-error bound on an item of a partition +/// whose items' true values are `values`: `ε·L1` for Count-Min (ε = e/w, +/// an overestimate), `ε·L2` for Count Sketch (ε = √(3/w)), which is at most +/// `ε·L1`. +fn heap_bound(algorithm: &SketchAlgorithm, width: u32, values: &[f64]) -> f64 { + let width = f64::from(width); + match algorithm { + SketchAlgorithm::CmsWithHeap => { + std::f64::consts::E / width * values.iter().map(|v| v.abs()).sum::() + } + SketchAlgorithm::CountSketchWithHeap => { + (3.0 / width).sqrt() * values.iter().map(|v| v * v).sum::().sqrt() + } + other => panic!("not a heap: {other:?}"), + } +} + +/// Checks a heap top-k plan's `answers` against the `truth` (each item's +/// exact value, by partition): per partition, `k` answers, the true top `k` +/// recalled, each item named by its labels (`item_label`, and `partition` +/// when partitioned), and each estimate within the heap's bound. +fn assert_heap_topk_answers( + answers: &[Answer], + truth: &BTreeMap>, + (partition, item_label, k): (Option<&str>, &str, usize), + (algorithm, width): (&SketchAlgorithm, u32), +) { + let mut answered: BTreeMap> = BTreeMap::new(); + for (labels, value) in answers { + // A range function's result drops the metric name, as the exact + // top-k's does. + assert!(!labels.contains_key("__name__"), "{labels:?}"); + let group = partition.map_or(String::new(), |p| labels[p].clone()); + let item = labels + .get(item_label) + .unwrap_or_else(|| panic!("{item_label} kept: {labels:?}")); + answered + .entry(group) + .or_default() + .push((item.clone(), *value)); + } + assert_eq!( + answered.keys().collect::>(), + truth.keys().collect::>() + ); + for (group, items) in &answered { + let exact = &truth[group]; + let bound = heap_bound( + algorithm, + width, + &exact.values().copied().collect::>(), + ); + let mut ranked: Vec<(&String, &f64)> = exact.iter().collect(); + ranked.sort_by(|a, b| b.1.total_cmp(a.1)); + let top: BTreeSet<&String> = ranked.iter().take(k).map(|(item, _)| *item).collect(); + assert_eq!(items.len(), k, "{group}: {items:?}"); + let recalled = items.iter().filter(|(item, _)| top.contains(item)).count(); + assert_eq!(recalled, k, "{group}: recall of {top:?} in {items:?}"); + for (item, estimate) in items { + let error = estimate - exact[item]; + assert!( + error.abs() <= bound + 1e-9 * exact[item].abs(), + "{group}/{item}: {estimate} vs exact {}, bound {bound}", + exact[item] + ); + if *algorithm == SketchAlgorithm::CmsWithHeap { + assert!( + error >= -1e-9 * exact[item].abs(), + "Count-Min overestimates" + ); + } + } + } +} + +/// `data` samples of 2 regions with 40 series each, six inside the last +/// minute per series: series `r` (rank 1..=40) of a region sums to +/// `1000 / r^1.1` (west at half that), a skewed ranking. +fn skewed_series_samples() -> (Vec, BTreeMap>) { + let mut samples = Vec::new(); + let mut truth: BTreeMap> = BTreeMap::new(); + for (region, scale) in [("east", 1.0), ("west", 0.5)] { + for rank in 1..=40 { + let instance = format!("{region}-{rank:02}"); + let sum = scale * 1000.0 / f64::from(rank).powf(1.1); + for step in 0..6 { + let mut s = sample( + "data", + &instance, + EVALUATION_MS - 55_000 + step * 10_000, + sum / 6.0, + ); + s.labels.insert("region".into(), region.into()); + samples.push(s); + } + truth + .entry(region.to_string()) + .or_default() + .insert(instance, sum); + } + } + (samples, truth) +} + +/// `workload`'s plan with only `algorithm`'s heap plans allowed (guarantees +/// ignored): it builds that heap, compiles as a runtime compiles it, and +/// both it and its query-time reference answer `samples` with the true top +/// `k` per partition, each named by its labels and within the heap's bound +/// of `truth` ([`assert_heap_topk_answers`]). +async fn assert_forced_heap_answers( + workload: &PlanningWorkload, + algorithm: SketchAlgorithm, + (samples, truth): (&[Sample], &BTreeMap>), + labels: (Option<&str>, &str, usize), +) { + let plan = plan_ignoring_guarantees(workload, Some(algorithm.clone())) + .await + .unwrap_or_else(|error| panic!("{algorithm:?}: {error}")); + let (built, width) = heap_of(&plan).expect("a heap plan"); + assert_eq!(built, algorithm); + plan.check_compiles().unwrap(); + let plan_json = serde_json::to_string(&plan).unwrap(); + let run = run_data_plane(&plan_json, samples, EVALUATION_MS, &mut SummaryStore::new()); + for answers in [ + &run.answers_per_query[0], + &run.reference_answers_per_query[0], + ] { + assert_heap_topk_answers(answers, truth, labels, (&algorithm, width)); + } +} + +/// The ASAPQuery workloads' top-k-sum shape over a gauge, +/// `topk by (region) (3, sum_over_time(data[1m]))`: the fused +/// whole-expression Count Sketch heap (one per region over the raw +/// samples, ranking series identities), forced with guarantees ignored, +/// compiles, and answers each region's true top 3 series, with their full +/// labels, within its bound of their exact sums. (A Count-Min heap needs +/// the weights proven non-negative.) +#[tokio::test] +async fn a_forced_heap_topk_sum_plan_compiles_and_answers_within_its_bound() { + let workload = heap_topk_workload( + "topk by (region) (3, sum_over_time(data[1m]))", + "data", + r#""metric_type": "gauge""#, + ); + let (samples, truth) = skewed_series_samples(); + assert_forced_heap_answers( + &workload, + SketchAlgorithm::CountSketchWithHeap, + (&samples, &truth), + (Some("region"), "instance", 3), + ) + .await; +} + +/// `data` samples of 2 regions with 40 series each inside the last minute: +/// series `r` (rank 1..=40) has `round(200 / r^1.1)` samples (at least 1), +/// a skewed count ranking. +fn skewed_count_samples() -> (Vec, BTreeMap>) { + let mut samples = Vec::new(); + let mut truth: BTreeMap> = BTreeMap::new(); + for region in ["east", "west"] { + for rank in 1..=40 { + let instance = format!("{region}-{rank:02}"); + let count = (200.0 / f64::from(rank).powf(1.1)).round().max(1.0) as i64; + for step in 0..count { + // Spread over (EVALUATION_MS - 59 s, EVALUATION_MS - 1 s]. + let at = EVALUATION_MS - 1_000 - step * 58_000 / count; + let mut s = sample("data", &instance, at, 1.0 + step as f64); + s.labels.insert("region".into(), region.into()); + samples.push(s); + } + truth + .entry(region.to_string()) + .or_default() + .insert(instance, count as f64); + } + } + samples.sort_by_key(|s| s.timestamp_ms); + (samples, truth) +} + +/// `topk by (region) (3, count_over_time(data[1m]))`: each forced fused +/// heap (each sample counts 1) compiles and answers each region's true top +/// 3 series, with their labels, within its bound of their counts. +#[tokio::test] +async fn a_forced_heap_topk_count_plan_compiles_and_answers_within_its_bound() { + let workload = heap_topk_workload( + "topk by (region) (3, count_over_time(data[1m]))", + "data", + r#""metric_type": "gauge""#, + ); + let (samples, truth) = skewed_count_samples(); + for algorithm in [ + SketchAlgorithm::CmsWithHeap, + SketchAlgorithm::CountSketchWithHeap, + ] { + assert_forced_heap_answers( + &workload, + algorithm, + (&samples, &truth), + (Some("region"), "instance", 3), + ) + .await; + } +} + +/// The per-second rate of series `instance` (1 or 2) of job `job` (1..=12) +/// in [`skewed_counter_samples`]: `50 / job^1.2`, plus a little per +/// instance, a skewed ranking of the jobs' sums. +fn skewed_counter_rate(job: i64, instance: i64) -> f64 { + 50.0 / (job as f64).powf(1.2) + 0.01 * instance as f64 +} + +/// `data_total` samples of 12 jobs with 2 series each, every 10 s from 595 s +/// before `EVALUATION_MS`, each a counter growing linearly at +/// [`skewed_counter_rate`], as [`counter_samples`]. +fn skewed_counter_samples() -> Vec { + let mut samples = Vec::new(); + for job in 1..=12 { + for instance in 1..=2 { + for step in 0..60 { + let mut s = sample( + "data_total", + &format!("{job}-{instance}"), + EVALUATION_MS - 595_000 + step * 10_000, + skewed_counter_rate(job, instance) * (5 + step * 10) as f64, + ); + s.labels.insert("job".into(), format!("j{job:02}")); + samples.push(s); + } + } + } + samples +} + +/// The ASAPQuery workloads' counter top-k, `topk(3, sum by (job) +/// ((data_total[5m])))` for `f` `increase` or `rate`: each forced fused +/// heap (one over the per-series values, ranking jobs) compiles and answers +/// the true top 3 jobs, with their `job` labels, within its bound of their +/// exact sums. +#[tokio::test] +async fn a_forced_heap_counter_topk_plan_compiles_and_answers_within_its_bound() { + let samples = skewed_counter_samples(); + for (function, seconds) in [("increase", 300.0), ("rate", 1.0)] { + let workload = heap_topk_workload( + &format!("topk(3, sum by (job) ({function}(data_total[5m])))"), + "data_total", + r#""metric_type": "counter""#, + ); + // Each job's exact sum over its two series. + let truth = BTreeMap::from([( + String::new(), + (1..=12) + .map(|job| { + let sum = skewed_counter_rate(job, 1) + skewed_counter_rate(job, 2); + (format!("j{job:02}"), sum * seconds) + }) + .collect::>(), + )]); + for algorithm in [ + SketchAlgorithm::CmsWithHeap, + SketchAlgorithm::CountSketchWithHeap, + ] { + assert_forced_heap_answers(&workload, algorithm, (&samples, &truth), (None, "job", 3)) + .await; + } + } +} diff --git a/crates/types/src/ir/operator/asap.rs b/crates/types/src/ir/operator/asap.rs index 7cf6f5dd7..ca62532eb 100644 --- a/crates/types/src/ir/operator/asap.rs +++ b/crates/types/src/ir/operator/asap.rs @@ -331,6 +331,11 @@ impl ASAPOp { { dtype = DataType::Float64; } + if let SketchStatistic::TopK { .. } = query { + if let Some(schema) = topk_estimate_schema(summary_input) { + return Ok(schema); + } + } let nullable = matches!(query, SketchStatistic::Quantile { .. }) && quantile_may_be_empty(summary_input); let mut schema = input.clone(); @@ -751,6 +756,50 @@ fn source_kind(node: &OperatorNode) -> OperatorResultKind { } } +/// The rows a heap sketch's top-k estimate returns: per state row, its `k` +/// heaviest items, each as the state's partition columns, then the item +/// columns of the build's update (the inner group labels, or the PromQL +/// series identity), then the estimated weight, `topk` (Float64). `None` +/// when `state` is not a keyed build whose item columns resolve in its +/// input. +fn topk_estimate_schema(state: &OperatorNode) -> Option { + use crate::ir::schema::SummaryInputExpr; + let (Some(ASAPOp::SummaryAgg { child, input, .. }) + | Some(ASAPOp::PaneChain { child, input, .. })) = state.summary_build() + else { + return None; + }; + let columns = match input.item.as_ref()? { + SummaryInputExpr::Column(column) => vec![column], + SummaryInputExpr::Tuple(items) => items + .iter() + .map(|item| match item { + SummaryInputExpr::Column(column) => Some(column), + _ => None, + }) + .collect::>>()?, + _ => return None, + }; + let mut fields: Vec = state + .schema + .fields + .iter() + .filter(|field| field.is_plain()) + .cloned() + .collect(); + for column in columns { + let index = crate::ir::scalar::resolve_column_ref(column, &child.schema).ok()?; + fields.push(child.schema.fields[index].clone()); + } + fields.push(Field::plain("topk", DataType::Float64, false)); + // One row per item: the partition columns alone no longer identify a row. + Some(Schema { + fields, + unique_keys: Vec::new(), + ..state.schema.clone() + }) +} + /// Whether a quantile read from `state` can have no value to rank, and so is /// NULL as the SQL aggregate it realizes is: the `SummaryAgg` under it (seen /// through `SummaryMerge`) is filtered, or, over a relation, is global (zero diff --git a/docs/design_docs/proposals/planner-layering-example1-acceptance.md b/docs/design_docs/proposals/planner-layering-example1-acceptance.md index bf9b97a9b..62afdb75a 100644 --- a/docs/design_docs/proposals/planner-layering-example1-acceptance.md +++ b/docs/design_docs/proposals/planner-layering-example1-acceptance.md @@ -118,17 +118,13 @@ Invariants: * Exact top-*k* is implemented as a sort followed by a limit: each job's series sorted by the ranked value, descending, then a `Project` that restores the logical root columns `[job, topk_10]`. -* A summary Q2 is a sketch build node feeding an estimation node. There is no - merge node, because there are no window summaries. +* A summary Q2 is a sketch build node feeding an estimation node, which + returns each job's `k` heaviest series, and a `Project` to `[job, topk_10]` + followed by each ranked series' identity. There is no merge node, because + there are no window summaries. * In the whole-window candidates, every node is `NotMaterialized` and runs at query time. -Runtime capability check (not part of the doc): every candidate compiles in -the physical planner. Ignored on two runtime gaps: a candidate's CMS + heap -weights are an open requirement that only the selected plan's confirmation -answers, and the heaps' top-*k* estimate output is not the keyed-evaluation -shape the physical planner builds (#579). - ## Plan selection: 1 plan | Id | Outcome | Reason | diff --git a/tools/dag-viewer/examples/planner-layering-example1.json b/tools/dag-viewer/examples/planner-layering-example1.json index c7dc5f664..63532e6dc 100644 --- a/tools/dag-viewer/examples/planner-layering-example1.json +++ b/tools/dag-viewer/examples/planner-layering-example1.json @@ -8951,17 +8951,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -8981,6 +8985,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -9004,19 +9014,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -9712,17 +9726,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -9742,6 +9760,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -9765,19 +9789,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -10394,17 +10422,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -10424,6 +10456,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -10447,19 +10485,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -11263,17 +11305,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -11293,6 +11339,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -11316,19 +11368,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -12009,17 +12065,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -12039,6 +12099,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -12062,19 +12128,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -12871,17 +12941,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -12901,6 +12975,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -12924,19 +13004,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -13610,17 +13694,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -13640,6 +13728,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -13663,19 +13757,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -14457,17 +14555,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -14487,6 +14589,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -14510,19 +14618,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -15181,17 +15293,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -15211,6 +15327,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -15234,19 +15356,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -16065,17 +16191,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -16095,6 +16225,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -16118,19 +16254,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -16826,17 +16966,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -16856,6 +17000,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -16879,19 +17029,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -17508,17 +17662,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -17538,6 +17696,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -17561,19 +17725,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -18377,17 +18545,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -18407,6 +18579,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -18430,19 +18608,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -19123,17 +19305,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -19153,6 +19339,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -19176,19 +19368,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -19985,17 +20181,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -20015,6 +20215,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -20038,19 +20244,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -20724,17 +20934,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -20754,6 +20968,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -20777,19 +20997,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -21571,17 +21795,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -21601,6 +21829,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -21624,19 +21858,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -22295,17 +22533,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null }, @@ -22325,6 +22567,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -22348,19 +22596,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "timing": null } @@ -54528,17 +54780,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -55360,17 +55616,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -55406,19 +55666,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -55437,6 +55701,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -55908,17 +56178,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -56614,17 +56888,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -56660,19 +56938,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -56691,6 +56973,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -57107,17 +57395,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 7, "role": "Input", @@ -57731,17 +58023,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -57777,19 +58073,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -57808,6 +58108,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -58282,17 +58588,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -59099,17 +59409,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -59145,19 +59459,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -59176,6 +59494,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -59650,17 +59974,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -60469,17 +60797,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -60515,19 +60847,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -60546,6 +60882,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -61020,17 +61362,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -61711,17 +62057,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -61757,19 +62107,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -61788,6 +62142,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -62262,17 +62622,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -63081,17 +63445,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -63127,19 +63495,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -63158,6 +63530,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -63625,17 +64003,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -64435,17 +64817,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -64481,19 +64867,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -64512,6 +64902,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -64979,17 +65375,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -65791,17 +66191,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -65837,19 +66241,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -65868,6 +66276,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -66335,17 +66749,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -67019,17 +67437,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -67065,19 +67487,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -67096,6 +67522,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -67563,17 +67995,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -68375,17 +68811,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -68421,19 +68861,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -68452,6 +68896,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -68922,17 +69372,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -69717,17 +70171,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -69763,19 +70221,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -69794,6 +70256,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -70264,17 +70732,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -71061,17 +71533,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -71107,19 +71583,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -71138,6 +71618,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -71608,17 +72094,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -72405,17 +72895,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -72451,19 +72945,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -72482,6 +72980,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -72952,17 +73456,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -73751,17 +74259,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -73797,19 +74309,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -73828,6 +74344,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -74298,17 +74820,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -74967,17 +75493,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -75013,19 +75543,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -75044,6 +75578,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -75514,17 +76054,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -76311,17 +76855,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -76357,19 +76905,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -76388,6 +76940,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -76858,17 +77416,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -77655,17 +78217,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -77701,19 +78267,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -77732,6 +78302,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -78202,17 +78778,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -78875,17 +79455,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -78921,19 +79505,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -78952,6 +79540,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -79423,17 +80017,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -80255,17 +80853,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -80301,19 +80903,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -80332,6 +80938,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -80803,17 +81415,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -81509,17 +82125,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -81555,19 +82175,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -81586,6 +82210,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -82002,17 +82632,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 7, "role": "Input", @@ -82626,17 +83260,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -82672,19 +83310,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -82703,6 +83345,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -83177,17 +83825,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -83994,17 +84646,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -84040,19 +84696,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -84071,6 +84731,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -84545,17 +85211,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -85364,17 +86034,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -85410,19 +86084,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -85441,6 +86119,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -85915,17 +86599,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -86606,17 +87294,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -86652,19 +87344,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -86683,6 +87379,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -87157,17 +87859,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -87976,17 +88682,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -88022,19 +88732,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -88053,6 +88767,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -88520,17 +89240,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -89330,17 +90054,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -89376,19 +90104,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -89407,6 +90139,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -89874,17 +90612,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -90686,17 +91428,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -90732,19 +91478,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -90763,6 +91513,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -91230,17 +91986,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -91914,17 +92674,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -91960,19 +92724,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -91991,6 +92759,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -92458,17 +93232,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -93270,17 +94048,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -93316,19 +94098,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -93347,6 +94133,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -93817,17 +94609,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -94612,17 +95408,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -94658,19 +95458,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -94689,6 +95493,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -95159,17 +95969,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -95956,17 +96770,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -96002,19 +96820,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -96033,6 +96855,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -96503,17 +97331,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -97300,17 +98132,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -97346,19 +98182,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -97377,6 +98217,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -97847,17 +98693,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -98646,17 +99496,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -98692,19 +99546,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -98723,6 +99581,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -99193,17 +100057,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -99862,17 +100730,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -99908,19 +100780,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -99939,6 +100815,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -100409,17 +101291,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -101206,17 +102092,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -101252,19 +102142,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -101283,6 +102177,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -101753,17 +102653,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 9, "role": "Input", @@ -102550,17 +103454,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -102596,19 +103504,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -102627,6 +103539,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 } @@ -103097,17 +104015,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "producer": 8, "role": "Input", @@ -103770,17 +104692,21 @@ "dtype": { "Plain": "utf8" }, + "name": "$promql_series_identity", + "nullable": false, + "table": null + }, + { + "dtype": { + "Plain": "float64" + }, "name": "topk", "nullable": false, "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -103816,19 +104742,23 @@ }, { "dtype": { - "Plain": "utf8" + "Plain": "float64" }, "name": "topk_10", "nullable": false, "table": null + }, + { + "dtype": { + "Plain": "utf8" + }, + "name": "$promql_series_identity", + "nullable": false, + "table": null } ], "time_index": null, - "unique_keys": [ - [ - 0 - ] - ] + "unique_keys": [] }, "output_state": { "primitive": "Raw", @@ -103847,6 +104777,12 @@ }, { "alias": "topk_10", + "expr": { + "Column": 2 + } + }, + { + "alias": "$promql_series_identity", "expr": { "Column": 1 }