{"record":{"id":"25231cb81fb49e9f","repo":"nautechsystems/nautilus_trader","slug":"cannot-execute-time-range-requestjoin-without-a-ch","errorCode":null,"errorMessage":"Cannot execute time-range RequestJoin without a child window","messagePattern":"Cannot execute time-range RequestJoin without a child window","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/data/src/engine/time_range.rs","lineNumber":94,"sourceCode":"            | RequestCommand::BookDepth(_)\n            | RequestCommand::Join(_)\n    )\n}\n\nimpl DataEngine {\n    pub(super) fn execute_time_range_pipeline_request(\n        &mut self,\n        req: RequestCommand,\n    ) -> anyhow::Result<()> {\n        let request_id = *req.request_id();\n        let (start_dt, end_dt, start_ns, end_ns) = self.bound_time_range_pipeline_dates(&req)?;\n        let ts_init = self.clock.borrow().timestamp_ns();\n        let parent =\n            time_range_parent_request_with_dates(req, Some(start_dt), Some(end_dt), ts_init);\n        let response_client_id = self.time_range_pipeline_response_client_id(&parent);\n        let generator = DefaultTimeRangeGenerator::new(request_params(&parent), start_ns, end_ns)?;\n        if matches!(parent, RequestCommand::Join(_)) && !generator.can_yield_initial_window() {\n            anyhow::bail!(\"Cannot execute time-range RequestJoin without a child window\");\n        }\n\n        self.time_range_pipeline_requests.insert(\n            request_id,\n            TimeRangePipelineState {\n                parent,\n                generator,\n                start_ns,\n                end_ns,\n                response_client_id,\n                data_count: 0,\n                last_response: None,\n            },\n        );\n\n        if let Err(e) = self.dispatch_next_time_range_pipeline_request(request_id, None) {\n            self.abort_time_range_pipeline(request_id);\n            return Err(e);","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/data/src/engine/time_range.rs#L76-L112","documentation":"A time-range RequestJoin must be able to yield an initial child window; if DefaultTimeRangeGenerator.can_yield_initial_window() is false, there is no child interval to fan out to and execution aborts. This prevents joining against an empty/degenerate time-range pipeline.","triggerScenarios":"Executing a time-range pipeline request whose parent is RequestCommand::Join while its configured windows (start/end and durations_seconds) produce no initial window — e.g. a zero-width or inverted window, or durations that filter out every candidate interval.","commonSituations":"Configuring a Join request with start == end; providing durations_seconds values that discard all windows; passing wrong params so the generator has no intervals to emit at t0.","solutions":["Ensure the Join request's start_ns < end_ns so at least one window exists","Provide valid durations_seconds (positive, at least 1ns) in the request params","If a Join with no child window is legitimately possible, handle the empty case before calling execute_time_range_pipeline_request"],"exampleFix":"// before\nlet params = Params::from([(\"durations_seconds\", json!([0]))]); // no valid window\n// after\nlet params = Params::from([(\"durations_seconds\", json!([1.0]))]);\nassert!(start_ns < end_ns);","handlingStrategy":"validation","validationCode":"assert!(start_ns < end_ns, \"Join window must be non-empty\");\nassert!(durations.iter().all(|d| d.is_none() || *d >= 1.0));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate Join request windows and durations_seconds before execute_request","Never use 0 or sub-nanosecond values as durations; use null for 'none'","Test Join configs with edge-case windows (start==end) in CI"],"tags":["rust","time-range","join","pipeline"],"backgroundTag":"invalid-argument-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}