Skip to content

Commit 9e16e9d

Browse files
committed
Turn LimitOffset into Limit and Offset
1 parent 190aa7f commit 9e16e9d

File tree

4 files changed

+94
-94
lines changed

4 files changed

+94
-94
lines changed

QueryBuilder.Tests/GeneralTests.cs

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ public void OneLimitPerEngine()
274274
.ForSqlServer(q => q.Limit(5))
275275
.ForSqlServer(q => q.Limit(10));
276276

277-
var limits = query.GetComponents<LimitOffset>("limit", EngineCodes.SqlServer);
277+
var limits = query.GetComponents<LimitClause>("limit", EngineCodes.SqlServer);
278278
Assert.Single(limits);
279279
Assert.Equal(10, limits.Single().Limit);
280280
}
@@ -295,27 +295,14 @@ public void CompilerSpecificLimit()
295295
Assert.Equal("SELECT * FROM `mytable`", c[EngineCodes.MySql].ToString());
296296
}
297297

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-
311298
[Fact]
312299
public void OneOffsetPerEngine()
313300
{
314301
var query = new Query("mytable")
315302
.ForSqlServer(q => q.Offset(5))
316303
.ForSqlServer(q => q.Offset(10));
317304

318-
var limits = query.GetComponents<LimitOffset>("limit", EngineCodes.SqlServer);
305+
var limits = query.GetComponents<OffsetClause>("offset", EngineCodes.SqlServer);
319306
Assert.Single(limits);
320307
Assert.Equal(10, limits.Single().Offset);
321308
}
@@ -330,27 +317,29 @@ public void CompilerSpecificOffset()
330317
var engines = new[] { EngineCodes.SqlServer, EngineCodes.MySql, EngineCodes.PostgreSql };
331318
var c = Compilers.Compile(engines, query);
332319

333-
Assert.Equal(2, query.GetComponents("limit").Count());
320+
Assert.Equal(2, query.GetComponents("offset").Count());
334321
Assert.Equal("SELECT * FROM `mytable` LIMIT 18446744073709551615 OFFSET 5", c[EngineCodes.MySql].ToString());
335322
Assert.Equal("SELECT * FROM \"mytable\" OFFSET 10", c[EngineCodes.PostgreSql].ToString());
336323
Assert.Equal("SELECT * FROM [mytable]", c[EngineCodes.SqlServer].ToString());
337324
}
338325

339326
[Fact]
340-
public void Offset_Preserves_Limit()
327+
public void Limit_Takes_Generic_If_Needed()
341328
{
342329
var query = new Query("mytable")
343-
.Limit(5);
344-
query.Offset(10);
330+
.Limit(5)
331+
.Offset(10)
332+
.ForPostgreSql(q => q.Offset(20));
345333

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);
334+
var engines = new[] { EngineCodes.MySql, EngineCodes.PostgreSql };
335+
var c = Compilers.Compile(engines, query);
336+
337+
Assert.Equal("SELECT * FROM `mytable` LIMIT 5 OFFSET 10", c[EngineCodes.MySql].ToString());
338+
Assert.Equal("SELECT * FROM \"mytable\" LIMIT 5 OFFSET 20", c[EngineCodes.PostgreSql].ToString());
350339
}
351340

352341
[Fact]
353-
public void LimitOffset_Takes_Generic_If_Needed()
342+
public void Offset_Takes_Generic_If_Needed()
354343
{
355344
var query = new Query("mytable")
356345
.Limit(5)
@@ -363,5 +352,37 @@ public void LimitOffset_Takes_Generic_If_Needed()
363352
Assert.Equal("SELECT * FROM `mytable` LIMIT 5 OFFSET 10", c[EngineCodes.MySql].ToString());
364353
Assert.Equal("SELECT * FROM \"mytable\" LIMIT 20 OFFSET 10", c[EngineCodes.PostgreSql].ToString());
365354
}
355+
356+
[Fact]
357+
public void Can_Change_Generic_Limit_After_SpecificOffset()
358+
{
359+
var query = new Query("mytable")
360+
.Limit(5)
361+
.Offset(10)
362+
.ForPostgreSql(q => q.Offset(20))
363+
.Limit(7);
364+
365+
var engines = new[] { EngineCodes.MySql, EngineCodes.PostgreSql };
366+
var c = Compilers.Compile(engines, query);
367+
368+
Assert.Equal("SELECT * FROM `mytable` LIMIT 7 OFFSET 10", c[EngineCodes.MySql].ToString());
369+
Assert.Equal("SELECT * FROM \"mytable\" LIMIT 7 OFFSET 20", c[EngineCodes.PostgreSql].ToString());
370+
}
371+
372+
[Fact]
373+
public void Can_Change_Generic_Offset_After_SpecificLimit()
374+
{
375+
var query = new Query("mytable")
376+
.Limit(5)
377+
.Offset(10)
378+
.ForPostgreSql(q => q.Limit(20))
379+
.Offset(7);
380+
381+
var engines = new[] { EngineCodes.MySql, EngineCodes.PostgreSql };
382+
var c = Compilers.Compile(engines, query);
383+
384+
Assert.Equal("SELECT * FROM `mytable` LIMIT 5 OFFSET 7", c[EngineCodes.MySql].ToString());
385+
Assert.Equal("SELECT * FROM \"mytable\" LIMIT 20 OFFSET 7", c[EngineCodes.PostgreSql].ToString());
386+
}
366387
}
367388
}

