11package tla .backend .es .query ;
22
33import java .util .Arrays ;
4+ import java .util .ArrayList ;
45
56import org .elasticsearch .search .sort .ScoreSortBuilder ;
67import org .elasticsearch .search .sort .SortBuilder ;
1415 * Representation of search order specifications.
1516 */
1617@ NoArgsConstructor
17- @ AllArgsConstructor
1818public class SortSpec {
1919
20- public static final String DELIMITER = "_" ;
21- /**
22- * an empty sort specification instance, whose {@link #primary()} method just returns
23- * a standard {@link ScoreSortBuilder}.
24- */
25- public static final SortSpec DEFAULT = new SortSpec ();
20+ public static final String DELIMITER = "_" ;
21+ /**
22+ * an empty sort specification instance, whose {@link #primary()} method just
23+ * returns a standard {@link ScoreSortBuilder}.
24+ */
25+ public static final SortSpec DEFAULT = new SortSpec ();
2626
27- /**
28- * name of field by whose value to order.
29- */
30- protected String field ;
31- /**
32- * sort order (i.e. {@link SortOrder.ASC} or {@link SortOrder.DESC})
33- */
34- protected SortOrder order ;
27+ protected ArrayList <FieldOrder > FieldOrders = new ArrayList <FieldOrder >();
3528
36- /**
37- * Create new sort spec configured for ascending order ({@link SortOrder.ASC}) on given field.
38- */
39- public SortSpec (String field ) {
40- this (field , SortOrder .ASC );
41- }
29+ /**
30+ * Create new sort spec configured for ascending order ({@link SortOrder.ASC})
31+ * on given field.
32+ */
33+ public SortSpec (FieldOrder FieldOrder ) {
34+ this .FieldOrders .add (FieldOrder );
35+ }
4236
43- /**
44- * Create a new sort specification instance with given field name and sort order (<code>"asc"</code>/<code>"desc"</code>).
45- */
46- public SortSpec (String field , String order ) {
47- this (
48- field ,
49- order .toLowerCase ().equals ("desc" ) ? SortOrder .DESC : SortOrder .ASC
50- );
51- }
37+ public SortSpec (ArrayList <FieldOrder > FieldOrders ) {
38+ this .FieldOrders = FieldOrders ;
39+ }
5240
53- /**
54- * Create a sort spec instance from a string consisting of a field name, followed by an order specifier (asc/desc),
55- * seperated by the delimiter character defined in {@link #DELIMITER}.
56- */
57- public static SortSpec from (String source ) {
58- if (source != null ) {
59- String [] segm = source .split (DELIMITER );
60- String field = String .join (
61- DELIMITER ,
62- Arrays .asList (segm ).subList (0 , segm .length - 1 )
63- );
64- if (segm .length > 1 ) {
65- return new SortSpec (field , segm [segm .length - 1 ]);
66- } else {
67- return new SortSpec (segm [0 ]);
68- }
69- } else {
70- return new SortSpec ("id" );
71- }
72- }
41+ public void addFieldOrder (FieldOrder FieldOrder ) {
42+ this .FieldOrders .add (FieldOrder );
43+ }
7344
74- public SortBuilder <?> primary () {
75- if (this .field != null ) {
76- return SortBuilders .fieldSort (this .field ).order (this .order );
77- } else {
78- return SortBuilders .scoreSort ();
79- }
80- }
45+ public static class FieldOrder {
46+ /**
47+ * name of field by whose value to order.
48+ */
49+ protected String field ;
50+ /**
51+ * sort order (i.e. {@link SortOrder.ASC} or {@link SortOrder.DESC})
52+ */
53+ protected SortOrder order ;
8154
82- public SortBuilder <?> secondary () {
83- return SortBuilders .fieldSort ("id" ).order (this .order );
84- }
55+ public FieldOrder (String field , SortOrder order ) {
56+ this .field = field ;
57+ this .order = order ;
58+ }
59+ }
8560
61+ /**
62+ * Create a sort spec instance from a string consisting of a field name,
63+ * followed by an order specifier (asc/desc), seperated by the delimiter
64+ * character defined in {@link #DELIMITER}.
65+ */
66+ public static SortSpec from (String source ) {
67+
68+ if (source != null ) {
69+ String [] segm = source .split (DELIMITER );
70+ String field = String .join (DELIMITER , Arrays .asList (segm ).subList (0 , segm .length - 1 ));
71+ ;
72+ if (segm .length > 1 ) {
73+ if (segm [segm .length - 1 ].equals ("asc" )) {
74+ return new SortSpec (new FieldOrder (field , SortOrder .ASC ));
75+ } else {
76+ return new SortSpec (new FieldOrder (field , SortOrder .DESC ));
77+ }
78+ } else {
79+ return new SortSpec (new FieldOrder (segm [0 ], SortOrder .ASC ));
80+ }
81+ } else {
82+ return new SortSpec (new FieldOrder ("id" , SortOrder .ASC ));
83+ }
84+ }
85+
86+ public ArrayList <SortBuilder <?>> Sorting () {
87+ ArrayList <SortBuilder <?>> allSortBuilders = new ArrayList <SortBuilder <?>>();
88+ for (FieldOrder fieldOrder : FieldOrders ) {
89+ allSortBuilders .add (SortBuilders .fieldSort (fieldOrder .field ).order (fieldOrder .order ));
90+ }
91+ return allSortBuilders ;
92+ }
8693}
0 commit comments