package sample.context.orm; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import lombok.Data; import lombok.Value; import sample.context.Dto; /** * ソート情報を表現します。 * 複数件のソート情報(SortOrder)を内包します。 */ @Data public class Sort implements Dto { private static final long serialVersionUID = 1L; /** ソート条件 */ private final List<SortOrder> orders = new ArrayList<SortOrder>(); /** ソート条件を追加します。 */ public Sort add(SortOrder order) { orders.add(order); return this; } /** ソート条件(昇順)を追加します。 */ public Sort asc(String property) { return add(SortOrder.asc(property)); } /** ソート条件(降順)を追加します。 */ public Sort desc(String property) { return add(SortOrder.desc(property)); } /** ソート条件一覧を返します。 */ public List<SortOrder> orders() { return orders; } /** ソート条件が未指定だった際にソート順が上書きされます。 */ public Sort ifEmpty(SortOrder... items) { if (orders.isEmpty() && items != null) { orders.addAll(Arrays.asList(items)); } return this; } /** 昇順でソート情報を返します。 */ public static Sort ascBy(String property) { return new Sort().asc(property); } /** 降順でソート情報を返します。 */ public static Sort descBy(String property) { return new Sort().desc(property); } /** フィールド単位のソート情報を表現します。 */ @Value public static class SortOrder implements Serializable { private static final long serialVersionUID = 1L; private String property; private boolean ascending; public static SortOrder asc(String property) { return new SortOrder(property, true); } public static SortOrder desc(String property) { return new SortOrder(property, false); } } }