diff --git a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs index 9e6d9b16c3..44fb681b25 100644 --- a/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs +++ b/Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Translator.cs @@ -231,34 +231,14 @@ public override void Translate(IOutput output, SqlDatePart datePart) } } - /// - public override void Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - switch (section) { - case SelectSection.Limit: - _ = context.Output.Append("FIRST"); - break; - case SelectSection.Offset: - _ = context.Output.Append("SKIP"); - break; - default: - base.Translate(context, node, section); - break; - } - } + public override void SelectLimit(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("FIRST "); - /// - public override void Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) - { - switch (section) { - case UpdateSection.Limit: - _ = context.Output.Append("ROWS"); - break; - default: - base.Translate(context, node, section); - break; - } - } + public override void SelectOffset(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("SKIP "); + + public override void UpdateLimit(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("ROWS").AppendSpaceIfNecessary(); /// public override void Translate(SqlCompilerContext context, SqlDelete node, DeleteSection section) @@ -380,4 +360,4 @@ public Translator(SqlDriver driver) DoubleFormatString = $"{base.DoubleFormatString}e0"; } } -} +} \ No newline at end of file diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs index 3fc0c3c7f9..f3e5e3acee 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs @@ -258,15 +258,15 @@ public override void Visit(SqlPlaceholder node) protected override void VisitSelectLimitOffset(SqlSelect node) { if (node.Limit is not null) { - AppendTranslated(node, SelectSection.Limit); + translator.SelectLimit(context, node); node.Limit.AcceptVisitor(this); } if (node.Offset is not null) { if (node.Limit is null) { - AppendTranslated(node, SelectSection.Limit); + translator.SelectLimit(context, node); _ = context.Output.Append(" 18446744073709551615 "); // magic number from http://dev.mysql.com/doc/refman/5.0/en/select.html } - AppendTranslated(node, SelectSection.Offset); + translator.SelectOffset(context, node); node.Offset.AcceptVisitor(this); } } diff --git a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs index 8675b2e563..8ae3ce5ead 100644 --- a/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs +++ b/Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs @@ -63,34 +63,26 @@ protected override void TranslateChar(IOutput output, char ch) } } - /// - public override void Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) + public override void SelectHintsEntry(SqlCompilerContext context, SqlSelect node) { } + + public override void SelectHintsExit(SqlCompilerContext context, SqlSelect node) { - switch (section) { - case SelectSection.HintsEntry: - break; - case SelectSection.HintsExit: - if (node.Hints.Count == 0) { - break; + if (node.Hints.Count != 0) { + var hints = new List(node.Hints.Count); + foreach (var hint in node.Hints) { + if (hint is SqlNativeHint sqlNativeHint) { + hints.Add(QuoteIdentifier(sqlNativeHint.HintText)); } - var hints = new List(node.Hints.Count); - foreach (var hint in node.Hints) { - if (hint is SqlNativeHint sqlNativeHint) { - hints.Add(QuoteIdentifier(sqlNativeHint.HintText)); - } - } - if (hints.Count > 0) { - _ = context.Output.Append("USE INDEX (") - .Append(string.Join(", ", hints)) - .Append(")"); - } - break; - default: - base.Translate(context, node, section); - break; + } + if (hints.Count > 0) { + _ = context.Output.Append("USE INDEX (") + .Append(string.Join(", ", hints)) + .Append(")"); + } } } + /// public override void Translate(IOutput output, SqlFunctionType type) { @@ -356,16 +348,8 @@ public override void Translate(SqlCompilerContext context, SqlAlterTable node, A } } - /// - public override void Translate(SqlCompilerContext context, SqlInsert node, InsertSection section) - { - if (section == InsertSection.DefaultValues) { - _ = context.Output.Append("() VALUES ()"); - } - else { - base.Translate(context, node, section); - } - } + public override void InsertDefaultValues(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().AppendOpeningPunctuation("() VALUES ()"); /// public override void Translate(SqlCompilerContext context, SqlBreak node) diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs index 25bc665d52..764a69789c 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs @@ -70,24 +70,14 @@ public override void TranslateString(IOutput output, string str) base.TranslateString(output, str); } - /// - public override void Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - switch (section) { - case SelectSection.HintsEntry: - _ = context.Output.Append("/*+"); - break; - case SelectSection.HintsExit: - _ = context.Output.Append("*/"); - break; - case SelectSection.Limit: - case SelectSection.Offset: - throw new NotSupportedException(); - default: - base.Translate(context, node, section); - break; - } - } + public override void SelectLimit(SqlCompilerContext context, SqlSelect node) => throw new NotSupportedException(); + public override void SelectOffset(SqlCompilerContext context, SqlSelect node) => throw new NotSupportedException(); + + public override void SelectHintsEntry(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("/*+ "); + + public override void SelectHintsExit(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("*/ "); /// public override string Translate(SqlJoinMethod method) diff --git a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs index 67c9a80be7..65e54d6a66 100644 --- a/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs +++ b/Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v11/Translator.cs @@ -13,13 +13,8 @@ namespace Xtensive.Sql.Drivers.Oracle.v11 { internal class Translator : v10.Translator { - /// - public override void Translate(SqlCompilerContext context, SqlOrder node, NodeSection section) - { - if (section == NodeSection.Exit) { - _ = context.Output.Append(node.Ascending ? "ASC NULLS FIRST" : "DESC NULLS LAST"); - } - } + public override void OrderExit(SqlCompilerContext context, SqlOrder node) => + context.Output.Append(node.Ascending ? "ASC NULLS FIRST" : "DESC NULLS LAST"); /// public override string Translate(SqlValueType type) diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs index 5914326e9c..403124cd9e 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Translator.cs @@ -453,23 +453,11 @@ public override void Translate(SqlCompilerContext context, SqlDeclareCursor node } } - /// - public override void Translate(SqlCompilerContext context, SqlFetch node, FetchSection section) - { - switch (section) { - case FetchSection.Entry: - _ = context.Output.Append("FETCH ").Append(node.Option.ToString().ToUpper()); - return; - case FetchSection.Targets: - var output = context.Output; - _ = output.Append("FROM "); - TranslateIdentifier(output, node.Cursor.Name); - return; - case FetchSection.Exit: - break; - } - base.Translate(context, node, section); - } + public override void FetchEntry(SqlCompilerContext context, SqlFetch node) => + context.Output.Append("FETCH ").Append(node.Option.ToString().ToUpper()); + + public override void FetchTarget(SqlCompilerContext context, SqlFetch node) => + TranslateIdentifier(context.Output.AppendSpaceIfNecessary().Append("FROM "), node.Cursor.Name); /// public override void Translate(SqlCompilerContext context, SqlOpenCursor node) @@ -962,4 +950,4 @@ public Translator(SqlDriver driver) DoubleFormatString = base.DoubleFormatString + "'::float8'"; } } -} +} \ No newline at end of file diff --git a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs index fb0fe8279e..86c665a07c 100644 --- a/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs +++ b/Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_3/Translator.cs @@ -44,13 +44,8 @@ public override void Translate(SqlCompilerContext context, SqlCreateIndex node, } } - /// - public override void Translate(SqlCompilerContext context, SqlOrder node, NodeSection section) - { - if (section == NodeSection.Exit) { - _ = context.Output.Append(node.Ascending ? "ASC NULLS FIRST" : "DESC NULLS LAST"); - } - } + public override void OrderExit(SqlCompilerContext context, SqlOrder node) => + context.Output.Append(node.Ascending ? "ASC NULLS FIRST" : "DESC NULLS LAST"); internal protected string GetFulltextVector(SqlCompilerContext context, FullTextIndex index) { diff --git a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs index f94e40db9f..813234a815 100644 --- a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs +++ b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs @@ -83,7 +83,7 @@ protected override void VisitUpdateLimit(SqlUpdate node) throw new NotSupportedException(Strings.ExStorageDoesNotSupportLimitationOfRowCountToUpdate); } - AppendTranslated(node, UpdateSection.Limit); + translator.UpdateLimit(context); _ = context.Output.AppendOpeningPunctuation("("); node.Limit.AcceptVisitor(this); _ = context.Output.Append(")"); diff --git a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Translator.cs b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Translator.cs index 7b4c058e63..7740138795 100644 --- a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Translator.cs +++ b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Translator.cs @@ -318,45 +318,32 @@ public override string Translate(SqlJoinMethod method) }; } - /// - public override void Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) + public override void SelectLimit(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("TOP "); + + public override void SelectOffset(SqlCompilerContext context, SqlSelect node) => throw new NotSupportedException(); + + public override void SelectExit(SqlCompilerContext context, SqlSelect node) { var output = context.Output; - switch (section) { - case SelectSection.Entry: - base.Translate(context, node, section); - break; - case SelectSection.Limit: - _ = output.Append("TOP"); - break; - case SelectSection.Offset: - throw new NotSupportedException(); - case SelectSection.Exit: - var hasHints = false; - foreach (var hint in node.Hints) { - switch (hint) { - case SqlForceJoinOrderHint: - AppendHint(output, "FORCE ORDER", ref hasHints); - break; - case SqlFastFirstRowsHint sqlFastFirstRowsHint: - AppendHint(output, "FAST ", ref hasHints); - _ = output.Append(sqlFastFirstRowsHint.Amount); - break; - case SqlNativeHint sqlNativeHint: - AppendHint(output, sqlNativeHint.HintText, ref hasHints); - break; - } - } - if (hasHints) { - _ = output.Append(")"); - } - break; - default: - base.Translate(context, node, section); - break; + var hasHints = false; + foreach (var hint in node.Hints) { + switch (hint) { + case SqlForceJoinOrderHint: + AppendHint(output, "FORCE ORDER", ref hasHints); + break; + case SqlFastFirstRowsHint sqlFastFirstRowsHint: + AppendHint(output, "FAST ", ref hasHints); + _ = output.Append(sqlFastFirstRowsHint.Amount); + break; + case SqlNativeHint sqlNativeHint: + AppendHint(output, sqlNativeHint.HintText, ref hasHints); + break; + } + } + if (hasHints) { + _ = output.Append(")"); } - - /// static void AppendHint(IOutput output, string hint, ref bool hasHints) { @@ -371,17 +358,8 @@ static void AppendHint(IOutput output, string hint, ref bool hasHints) } } - public override void Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) - { - switch (section) { - case UpdateSection.Limit: - _ = context.Output.Append("TOP"); - break; - default: - base.Translate(context, node, section); - break; - } - } + public override void UpdateLimit(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("TOP").AppendSpaceIfNecessary(); /// public override void Translate(SqlCompilerContext context, SqlDelete node, DeleteSection section) diff --git a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Compiler.cs b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Compiler.cs index b4f91e357b..662f2396bf 100644 --- a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Compiler.cs +++ b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Compiler.cs @@ -26,7 +26,7 @@ protected override void VisitSelectLimitOffset(SqlSelect node) return; // Nothing to process. } - AppendTranslated(node, SelectSection.Offset); + translator.SelectOffset(context, node); if (node.HasOffset) { node.Offset.AcceptVisitor(this); @@ -35,14 +35,12 @@ protected override void VisitSelectLimitOffset(SqlSelect node) _ = context.Output.Append("0"); } - AppendSpaceIfNecessary(); - translator.Translate(context, node, SelectSection.OffsetEnd); + translator.SelectOffsetEnd(context, node); if (node.HasLimit) { - AppendTranslated(node, SelectSection.Limit); + translator.SelectLimit(context, node); node.Limit.AcceptVisitor(this); - AppendSpaceIfNecessary(); - translator.Translate(context, node, SelectSection.LimitEnd); + translator.SelectLimitEnd(context, node); } } diff --git a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Translator.cs b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Translator.cs index f9fddc03c4..9c5933bf14 100644 --- a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Translator.cs +++ b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v11/Translator.cs @@ -50,28 +50,17 @@ public override void Translate(SqlCompilerContext context, SequenceDescriptor de } } - /// - public override void Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - var output = context.Output; - switch (section) { - case SelectSection.Limit: - _ = output.Append("FETCH NEXT"); - break; - case SelectSection.LimitEnd: - _ = output.Append("ROWS ONLY"); - break; - case SelectSection.Offset: - _ = output.Append("OFFSET"); - break; - case SelectSection.OffsetEnd: - _ = output.Append("ROWS"); - break; - default: - base.Translate(context, node, section); - break; - } - } + public override void SelectLimit(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("FETCH NEXT "); + + public override void SelectOffset(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("OFFSET "); + + public override void SelectLimitEnd(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("ROWS ONLY "); + + public override void SelectOffsetEnd(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("ROWS "); private void TranslateSequenceStatement(SqlCompilerContext context, Sequence sequence, string action) { diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs index dc044373f7..68a53377d3 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs @@ -351,13 +351,13 @@ protected override void VisitSelectLimitOffset(SqlSelect node) return; } - AppendTranslated(node, SelectSection.Limit); + translator.SelectLimit(context, node); SqlDml.Literal(-1).AcceptVisitor(this); - AppendTranslated(node, SelectSection.LimitEnd); + translator.SelectLimitEnd(context, node); - AppendTranslated(node, SelectSection.Offset); + translator.SelectOffset(context, node); node.Offset.AcceptVisitor(this); - AppendTranslated(node, SelectSection.OffsetEnd); + translator.SelectOffsetEnd(context, node); } /// diff --git a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs index d812d1d011..a79d9fb00c 100644 --- a/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs +++ b/Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Translator.cs @@ -274,17 +274,17 @@ public override void Translate(SqlCompilerContext context, SqlFunctionCall node, } } - /// - public override void Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) - { - _ = context.Output.Append(section switch { - UpdateSection.Entry => "UPDATE", - UpdateSection.Set => "SET", - UpdateSection.From => "FROM", - UpdateSection.Where => "WHERE", - _ => string.Empty - }); - } + public override void UpdateSet(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("SET").AppendSpaceIfNecessary(); + + public override void UpdateFrom(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("FROM").AppendSpaceIfNecessary(); + + public override void UpdateWhere(SqlCompilerContext context, SqlUpdate node) => + context.Output.AppendSpaceIfNecessary().Append("WHERE").AppendSpaceIfNecessary(); + + public override void UpdateLimit(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary(); /// public override void Translate(SqlCompilerContext context, SqlCreateIndex node, CreateIndexSection section) @@ -586,4 +586,4 @@ protected internal Translator(SqlDriver driver) { } } -} +} \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs index afb1f1a8ab..051a288664 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/Internals/Nodes/ContainerNode.cs @@ -273,6 +273,9 @@ public IOutput AppendSpaceIfNecessary() return AppendSpace(); } + public IOutput AppendSpacePrefixed(string text) => + AppendSpaceIfNecessary().Append(text); + /// public IOutput AppendNewLine(string text) { diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs index c114d16d16..4bcbd59a33 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlCompiler.cs @@ -308,13 +308,11 @@ public virtual void Visit(SqlBatch node) public virtual void Visit(SqlBetween node) { using (context.EnterScope(node)) { - AppendTranslatedEntry(node); node.Expression.AcceptVisitor(this); - AppendTranslated(node, BetweenSection.Between); + translator.BetweenBetween(context, node); node.Left.AcceptVisitor(this); - AppendTranslated(node, BetweenSection.And); + translator.BetweenAnd(context, node); node.Right.AcceptVisitor(this); - AppendTranslatedExit(node); } } @@ -444,7 +442,8 @@ public virtual void Visit(SqlCollate node) /// Visits and translates its parts. /// /// Column reference to visit. - public virtual void Visit(SqlColumnRef node) => AppendTranslated(node, ColumnSection.Entry); + public virtual void Visit(SqlColumnRef node) => + translator.ColumnEntry(context, node); /// /// Visits table and translates its parts. @@ -1163,15 +1162,14 @@ public virtual void Visit(SqlDynamicFilter node) public virtual void Visit(SqlFetch node) { using (context.EnterScope(node)) { - AppendTranslatedEntry(node); + translator.FetchEntry(context, node); if (node.RowCount is not null) { node.RowCount.AcceptVisitor(this); } - AppendTranslated(node, FetchSection.Targets); + translator.FetchTarget(context, node); foreach (var item in node.Targets) { item.AcceptVisitor(this); } - AppendTranslatedExit(node); } } @@ -1232,19 +1230,19 @@ public virtual void Visit(SqlCustomFunctionCall node) => public virtual void Visit(SqlIf node) { using (context.EnterScope(node)) { - AppendTranslated(node, IfSection.Entry); + translator.IfEntry(context); node.Condition.AcceptVisitor(this); - AppendTranslated(node, IfSection.True); + translator.IfTrue(context); node.True.AcceptVisitor(this); if (node.False != null) { - AppendTranslated(node, IfSection.False); + translator.IfFalse(context); node.False.AcceptVisitor(this); } - AppendTranslated(node, IfSection.Exit); + translator.IfExit(context); } } @@ -1255,7 +1253,8 @@ public virtual void Visit(SqlIf node) public virtual void Visit(SqlInsert node) { using (context.EnterScope(node)) { - AppendTranslatedEntry(node); + translator.InsertEntry(context); + AppendSpaceIfNecessary(); if (node.Into == null) { throw new SqlCompilerException(Strings.ExTablePropertyIsNotSet); @@ -1265,7 +1264,7 @@ public virtual void Visit(SqlInsert node) node.Into.AcceptVisitor(this); } - AppendTranslated(node, InsertSection.ColumnsEntry); + translator.InsertColumnsEntry(context, node); var columns = node.ValueRows.Columns; if (columns.Count > 0) { using (context.EnterCollectionScope()) { @@ -1275,9 +1274,9 @@ public virtual void Visit(SqlInsert node) } } } - AppendTranslated(node, InsertSection.ColumnsExit); + translator.InsertColumnsExit(context, node); if (node.ValueRows.Count == 0 && node.From == null) { - AppendTranslated(node, InsertSection.DefaultValues); + translator.InsertDefaultValues(context); } else { if (node.From != null) @@ -1285,7 +1284,7 @@ public virtual void Visit(SqlInsert node) node.From.AcceptVisitor(this); } else { - AppendTranslated(node, InsertSection.ValuesEntry); + translator.InsertValuesEntry(context, node); bool firstRow = true; foreach (var row in node.ValueRows) { if (!firstRow) { @@ -1295,10 +1294,10 @@ public virtual void Visit(SqlInsert node) firstRow = false; row.AcceptVisitor(this); } - AppendTranslated(node, InsertSection.ValuesExit); + translator.InsertValuesExit(context, node); } } - AppendTranslatedExit(node); + translator.InsertExit(context); } } @@ -1320,7 +1319,7 @@ public virtual void Visit(SqlJoinExpression node) AppendTranslated(node, JoinSection.Specification); node.Right.AcceptVisitor(this); if (node.Expression is not null) { - AppendTranslated(node, JoinSection.Condition); + translator.JoinCondition(context, node); node.Expression.AcceptVisitor(this); } AppendTranslated(node, JoinSection.Exit); @@ -1343,15 +1342,15 @@ public virtual void Visit(SqlJoinHint node) public virtual void Visit(SqlLike node) { using (context.EnterScope(node)) { - AppendTranslatedEntry(node); + translator.LikeEntry(context); node.Expression.AcceptVisitor(this); - AppendTranslated(node, LikeSection.Like); + translator.LikeLike(context, node); node.Pattern.AcceptVisitor(this); if (node.Escape is not null) { - AppendTranslated(node, LikeSection.Escape); + translator.LikeEscape(context); node.Escape.AcceptVisitor(this); } - AppendTranslatedExit(node); + translator.LikeExit(context); } } @@ -1407,7 +1406,6 @@ public virtual void Visit(SqlOrder node) { using (context.EnterScope(node)) { AppendSpaceIfNecessary(); - translator.Translate(context, node, NodeSection.Entry); if (node.Expression is not null) { node.Expression.AcceptVisitor(this); } @@ -1415,7 +1413,7 @@ public virtual void Visit(SqlOrder node) _ = context.Output.Append(node.Position.ToString()); } AppendSpace(); - translator.Translate(context, node, NodeSection.Exit); + translator.OrderExit(context, node); } } @@ -1580,13 +1578,13 @@ protected virtual void VisitSelectHints(SqlSelect node) } using (context.EnterCollectionScope()) { - AppendTranslated(node, SelectSection.HintsEntry); + translator.SelectHintsEntry(context, node); hints[0].AcceptVisitor(this); for (var i = 1; i < hints.Count; i++) { AppendDelimiter(translator.HintDelimiter); hints[i].AcceptVisitor(this); } - AppendTranslated(node, SelectSection.HintsExit); + translator.SelectHintsExit(context, node); } } @@ -1609,7 +1607,7 @@ protected virtual void VisitSelectColumns(SqlSelect node) } var cr = item as SqlColumnRef; - if (cr is not null && cr.SqlColumn is SqlColumnStub) { + if (cr?.SqlColumn is SqlColumnStub) { continue; } @@ -1617,7 +1615,7 @@ protected virtual void VisitSelectColumns(SqlSelect node) if (cr is not null) { AppendSpaceIfNecessary(); cr.SqlColumn.AcceptVisitor(this); - translator.Translate(context, cr, ColumnSection.AliasDeclaration); + translator.ColumnAliasDeclaration(context, cr); } else { AppendSpaceIfNecessary(); @@ -1638,8 +1636,7 @@ protected virtual void VisitSelectFrom(SqlSelect node) } AppendSpace(); - translator.Translate(context, node, SelectSection.From); - AppendSpace(); + translator.SelectFrom(context, node); var joinedFrom = node.From as SqlJoinedTable; var linearJoinRequired = CheckFeature(QueryFeatures.StrictJoinSyntax) && joinedFrom != null; @@ -1662,7 +1659,7 @@ protected virtual void VisitSelectFrom(SqlSelect node) AppendTranslated(join, JoinSection.Specification); table.AcceptVisitor(this); if (condition is not null) { - AppendTranslated(join, JoinSection.Condition); + translator.JoinCondition(context, join); condition.AcceptVisitor(this); } @@ -1680,7 +1677,7 @@ protected virtual void VisitSelectWhere(SqlSelect node) return; } - AppendTranslated(node, SelectSection.Where); + translator.SelectWhere(context, node); node.Where.AcceptVisitor(this); } @@ -1694,9 +1691,7 @@ protected virtual void VisitSelectGroupBy(SqlSelect node) return; } // group by - AppendSpace(); - translator.Translate(context, node, SelectSection.GroupBy); - AppendSpace(); + translator.SelectGroupBy(context, node); using (context.EnterCollectionScope()) { foreach (var item in node.GroupBy) { AppendCollectionDelimiterIfNecessary(AppendColumnDelimiter); @@ -1713,7 +1708,7 @@ protected virtual void VisitSelectGroupBy(SqlSelect node) return; } // having - AppendTranslated(node, SelectSection.Having); + translator.SelectHaving(context, node); node.Having.AcceptVisitor(this); } @@ -1727,9 +1722,7 @@ protected virtual void VisitSelectOrderBy(SqlSelect node) return; } - AppendSpace(); - translator.Translate(context, node, SelectSection.OrderBy); - AppendSpace(); + translator.SelectOrderBy(context, node); using (context.EnterCollectionScope()) { foreach (var item in node.OrderBy) { AppendCollectionDelimiterIfNecessary(AppendColumnDelimiter); @@ -1745,14 +1738,14 @@ protected virtual void VisitSelectOrderBy(SqlSelect node) protected virtual void VisitSelectLimitOffset(SqlSelect node) { if (node.Limit is not null) { - AppendTranslated(node, SelectSection.Limit); + translator.SelectLimit(context, node); node.Limit.AcceptVisitor(this); - AppendTranslated(node, SelectSection.LimitEnd); + translator.SelectLimitEnd(context, node); } if (node.Offset is not null) { - AppendTranslated(node, SelectSection.Offset); + translator.SelectOffset(context, node); node.Offset.AcceptVisitor(this); - AppendTranslated(node, SelectSection.OffsetEnd); + translator.SelectOffsetEnd(context, node); } } @@ -1881,7 +1874,8 @@ protected void VisitUpdateDefault(SqlUpdate node) /// Visits entry part of statement. /// /// Statement to visit. - protected virtual void VisitUpdateEntry(SqlUpdate node) => AppendTranslatedEntry(node); + protected virtual void VisitUpdateEntry(SqlUpdate node) => + translator.UpdateEntry(context, node); /// /// Visits UPDATE part of statement. @@ -1904,7 +1898,7 @@ protected virtual void VisitUpdateUpdate(SqlUpdate node) /// Statement to visit. protected virtual void VisitUpdateSet(SqlUpdate node) { - AppendTranslated(node, UpdateSection.Set); + translator.UpdateSet(context); using (context.EnterCollectionScope()) { foreach (var item in node.Values.Keys) { @@ -1927,7 +1921,7 @@ protected virtual void VisitUpdateSet(SqlUpdate node) protected virtual void VisitUpdateFrom(SqlUpdate node) { if (Driver.ServerInfo.Query.Features.Supports(QueryFeatures.UpdateFrom) && node.From != null) { - AppendTranslated(node, UpdateSection.From); + translator.UpdateFrom(context); node.From.AcceptVisitor(this); } } @@ -1939,7 +1933,7 @@ protected virtual void VisitUpdateFrom(SqlUpdate node) protected virtual void VisitUpdateWhere(SqlUpdate node) { if (node.Where is not null) { - AppendTranslated(node, UpdateSection.Where); + translator.UpdateWhere(context, node); node.Where.AcceptVisitor(this); } } @@ -1955,7 +1949,7 @@ protected virtual void VisitUpdateLimit(SqlUpdate node) throw new NotSupportedException(Strings.ExStorageIsNotSupportedLimitationOfRowCountToUpdate); } - AppendTranslated(node, UpdateSection.Limit); + translator.UpdateLimit(context); node.Limit.AcceptVisitor(this); } } @@ -1964,7 +1958,9 @@ protected virtual void VisitUpdateLimit(SqlUpdate node) /// Visits end part of statement. /// /// Statement to visit. - protected virtual void VisitUpdateExit(SqlUpdate node) => AppendTranslatedExit(node); + protected virtual void VisitUpdateExit(SqlUpdate node) + { + } /// /// Visits expression. @@ -2039,11 +2035,11 @@ public virtual void Visit(SqlVariant node) public virtual void Visit(SqlWhile node) { using (context.EnterScope(node)) { - AppendTranslated(node, WhileSection.Entry); + translator.WhileEntry(context); node.Condition.AcceptVisitor(this); - AppendTranslated(node, WhileSection.Statement); + translator.WhileStatement(context); node.Statement.AcceptVisitor(this); - AppendTranslated(node, WhileSection.Exit); + translator.WhileExit(context); } } @@ -2298,22 +2294,6 @@ protected void AppendTranslated(SqlArray node, ArraySection section) translator.Translate(context, node, section); } - protected void AppendTranslated(SqlBetween node, BetweenSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - AppendSpaceIfNecessary(); - } - - protected void AppendTranslatedEntry(SqlBetween node) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, BetweenSection.Entry); - } - - protected void AppendTranslatedExit(SqlBetween node) => - translator.Translate(context, node, BetweenSection.Exit); - protected void AppendTranslatedEntry(SqlBinary node) { AppendSpaceIfNecessary(); @@ -2402,13 +2382,6 @@ protected void AppendTranslated(SqlCollate node, NodeSection section) translator.Translate(context, node, section); } - protected void AppendTranslated(SqlColumnRef node, ColumnSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - AppendSpaceIfNecessary(); - } - protected void AppendTranslatedEntry(SqlConcat node) { AppendSpaceIfNecessary(); @@ -2593,18 +2566,6 @@ protected void AppendTranslated(SqlTruncateTable node) AppendSpaceIfNecessary(); } - protected void AppendTranslated(SqlFetch node, FetchSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - } - - protected void AppendTranslatedEntry(SqlFetch node) => - translator.Translate(context, node, FetchSection.Entry); - - protected void AppendTranslatedExit(SqlFetch node) => - translator.Translate(context, node, FetchSection.Exit); - protected void AppendTranslated(SqlFunctionCall node, FunctionCallSection section, int position) { AppendSpaceIfNecessary(); @@ -2635,49 +2596,12 @@ protected void AppendTranslatedEntry(SqlUserFunctionCall node) protected void AppendTranslatedExit(SqlUserFunctionCall node) => translator.Translate(context, node, FunctionCallSection.Exit, -1); - protected void AppendTranslated(SqlIf node, IfSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - } - - protected void AppendTranslated(SqlInsert node, InsertSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - } - - protected void AppendTranslatedEntry(SqlInsert node) - { - translator.Translate(context, node, InsertSection.Entry); - AppendSpaceIfNecessary(); - } - - protected void AppendTranslatedExit(SqlInsert node) => - translator.Translate(context, node, InsertSection.Exit); - protected void AppendTranslated(SqlJoinExpression node, JoinSection section) { AppendSpaceIfNecessary(); translator.Translate(context, node, section); } - protected void AppendTranslated(SqlLike node, LikeSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - AppendSpaceIfNecessary(); - } - - protected void AppendTranslatedEntry(SqlLike node) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, LikeSection.Entry); - } - - protected void AppendTranslatedExit(SqlLike node) => - translator.Translate(context, node, LikeSection.Exit); - protected void AppendTranslated(SqlMatch node, MatchSection section) { AppendSpaceIfNecessary(); @@ -2736,21 +2660,11 @@ protected void AppendTranslated(SqlRow node, NodeSection section) => protected void AppendTranslated(SqlRowNumber node, NodeSection section) => translator.Translate(context, node, section); - protected void AppendTranslated(SqlSelect node, SelectSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - AppendSpaceIfNecessary(); - } - - protected void AppendTranslatedEntry(SqlSelect node) - { - translator.Translate(context, node, SelectSection.Entry); - AppendSpaceIfNecessary(); - } + protected void AppendTranslatedEntry(SqlSelect node) => + translator.SelectEntry(context, node); protected void AppendTranslatedExit(SqlSelect node) => - translator.Translate(context, node, SelectSection.Exit); + translator.SelectExit(context, node); protected void AppendTranslated(SqlStatementBlock node, NodeSection section) { @@ -2779,19 +2693,6 @@ protected void AppendTranslated(SqlTrim node, TrimSection section) protected void AppendTranslated(SqlUnary node, NodeSection section) => translator.Translate(context, node, section); - protected void AppendTranslated(SqlUpdate node, UpdateSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - AppendSpaceIfNecessary(); - } - - protected void AppendTranslatedEntry(SqlUpdate node) => - translator.Translate(context, node, UpdateSection.Entry); - - protected void AppendTranslatedExit(SqlUpdate node) => - translator.Translate(context, node, UpdateSection.Exit); - protected void AppendTranslatedEntry(SqlUserColumn node) { AppendSpaceIfNecessary(); @@ -2807,13 +2708,6 @@ protected void AppendTranslated(SqlVariable node) translator.Translate(context, node); } - protected void AppendTranslated(SqlWhile node, WhileSection section) - { - AppendSpaceIfNecessary(); - translator.Translate(context, node, section); - AppendSpaceIfNecessary(); - } - protected void AppendTranslated(SqlExtract extract, ExtractSection section) { AppendSpaceIfNecessary(); @@ -2948,4 +2842,4 @@ protected SqlCompiler(SqlDriver driver) queryFeatures = Driver.ServerInfo.Query.Features; } } -} +} \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs index 1e72074f4f..c8734f22ce 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlNodeSections.cs @@ -45,14 +45,6 @@ public enum ConstraintSection ReferencedColumns = 6, } - public enum BetweenSection - { - Entry = 0, - Exit = 1, - Between = 2, - And = 3, - } - public enum CaseSection { Entry = 0, @@ -63,13 +55,6 @@ public enum CaseSection Else = 5, } - public enum ColumnSection - { - Entry = 0, - Exit = 1, - AliasDeclaration = 2, - } - public enum CreateDomainSection { Entry = 0, @@ -123,13 +108,6 @@ public enum DeleteSection Limit = 4, } - public enum FetchSection - { - Entry = 0, - Exit = 1, - Targets = 2, - } - public enum FunctionCallSection { Entry = 0, @@ -151,41 +129,11 @@ public enum SequenceDescriptorSection AlterMinValue = 7, } - public enum IfSection - { - Entry = 0, - Exit = 1, - True = 2, - False = 3, - } - - public enum InsertSection - { - Entry = 0, - Exit = 1, - ColumnsEntry = 2, - ColumnsExit = 4, - ValuesEntry = 3, - ValuesExit = 5, - DefaultValues = 6, - From = 7, - NewRow = 8, - } - public enum JoinSection { Entry = 0, Exit = 1, Specification = 2, - Condition = 3, - } - - public enum LikeSection - { - Entry = 0, - Exit = 1, - Like = 2, - Escape = 3, } public enum MatchSection @@ -195,23 +143,6 @@ public enum MatchSection Specification = 2, } - public enum SelectSection - { - Entry = 0, - Exit = 1, - From = 3, - Where = 4, - GroupBy = 5, - Having = 6, - OrderBy = 7, - HintsEntry = 8, - HintsExit = 9, - Limit = 10, - Offset = 11, - LimitEnd = 12, - OffsetEnd = 13, - } - public enum TableSection { Entry = 0, @@ -257,23 +188,6 @@ public enum ArraySection EmptyArray = 2, } - public enum UpdateSection - { - Entry = 0, - Exit = 1, - Set = 2, - From = 3, - Where = 4, - Limit = 5, - } - - public enum WhileSection - { - Entry = 0, - Exit = 1, - Statement = 2, - } - public enum QueryExpressionSection { Entry = 0, diff --git a/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs b/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs index fbc53d93c7..444bc7f256 100644 --- a/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs +++ b/Orm/Xtensive.Orm/Sql/Compiler/SqlTranslator.cs @@ -386,24 +386,18 @@ public virtual void Translate(SqlCompilerContext context, SqlAssignment node, No } } - /// - /// Translates expression and writes result to to . - /// - /// The compiler context. - /// Expression to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlBetween node, BetweenSection section) + public virtual void BetweenBetween(SqlCompilerContext context, SqlBetween node) { - switch (section) { - case BetweenSection.Between: - Translate(context.Output, node.NodeType); - break; - case BetweenSection.And: - _ = context.Output.Append("AND"); - break; - } + context.Output.AppendSpaceIfNecessary(); + Translate(context.Output, node.NodeType); + context.Output.AppendSpaceIfNecessary(); } + public virtual void BetweenAnd(SqlCompilerContext context, SqlBetween node) => + context.Output.AppendSpaceIfNecessary() + .Append("AND") + .AppendSpaceIfNecessary(); + /// /// Translates expression and writes result to to . /// @@ -512,23 +506,19 @@ public virtual void Translate(SqlCompilerContext context, SqlCollate node, NodeS } } - /// - /// Translates node and writes result to to . - /// - /// The compiler context. - /// Node to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlColumnRef node, ColumnSection section) + public virtual void ColumnEntry(SqlCompilerContext context, SqlColumnRef node) { var output = context.Output; - switch (section) { - case ColumnSection.Entry: - TranslateIdentifier(output, node.Name); - break; - case ColumnSection.AliasDeclaration when !string.IsNullOrEmpty(node.Name): - _ = output.Append(" AS "); - TranslateIdentifier(output, node.Name); - break; + output.AppendSpaceIfNecessary(); + TranslateIdentifier(output, node.Name); + output.AppendSpaceIfNecessary(); + } + + public virtual void ColumnAliasDeclaration(SqlCompilerContext context, SqlColumnRef node) + { + if (!string.IsNullOrEmpty(node.Name)) { + _ = context.Output.Append(" AS "); + TranslateIdentifier(context.Output, node.Name); } } @@ -1267,27 +1257,14 @@ public virtual void Translate(SqlCompilerContext context, SqlDropView node) _ = context.Output.Append(node.Cascade ? " CASCADE" : " RESTRICT"); } - /// - /// Translates statement and writes result to to . - /// - /// The compiler context. - /// Statement to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlFetch node, FetchSection section) + public virtual void FetchEntry(SqlCompilerContext context, SqlFetch node) => + context.Output.Append("FETCH ").Append(node.Option.ToString()); + + public virtual void FetchTarget(SqlCompilerContext context, SqlFetch node) { - var output = context.Output; - switch (section) { - case FetchSection.Entry: - _ = context.Output.Append("FETCH ") - .Append(node.Option.ToString()); - break; - case FetchSection.Targets: - _ = context.Output.Append("FROM ") - .Append(node.Cursor.Name); - if (node.Targets.Count != 0) { - _ = context.Output.Append(" INTO"); - } - break; + _ = context.Output.AppendSpaceIfNecessary().Append("FROM ").Append(node.Cursor.Name); + if (node.Targets.Count != 0) { + _ = context.Output.Append(" INTO"); } } @@ -1382,63 +1359,53 @@ public virtual void Translate(SqlCompilerContext context, SqlExtract extract, Ex }); } - /// - /// Translates expression and writes result to to . - /// - /// The compiler context. - /// Expression to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlIf node, IfSection section) + public virtual void IfEntry(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("IF"); + + public virtual void IfTrue(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("BEGIN"); + + public virtual void IfFalse(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("END BEGIN"); + + public virtual void IfExit(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("END"); + + public virtual void InsertEntry(SqlCompilerContext context) => + context.Output.Append("INSERT INTO"); + + public virtual void InsertColumnsEntry(SqlCompilerContext context, SqlInsert node) { - _ = context.Output.Append(section switch { - IfSection.Entry => "IF", - IfSection.True => "BEGIN", - IfSection.False => "END BEGIN", - IfSection.Exit => "END", - _ => string.Empty - }); + context.Output.AppendSpaceIfNecessary(); + if (node.ValueRows.Count > 0) { + context.Output.Append("("); + } } - /// - /// Translates statement and writes result to to . - /// - /// The compiler context. - /// Statement to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlInsert node, InsertSection section) + public virtual void InsertColumnsExit(SqlCompilerContext context, SqlInsert node) { - var output = context.Output; - switch (section) { - case InsertSection.Entry: - _ = output.Append("INSERT INTO"); - break; - case InsertSection.ColumnsEntry when node.ValueRows.Count > 0: - _ = output.AppendOpeningPunctuation("("); - break; - case InsertSection.ColumnsExit when node.ValueRows.Count > 0: - _ = output.Append(")"); - break; - case InsertSection.From: - _ = output.Append("FROM"); - break; - case InsertSection.ValuesEntry when node.ValueRows.Count == 0: - _ = output.AppendOpeningPunctuation("VALUES ("); - break; - case InsertSection.ValuesEntry when node.ValueRows.Count > 0: - _ = output.AppendOpeningPunctuation("VALUES "); - break; - case InsertSection.ValuesExit when node.ValueRows.Count == 0: - _ = output.Append(")"); - break; - case InsertSection.DefaultValues: - _ = output.Append("DEFAULT VALUES"); - break; - case InsertSection.NewRow: - _ = output.Append("), ("); - break; + context.Output.AppendSpaceIfNecessary(); + if (node.ValueRows.Count > 0) { + context.Output.Append(")"); + } + } + + public virtual void InsertValuesEntry(SqlCompilerContext context, SqlInsert node) => + context.Output.AppendSpaceIfNecessary().AppendOpeningPunctuation(node.ValueRows.Count == 0 ? "VALUES (" : "VALUES "); + + public virtual void InsertValuesExit(SqlCompilerContext context, SqlInsert node) + { + context.Output.AppendSpaceIfNecessary(); + if (node.ValueRows.Count == 0) { + context.Output.Append(")"); } } + public virtual void InsertDefaultValues(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().AppendOpeningPunctuation("DEFAULT VALUES"); + + public virtual void InsertExit(SqlCompilerContext context) { } + /// /// Translates node and writes result to to . /// @@ -1466,39 +1433,30 @@ public virtual void Translate(SqlCompilerContext context, SqlJoinExpression node Translate(output, node.JoinType); _ = output.Append(" JOIN"); break; - case JoinSection.Condition: - _ = output.Append(node.JoinType == SqlJoinType.UsingJoin ? "USING" : "ON"); - break; case JoinSection.Exit when explicitJoinOrder: _ = output.Append(")"); break; } } - /// - /// Translates statement and writes result to to . - /// - /// The compiler context. - /// Statement to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlLike node, LikeSection section) - { - var output = context.Output; - switch (section) { - case LikeSection.Entry: - _ = output.Append("("); - break; - case LikeSection.Exit: - _ = output.AppendClosingPunctuation(")"); - break; - case LikeSection.Like: - _ = output.Append(node.Not ? "NOT LIKE" : "LIKE"); - break; - case LikeSection.Escape: - _ = output.Append("ESCAPE"); - break; - } - } + public virtual void JoinCondition(SqlCompilerContext context, SqlJoinExpression node) => + context.Output.AppendSpacePrefixed(node.JoinType == SqlJoinType.UsingJoin ? "USING " : "ON "); + + public virtual void LikeEntry(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("("); + + public virtual void LikeExit(SqlCompilerContext context) => + context.Output.AppendClosingPunctuation(")"); + + public virtual void LikeLike(SqlCompilerContext context, SqlLike node) => + context.Output.AppendSpaceIfNecessary() + .Append(node.Not ? "NOT LIKE" : "LIKE") + .AppendSpaceIfNecessary(); + + public virtual void LikeEscape(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary() + .Append("ESCAPE") + .AppendSpaceIfNecessary(); /// /// Translates literal values like numbers, string, char, TimeSpan, DateTime values, etc. @@ -1613,20 +1571,8 @@ public virtual void Translate(SqlCompilerContext context, SqlNull node) => public virtual void Translate(SqlCompilerContext context, SqlOpenCursor node) => context.Output.Append("OPEN ").Append(node.Cursor.Name); - /// - /// Translates node and writes result to to . - /// - /// The compiler context. - /// Node to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlOrder node, NodeSection section) - { - switch (section) { - case NodeSection.Exit: - TranslateSortOrder(context.Output, node.Ascending); - break; - } - } + public virtual void OrderExit(SqlCompilerContext context, SqlOrder node) => + TranslateSortOrder(context.Output, node.Ascending); /// /// Translates statement and writes result to to . @@ -1710,26 +1656,35 @@ public virtual void Translate(SqlCompilerContext context, SqlRenameTable node) TranslateIdentifier(context.Output, node.NewName); } - /// - /// Translates statement and writes result to to . - /// - /// The compiler context. - /// Statement to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlSelect node, SelectSection section) - { - _ = context.Output.Append(section switch { - SelectSection.Entry => node.Distinct ? "SELECT DISTINCT" : "SELECT", - SelectSection.From => "FROM", - SelectSection.Where => "WHERE", - SelectSection.GroupBy => "GROUP BY", - SelectSection.Having => "HAVING", - SelectSection.OrderBy => "ORDER BY", - SelectSection.Limit => "LIMIT", - SelectSection.Offset => "OFFSET", - _ => string.Empty - }); - } + public virtual void SelectEntry(SqlCompilerContext context, SqlSelect node) => + context.Output.Append(node.Distinct ? "SELECT DISTINCT " : "SELECT "); + + public virtual void SelectFrom(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("FROM "); + + public virtual void SelectWhere(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("WHERE "); + + public virtual void SelectLimit(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("LIMIT "); + + public virtual void SelectGroupBy(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("GROUP BY "); + + public virtual void SelectOrderBy(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("ORDER BY "); + + public virtual void SelectHaving(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("HAVING "); + + public virtual void SelectOffset(SqlCompilerContext context, SqlSelect node) => + context.Output.AppendSpacePrefixed("OFFSET "); + + public virtual void SelectLimitEnd(SqlCompilerContext context, SqlSelect node) { } + public virtual void SelectOffsetEnd(SqlCompilerContext context, SqlSelect node) { } + public virtual void SelectExit(SqlCompilerContext context, SqlSelect node) { } + public virtual void SelectHintsEntry(SqlCompilerContext context, SqlSelect node) { } + public virtual void SelectHintsExit(SqlCompilerContext context, SqlSelect node) { } /// /// Translates statement and writes result to to . @@ -1866,23 +1821,20 @@ public virtual void Translate(SqlCompilerContext context, SqlUnary node, NodeSec } } - /// - /// Translates statement and writes result to to . - /// - /// The compiler context. - /// Statement to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlUpdate node, UpdateSection section) - { - _ = context.Output.Append(section switch { - UpdateSection.Entry => "UPDATE", - UpdateSection.Set => "SET", - UpdateSection.From => "FROM", - UpdateSection.Where => (node.Where is SqlCursor) ? "WHERE CURRENT OF" : "WHERE", - UpdateSection.Limit => "LIMIT", - _ => string.Empty - }); - } + public virtual void UpdateSet(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("SET").AppendSpaceIfNecessary(); + + public virtual void UpdateFrom(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("FROM").AppendSpaceIfNecessary(); + + public virtual void UpdateWhere(SqlCompilerContext context, SqlUpdate node) => + context.Output.AppendSpaceIfNecessary().Append((node.Where is SqlCursor) ? "WHERE CURRENT OF" : "WHERE").AppendSpaceIfNecessary(); + + public virtual void UpdateLimit(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary().Append("LIMIT").AppendSpaceIfNecessary(); + + public virtual void UpdateEntry(SqlCompilerContext context, SqlUpdate node) => + context.Output.Append("UPDATE "); /// /// Translates node and writes result to to . @@ -1923,26 +1875,20 @@ public virtual void Translate(SqlCompilerContext context, SqlUserFunctionCall no /// Expression to translate. public virtual void Translate(SqlCompilerContext context, SqlVariable node) => context.Output.Append("@").Append(node.Name); - /// - /// Translates statement and writes result to to . - /// - /// The compiler context. - /// Statement to translate. - /// Particular section to translate. - public virtual void Translate(SqlCompilerContext context, SqlWhile node, WhileSection section) - { - switch (section) { - case WhileSection.Entry: - _ = context.Output.AppendOpeningPunctuation("WHILE ("); - break; - case WhileSection.Statement: - _ = context.Output.AppendClosingPunctuation(") BEGIN"); - break; - case WhileSection.Exit: - _ = context.Output.Append("END"); - break; - } - } + public virtual void WhileEntry(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary() + .AppendOpeningPunctuation("WHILE (") + .AppendSpaceIfNecessary(); + + public virtual void WhileStatement(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary() + .AppendClosingPunctuation(") BEGIN") + .AppendSpaceIfNecessary(); + + public virtual void WhileExit(SqlCompilerContext context) => + context.Output.AppendSpaceIfNecessary() + .AppendClosingPunctuation("END") + .AppendSpaceIfNecessary(); /// /// Translates statement and writes result to to . @@ -2697,4 +2643,4 @@ protected SqlTranslator(SqlDriver driver) supportsMultischemaQueries = queryFeatures.Supports(QueryFeatures.MultischemaQueries); } } -} +} \ No newline at end of file