From 655bf172e5de40704bdd2f2a557935fd6dbf68f2 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 5 Aug 2026 21:42:28 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20Remove=20unnecessary=20Stri?= =?UTF-8?q?ng=20allocation=20in=20parser=20segments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: SayanthRock <202829406+SayanthRock@users.noreply.github.com> --- compiler/rockql-parser/src/lib.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/compiler/rockql-parser/src/lib.rs b/compiler/rockql-parser/src/lib.rs index 6b22432..0369f76 100644 --- a/compiler/rockql-parser/src/lib.rs +++ b/compiler/rockql-parser/src/lib.rs @@ -27,9 +27,16 @@ impl Display for Diagnostic { } } +/// Represents a raw query segment before parsing. +/// +/// ⚡ Bolt Optimization: +/// Previously `Segment` stored `text: String`, causing an allocation for every segment +/// split by a pipe. By storing a reference to the original source string (`&'a str`), +/// we eliminate multiple heap allocations per parsed query, reducing memory usage +/// and speeding up parsing of pipelines. #[derive(Debug)] -struct Segment { - text: String, +struct Segment<'a> { + text: &'a str, span: Span, } @@ -47,7 +54,7 @@ pub fn parse(source: &str) -> Result> { let mut diagnostics = Vec::new(); for segment in segments { - match parse_transform(&segment.text, segment.span) { + match parse_transform(segment.text, segment.span) { Ok(transform) => transforms.push(SpannedTransform::new(segment.span, transform)), Err(diagnostic) => diagnostics.push(diagnostic), } @@ -64,7 +71,7 @@ pub fn format_source(source: &str) -> Result> { parse(source).map(|query| format!("{query}\n")) } -fn split_segments(source: &str) -> Vec { +fn split_segments<'a>(source: &'a str) -> Vec> { let mut segments = Vec::new(); for (line_index, line) in source.lines().enumerate() { @@ -88,7 +95,7 @@ fn split_segments(source: &str) -> Vec { segments } -fn push_segment(segments: &mut Vec, raw: &str, line: usize, byte_start: usize) { +fn push_segment<'a>(segments: &mut Vec>, raw: &'a str, line: usize, byte_start: usize) { let text = raw.trim(); if text.is_empty() { return; @@ -96,7 +103,7 @@ fn push_segment(segments: &mut Vec, raw: &str, line: usize, byte_start: let leading_bytes = raw.find(text).unwrap_or(0); segments.push(Segment { - text: text.to_owned(), + text, span: Span::new(line, byte_start + leading_bytes + 1), }); }