@@ -200,9 +200,22 @@ public void setCommentText(String commentText) {
200200 }
201201
202202 public static class ColumnParams implements Serializable {
203+ public enum SortOrder {
204+ ASC , DESC
205+ }
206+
207+ public enum NullOrdering {
208+ FIRST , LAST
209+ }
210+
203211 public final String columnName ;
204212 public final List <String > params ;
205213 private final Expression expression ;
214+ private String collation ;
215+ private String operatorClass ;
216+ private List <Option > operatorClassParameters ;
217+ private SortOrder sortOrder ;
218+ private NullOrdering nullOrdering ;
206219
207220 public ColumnParams (String columnName ) {
208221 this .columnName = columnName ;
@@ -244,10 +257,159 @@ public boolean isExpression() {
244257 return expression != null ;
245258 }
246259
260+ public String getCollation () {
261+ return collation ;
262+ }
263+
264+ public void setCollation (String collation ) {
265+ this .collation = collation ;
266+ }
267+
268+ public String getOperatorClass () {
269+ return operatorClass ;
270+ }
271+
272+ public void setOperatorClass (String operatorClass ) {
273+ this .operatorClass = operatorClass ;
274+ }
275+
276+ public List <Option > getOperatorClassParameters () {
277+ return operatorClassParameters ;
278+ }
279+
280+ public void setOperatorClassParameters (List <Option > operatorClassParameters ) {
281+ this .operatorClassParameters = operatorClassParameters ;
282+ }
283+
284+ public SortOrder getSortOrder () {
285+ return sortOrder ;
286+ }
287+
288+ public void setSortOrder (SortOrder sortOrder ) {
289+ this .sortOrder = sortOrder ;
290+ }
291+
292+ public NullOrdering getNullOrdering () {
293+ return nullOrdering ;
294+ }
295+
296+ public void setNullOrdering (NullOrdering nullOrdering ) {
297+ this .nullOrdering = nullOrdering ;
298+ }
299+
300+ public ColumnParams withCollation (String collation ) {
301+ setCollation (collation );
302+ return this ;
303+ }
304+
305+ public ColumnParams withOperatorClass (String operatorClass ) {
306+ setOperatorClass (operatorClass );
307+ return this ;
308+ }
309+
310+ public ColumnParams withOperatorClassParameters (List <Option > operatorClassParameters ) {
311+ setOperatorClassParameters (operatorClassParameters );
312+ return this ;
313+ }
314+
315+ public ColumnParams withSortOrder (SortOrder sortOrder ) {
316+ setSortOrder (sortOrder );
317+ return this ;
318+ }
319+
320+ public ColumnParams withNullOrdering (NullOrdering nullOrdering ) {
321+ setNullOrdering (nullOrdering );
322+ return this ;
323+ }
324+
325+ @ Override
326+ public String toString () {
327+ StringBuilder builder = new StringBuilder (
328+ expression != null ? "(" + expression + ")" : columnName );
329+ if (params != null ) {
330+ builder .append (" " ).append (String .join (" " , params ));
331+ }
332+ if (collation != null && !hasParam ("COLLATE" )) {
333+ builder .append (" COLLATE " ).append (collation );
334+ }
335+ if (operatorClass != null && !hasParam (operatorClass )) {
336+ builder .append (" " ).append (operatorClass );
337+ if (operatorClassParameters != null && !operatorClassParameters .isEmpty ()) {
338+ builder .append (" " )
339+ .append (PlainSelect .getStringList (
340+ operatorClassParameters , true , true ));
341+ }
342+ }
343+ if (sortOrder != null && !hasParam (sortOrder .name ())) {
344+ builder .append (" " ).append (sortOrder );
345+ }
346+ if (nullOrdering != null && !hasParam ("NULLS" )) {
347+ builder .append (" NULLS " ).append (nullOrdering );
348+ }
349+ return builder .toString ();
350+ }
351+
352+ private boolean hasParam (String expected ) {
353+ return params != null && params .stream ().anyMatch (expected ::equalsIgnoreCase );
354+ }
355+ }
356+
357+ /** A named PostgreSQL index option with an optional value. */
358+ public static class Option implements Serializable {
359+ private String name ;
360+ private Expression value ;
361+ private boolean useEquals ;
362+
363+ public Option () {}
364+
365+ public Option (String name , Expression value , boolean useEquals ) {
366+ this .name = name ;
367+ this .value = value ;
368+ this .useEquals = useEquals ;
369+ }
370+
371+ public String getName () {
372+ return name ;
373+ }
374+
375+ public void setName (String name ) {
376+ this .name = name ;
377+ }
378+
379+ public Expression getValue () {
380+ return value ;
381+ }
382+
383+ public void setValue (Expression value ) {
384+ this .value = value ;
385+ }
386+
387+ public boolean isUseEquals () {
388+ return useEquals ;
389+ }
390+
391+ public void setUseEquals (boolean useEquals ) {
392+ this .useEquals = useEquals ;
393+ }
394+
395+ public Option withName (String name ) {
396+ setName (name );
397+ return this ;
398+ }
399+
400+ public Option withValue (Expression value ) {
401+ setValue (value );
402+ return this ;
403+ }
404+
405+ public Option withUseEquals (boolean useEquals ) {
406+ setUseEquals (useEquals );
407+ return this ;
408+ }
409+
247410 @ Override
248411 public String toString () {
249- String head = expression != null ? "(" + expression + ")" : columnName ;
250- return head + (params != null ? " " + String .join (" " , params ) : "" );
412+ return value == null ? name : name + (useEquals ? " = " : " " ) + value ;
251413 }
252414 }
253415}
0 commit comments