rerun-io / rerun

Visualize streams of multimodal data. Fast, easy to use, and simple to integrate. Built in Rust using egui.
https://rerun.io/
Apache License 2.0
6.37k stars 310 forks source link

Index column has a null value #7651

Open abey79 opened 2 days ago

abey79 commented 2 days ago

Notice the first two rows with duplicate frame_nr number, even though frame_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.

image

(Temporary) link to rrd: https://www.swisstransfer.com/d/6de8cb41-311e-41ee-a66d-9eb8827b478e

teh-cmc commented 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
abey79 commented 2 days ago

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           ┆ -                                                  │ │
│ └─────────────┴────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