Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 8497122

Browse files
committed
Add QueryType to ToSelectStatement() to be able to change generated SQL
1 parent 1c198ce commit 8497122

23 files changed

+214
-164
lines changed

src/ServiceStack.OrmLite.Firebird/FirebirdOrmLiteDialectProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ public override string ToChangeColumnNameStatement(Type modelType, FieldDefiniti
789789
}
790790
#endregion DDL
791791

792-
public override string ToSelectStatement(ModelDefinition modelDef,
792+
public override string ToSelectStatement(QueryType queryType, ModelDefinition modelDef,
793793
string selectExpression,
794794
string bodyExpression,
795795
string orderByExpression = null,
@@ -804,7 +804,7 @@ public override string ToSelectStatement(ModelDefinition modelDef,
804804
if (orderByExpression != null)
805805
sb.Append(orderByExpression);
806806

807-
if (rows != null || offset != null)
807+
if ((queryType == QueryType.Select || (rows == 1 && offset is null or 0)) && (offset != null || rows != null))
808808
{
809809
var sqlPrefix = "SELECT";
810810
if (rows != null)

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,8 +1060,7 @@ public override string EscapeWildcards(string value)
10601060
.Replace("%", @"^%");
10611061
}
10621062

1063-
1064-
public override string ToSelectStatement(ModelDefinition modelDef,
1063+
public override string ToSelectStatement(QueryType queryType, ModelDefinition modelDef,
10651064
string selectExpression,
10661065
string bodyExpression,
10671066
string orderByExpression = null,
@@ -1083,24 +1082,23 @@ public override string ToSelectStatement(ModelDefinition modelDef,
10831082
if (!offset.HasValue)
10841083
offset = 0;
10851084

1086-
if (string.IsNullOrEmpty(orderByExpression) && rows.HasValue)
1085+
if ((queryType == QueryType.Select || (rows == 1 && offset is null or 0)) && string.IsNullOrEmpty(orderByExpression))
10871086
{
10881087
var primaryKey = modelDef.FieldDefinitions.FirstOrDefault(x => x.IsPrimaryKey);
10891088
if (primaryKey == null)
10901089
{
10911090
if (rows.Value == 1 && offset.Value == 0)
10921091
{
10931092
// Probably used Single<> extension method on a table with a composite key so let it through.
1094-
// Lack of an orderby expression will mean it returns a random matching row, but that is OK.
1093+
// Lack of an order by expression will mean it returns a random matching row, but that is OK.
10951094
orderByExpression = "";
10961095
}
10971096
else
10981097
throw new ApplicationException("Malformed model, no PrimaryKey defined");
10991098
}
11001099
else
11011100
{
1102-
orderByExpression = string.Format("ORDER BY {0}",
1103-
this.GetQuotedColumnName(modelDef, primaryKey.FieldName));
1101+
orderByExpression = $"ORDER BY {this.GetQuotedColumnName(modelDef, primaryKey.FieldName)}";
11041102
}
11051103
}
11061104
sbInner.Append(" " + orderByExpression);

src/ServiceStack.OrmLite.SqlServer/SqlServer2012OrmLiteDialectProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public override List<string> SequenceList(Type tableType)
7575
return gens;
7676
}
7777

78-
public override string ToSelectStatement(ModelDefinition modelDef,
78+
public override string ToSelectStatement(QueryType queryType, ModelDefinition modelDef,
7979
string selectExpression,
8080
string bodyExpression,
8181
string orderByExpression = null,
@@ -89,11 +89,11 @@ public override string ToSelectStatement(ModelDefinition modelDef,
8989
if (orderByExpression != null)
9090
sb.Append(orderByExpression);
9191

92-
if (offset != null || rows != null)
92+
if (queryType == QueryType.Select || (rows == 1 && offset is null or 0))
9393
{
94-
if (orderByExpression.IsEmpty())
94+
if (queryType == QueryType.Select && orderByExpression.IsEmpty())
9595
{
96-
var orderBy = offset == null && rows == 1 //Avoid for Single requests
96+
var orderBy = (offset is null or 0) && rows == 1 //Avoid for Single requests
9797
? "1"
9898
: this.GetQuotedColumnName(modelDef, modelDef.PrimaryKey);
9999

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ public override void PrepareInsertRowStatement<T>(IDbCommand dbCmd, Dictionary<s
558558
: $"INSERT INTO {GetQuotedTableName(modelDef)} {strReturning}DEFAULT VALUES";
559559
}
560560

561-
public override string ToSelectStatement(ModelDefinition modelDef,
561+
public override string ToSelectStatement(QueryType queryType, ModelDefinition modelDef,
562562
string selectExpression,
563563
string bodyExpression,
564564
string orderByExpression = null,
@@ -568,22 +568,22 @@ public override string ToSelectStatement(ModelDefinition modelDef,
568568
var sb = StringBuilderCache.Allocate()
569569
.Append(selectExpression)
570570
.Append(bodyExpression);
571-
572-
if (!offset.HasValue && !rows.HasValue)
571+
572+
if (!offset.HasValue && !rows.HasValue || (queryType != QueryType.Select && rows != 1))
573573
return StringBuilderCache.ReturnAndFree(sb) + orderByExpression;
574574

575-
if (offset.HasValue && offset.Value < 0)
575+
if (offset is < 0)
576576
throw new ArgumentException($"Skip value:'{offset.Value}' must be>=0");
577577

578-
if (rows.HasValue && rows.Value < 0)
578+
if (rows is < 0)
579579
throw new ArgumentException($"Rows value:'{rows.Value}' must be>=0");
580580

581581
var skip = offset ?? 0;
582582
var take = rows ?? int.MaxValue;
583583

584584
var selectType = selectExpression.StartsWithIgnoreCase("SELECT DISTINCT") ? "SELECT DISTINCT" : "SELECT";
585585

586-
//Temporary hack till we come up with a more robust paging sln for SqlServer
586+
//Temp hack for SqlServer <= 2008
587587
if (skip == 0)
588588
{
589589
var sql = StringBuilderCache.ReturnAndFree(sb) + orderByExpression;

src/ServiceStack.OrmLite.VistaDB/VistaDbDialectProvider.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,8 @@ public override string ToChangeColumnNameStatement(Type modelType, FieldDefiniti
389389
}
390390

391391
/// Limit/Offset paging logic needs to be implemented here:
392-
public override string ToSelectStatement(
393-
ModelDefinition modelDef, string selectExpression, string bodyExpression, string orderByExpression = null, int? offset = null, int? rows = null)
392+
public override string ToSelectStatement(QueryType queryType, ModelDefinition modelDef, string selectExpression,
393+
string bodyExpression, string orderByExpression = null, int? offset = null, int? rows = null)
394394
{
395395
var sb = StringBuilderCache.Allocate()
396396
.Append(selectExpression)
@@ -399,7 +399,7 @@ public override string ToSelectStatement(
399399
var hasOrderBy = !string.IsNullOrWhiteSpace(orderByExpression);
400400

401401
var skip = offset.GetValueOrDefault();
402-
if ((skip > 0 || rows.HasValue) && !hasOrderBy)
402+
if (queryType == QueryType.Select && (skip > 0 || rows.HasValue) && !hasOrderBy)
403403
{
404404
hasOrderBy = true;
405405
//Ordering by the first column in select list
@@ -409,15 +409,18 @@ public override string ToSelectStatement(
409409
if (hasOrderBy)
410410
sb.Append(orderByExpression);
411411

412-
if (skip > 0)
413-
sb.Append(this.GetPagingOffsetExpression(skip));
414-
415-
if (rows.HasValue)
412+
if (queryType == QueryType.Select)
416413
{
417-
if (skip == 0)
418-
sb.Append(this.GetPagingOffsetExpression(0));
414+
if (skip > 0)
415+
sb.Append(this.GetPagingOffsetExpression(skip));
416+
417+
if (rows.HasValue)
418+
{
419+
if (skip == 0)
420+
sb.Append(this.GetPagingOffsetExpression(0));
419421

420-
sb.Append(this.GetPagingFetchExpression(rows.Value));
422+
sb.Append(this.GetPagingFetchExpression(rows.Value));
423+
}
421424
}
422425

423426
return StringBuilderCache.ReturnAndFree(sb);

src/ServiceStack.OrmLite/Async/OrmLiteResultsFilterExtensionsAsync.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public static Task<object> ScalarAsync(this IDbCommand dbCmd)
181181

182182
public static Task<object> ScalarAsync(this IDbCommand dbCmd, ISqlExpression expression, CancellationToken token)
183183
{
184-
dbCmd.PopulateWith(expression);
184+
dbCmd.PopulateWith(expression, QueryType.Scalar);
185185

186186
if (OrmLiteConfig.ResultsFilter != null)
187187
return OrmLiteConfig.ResultsFilter.GetScalar(dbCmd).InTask();

src/ServiceStack.OrmLite/Async/ReadExpressionCommandExtensionsAsync.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,68 +38,68 @@ internal static Task<List<T>> SelectAsync<T>(this IDbCommand dbCmd, Expression<F
3838
internal static Task<List<Tuple<T, T2>>> SelectMultiAsync<T, T2>(this IDbCommand dbCmd, SqlExpression<T> q, CancellationToken token)
3939
{
4040
q.Select(q.CreateMultiSelect<T, T2, EOT, EOT, EOT, EOT, EOT>(dbCmd.GetDialectProvider()));
41-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2>>(q.ToSelectStatement(), q.Params, q.OnlyFields, token);
41+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2>>(q.ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
4242
}
4343

4444
internal static Task<List<Tuple<T, T2, T3>>> SelectMultiAsync<T, T2, T3>(this IDbCommand dbCmd, SqlExpression<T> q, CancellationToken token)
4545
{
4646
q.Select(q.CreateMultiSelect<T, T2, T3, EOT, EOT, EOT, EOT>(dbCmd.GetDialectProvider()));
47-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3>>(q.ToSelectStatement(), q.Params, q.OnlyFields, token);
47+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3>>(q.ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
4848
}
4949

5050
internal static Task<List<Tuple<T, T2, T3, T4>>> SelectMultiAsync<T, T2, T3, T4>(this IDbCommand dbCmd, SqlExpression<T> q, CancellationToken token)
5151
{
5252
q.Select(q.CreateMultiSelect<T, T2, T3, T4, EOT, EOT, EOT>(dbCmd.GetDialectProvider()));
53-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4>>(q.ToSelectStatement(), q.Params, q.OnlyFields, token);
53+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4>>(q.ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
5454
}
5555

5656
internal static Task<List<Tuple<T, T2, T3, T4, T5>>> SelectMultiAsync<T, T2, T3, T4, T5>(this IDbCommand dbCmd, SqlExpression<T> q, CancellationToken token)
5757
{
5858
q.Select(q.CreateMultiSelect<T, T2, T3, T4, T5, EOT, EOT>(dbCmd.GetDialectProvider()));
59-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5>>(q.ToSelectStatement(), q.Params, q.OnlyFields, token);
59+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5>>(q.ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
6060
}
6161

6262
internal static Task<List<Tuple<T, T2, T3, T4, T5, T6>>> SelectMultiAsync<T, T2, T3, T4, T5, T6>(this IDbCommand dbCmd, SqlExpression<T> q, CancellationToken token)
6363
{
6464
q.Select(q.CreateMultiSelect<T, T2, T3, T4, T5, T6, EOT>(dbCmd.GetDialectProvider()));
65-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6>>(q.ToSelectStatement(), q.Params, q.OnlyFields, token);
65+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6>>(q.ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
6666
}
6767

6868
internal static Task<List<Tuple<T, T2, T3, T4, T5, T6, T7>>> SelectMultiAsync<T, T2, T3, T4, T5, T6, T7>(this IDbCommand dbCmd, SqlExpression<T> q, CancellationToken token)
6969
{
7070
q.Select(q.CreateMultiSelect<T, T2, T3, T4, T5, T6, T7>(dbCmd.GetDialectProvider()));
71-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6, T7>>(q.ToSelectStatement(), q.Params, q.OnlyFields, token);
71+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6, T7>>(q.ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
7272
}
7373

7474

7575
internal static Task<List<Tuple<T, T2>>> SelectMultiAsync<T, T2>(this IDbCommand dbCmd, SqlExpression<T> q, string[] tableSelects, CancellationToken token)
7676
{
77-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(), q.Params, q.OnlyFields, token);
77+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
7878
}
7979

8080
internal static Task<List<Tuple<T, T2, T3>>> SelectMultiAsync<T, T2, T3>(this IDbCommand dbCmd, SqlExpression<T> q, string[] tableSelects, CancellationToken token)
8181
{
82-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(), q.Params, q.OnlyFields, token);
82+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
8383
}
8484

8585
internal static Task<List<Tuple<T, T2, T3, T4>>> SelectMultiAsync<T, T2, T3, T4>(this IDbCommand dbCmd, SqlExpression<T> q, string[] tableSelects, CancellationToken token)
8686
{
87-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(), q.Params, q.OnlyFields, token);
87+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
8888
}
8989

9090
internal static Task<List<Tuple<T, T2, T3, T4, T5>>> SelectMultiAsync<T, T2, T3, T4, T5>(this IDbCommand dbCmd, SqlExpression<T> q, string[] tableSelects, CancellationToken token)
9191
{
92-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(), q.Params, q.OnlyFields, token);
92+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
9393
}
9494

9595
internal static Task<List<Tuple<T, T2, T3, T4, T5, T6>>> SelectMultiAsync<T, T2, T3, T4, T5, T6>(this IDbCommand dbCmd, SqlExpression<T> q, string[] tableSelects, CancellationToken token)
9696
{
97-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(), q.Params, q.OnlyFields, token);
97+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
9898
}
9999

100100
internal static Task<List<Tuple<T, T2, T3, T4, T5, T6, T7>>> SelectMultiAsync<T, T2, T3, T4, T5, T6, T7>(this IDbCommand dbCmd, SqlExpression<T> q, string[] tableSelects, CancellationToken token)
101101
{
102-
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6, T7>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(), q.Params, q.OnlyFields, token);
102+
return dbCmd.ExprConvertToListAsync<Tuple<T, T2, T3, T4, T5, T6, T7>>(q.Select(q.CreateMultiSelect(tableSelects)).ToSelectStatement(QueryType.Select), q.Params, q.OnlyFields, token);
103103
}
104104

105105

@@ -164,7 +164,7 @@ internal static async Task<long> GetCountAsync(this IDbCommand dbCmd, string sql
164164
internal static Task<long> RowCountAsync<T>(this IDbCommand dbCmd, SqlExpression<T> expression, CancellationToken token)
165165
{
166166
var countExpr = expression.Clone().OrderBy();
167-
return dbCmd.ScalarAsync<long>(dbCmd.GetDialectProvider().ToRowCountStatement(countExpr.ToSelectStatement()), countExpr.Params, token);
167+
return dbCmd.ScalarAsync<long>(dbCmd.GetDialectProvider().ToRowCountStatement(countExpr.ToSelectStatement(QueryType.Scalar)), countExpr.Params, token);
168168
}
169169

170170
internal static Task<long> RowCountAsync(this IDbCommand dbCmd, string sql, object anonType, CancellationToken token)

src/ServiceStack.OrmLite/Expressions/IUntypedSqlExpression.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,9 +620,10 @@ public string ToDeleteRowStatement()
620620
return q.ToDeleteRowStatement();
621621
}
622622

623-
public string ToSelectStatement()
623+
public string ToSelectStatement() => ToSelectStatement(QueryType.Select);
624+
public string ToSelectStatement(QueryType forType)
624625
{
625-
return q.ToSelectStatement();
626+
return q.ToSelectStatement(forType);
626627
}
627628

628629
public string ToCountStatement()

0 commit comments

Comments
 (0)