@@ -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,179 @@ 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+ appendParams (builder );
330+ appendCollation (builder );
331+ appendOperatorClass (builder );
332+ appendSortOrder (builder );
333+ appendNullOrdering (builder );
334+ return builder .toString ();
335+ }
336+
337+ private void appendParams (StringBuilder builder ) {
338+ if (params != null ) {
339+ builder .append (" " ).append (String .join (" " , params ));
340+ }
341+ }
342+
343+ private void appendCollation (StringBuilder builder ) {
344+ if (collation != null && !hasParam ("COLLATE" )) {
345+ builder .append (" COLLATE " ).append (collation );
346+ }
347+ }
348+
349+ private void appendOperatorClass (StringBuilder builder ) {
350+ if (operatorClass != null && !hasParam (operatorClass )) {
351+ builder .append (" " ).append (operatorClass );
352+ if (operatorClassParameters != null && !operatorClassParameters .isEmpty ()) {
353+ builder .append (" " )
354+ .append (PlainSelect .getStringList (
355+ operatorClassParameters , true , true ));
356+ }
357+ }
358+ }
359+
360+ private void appendSortOrder (StringBuilder builder ) {
361+ if (sortOrder != null && !hasParam (sortOrder .name ())) {
362+ builder .append (" " ).append (sortOrder );
363+ }
364+ }
365+
366+ private void appendNullOrdering (StringBuilder builder ) {
367+ if (nullOrdering != null && !hasParam ("NULLS" )) {
368+ builder .append (" NULLS " ).append (nullOrdering );
369+ }
370+ }
371+
372+ private boolean hasParam (String expected ) {
373+ return params != null && params .stream ().anyMatch (expected ::equalsIgnoreCase );
374+ }
375+ }
376+
377+ /** A named PostgreSQL index option with an optional value. */
378+ public static class Option implements Serializable {
379+ private String name ;
380+ private Expression value ;
381+ private boolean useEquals ;
382+
383+ public Option () {}
384+
385+ public Option (String name , Expression value , boolean useEquals ) {
386+ this .name = name ;
387+ this .value = value ;
388+ this .useEquals = useEquals ;
389+ }
390+
391+ public String getName () {
392+ return name ;
393+ }
394+
395+ public void setName (String name ) {
396+ this .name = name ;
397+ }
398+
399+ public Expression getValue () {
400+ return value ;
401+ }
402+
403+ public void setValue (Expression value ) {
404+ this .value = value ;
405+ }
406+
407+ public boolean isUseEquals () {
408+ return useEquals ;
409+ }
410+
411+ public void setUseEquals (boolean useEquals ) {
412+ this .useEquals = useEquals ;
413+ }
414+
415+ public Option withName (String name ) {
416+ setName (name );
417+ return this ;
418+ }
419+
420+ public Option withValue (Expression value ) {
421+ setValue (value );
422+ return this ;
423+ }
424+
425+ public Option withUseEquals (boolean useEquals ) {
426+ setUseEquals (useEquals );
427+ return this ;
428+ }
429+
247430 @ Override
248431 public String toString () {
249- String head = expression != null ? "(" + expression + ")" : columnName ;
250- return head + (params != null ? " " + String .join (" " , params ) : "" );
432+ return value == null ? name : name + (useEquals ? " = " : " " ) + value ;
251433 }
252434 }
253435}
0 commit comments