5959import org .springframework .data .cassandra .core .query .Update .SetAtIndexOp ;
6060import org .springframework .data .cassandra .core .query .Update .SetAtKeyOp ;
6161import org .springframework .data .cassandra .core .query .Update .SetOp ;
62+ import org .springframework .data .cassandra .core .query .VectorSort ;
6263import org .springframework .data .convert .EntityWriter ;
6364import org .springframework .data .domain .Sort ;
6465import org .springframework .data .mapping .PersistentProperty ;
7273import org .springframework .util .ClassUtils ;
7374
7475import com .datastax .oss .driver .api .core .CqlIdentifier ;
76+ import com .datastax .oss .driver .api .core .data .CqlVector ;
7577import com .datastax .oss .driver .api .core .metadata .schema .ClusteringOrder ;
7678import com .datastax .oss .driver .api .querybuilder .BindMarker ;
7779import com .datastax .oss .driver .api .querybuilder .QueryBuilder ;
@@ -688,38 +690,54 @@ private CqlIdentifier getKeyspace(CassandraPersistentEntity<?> entity, CqlIdenti
688690 private StatementBuilder <Select > createSelectAndOrder (List <Selector > selectors , CassandraPersistentEntity <?> entity ,
689691 CqlIdentifier from , Filter filter , Sort sort ) {
690692
691- Select select ;
693+ StatementBuilder <Select > builder = StatementBuilder .of ((Select ) QueryBuilder .selectFrom (from ),
694+ cassandraConverter .getCodecRegistry ());
692695
693- if (selectors .isEmpty ()) {
694- select = QueryBuilder .selectFrom (getKeyspace (entity , from ), from ).all ();
695- } else {
696+ builder .bind ((statement , factory ) -> {
696697
697- List <com .datastax .oss .driver .api .querybuilder .select .Selector > mappedSelectors = new ArrayList <>(
698- selectors .size ());
699- for (Selector selector : selectors ) {
700- com .datastax .oss .driver .api .querybuilder .select .Selector orElseGet = selector .getAlias ()
701- .map (it -> getSelection (selector ).as (it )).orElseGet (() -> getSelection (selector ));
702- mappedSelectors .add (orElseGet );
703- }
698+ Select select ;
704699
705- select = QueryBuilder .selectFrom (getKeyspace (entity , from ), from ).selectors (mappedSelectors );
706- }
700+ if (selectors .isEmpty ()) {
701+ select = QueryBuilder .selectFrom (getKeyspace (entity , from ), from ).all ();
702+ } else {
707703
708- StatementBuilder <Select > builder = StatementBuilder .of (select , cassandraConverter .getCodecRegistry ());
704+ List <com .datastax .oss .driver .api .querybuilder .select .Selector > mappedSelectors = new ArrayList <>(
705+ selectors .size ());
706+ for (Selector selector : selectors ) {
707+ com .datastax .oss .driver .api .querybuilder .select .Selector orElseGet = selector .getAlias ()
708+ .map (it -> getSelection (selector , factory ).as (it )).orElseGet (() -> getSelection (selector , factory ));
709+ mappedSelectors .add (orElseGet );
710+ }
711+
712+ select = QueryBuilder .selectFrom (getKeyspace (entity , from ), from ).selectors (mappedSelectors );
713+ }
714+
715+ return select ;
716+ });
709717
710718 builder .bind ((statement , factory ) -> {
711719 return statement .where (getRelations (filter , factory ));
712720 });
713721
714722 if (sort .isSorted ()) {
715723
716- builder .apply ((statement ) -> {
724+ builder .bind ((statement , factory ) -> {
717725
718726 Select statementToUse = statement ;
719727
720- for (Sort .Order order : sort ) {
721- statementToUse = statementToUse .orderBy (order .getProperty (),
722- order .isAscending () ? ClusteringOrder .ASC : ClusteringOrder .DESC );
728+ if (sort instanceof VectorSort vs ) {
729+
730+ for (Sort .Order order : sort ) {
731+
732+ Object vector = vs .getVector ();
733+ statementToUse = statementToUse .orderByAnnOf (order .getProperty (), (CqlVector <?>) vector );
734+ }
735+ } else {
736+
737+ for (Sort .Order order : sort ) {
738+ statementToUse = statementToUse .orderBy (order .getProperty (),
739+ order .isAscending () ? ClusteringOrder .ASC : ClusteringOrder .DESC );
740+ }
723741 }
724742
725743 return statementToUse ;
@@ -730,25 +748,33 @@ private StatementBuilder<Select> createSelectAndOrder(List<Selector> selectors,
730748 }
731749
732750 private static List <Relation > getRelations (Filter filter , TermFactory factory ) {
751+
733752 List <Relation > relations = new ArrayList <>();
753+
734754 for (CriteriaDefinition criteriaDefinition : filter ) {
735755 relations .add (toClause (criteriaDefinition , factory ));
736756 }
757+
737758 return relations ;
738759 }
739760
740- private static com .datastax .oss .driver .api .querybuilder .select .Selector getSelection (Selector selector ) {
761+ private static com .datastax .oss .driver .api .querybuilder .select .Selector getSelection (Selector selector ,
762+ TermFactory factory ) {
741763
742764 if (selector instanceof FunctionCall ) {
743765
744766 com .datastax .oss .driver .api .querybuilder .select .Selector [] arguments = ((FunctionCall ) selector ).getParameters ()
745767 .stream ().map (param -> {
746768
747- if (param instanceof ColumnSelector ) {
769+ if (param instanceof ColumnSelector s ) {
748770
749- return com .datastax .oss .driver .api .querybuilder .select .Selector
750- .column (((ColumnSelector ) param ).getExpression ());
771+ return com .datastax .oss .driver .api .querybuilder .select .Selector .column (s .getExpression ());
751772 }
773+
774+ if (param instanceof CqlIdentifier i ) {
775+ return com .datastax .oss .driver .api .querybuilder .select .Selector .column (i .toString ());
776+ }
777+
752778 return new SimpleSelector (param .toString ());
753779
754780 }).toArray (com .datastax .oss .driver .api .querybuilder .select .Selector []::new );
0 commit comments