From 4b8747a5fdbf2a223404f612b8e7a58d39ef6509 Mon Sep 17 00:00:00 2001 From: daisuke8000 Date: Mon, 6 Jul 2026 00:16:14 +0900 Subject: [PATCH] Format jq outputs into one String without Vec (DSK-137) Replace collect/join in Replace and Append modes with a single-pass write into the destination string. Co-authored-by: Cursor --- .../rustern-core/src/pipeline/jq_evaluate.rs | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/crates/rustern-core/src/pipeline/jq_evaluate.rs b/crates/rustern-core/src/pipeline/jq_evaluate.rs index ddbee0f..40882b2 100644 --- a/crates/rustern-core/src/pipeline/jq_evaluate.rs +++ b/crates/rustern-core/src/pipeline/jq_evaluate.rs @@ -1,10 +1,11 @@ -use std::sync::Arc; - -use futures::stream::{Stream, StreamExt}; use jaq_core::data::JustLut; use jaq_core::load::{Arena, File, Loader}; use jaq_core::{Compiler, Ctx, Filter, Vars}; use jaq_json::Val; +use std::fmt::Write as _; +use std::sync::Arc; + +use futures::stream::{Stream, StreamExt}; use crate::source::{LogEvent, LogSourceError}; @@ -23,6 +24,17 @@ pub enum QueryMode { Filter, } +fn format_outputs_joined(outputs: &[Val]) -> String { + let mut rendered = String::new(); + for (i, v) in outputs.iter().enumerate() { + if i > 0 { + rendered.push('\n'); + } + let _ = write!(rendered, "{v}"); + } + rendered +} + #[derive(Clone)] pub struct CompiledFilter { inner: Arc>>, @@ -105,21 +117,13 @@ where } QueryMode::Replace => { ev.structured = None; - let rendered = outputs - .iter() - .map(|v| format!("{v}")) - .collect::>() - .join("\n"); + let rendered = format_outputs_joined(&outputs); ev.message = Arc::from(rendered.as_str()); Some(Ok(ev)) } QueryMode::Append => { ev.structured = None; - let rendered = outputs - .iter() - .map(|v| format!("{v}")) - .collect::>() - .join("\n"); + let rendered = format_outputs_joined(&outputs); ev.message = Arc::from(format!("{} | {}", ev.message, rendered).as_str()); Some(Ok(ev))