diff --git a/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs b/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs
index 1f2d208..c96f31b 100644
--- a/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs
+++ b/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs
@@ -185,33 +185,13 @@ public class LinqQueryBreakdown : QueryBreakdown
/// Gets a LINQ to SQL query of the specified type based on this breakdown.
///
/// The entity type for the query.
- /// An IQueryable of the specified type reconstructed from the breakdown; an empty queryable if the type doesn't match the original entity type or the original data source isn't available.
+ /// An empty queryable. Breakdown analysis is one-way; reconstruction requires the original provider, which is not preserved.
///
- /// This method attempts to reconstruct a LINQ query from the analyzed components (WHERE, ORDER BY, etc.).
- /// If a data source (IQueryable) is available in the breakdown's OriginalExpression, it will be used.
- /// Otherwise, returns an empty queryable — breakdown analysis is one-way; reconstruction requires the original provider.
+ /// Always returns an empty queryable today. A future version may reconstruct the LINQ query from
+ /// when the provider is available; until then callers receive an
+ /// empty result rather than a null reference.
///
- public override IQueryable GetQuery() where T : class
- {
- if (OriginalExpression == null)
- {
- return GetEmptyQueryable();
- }
-
- try
- {
- if (OriginalExpression is Expression && EntityType == typeof(T))
- {
- return GetEmptyQueryable();
- }
-
- return GetEmptyQueryable();
- }
- catch
- {
- return GetEmptyQueryable();
- }
- }
+ public override IQueryable GetQuery() where T : class => GetEmptyQueryable();
///
/// Get and empty queryable of T
diff --git a/src/Strata.SqlTools.Markdown/LinqToSql/QueryBreakdownGenerator.cs b/src/Strata.SqlTools.Markdown/LinqToSql/QueryBreakdownGenerator.cs
index e00c19a..3a013b3 100644
--- a/src/Strata.SqlTools.Markdown/LinqToSql/QueryBreakdownGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/LinqToSql/QueryBreakdownGenerator.cs
@@ -6,7 +6,7 @@ namespace Strata.SqlTools.Markdown.LinqToSql;
/// Generates Mermaid diagram markdown from LINQ to SQL QueryBreakdown objects.
/// Creates flowchart visualizations showing the LINQ query structure and flow.
///
-public class QueryBreakdownGenerator
+public static class QueryBreakdownGenerator
{
///
/// Generates a Mermaid flowchart diagram from a LINQ to SQL QueryBreakdown.
diff --git a/src/Strata.SqlTools.Markdown/LinqToSql/SqlStatementGenerator.cs b/src/Strata.SqlTools.Markdown/LinqToSql/SqlStatementGenerator.cs
index b3e8814..da7b166 100644
--- a/src/Strata.SqlTools.Markdown/LinqToSql/SqlStatementGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/LinqToSql/SqlStatementGenerator.cs
@@ -8,7 +8,7 @@ namespace Strata.SqlTools.Markdown.LinqToSql;
/// Generates Mermaid diagrams for LINQ to SQL statements, including sequence diagrams
/// for statement execution flow and entity-relationship diagrams.
///
-public class SqlStatementGenerator
+public static class SqlStatementGenerator
{
///
/// Generates a Mermaid sequence diagram showing LINQ to SQL statement execution flow.
diff --git a/src/Strata.SqlTools.Markdown/PostgreSql/QueryBreakdownGenerator.cs b/src/Strata.SqlTools.Markdown/PostgreSql/QueryBreakdownGenerator.cs
index f467bb1..d9f5fd0 100644
--- a/src/Strata.SqlTools.Markdown/PostgreSql/QueryBreakdownGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/PostgreSql/QueryBreakdownGenerator.cs
@@ -6,7 +6,7 @@ namespace Strata.SqlTools.Markdown.PostgreSql;
/// Generates Mermaid diagram markdown from PostgreSQL SQL QueryBreakdown objects.
/// Creates flowchart visualizations showing the query structure and flow.
///
-public class QueryBreakdownGenerator
+public static class QueryBreakdownGenerator
{
///
/// Generates a Mermaid flowchart diagram from a PostgreSQL QueryBreakdown.
diff --git a/src/Strata.SqlTools.Markdown/PostgreSql/SqlStatementGenerator.cs b/src/Strata.SqlTools.Markdown/PostgreSql/SqlStatementGenerator.cs
index dbcf677..34d61ec 100644
--- a/src/Strata.SqlTools.Markdown/PostgreSql/SqlStatementGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/PostgreSql/SqlStatementGenerator.cs
@@ -6,7 +6,7 @@ namespace Strata.SqlTools.Markdown.PostgreSql;
/// Generates Mermaid diagrams for PostgreSQL SQL statements, including sequence diagrams
/// for statement execution flow and entity-relationship diagrams.
///
-public class SqlStatementGenerator
+public static class SqlStatementGenerator
{
///
/// Generates a Mermaid sequence diagram showing PostgreSQL SQL statement execution flow.
diff --git a/src/Strata.SqlTools.Markdown/Snowflake/QueryBreakdownGenerator.cs b/src/Strata.SqlTools.Markdown/Snowflake/QueryBreakdownGenerator.cs
index c6d197a..b2d5c2d 100644
--- a/src/Strata.SqlTools.Markdown/Snowflake/QueryBreakdownGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/Snowflake/QueryBreakdownGenerator.cs
@@ -6,7 +6,7 @@ namespace Strata.SqlTools.Markdown.Snowflake;
/// Generates Mermaid diagram markdown from Snowflake SQL QueryBreakdown objects.
/// Creates flowchart visualizations showing the query structure and flow.
///
-public class QueryBreakdownGenerator
+public static class QueryBreakdownGenerator
{
///
/// Generates a Mermaid flowchart diagram from a Snowflake QueryBreakdown.
diff --git a/src/Strata.SqlTools.Markdown/Snowflake/SqlStatementGenerator.cs b/src/Strata.SqlTools.Markdown/Snowflake/SqlStatementGenerator.cs
index c5abdd6..16a40ad 100644
--- a/src/Strata.SqlTools.Markdown/Snowflake/SqlStatementGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/Snowflake/SqlStatementGenerator.cs
@@ -6,7 +6,7 @@ namespace Strata.SqlTools.Markdown.Snowflake;
/// Generates Mermaid diagrams for Snowflake SQL statements, including sequence diagrams
/// for statement execution flow and entity-relationship diagrams.
///
-public class SqlStatementGenerator
+public static class SqlStatementGenerator
{
///
/// Generates a Mermaid sequence diagram showing Snowflake SQL statement execution flow.
diff --git a/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs b/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs
index a0f048d..051cc8a 100644
--- a/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs
@@ -8,7 +8,7 @@ namespace Strata.SqlTools.Markdown.SqlServer;
/// Generates Mermaid diagram markdown from SQL QueryBreakdown objects.
/// Creates flowchart visualizations showing the query structure and flow.
///
-public class QueryBreakdownGenerator
+public static class QueryBreakdownGenerator
{
///
/// Generates a Mermaid flowchart diagram from a QueryBreakdown.
diff --git a/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs b/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs
index 0905715..49bc4da 100644
--- a/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs
+++ b/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs
@@ -6,7 +6,7 @@ namespace Strata.SqlTools.Markdown.SqlServer;
///
/// Generates Mermaid sequence diagrams from SQL statements to visualize statement execution flow.
///
-public class SqlStatementGenerator
+public static class SqlStatementGenerator
{
///
/// Generates a Mermaid sequence diagram showing SQL statement execution.
diff --git a/src/Strata.SqlTools.Query/FilterCondition.cs b/src/Strata.SqlTools.Query/FilterCondition.cs
index a670099..406caee 100644
--- a/src/Strata.SqlTools.Query/FilterCondition.cs
+++ b/src/Strata.SqlTools.Query/FilterCondition.cs
@@ -6,8 +6,8 @@ public class FilterCondition
public IEnumerable
public class With : Base
{
- // TODO: revisit whether ordering should be applied here before delegating
- // to the base GetExpressions(); inherit base behavior for now.
+ // Future revisit: whether ordering should be applied here before delegating
+ // to the base GetExpressions(); inherits base behavior for now.
///
/// Merges two BoolExpr expressions using WITH semantics.
diff --git a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs
index 773f3f7..fd5ba06 100644
--- a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs
+++ b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs
@@ -100,10 +100,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
base.AddParameter(colonName.TrimStart(':', '@'), value);
// Add both formats to dictionary for compatibility
- if (Parameters.ContainsKey($"@{colonName.TrimStart(':', '@')}"))
- {
- Parameters.Remove($"@{colonName.TrimStart(':', '@')}");
- }
+ Parameters.Remove($"@{colonName.TrimStart(':', '@')}");
Parameters[colonName] = value;
Parameters[atName] = value;
}
diff --git a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs
index 235836b..3007748 100644
--- a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs
+++ b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs
@@ -23,8 +23,8 @@ public static partial class SqlUtils
var filter = new SqlFilter();
string param = "@" + GuidUtils.TranslateGuid(Guid.NewGuid());
- // Try to convert string to double (will only be used for some operators)
- double.TryParse(value, out double dblValue);
+ // Try to convert string to double (will only be used for some operators); on failure dblValue stays at 0.0 by design.
+ _ = double.TryParse(value, out double dblValue);
// Optimize IN if only one value
if (operation == FilterOperation.In && !value.Contains(','))
diff --git a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.cs b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.cs
index ac3445b..db760db 100644
--- a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.cs
+++ b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.cs
@@ -24,6 +24,7 @@ public static partial class SqlUtils
private const string DEFAULT_SCHEMA = "dbo";
private static readonly char[] separator = new[] { ',' };
+ private static readonly char[] spaceSeparator = new[] { ' ' };
#region SQL String Manipulation
@@ -40,7 +41,7 @@ public static partial class SqlUtils
foreach (string commaWord in commaWords)
{
- string[] spaceWords = commaWord.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
+ string[] spaceWords = commaWord.Split(spaceSeparator, StringSplitOptions.RemoveEmptyEntries);
var newSpaceWords = new List();
foreach (string spaceWord in spaceWords)
diff --git a/src/Strata.SqlTools.SqlServer/Exceptions/SqlParseException.cs b/src/Strata.SqlTools.SqlServer/Exceptions/SqlParseException.cs
index ce55470..debd2e2 100644
--- a/src/Strata.SqlTools.SqlServer/Exceptions/SqlParseException.cs
+++ b/src/Strata.SqlTools.SqlServer/Exceptions/SqlParseException.cs
@@ -87,7 +87,7 @@ public class SqlParseException : Exception
}
else
{
- sb.AppendLine($"SQL (truncated): {sql.Substring(0, 197)}...");
+ sb.AppendLine($"SQL (truncated): {sql.AsSpan(0, 197)}...");
}
return sb.ToString();
diff --git a/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs b/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs
index d918600..0d1551a 100644
--- a/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs
+++ b/src/Strata.SqlTools.SqlServer/Statements/StatementParser.cs
@@ -22,6 +22,7 @@ public class StatementParser
public const string KeywordHaving = "HAVING";
public const string KeywordOrderBy = "ORDER BY";
private static readonly char[] separator = new[] { '\r', '\n' };
+ private static readonly char[] semicolonSeparator = new[] { ';' };
#endregion
@@ -251,7 +252,7 @@ public class StatementParser
if (matchingKeyword != null)
{
// Extract setup clauses (simplified - would need more robust parsing for production)
- var statements = beforeSelect.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
+ var statements = beforeSelect.Split(semicolonSeparator, StringSplitOptions.RemoveEmptyEntries)
.Select(stmt => stmt.Trim())
.Where(trimmed => !string.IsNullOrEmpty(trimmed));
@@ -282,7 +283,7 @@ public class StatementParser
if (match.Success)
{
var finishSql = sql.Substring(match.Index + 1).Trim();
- var statements = finishSql.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
+ var statements = finishSql.Split(semicolonSeparator, StringSplitOptions.RemoveEmptyEntries);
foreach (var stmt in statements)
{
var trimmed = stmt.Trim();
diff --git a/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/QueryBreakdownGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/QueryBreakdownGeneratorTests.cs
index 70d3ca4..5123912 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/QueryBreakdownGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/QueryBreakdownGeneratorTests.cs
@@ -6,13 +6,11 @@ namespace Strata.SqlTools.Markdown.Tests.LinqToSql;
[TestFixture]
public class QueryBreakdownGeneratorTests
{
- private QueryBreakdownGenerator _generator = null!;
private TestDataContext _context = null!;
[SetUp]
public void Setup()
{
- _generator = new QueryBreakdownGenerator();
_context = new TestDataContext();
}
diff --git a/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/SqlStatementGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/SqlStatementGeneratorTests.cs
index c043500..4627e6e 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/SqlStatementGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/LinqToSql/SqlStatementGeneratorTests.cs
@@ -6,14 +6,6 @@ namespace Strata.SqlTools.Markdown.Tests.LinqToSql;
[TestFixture]
public class SqlStatementGeneratorTests
{
- private SqlStatementGenerator _generator = null!;
-
- [SetUp]
- public void Setup()
- {
- _generator = new SqlStatementGenerator();
- }
-
[Test]
public void GenerateLinqPipelineDiagram_BasicQuery_GeneratesSequenceDiagram()
{
diff --git a/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/QueryBreakdownGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/QueryBreakdownGeneratorTests.cs
index 371e6fe..68aa80e 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/QueryBreakdownGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/QueryBreakdownGeneratorTests.cs
@@ -6,14 +6,6 @@ namespace Strata.SqlTools.Markdown.Tests.PostgreSql;
[TestFixture]
public class QueryBreakdownGeneratorTests
{
- private QueryBreakdownGenerator _generator = null!;
-
- [SetUp]
- public void Setup()
- {
- _generator = new QueryBreakdownGenerator();
- }
-
[Test]
public void GenerateMermaidDiagram_SimplePostgreSqlQuery_GeneratesValidMermaid()
{
diff --git a/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/SqlStatementGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/SqlStatementGeneratorTests.cs
index ee70a0a..e9b2fba 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/SqlStatementGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/PostgreSql/SqlStatementGeneratorTests.cs
@@ -6,14 +6,6 @@ namespace Strata.SqlTools.Markdown.Tests.PostgreSql;
[TestFixture]
public class SqlStatementGeneratorTests
{
- private SqlStatementGenerator _generator = null!;
-
- [SetUp]
- public void Setup()
- {
- _generator = new SqlStatementGenerator();
- }
-
[Test]
public void GenerateSequenceDiagram_PostgreSqlQuery_GeneratesValidDiagram()
{
diff --git a/tests/Strata.SqlTools.Markdown.Tests/Snowflake/QueryBreakdownGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/Snowflake/QueryBreakdownGeneratorTests.cs
index 189cd1c..e8db15c 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/Snowflake/QueryBreakdownGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/Snowflake/QueryBreakdownGeneratorTests.cs
@@ -6,14 +6,6 @@ namespace Strata.SqlTools.Markdown.Tests.Snowflake;
[TestFixture]
public class QueryBreakdownGeneratorTests
{
- private QueryBreakdownGenerator _generator = null!;
-
- [SetUp]
- public void Setup()
- {
- _generator = new QueryBreakdownGenerator();
- }
-
[Test]
public void GenerateMermaidDiagram_SimpleSnowflakeQuery_GeneratesValidMermaid()
{
diff --git a/tests/Strata.SqlTools.Markdown.Tests/Snowflake/SqlStatementGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/Snowflake/SqlStatementGeneratorTests.cs
index 9e4173a..cffe833 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/Snowflake/SqlStatementGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/Snowflake/SqlStatementGeneratorTests.cs
@@ -6,14 +6,6 @@ namespace Strata.SqlTools.Markdown.Tests.Snowflake;
[TestFixture]
public class SqlStatementGeneratorTests
{
- private SqlStatementGenerator _generator = null!;
-
- [SetUp]
- public void Setup()
- {
- _generator = new SqlStatementGenerator();
- }
-
[Test]
public void GenerateSequenceDiagram_SnowflakeQuery_GeneratesValidDiagram()
{
diff --git a/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryBreakdownGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryBreakdownGeneratorTests.cs
index b3d8e60..a887dda 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryBreakdownGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryBreakdownGeneratorTests.cs
@@ -7,14 +7,6 @@ namespace Strata.SqlTools.Markdown.Tests.SqlServer;
[TestFixture]
public class QueryBreakdownGeneratorTests
{
- private QueryBreakdownGenerator _generator = null!;
-
- [SetUp]
- public void Setup()
- {
- _generator = new QueryBreakdownGenerator();
- }
-
[Test]
public void GenerateMermaidDiagram_WithSimpleQuery_GeneratesFlowchart()
{
diff --git a/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryMarkdownGenerationTests.cs b/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryMarkdownGenerationTests.cs
index e01392d..7afa5c1 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryMarkdownGenerationTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/SqlServer/QueryMarkdownGenerationTests.cs
@@ -8,15 +8,12 @@ namespace Strata.SqlTools.Markdown.Tests.SqlServer;
[Category("MarkdownGeneration")]
public class QueryMarkdownGenerationTests
{
- private QueryBreakdownGenerator _generator = null!;
private string _queriesSourcePath = null!;
private string _markdownOutputPath = null!;
[SetUp]
public void Setup()
{
- _generator = new QueryBreakdownGenerator();
-
// Get the solution root directory
var testDirectory = TestContext.CurrentContext.TestDirectory;
var solutionRoot = Directory.GetParent(testDirectory)?.Parent?.Parent?.Parent?.Parent?.FullName;
diff --git a/tests/Strata.SqlTools.Markdown.Tests/SqlServer/SqlStatementGeneratorTests.cs b/tests/Strata.SqlTools.Markdown.Tests/SqlServer/SqlStatementGeneratorTests.cs
index 570f43d..403a0b9 100644
--- a/tests/Strata.SqlTools.Markdown.Tests/SqlServer/SqlStatementGeneratorTests.cs
+++ b/tests/Strata.SqlTools.Markdown.Tests/SqlServer/SqlStatementGeneratorTests.cs
@@ -6,14 +6,6 @@ namespace Strata.SqlTools.Markdown.Tests.SqlServer;
[TestFixture]
public class SqlStatementGeneratorTests
{
- private SqlStatementGenerator _generator = null!;
-
- [SetUp]
- public void Setup()
- {
- _generator = new SqlStatementGenerator();
- }
-
[Test]
public void GenerateSequenceDiagram_WithSimpleQuery_GeneratesSequence()
{