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 org.mybatis.dynamic.sql.exception.InvalidSqlException;
19 import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
20 import org.mybatis.dynamic.sql.render.RenderingContext;
21 import org.mybatis.dynamic.sql.select.PagingModel;
22 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
23 import org.mybatis.dynamic.sql.util.InternalError;
24 import org.mybatis.dynamic.sql.util.Messages;
25
26 public class FetchFirstPagingModelRenderer {
27 private final RenderingContext renderingContext;
28 private final PagingModel pagingModel;
29
30 public FetchFirstPagingModelRenderer(RenderingContext renderingContext, PagingModel pagingModel) {
31 this.renderingContext = renderingContext;
32 this.pagingModel = pagingModel;
33 }
34
35 public FragmentAndParameters render() {
36 return pagingModel.offset()
37 .map(this::renderWithOffset)
38 .orElseGet(this::renderFetchFirstRowsOnly);
39 }
40
41 private FragmentAndParameters renderWithOffset(Long offset) {
42 return pagingModel.fetchFirstRows()
43 .map(ffr -> renderOffsetAndFetchFirstRows(offset, ffr))
44 .orElseGet(() -> renderOffsetOnly(offset));
45 }
46
47 private FragmentAndParameters renderFetchFirstRowsOnly() {
48 return pagingModel.fetchFirstRows().map(this::renderFetchFirstRowsOnly)
49 .orElseThrow(() ->
50 new InvalidSqlException(Messages.getInternalErrorString(InternalError.INTERNAL_ERROR_13)));
51 }
52
53 private FragmentAndParameters renderFetchFirstRowsOnly(Long fetchFirstRows) {
54 RenderedParameterInfo fetchFirstParameterInfo = renderingContext.calculateFetchFirstRowsParameterInfo();
55 return FragmentAndParameters
56 .withFragment("fetch first " + fetchFirstParameterInfo.renderedPlaceHolder()
57 + " rows only")
58 .withParameter(fetchFirstParameterInfo.parameterMapKey(), fetchFirstRows)
59 .build();
60 }
61
62 private FragmentAndParameters renderOffsetOnly(Long offset) {
63 RenderedParameterInfo offsetParameterInfo = renderingContext.calculateOffsetParameterInfo();
64 return FragmentAndParameters.withFragment("offset " + offsetParameterInfo.renderedPlaceHolder()
65 + " rows")
66 .withParameter(offsetParameterInfo.parameterMapKey(), offset)
67 .build();
68 }
69
70 private FragmentAndParameters renderOffsetAndFetchFirstRows(Long offset, Long fetchFirstRows) {
71 RenderedParameterInfo offsetParameterInfo = renderingContext.calculateOffsetParameterInfo();
72 RenderedParameterInfo fetchFirstParameterInfo = renderingContext.calculateFetchFirstRowsParameterInfo();
73 return FragmentAndParameters.withFragment("offset " + offsetParameterInfo.renderedPlaceHolder()
74 + " rows fetch first " + fetchFirstParameterInfo.renderedPlaceHolder()
75 + " rows only")
76 .withParameter(offsetParameterInfo.parameterMapKey(), offset)
77 .withParameter(fetchFirstParameterInfo.parameterMapKey(), fetchFirstRows)
78 .build();
79 }
80 }