99 */
1010package net .sf .jsqlparser .statement .create .index ;
1111
12- import static java .util .stream .Collectors .joining ;
13-
1412import java .util .*;
13+ import java .util .function .Consumer ;
1514import net .sf .jsqlparser .expression .Expression ;
1615import net .sf .jsqlparser .schema .*;
1716import net .sf .jsqlparser .statement .*;
1817import net .sf .jsqlparser .statement .create .table .*;
19- import net .sf .jsqlparser .statement .select .PlainSelect ;
2018
2119public class CreateIndex implements Statement {
2220
@@ -27,6 +25,7 @@ public class CreateIndex implements Statement {
2725 private boolean usingIfNotExists = false ;
2826 private boolean concurrently ;
2927 private boolean only ;
28+ private boolean nullFiltered ;
3029 private List <String > includeColumns ;
3130 private Boolean nullsDistinct ;
3231 private List <Index .Option > storageParameters ;
@@ -66,6 +65,20 @@ public void setOnly(boolean only) {
6665 this .only = only ;
6766 }
6867
68+ /** Whether this Spanner index omits rows with null key values. */
69+ public boolean isNullFiltered () {
70+ return nullFiltered ;
71+ }
72+
73+ public void setNullFiltered (boolean nullFiltered ) {
74+ this .nullFiltered = nullFiltered ;
75+ }
76+
77+ public CreateIndex withNullFiltered (boolean nullFiltered ) {
78+ setNullFiltered (nullFiltered );
79+ return this ;
80+ }
81+
6982 public List <String > getIncludeColumns () {
7083 return includeColumns ;
7184 }
@@ -142,10 +155,15 @@ public String toString() {
142155
143156 /** Shared rendering for the statement model and CreateIndexDeParser. */
144157 public StringBuilder appendTo (StringBuilder buffer ) {
158+ return appendTo (buffer , expression -> buffer .append (expression ));
159+ }
160+
161+ /** Shares rendering while allowing visitors to transform key and option expressions. */
162+ public StringBuilder appendTo (StringBuilder buffer , Consumer <Expression > expressionPrinter ) {
145163 appendIndexHeader (buffer );
146164 appendIndexTarget (buffer );
147- appendIndexColumns (buffer );
148- appendPostgreSqlTail (buffer );
165+ appendIndexColumns (buffer , expressionPrinter );
166+ appendPostgreSqlTail (buffer , expressionPrinter );
149167 if (tailParameters != null ) {
150168 for (String param : tailParameters ) {
151169 buffer .append (" " ).append (param );
@@ -159,6 +177,12 @@ private void appendIndexHeader(StringBuilder buffer) {
159177 if (index .getType () != null ) {
160178 buffer .append (index .getType ()).append (" " );
161179 }
180+ if (index .getClustering () != null ) {
181+ buffer .append (index .getClustering ()).append (" " );
182+ }
183+ if (nullFiltered ) {
184+ buffer .append ("NULL_FILTERED " );
185+ }
162186 buffer .append ("INDEX " );
163187 if (concurrently ) {
164188 buffer .append ("CONCURRENTLY " );
@@ -185,32 +209,38 @@ private void appendIndexTarget(StringBuilder buffer) {
185209 }
186210 }
187211
188- private void appendIndexColumns (StringBuilder buffer ) {
189- if (index .getColumnsNames () != null ) {
212+ private void appendIndexColumns (StringBuilder buffer , Consumer < Expression > expressionPrinter ) {
213+ if (index .getColumns () != null ) {
190214 buffer .append (" (" );
191- buffer .append (index .getColumns ().stream ()
192- .map (Index .ColumnParams ::toString )
193- .collect (joining (", " )));
215+ for (Iterator <Index .ColumnParams > columns = index .getColumns ().iterator (); columns
216+ .hasNext ();) {
217+ columns .next ().appendTo (buffer , expressionPrinter );
218+ if (columns .hasNext ()) {
219+ buffer .append (", " );
220+ }
221+ }
194222 buffer .append (")" );
195223 }
196224 }
197225
198- private void appendPostgreSqlTail (StringBuilder buffer ) {
226+ private void appendPostgreSqlTail (StringBuilder buffer ,
227+ Consumer <Expression > expressionPrinter ) {
199228 if (includeColumns != null ) {
200229 buffer .append (" INCLUDE (" ).append (String .join (", " , includeColumns )).append (")" );
201230 }
202231 if (nullsDistinct != null ) {
203232 buffer .append (" NULLS " ).append (nullsDistinct ? "DISTINCT" : "NOT DISTINCT" );
204233 }
205234 if (storageParameters != null ) {
206- buffer .append (" WITH " )
207- . append ( PlainSelect . getStringList ( storageParameters , true , true ) );
235+ buffer .append (" WITH " );
236+ Index . Option . appendListTo ( buffer , storageParameters , expressionPrinter );
208237 }
209238 if (tableSpace != null ) {
210239 buffer .append (" TABLESPACE " ).append (tableSpace );
211240 }
212241 if (where != null ) {
213- buffer .append (" WHERE " ).append (where );
242+ buffer .append (" WHERE " );
243+ expressionPrinter .accept (where );
214244 }
215245 }
216246
0 commit comments