|
16 | 16 | import java.util.ArrayList; |
17 | 17 | import java.util.List; |
18 | 18 | import java.util.Map; |
| 19 | +import java.util.function.Consumer; |
19 | 20 |
|
20 | 21 | /* |
21 | 22 | * STRUCT<T> |
@@ -113,73 +114,62 @@ public StructType add(Expression expression, String aliasName) { |
113 | 114 | } |
114 | 115 |
|
115 | 116 | public StringBuilder appendTo(StringBuilder builder) { |
116 | | - if (dialect != Dialect.DUCKDB && keyword != null) { |
117 | | - builder.append(keyword); |
118 | | - } |
| 117 | + return appendTo(builder, expression -> builder.append(expression)); |
| 118 | + } |
119 | 119 |
|
120 | | - if (dialect != Dialect.DUCKDB && parameters != null && !parameters.isEmpty()) { |
121 | | - builder.append("<"); |
122 | | - int i = 0; |
123 | | - |
124 | | - for (Map.Entry<String, ColDataType> e : parameters) { |
125 | | - if (0 < i++) { |
126 | | - builder.append(","); |
127 | | - } |
128 | | - // optional name |
129 | | - if (e.getKey() != null && !e.getKey().isEmpty()) { |
130 | | - builder.append(e.getKey()).append(" "); |
131 | | - } |
132 | | - |
133 | | - // mandatory type |
134 | | - builder.append(e.getValue()); |
| 120 | + /** Renders current argument expressions through the caller's visitor. */ |
| 121 | + public StringBuilder appendTo(StringBuilder builder, Consumer<Expression> expressions) { |
| 122 | + if (dialect == Dialect.DUCKDB) { |
| 123 | + appendArguments(builder, expressions); |
| 124 | + appendTypeParameters(builder, true); |
| 125 | + } else { |
| 126 | + if (keyword != null) { |
| 127 | + builder.append(keyword); |
135 | 128 | } |
136 | | - |
137 | | - builder.append(">"); |
| 129 | + appendTypeParameters(builder, false); |
| 130 | + appendArguments(builder, expressions); |
138 | 131 | } |
| 132 | + return builder; |
| 133 | + } |
139 | 134 |
|
140 | | - if (arguments != null && !arguments.isEmpty()) { |
141 | | - |
142 | | - if (dialect == Dialect.DUCKDB) { |
143 | | - builder.append("{ "); |
144 | | - int i = 0; |
145 | | - for (SelectItem<?> e : arguments) { |
146 | | - if (0 < i++) { |
147 | | - builder.append(","); |
148 | | - } |
149 | | - builder.append(e.getAlias().getName()); |
150 | | - builder.append(":"); |
151 | | - builder.append(e.getExpression()); |
152 | | - } |
153 | | - builder.append(" }"); |
154 | | - } else { |
155 | | - builder.append("("); |
156 | | - int i = 0; |
157 | | - for (SelectItem<?> e : arguments) { |
158 | | - if (0 < i++) { |
159 | | - builder.append(","); |
160 | | - } |
161 | | - e.appendTo(builder); |
162 | | - } |
163 | | - |
164 | | - builder.append(")"); |
| 135 | + private void appendTypeParameters(StringBuilder builder, boolean cast) { |
| 136 | + if (parameters == null || parameters.isEmpty()) { |
| 137 | + return; |
| 138 | + } |
| 139 | + builder.append(cast ? "::STRUCT( " : "<"); |
| 140 | + int i = 0; |
| 141 | + for (Map.Entry<String, ColDataType> parameter : parameters) { |
| 142 | + if (i++ > 0) { |
| 143 | + builder.append(','); |
| 144 | + } |
| 145 | + if (cast || parameter.getKey() != null && !parameter.getKey().isEmpty()) { |
| 146 | + builder.append(parameter.getKey()).append(' '); |
165 | 147 | } |
| 148 | + builder.append(parameter.getValue()); |
166 | 149 | } |
| 150 | + builder.append(cast ? ')' : '>'); |
| 151 | + } |
167 | 152 |
|
168 | | - if (dialect == Dialect.DUCKDB && parameters != null && !parameters.isEmpty()) { |
169 | | - builder.append("::STRUCT( "); |
170 | | - int i = 0; |
171 | | - |
172 | | - for (Map.Entry<String, ColDataType> e : parameters) { |
173 | | - if (0 < i++) { |
174 | | - builder.append(","); |
175 | | - } |
176 | | - builder.append(e.getKey()).append(" "); |
177 | | - builder.append(e.getValue()); |
| 153 | + private void appendArguments(StringBuilder builder, Consumer<Expression> expressions) { |
| 154 | + if (arguments == null || arguments.isEmpty()) { |
| 155 | + return; |
| 156 | + } |
| 157 | + boolean structLiteral = dialect == Dialect.DUCKDB; |
| 158 | + builder.append(structLiteral ? "{ " : "("); |
| 159 | + int i = 0; |
| 160 | + for (SelectItem<?> argument : arguments) { |
| 161 | + if (i++ > 0) { |
| 162 | + builder.append(','); |
| 163 | + } |
| 164 | + if (structLiteral) { |
| 165 | + builder.append(argument.getAlias().getName()).append(':'); |
| 166 | + } |
| 167 | + expressions.accept(argument.getExpression()); |
| 168 | + if (!structLiteral && argument.getAlias() != null) { |
| 169 | + builder.append(argument.getAlias()); |
178 | 170 | } |
179 | | - builder.append(")"); |
180 | 171 | } |
181 | | - |
182 | | - return builder; |
| 172 | + builder.append(structLiteral ? " }" : ")"); |
183 | 173 | } |
184 | 174 |
|
185 | 175 | @Override |
|
0 commit comments