From 85cc79d5a1587a32be4321900a0ca4c68291adca Mon Sep 17 00:00:00 2001 From: Thom Lamb Date: Wed, 27 May 2026 17:06:51 -0500 Subject: [PATCH] refactor(dedup): share clause-with-comments ingestion (PG/Snowflake QueryBreakdown ctors) The `QueryBreakdown(string select, string from, ...)` constructors on PostgreSql.QueryBreakdown and Snowflake.QueryBreakdown each ran the same six-line pattern twice (once per clause): call `parser.ExtractSqlComments`, set the clause to the trimmed result, join the comment list into the Comment property. New `StatementParser.PopulateClauseWithComments(rawText, target)` instance method does both halves. Each ctor now reads: parser.PopulateClauseWithComments(selectClause, SelectClause); parser.PopulateClauseWithComments(fromClause, FromClause); Same behavior; the helper is a pure refactor of existing semantics. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Breakdowns/QueryBreakdown.cs | 10 ++-------- .../Breakdowns/QueryBreakdown.cs | 10 ++-------- .../Statements/StatementParser.cs | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/Strata.SqlTools.PostgreSql/Breakdowns/QueryBreakdown.cs b/src/Strata.SqlTools.PostgreSql/Breakdowns/QueryBreakdown.cs index 0a07d1c..fa6bf27 100644 --- a/src/Strata.SqlTools.PostgreSql/Breakdowns/QueryBreakdown.cs +++ b/src/Strata.SqlTools.PostgreSql/Breakdowns/QueryBreakdown.cs @@ -36,14 +36,8 @@ public class QueryBreakdown : SqlServerQueryBreakdown public QueryBreakdown(string selectClause, string fromClause, bool isMicrosoftSql = false) : base() { var parser = isMicrosoftSql ? Parser : PostgreSqlParserInstance; - - var cleanSelect = parser.ExtractSqlComments(selectClause, out var selectComments); - SelectClause.Clause = cleanSelect.Trim(); - SelectClause.Comment = selectComments.Count > 0 ? string.Join(" ", selectComments) : null; - - var cleanFrom = parser.ExtractSqlComments(fromClause, out var fromComments); - FromClause.Clause = cleanFrom.Trim(); - FromClause.Comment = fromComments.Count > 0 ? string.Join(" ", fromComments) : null; + parser.PopulateClauseWithComments(selectClause, SelectClause); + parser.PopulateClauseWithComments(fromClause, FromClause); } /// diff --git a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs index 5eb2c9a..637a8f1 100644 --- a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs +++ b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs @@ -39,14 +39,8 @@ public class QueryBreakdown : SqlServerQueryBreakdown public QueryBreakdown(string selectClause, string fromClause, bool isMicrosoftSql = false) : base() { var parser = isMicrosoftSql ? Parser : SnowflakeParserInstance; - - var cleanSelect = parser.ExtractSqlComments(selectClause, out var selectComments); - SelectClause.Clause = cleanSelect.Trim(); - SelectClause.Comment = selectComments.Count > 0 ? string.Join(" ", selectComments) : null; - - var cleanFrom = parser.ExtractSqlComments(fromClause, out var fromComments); - FromClause.Clause = cleanFrom.Trim(); - FromClause.Comment = fromComments.Count > 0 ? string.Join(" ", fromComments) : null; + parser.PopulateClauseWithComments(selectClause, SelectClause); + parser.PopulateClauseWithComments(fromClause, FromClause); } /// diff --git a/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs b/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs index 6b751c2..c46da5a 100644 --- a/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs +++ b/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs @@ -140,6 +140,22 @@ public class StatementParser /// The SQL statement containing comments. /// The extracted comments as a list of strings. /// The SQL statement with comments removed. + /// + /// Runs on and assigns the + /// cleaned text to 's (trimmed) + /// and the merged comments to its . Helper for + /// dialect-specific QueryBreakdown constructors that need to ingest + /// comment-bearing SQL fragments. + /// + /// The SQL fragment to clean. + /// The clause to populate. + public void PopulateClauseWithComments(string rawText, ISqlClause target) + { + var clean = ExtractSqlComments(rawText, out var comments); + target.Clause = clean.Trim(); + target.Comment = comments.Count > 0 ? string.Join(" ", comments) : null; + } + #pragma warning disable S3776 // Cognitive Complexity of methods should not be too high #pragma warning disable S127 // "for" loop stop conditions should be invariant public virtual string ExtractSqlComments(string sql, out List comments)