Open abey79 opened 2 days ago
Can't repro:
cargo r --all-features -p re_dataframe --example query -- /tmp/face_tracking.rrd frame_nr 0 4 /video/landmarker/faces/0/landmarks
This repros:
#![allow(clippy::unwrap_used, clippy::match_same_arms)]
use itertools::Itertools;
use re_chunk::TimeInt;
use re_chunk_store::{
ChunkStore, ChunkStoreConfig, ComponentColumnSelector, QueryExpression, SparseFillStrategy,
TimeColumnSelector, Timeline, VersionPolicy,
};
use re_dataframe::{QueryCache, QueryEngine};
use re_log_types::{ResolvedTimeRange, StoreKind};
fn main() -> anyhow::Result<()> {
let args = std::env::args().collect_vec();
let get_arg = |i| {
let Some(value) = args.get(i) else {
eprintln!(
"Usage: {} <path_to_rrd> [timeline] [from] [to] [entity_path_filter]",
args.first().map_or("$BIN", |s| s.as_str())
);
std::process::exit(1);
};
value
};
let path_to_rrd = get_arg(1);
let timeline_name = "frame_nr";
let time_from = TimeInt::MIN;
let time_to = TimeInt::try_from(4)?;
// TODO(cmc): We need to take a selector, not a Timeline.
let timeline = match timeline_name {
"log_time" => Timeline::new_temporal(timeline_name),
"log_tick" => Timeline::new_sequence(timeline_name),
"frame" => Timeline::new_sequence(timeline_name),
"frame_nr" => Timeline::new_sequence(timeline_name),
_ => Timeline::new_temporal(timeline_name),
};
let stores = ChunkStore::from_rrd_filepath(
&ChunkStoreConfig::DEFAULT,
path_to_rrd,
VersionPolicy::Warn,
)?;
for (store_id, store) in &stores {
if store_id.kind != StoreKind::Recording {
continue;
}
let query_cache = QueryCache::new(store);
let query_engine = QueryEngine {
store,
cache: &query_cache,
};
let mut query = QueryExpression::new(timeline);
query.view_contents = None;
query.filtered_index_range = Some(ResolvedTimeRange::new(time_from, time_to));
query.sparse_fill_strategy = SparseFillStrategy::LatestAtGlobal;
query.selection = Some(vec![
TimeColumnSelector {
timeline: *timeline.name(),
}
.into(),
ComponentColumnSelector::new_for_component_name(
"/video/landmarker/faces/0/landmarks".into(),
"rerun.components.Scalar".into(),
)
.into(),
]);
eprintln!("{query:#?}:");
let query_handle = query_engine.query(query.clone());
// eprintln!("{:#?}", query_handle.selected_contents());
for batch in query_handle.into_batch_iter() {
eprintln!("{batch}");
}
}
Ok(())
}
Result:
QueryExpression {
view_contents: None,
filtered_index: Timeline {
name: "frame_nr",
typ: Sequence,
},
filtered_index_range: Some(
ResolvedTimeRange {
min: TimeInt::MIN(
-9223372036854775807,
),
max: TimeInt(4),
},
),
filtered_index_values: None,
using_index_values: None,
filtered_point_of_view: None,
sparse_fill_strategy: LatestAtGlobal,
selection: Some(
[
Time(
TimeColumnSelector {
timeline: "frame_nr",
},
),
Component(
ComponentColumnSelector {
entity_path: /video/landmarker/faces/0/landmarks,
component: "rerun.components.Scalar",
join_encoding: OverlappingSlice,
},
),
],
),
}:
┌──────────────────────────────────────────────────────────────────────┐
│ CHUNK METADATA: │
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┌─────────────┬────────────────────────────────────────────────────┐ │
│ │ frame_nr ┆ /video/landmarker/faces/0/landmarks:Scalar │ │
│ │ --- ┆ --- │ │
│ │ type: "i64" ┆ type: "null" │ │
│ │ ┆ sorbet.path: "/video/landmarker/faces/0/landmarks" │ │
│ │ ┆ sorbet.semantic_type: "Scalar" │ │
│ ╞═════════════╪════════════════════════════════════════════════════╡ │
│ │ - ┆ - │ │
│ └─────────────┴────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────┐
│ CHUNK METADATA: │
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┌─────────────┬────────────────────────────────────────────────────┐ │
│ │ frame_nr ┆ /video/landmarker/faces/0/landmarks:Scalar │ │
│ │ --- ┆ --- │ │
│ │ type: "i64" ┆ type: "null" │ │
│ │ ┆ sorbet.path: "/video/landmarker/faces/0/landmarks" │ │
│ │ ┆ sorbet.semantic_type: "Scalar" │ │
│ ╞═════════════╪════════════════════════════════════════════════════╡ │
│ │ 0 ┆ - │ │
│ └─────────────┴────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────┐
│ CHUNK METADATA: │
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┌─────────────┬────────────────────────────────────────────────────┐ │
│ │ frame_nr ┆ /video/landmarker/faces/0/landmarks:Scalar │ │
│ │ --- ┆ --- │ │
│ │ type: "i64" ┆ type: "null" │ │
│ │ ┆ sorbet.path: "/video/landmarker/faces/0/landmarks" │ │
│ │ ┆ sorbet.semantic_type: "Scalar" │ │
│ ╞═════════════╪════════════════════════════════════════════════════╡ │
│ │ 1 ┆ - │ │
│ └─────────────┴────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────┐
│ CHUNK METADATA: │
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┌─────────────┬────────────────────────────────────────────────────┐ │
│ │ frame_nr ┆ /video/landmarker/faces/0/landmarks:Scalar │ │
│ │ --- ┆ --- │ │
│ │ type: "i64" ┆ type: "null" │ │
│ │ ┆ sorbet.path: "/video/landmarker/faces/0/landmarks" │ │
│ │ ┆ sorbet.semantic_type: "Scalar" │ │
│ ╞═════════════╪════════════════════════════════════════════════════╡ │
│ │ 2 ┆ - │ │
│ └─────────────┴────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────┐
│ CHUNK METADATA: │
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┌─────────────┬────────────────────────────────────────────────────┐ │
│ │ frame_nr ┆ /video/landmarker/faces/0/landmarks:Scalar │ │
│ │ --- ┆ --- │ │
│ │ type: "i64" ┆ type: "null" │ │
│ │ ┆ sorbet.path: "/video/landmarker/faces/0/landmarks" │ │
│ │ ┆ sorbet.semantic_type: "Scalar" │ │
│ ╞═════════════╪════════════════════════════════════════════════════╡ │
│ │ 3 ┆ - │ │
│ └─────────────┴────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────┐
│ CHUNK METADATA: │
│ │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ┌─────────────┬────────────────────────────────────────────────────┐ │
│ │ frame_nr ┆ /video/landmarker/faces/0/landmarks:Scalar │ │
│ │ --- ┆ --- │ │
│ │ type: "i64" ┆ type: "null" │ │
│ │ ┆ sorbet.path: "/video/landmarker/faces/0/landmarks" │ │
│ │ ┆ sorbet.semantic_type: "Scalar" │ │
│ ╞═════════════╪════════════════════════════════════════════════════╡ │
│ │ 4 ┆ - │ │
│ └─────────────┴────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
Notice the first two rows with duplicate
frame_nr
number, even thoughframe_nr
is the index column.edit: the first row as a
null
frame_nr value actually (it just happens to be displayed as 0 here for some reason). See my comment below.(Temporary) link to rrd: https://www.swisstransfer.com/d/6de8cb41-311e-41ee-a66d-9eb8827b478e