Skip to content

Commit 0576659

Browse files
committed
Use AddOrReplaceComponent in Limit and Offset
1 parent 293184a commit 0576659

File tree

3 files changed

+101
-21
lines changed

3 files changed

+101
-21
lines changed

QueryBuilder.Tests/GeneralTests.cs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,5 +266,87 @@ public void AddOrReplace_Throws_MoreThanOne()
266266
Action act = () => query.AddOrReplaceComponent("where", new BasicCondition());
267267
Assert.Throws<InvalidOperationException>(act);
268268
}
269+
270+
[Fact]
271+
public void OneLimitPerEngine()
272+
{
273+
var query = new Query("mytable")
274+
.ForSqlServer(q => q.Limit(5))
275+
.ForSqlServer(q => q.Limit(10));
276+
277+
var limits = query.GetComponents<LimitOffset>("limit", EngineCodes.SqlServer);
278+
Assert.Single(limits);
279+
Assert.Equal(10, limits.Single().Limit);
280+
}
281+
282+
[Fact]
283+
public void CompilerSpecificLimit()
284+
{
285+
var query = new Query("mytable")
286+
.ForSqlServer(q => q.Limit(5))
287+
.ForPostgreSql(q => q.Limit(10));
288+
289+
var engines = new[] { EngineCodes.SqlServer, EngineCodes.MySql, EngineCodes.PostgreSql };
290+
var c = Compilers.Compile(engines, query);
291+
292+
Assert.Equal(2, query.GetComponents("limit").Count());
293+
Assert.Equal("SELECT TOP (5) * FROM [mytable]", c[EngineCodes.SqlServer].ToString());
294+
Assert.Equal("SELECT * FROM \"mytable\" LIMIT 10", c[EngineCodes.PostgreSql].ToString());
295+
Assert.Equal("SELECT * FROM `mytable`", c[EngineCodes.MySql].ToString());
296+
}
297+
298+
[Fact]
299+
public void Limit_Preserves_Offset()
300+
{
301+
var query = new Query("mytable")
302+
.Offset(5);
303+
query.Limit(10);
304+
305+
var limits = query.GetComponents<LimitOffset>("limit");
306+
Assert.Single(limits);
307+
Assert.Equal(5, limits.Single().Offset);
308+
Assert.Equal(10, limits.Single().Limit);
309+
}
310+
311+
[Fact]
312+
public void OneOffsetPerEngine()
313+
{
314+
var query = new Query("mytable")
315+
.ForSqlServer(q => q.Offset(5))
316+
.ForSqlServer(q => q.Offset(10));
317+
318+
var limits = query.GetComponents<LimitOffset>("limit", EngineCodes.SqlServer);
319+
Assert.Single(limits);
320+
Assert.Equal(10, limits.Single().Offset);
321+
}
322+
323+
[Fact]
324+
public void CompilerSpecificOffset()
325+
{
326+
var query = new Query("mytable")
327+
.ForMySql(q => q.Offset(5))
328+
.ForPostgreSql(q => q.Offset(10));
329+
330+
var engines = new[] { EngineCodes.SqlServer, EngineCodes.MySql, EngineCodes.PostgreSql };
331+
var c = Compilers.Compile(engines, query);
332+
333+
Assert.Equal(2, query.GetComponents("limit").Count());
334+
Assert.Equal("SELECT * FROM `mytable` LIMIT 18446744073709551615 OFFSET 5", c[EngineCodes.MySql].ToString());
335+
Assert.Equal("SELECT * FROM \"mytable\" OFFSET 10", c[EngineCodes.PostgreSql].ToString());
336+
Assert.Equal("SELECT * FROM [mytable]", c[EngineCodes.SqlServer].ToString());
337+
}
338+
339+
[Fact]
340+
public void Offset_Preserves_Limit()
341+
{
342+
var query = new Query("mytable")
343+
.Limit(5);
344+
query.Offset(10);
345+
346+
var limits = query.GetComponents<LimitOffset>("limit");
347+
Assert.Single(limits);
348+
Assert.Equal(10, limits.Single().Offset);
349+
Assert.Equal(5, limits.Single().Limit);
350+
}
269351
}
270352
}

QueryBuilder/Compilers/SqlServerCompiler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public SqlServerCompiler()
1414

1515
protected override SqlResult CompileSelectQuery(Query query)
1616
{
17-
if (!UseLegacyPagination || !query.HasOffset())
17+
if (!UseLegacyPagination || !query.HasOffset(EngineCode))
1818
{
1919
return base.CompileSelectQuery(query);
2020
}

QueryBuilder/Query.cs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,31 @@ public Query(string table, string comment = null) : base()
2525

2626
public bool HasOffset(string engineCode = null)
2727
{
28+
engineCode = engineCode ?? EngineScope;
2829
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
2930

3031
return limitOffset?.HasOffset() ?? false;
3132
}
3233

3334
public bool HasLimit(string engineCode = null)
3435
{
36+
engineCode = engineCode ?? EngineScope;
3537
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
3638

3739
return limitOffset?.HasLimit() ?? false;
3840
}
3941

4042
internal int GetOffset(string engineCode = null)
4143
{
44+
engineCode = engineCode ?? EngineScope;
4245
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
4346

4447
return limitOffset?.Offset ?? 0;
4548
}
4649

4750
internal int GetLimit(string engineCode = null)
4851
{
52+
engineCode = engineCode ?? EngineScope;
4953
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
5054

5155
return limitOffset?.Limit ?? 0;
@@ -134,34 +138,28 @@ public Query WithRaw(string alias, string sql, params object[] bindings)
134138

135139
public Query Limit(int value)
136140
{
137-
var clause = GetOneComponent("limit", EngineScope) as LimitOffset;
138-
139-
if (clause != null)
140-
{
141-
clause.Limit = value;
142-
return this;
143-
}
144-
145-
return AddComponent("limit", new LimitOffset
141+
var newClause = new LimitOffset
146142
{
147143
Limit = value
148-
});
144+
};
145+
146+
if (GetOneComponent("limit", EngineScope) is LimitOffset currentClause)
147+
newClause.Offset = currentClause.Offset;
148+
149+
return AddOrReplaceComponent("limit", newClause);
149150
}
150151

151152
public Query Offset(int value)
152153
{
153-
var clause = GetOneComponent("limit", EngineScope) as LimitOffset;
154-
155-
if (clause != null)
156-
{
157-
clause.Offset = value;
158-
return this;
159-
}
160-
161-
return AddComponent("limit", new LimitOffset
154+
var newClause = new LimitOffset
162155
{
163156
Offset = value
164-
});
157+
};
158+
159+
if (GetOneComponent("limit", EngineScope) is LimitOffset currentClause)
160+
newClause.Limit = currentClause.Limit;
161+
162+
return AddOrReplaceComponent("limit", newClause);
165163
}
166164

167165
/// <summary>

0 commit comments

Comments
 (0)