QueryBuilder/Clauses/LimitClause.cs

Lines changed: 5 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,32 @@
11
namespace SqlKata
22
{
3-
public class LimitOffset : AbstractClause
3+
public class LimitClause : AbstractClause
44
{
55
private int _limit;
6-
private int _offset;
7-
6+
87
public int Limit
98
{
109
get => _limit;
11-
12-
set
13-
{
14-
if (value > 0)
15-
{
16-
_limit = value;
17-
}
18-
}
19-
}
20-
21-
public int Offset
22-
{
23-
get => _offset;
24-
25-
set
26-
{
27-
if (value > 0)
28-
{
29-
_offset = value;
30-
}
31-
}
10+
set => _limit = value > 0 ? value : _limit;
3211
}
3312

3413
public bool HasLimit()
3514
{
3615
return _limit > 0;
3716
}
3817

39-
public bool HasOffset()
40-
{
41-
return _offset > 0;
42-
}
43-
44-
public LimitOffset ClearLimit()
18+
public LimitClause Clear()
4519
{
4620
_limit = 0;
4721
return this;
4822
}
4923

50-
public LimitOffset ClearOffset()
51-
{
52-
_offset = 0;
53-
return this;
54-
}
55-
56-
public LimitOffset Clear()
57-
{
58-
return ClearLimit().ClearOffset();
59-
}
60-
6124
/// <inheritdoc />
6225
public override AbstractClause Clone()
6326
{
64-
return new LimitOffset
27+
return new LimitClause
6528
{
6629
Engine = Engine,
67-
Offset = Offset,
6830
Limit = Limit,
6931
Component = Component,
7032
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
namespace SqlKata
2+
{
3+
public class OffsetClause : AbstractClause
4+
{
5+
private int _offset;
6+
7+
public int Offset
8+
{
9+
get => _offset;
10+
set => _offset = value > 0 ? value : _offset;
11+
}
12+
13+
public bool HasOffset()
14+
{
15+
return _offset > 0;
16+
}
17+
18+
public OffsetClause Clear()
19+
{
20+
_offset = 0;
21+
return this;
22+
}
23+
24+
/// <inheritdoc />
25+
public override AbstractClause Clone()
26+
{
27+
return new OffsetClause
28+
{
29+
Engine = Engine,
30+
Offset = Offset,
31+
Component = Component,
32+
};
33+
}
34+
}
35+
}

QueryBuilder/Query.cs

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,36 +23,24 @@ public Query(string table, string comment = null) : base()
2323
}
2424

2525

26-
public bool HasOffset(string engineCode = null)
27-
{
28-
engineCode = engineCode ?? EngineScope;
29-
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
30-
31-
return limitOffset?.HasOffset() ?? false;
32-
}
26+
public bool HasOffset(string engineCode = null) => GetOffset(engineCode) > 0;
3327

34-
public bool HasLimit(string engineCode = null)
35-
{
36-
engineCode = engineCode ?? EngineScope;
37-
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
38-
39-
return limitOffset?.HasLimit() ?? false;
40-
}
28+
public bool HasLimit(string engineCode = null) => GetLimit(engineCode) > 0;
4129

4230
internal int GetOffset(string engineCode = null)
4331
{
4432
engineCode = engineCode ?? EngineScope;
45-
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
33+
var offset = this.GetOneComponent<OffsetClause>("offset", engineCode);
4634

47-
return limitOffset?.Offset ?? 0;
35+
return offset?.Offset ?? 0;
4836
}
4937

5038
internal int GetLimit(string engineCode = null)
5139
{
5240
engineCode = engineCode ?? EngineScope;
53-
var limitOffset = this.GetOneComponent<LimitOffset>("limit", engineCode);
41+
var limit = this.GetOneComponent<LimitClause>("limit", engineCode);
5442

55-
return limitOffset?.Limit ?? 0;
43+
return limit?.Limit ?? 0;
5644
}
5745

5846
public override Query Clone()
@@ -138,28 +126,22 @@ public Query WithRaw(string alias, string sql, params object[] bindings)
138126

139127
public Query Limit(int value)
140128
{
141-
var newClause = new LimitOffset
129+
var newClause = new LimitClause
142130
{
143131
Limit = value
144132
};
145133

146-
if (GetOneComponent("limit", EngineScope) is LimitOffset currentClause)
147-
newClause.Offset = currentClause.Offset;
148-
149134
return AddOrReplaceComponent("limit", newClause);
150135
}
151136

152137
public Query Offset(int value)
153138
{
154-
var newClause = new LimitOffset
139+
var newClause = new OffsetClause
155140
{
156141
Offset = value
157142
};
158143

159-
if (GetOneComponent("limit", EngineScope) is LimitOffset currentClause)
160-
newClause.Limit = currentClause.Limit;
161-
162-
return AddOrReplaceComponent("limit", newClause);
144+
return AddOrReplaceComponent("offset", newClause);
163145
}
164146

165147
/// <summary>

0 commit comments

Comments
 (0)