1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.dynamic.sql.select.render;
17
18 import java.util.Objects;
19
20 import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
21 import org.mybatis.dynamic.sql.render.RenderingContext;
22 import org.mybatis.dynamic.sql.select.PagingModel;
23 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
24
25 public class LimitAndOffsetPagingModelRenderer {
26 private final RenderingContext renderingContext;
27 private final Long limit;
28 private final PagingModel pagingModel;
29
30 public LimitAndOffsetPagingModelRenderer(RenderingContext renderingContext,
31 Long limit, PagingModel pagingModel) {
32 this.renderingContext = renderingContext;
33 this.limit = Objects.requireNonNull(limit);
34 this.pagingModel = pagingModel;
35 }
36
37 public FragmentAndParameters render() {
38 return pagingModel.offset().map(this::renderLimitAndOffset)
39 .orElseGet(this::renderLimitOnly);
40 }
41
42 private FragmentAndParameters renderLimitOnly() {
43 RenderedParameterInfo limitParameterInfo = renderingContext.calculateLimitParameterInfo();
44 return FragmentAndParameters.withFragment("limit " + limitParameterInfo.renderedPlaceHolder())
45 .withParameter(limitParameterInfo.parameterMapKey(), limit)
46 .build();
47 }
48
49 private FragmentAndParameters renderLimitAndOffset(Long offset) {
50 RenderedParameterInfo limitParameterInfo = renderingContext.calculateLimitParameterInfo();
51 RenderedParameterInfo offsetParameterInfo = renderingContext.calculateOffsetParameterInfo();
52 return FragmentAndParameters.withFragment("limit " + limitParameterInfo.renderedPlaceHolder()
53 + " offset " + offsetParameterInfo.renderedPlaceHolder())
54 .withParameter(limitParameterInfo.parameterMapKey(), limit)
55 .withParameter(offsetParameterInfo.parameterMapKey(), offset)
56 .build();
57 }
58 }