1515 */
1616package org .springframework .data .redis .repository .query ;
1717
18+ import java .util .Collection ;
1819import java .util .Iterator ;
1920
2021import org .springframework .dao .InvalidDataAccessApiUsageException ;
3031import org .springframework .data .repository .query .parser .Part ;
3132import org .springframework .data .repository .query .parser .PartTree ;
3233import org .springframework .lang .Nullable ;
34+ import org .springframework .util .ClassUtils ;
3335import org .springframework .util .CollectionUtils ;
3436
3537/**
@@ -80,17 +82,15 @@ protected RedisOperationChain or(RedisOperationChain base, RedisOperationChain c
8082 }
8183
8284 @ Override
83- protected KeyValueQuery <RedisOperationChain > complete (@ Nullable final RedisOperationChain criteria , Sort sort ) {
85+ protected KeyValueQuery <RedisOperationChain > complete (@ Nullable RedisOperationChain criteria , Sort sort ) {
8486
8587 KeyValueQuery <RedisOperationChain > query = new KeyValueQuery <>(criteria );
8688
87- if (criteria != null && !CollectionUtils .isEmpty (criteria .getSismember ())
88- && !CollectionUtils .isEmpty (criteria .getOrSismember ()))
89- if (criteria .getSismember ().size () == 1 && criteria .getOrSismember ().size () == 1 ) {
90-
91- criteria .getOrSismember ().add (criteria .getSismember ().iterator ().next ());
92- criteria .getSismember ().clear ();
93- }
89+ if (criteria != null && containsExactlyOne (criteria .getSismember ())
90+ && containsExactlyOne (criteria .getOrSismember ())) {
91+ criteria .getOrSismember ().addAll (criteria .getSismember ());
92+ criteria .getSismember ().clear ();
93+ }
9494
9595 if (sort .isSorted ()) {
9696 query .setSort (sort );
@@ -111,29 +111,33 @@ private NearPath getNearPath(Part part, Iterator<Object> iterator) {
111111 if (value instanceof Point point ) {
112112
113113 if (!iterator .hasNext ()) {
114- String message = "Expected to find distance value for geo query; Are you missing a parameter" ;
114+ String message = "Expected to find distance value for geo query; Are you missing a parameter? " ;
115115 throw new InvalidDataAccessApiUsageException (message );
116116 }
117117
118118 Distance distance ;
119119 Object distObject = iterator .next ();
120120
121- if (distObject instanceof Distance distanceValue ) {
122- distance = distanceValue ;
123- } else if (distObject instanceof Number numberValue ) {
124- distance = new Distance (numberValue .doubleValue (), Metrics .KILOMETERS );
121+ if (distObject instanceof Distance dist ) {
122+ distance = dist ;
123+ } else if (distObject instanceof Number num ) {
124+ distance = new Distance (num .doubleValue (), Metrics .KILOMETERS );
125125 } else {
126126
127127 String message = String .format ("Expected to find Distance or Numeric value for geo query but was %s" ,
128- distObject . getClass ( ));
128+ ClassUtils . getDescriptiveType ( distObject ));
129129 throw new InvalidDataAccessApiUsageException (message );
130130 }
131131
132132 return new NearPath (path , point , distance );
133133 }
134134
135- String message = String .format ("Expected to find a Circle or Point/Distance for geo query but was %s. " ,
136- value .getClass ());
135+ String message = String .format ("Expected to find a Circle or Point/Distance for geo query but was %s" ,
136+ ClassUtils . getDescriptiveType ( value .getClass () ));
137137 throw new InvalidDataAccessApiUsageException (message );
138138 }
139+
140+ private static boolean containsExactlyOne (Collection <?> collection ) {
141+ return !CollectionUtils .isEmpty (collection ) && collection .size () == 1 ;
142+ }
139143}
0 commit comments