From ffce2bc550b19c2592a94a7027af1630cf0ec73d Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Sat, 17 Aug 2024 09:10:24 -0400 Subject: [PATCH] Improvements to the Paging Implementation --- .../dynamic/sql/select/MultiSelectDSL.java | 33 +++++++------------ .../mybatis/dynamic/sql/select/PagingDSL.java | 1 + .../mybatis/dynamic/sql/select/SelectDSL.java | 33 +++++++------------ 3 files changed, 23 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java index 6b01f3696..42a20e551 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java @@ -65,19 +65,19 @@ public MultiSelectDSL orderBy(Collection columns) { @Override public LimitFinisher limitWhenPresent(Long limit) { this.limit = limit; - return new LF(); + return new LocalLimitFinisher(); } @Override public OffsetFirstFinisher offsetWhenPresent(Long offset) { this.offset = offset; - return new OFF(); + return new LocalOffsetFirstFinisher(); } @Override public FetchFirstFinisher fetchFirstWhenPresent(Long fetchFirstRows) { this.fetchFirstRows = fetchFirstRows; - return new FFF(); + return () -> MultiSelectDSL.this; } @NotNull @@ -106,20 +106,7 @@ public MultiSelectDSL configureStatement(Consumer consum return this; } - class FFF implements FetchFirstFinisher { - @Override - public Buildable rowsOnly() { - return MultiSelectDSL.this; - } - } - - class LF implements LimitFinisher { - @Override - public Buildable offsetWhenPresent(Long offset) { - MultiSelectDSL.this.offset = offset; - return MultiSelectDSL.this; - } - + abstract class BaseBuildable implements Buildable { @NotNull @Override public MultiSelectModel build() { @@ -127,17 +114,19 @@ public MultiSelectModel build() { } } - class OFF implements OffsetFirstFinisher { + class LocalOffsetFirstFinisher extends BaseBuildable implements OffsetFirstFinisher { @Override public FetchFirstFinisher fetchFirstWhenPresent(Long fetchFirstRows) { MultiSelectDSL.this.fetchFirstRows = fetchFirstRows; - return new FFF(); + return () -> MultiSelectDSL.this; } + } - @NotNull + class LocalLimitFinisher extends BaseBuildable implements LimitFinisher { @Override - public MultiSelectModel build() { - return MultiSelectDSL.this.build(); + public Buildable offsetWhenPresent(Long offset) { + MultiSelectDSL.this.offset = offset; + return MultiSelectDSL.this; } } } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/PagingDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/PagingDSL.java index 89cfafafb..0d86e5e9a 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/PagingDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/PagingDSL.java @@ -52,6 +52,7 @@ default FetchFirstFinisher fetchFirst(long fetchFirstRows) { FetchFirstFinisher fetchFirstWhenPresent(Long fetchFirstRows); } + @FunctionalInterface interface FetchFirstFinisher { Buildable rowsOnly(); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java index 82e55aefb..4b5ef2077 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java @@ -109,17 +109,17 @@ void orderBy(Collection columns) { public LimitFinisher limitWhenPresent(Long limit) { this.limit = limit; - return new LF(); + return new LocalLimitFinisher(); } public OffsetFirstFinisher offsetWhenPresent(Long offset) { this.offset = offset; - return new OFF(); + return new LocalOffsetFirstFinisher(); } public FetchFirstFinisher fetchFirstWhenPresent(Long fetchFirstRows) { this.fetchFirstRows = fetchFirstRows; - return new FFF(); + return () -> SelectDSL.this; } @Override @@ -153,20 +153,7 @@ private Optional buildPagingModel() { .build(); } - class FFF implements FetchFirstFinisher { - @Override - public Buildable rowsOnly() { - return SelectDSL.this; - } - } - - class LF implements LimitFinisher { - @Override - public Buildable offsetWhenPresent(Long offset) { - SelectDSL.this.offset = offset; - return SelectDSL.this; - } - + abstract class BaseBuildable implements Buildable { @NotNull @Override public R build() { @@ -174,17 +161,19 @@ public R build() { } } - class OFF implements OffsetFirstFinisher { + class LocalOffsetFirstFinisher extends BaseBuildable implements OffsetFirstFinisher { @Override public FetchFirstFinisher fetchFirstWhenPresent(Long fetchFirstRows) { SelectDSL.this.fetchFirstRows = fetchFirstRows; - return new FFF(); + return () -> SelectDSL.this; } + } - @NotNull + class LocalLimitFinisher extends BaseBuildable implements LimitFinisher { @Override - public R build() { - return SelectDSL.this.build(); + public Buildable offsetWhenPresent(Long offset) { + SelectDSL.this.offset = offset; + return SelectDSL.this; } } }