1
1
/**
2
- * Copyright 2016-2018 the original author or authors.
2
+ * Copyright 2016-2019 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
15
15
*/
16
16
package org .mybatis .dynamic .sql .select .render ;
17
17
18
+ import java .util .Map ;
18
19
import java .util .Objects ;
19
20
import java .util .Optional ;
20
21
import java .util .concurrent .atomic .AtomicInteger ;
21
22
23
+ import org .mybatis .dynamic .sql .BindableColumn ;
22
24
import org .mybatis .dynamic .sql .SortSpecification ;
25
+ import org .mybatis .dynamic .sql .SqlColumn ;
23
26
import org .mybatis .dynamic .sql .render .RenderingStrategy ;
24
27
import org .mybatis .dynamic .sql .select .OrderByModel ;
25
28
import org .mybatis .dynamic .sql .select .QueryExpressionModel ;
26
29
import org .mybatis .dynamic .sql .select .SelectModel ;
27
30
import org .mybatis .dynamic .sql .util .CustomCollectors ;
28
31
29
32
public class SelectRenderer {
33
+ private static final String LIMIT_PARAMETER = "_limit" ; //$NON-NLS-1$
34
+ private static final String OFFSET_PARAMETER = "_offset" ; //$NON-NLS-1$
30
35
private SelectModel selectModel ;
31
36
private RenderingStrategy renderingStrategy ;
32
37
private AtomicInteger sequence ;
@@ -42,9 +47,15 @@ public SelectStatementProvider render() {
42
47
.mapQueryExpressions (this ::renderQueryExpression )
43
48
.collect (QueryExpressionCollector .collect ());
44
49
50
+ Map <String , Object > parameters = collector .parameters ();
51
+ Optional <String > limitClause = selectModel .limit ().map (l -> renderLimit (parameters , l ));
52
+ Optional <String > offsetClause = selectModel .offset ().map (o -> renderOffset (parameters , o ));
53
+
45
54
return DefaultSelectStatementProvider .withQueryExpression (collector .queryExpression ())
46
- .withParameters (collector . parameters () )
55
+ .withParameters (parameters )
47
56
.withOrderByClause (selectModel .orderByModel ().map (this ::renderOrderBy ))
57
+ .withLimitClause (limitClause )
58
+ .withOffsetClause (offsetClause )
48
59
.build ();
49
60
}
50
61
@@ -69,6 +80,20 @@ private String orderByPhrase(SortSpecification column) {
69
80
return phrase ;
70
81
}
71
82
83
+ private String renderLimit (Map <String , Object > parameters , Long limit ) {
84
+ BindableColumn <Integer > bc = SqlColumn .of (LIMIT_PARAMETER );
85
+ String placeholder = renderingStrategy .getFormattedJdbcPlaceholder (bc , "parameters" , LIMIT_PARAMETER ); //$NON-NLS-1$
86
+ parameters .put (LIMIT_PARAMETER , limit );
87
+ return "limit " + placeholder ; //$NON-NLS-1$
88
+ }
89
+
90
+ private String renderOffset (Map <String , Object > parameters , Long offset ) {
91
+ BindableColumn <Integer > bc = SqlColumn .of (OFFSET_PARAMETER );
92
+ String placeholder = renderingStrategy .getFormattedJdbcPlaceholder (bc , "parameters" , OFFSET_PARAMETER ); //$NON-NLS-1$
93
+ parameters .put (OFFSET_PARAMETER , offset );
94
+ return "offset " + placeholder ; //$NON-NLS-1$
95
+ }
96
+
72
97
public static Builder withSelectModel (SelectModel selectModel ) {
73
98
return new Builder ().withSelectModel (selectModel );
74
99
}
0 commit comments