1515 */
1616package org .springframework .data .cassandra .core .query ;
1717
18+ import java .util .ArrayList ;
1819import java .util .Arrays ;
1920import java .util .Collections ;
2021import java .util .Iterator ;
5253 */
5354public class Columns implements Iterable <ColumnName > {
5455
55- private final Map <ColumnName , Selector > columns ;
56+ private final Map <ColumnName , List < Selector > > columns ;
5657
57- private Columns (Map <ColumnName , Selector > columns ) {
58+ private Columns (Map <ColumnName , List < Selector > > columns ) {
5859 this .columns = Collections .unmodifiableMap (columns );
5960 }
6061
@@ -77,10 +78,10 @@ public static Columns from(String... columnNames) {
7778
7879 Assert .notNull (columnNames , "Column names must not be null" );
7980
80- Map <ColumnName , Selector > columns = new LinkedHashMap <>(columnNames .length , 1 );
81+ Map <ColumnName , List < Selector > > columns = new LinkedHashMap <>(columnNames .length , 1 );
8182
8283 for (String columnName : columnNames ) {
83- columns .put (ColumnName .from (columnName ), ColumnSelector .from (columnName ));
84+ columns .put (ColumnName .from (columnName ), new ArrayList <>( List . of ( ColumnSelector .from (columnName )) ));
8485 }
8586
8687 return new Columns (columns );
@@ -96,10 +97,10 @@ public static Columns from(CqlIdentifier... columnNames) {
9697
9798 Assert .notNull (columnNames , "Column names must not be null" );
9899
99- Map <ColumnName , Selector > columns = new LinkedHashMap <>(columnNames .length , 1 );
100+ Map <ColumnName , List < Selector > > columns = new LinkedHashMap <>(columnNames .length , 1 );
100101
101102 for (CqlIdentifier cqlId : columnNames ) {
102- columns .put (ColumnName .from (cqlId ), ColumnSelector .from (cqlId ));
103+ columns .put (ColumnName .from (cqlId ), new ArrayList <>( List . of ( ColumnSelector .from (cqlId )) ));
103104 }
104105
105106 return new Columns (columns );
@@ -210,8 +211,8 @@ public Columns select(CqlIdentifier columnName, Selector selector) {
210211 */
211212 private Columns select (ColumnName columnName , Selector selector ) {
212213
213- Map <ColumnName , Selector > result = new LinkedHashMap <>(this .columns );
214- result .put (columnName , selector );
214+ Map <ColumnName , List < Selector > > result = new LinkedHashMap <>(this .columns );
215+ result .computeIfAbsent (columnName , it -> new ArrayList <>()). add ( selector );
215216
216217 return new Columns (result );
217218 }
@@ -232,9 +233,10 @@ public boolean isEmpty() {
232233 */
233234 public Columns and (Columns columns ) {
234235
235- Map <ColumnName , Selector > result = new LinkedHashMap <>(this .columns );
236+ Map <ColumnName , List < Selector > > result = new LinkedHashMap <>(this .columns );
236237
237- result .putAll (columns .columns );
238+ columns .columns
239+ .forEach ((col , selectors ) -> result .computeIfAbsent (col , columnName -> new ArrayList <>()).addAll (selectors ));
238240
239241 return new Columns (result );
240242 }
@@ -248,11 +250,12 @@ public Iterator<ColumnName> iterator() {
248250 * @param columnName must not be {@literal null}.
249251 * @return the {@link Optional} {@link Selector} for {@link ColumnName}.
250252 */
251- public Optional <Selector > getSelector (ColumnName columnName ) {
253+ public List <Selector > getSelector (ColumnName columnName ) {
252254
253255 Assert .notNull (columnName , "ColumnName must not be null" );
254256
255- return Optional .ofNullable (this .columns .get (columnName ));
257+ List <Selector > selectors = this .columns .get (columnName );
258+ return selectors == null ? List .of () : selectors ;
256259 }
257260
258261 @ Override
@@ -281,7 +284,7 @@ public int hashCode() {
281284 @ Override
282285 public String toString () {
283286
284- Iterator <Entry <ColumnName , Selector >> iterator = this .columns .entrySet ().iterator ();
287+ Iterator <Entry <ColumnName , List < Selector > >> iterator = this .columns .entrySet ().iterator ();
285288 StringBuilder builder = toString (iterator );
286289
287290 if (builder .isEmpty ()) {
@@ -291,24 +294,26 @@ public String toString() {
291294 return builder .toString ();
292295 }
293296
294- private StringBuilder toString (Iterator <Entry <ColumnName , Selector >> iterator ) {
297+ private StringBuilder toString (Iterator <Entry <ColumnName , List < Selector > >> iterator ) {
295298
296299 StringBuilder builder = new StringBuilder ();
297300 boolean first = true ;
298301
299302 while (iterator .hasNext ()) {
300303
301- Entry <ColumnName , Selector > entry = iterator .next ();
304+ Entry <ColumnName , List < Selector > > entry = iterator .next ();
302305
303- Selector expression = entry .getValue ();
306+ for ( Selector selector : entry .getValue ()) {
304307
305- if (first ) {
306- first = false ;
307- } else {
308- builder .append (", " );
308+ if (first ) {
309+ first = false ;
310+ } else {
311+ builder .append (", " );
312+ }
313+
314+ builder .append (selector );
309315 }
310316
311- builder .append (expression .toString ());
312317 }
313318
314319 return builder ;
@@ -670,8 +675,9 @@ public Selector dotProduct() {
670675
671676 @ Override
672677 public Selector using (SimilarityFunction similarityFunction ) {
673- return FunctionCall .from ("similarity_" + similarityFunction .name ().toLowerCase (Locale .ROOT ), columnName ,
674- vector ).as (columnName );
678+ return FunctionCall
679+ .from ("similarity_" + similarityFunction .name ().toLowerCase (Locale .ROOT ), columnName , vector )
680+ .as (columnName );
675681 }
676682 };
677683 }
0 commit comments