2323import java .util .List ;
2424import java .util .Map ;
2525
26- import org .springframework .dao .DataAccessException ;
2726import org .springframework .data .geo .Circle ;
2827import org .springframework .data .geo .GeoResult ;
2928import org .springframework .data .geo .GeoResults ;
3029import org .springframework .data .keyvalue .core .CriteriaAccessor ;
3130import org .springframework .data .keyvalue .core .QueryEngine ;
3231import org .springframework .data .keyvalue .core .SortAccessor ;
3332import org .springframework .data .keyvalue .core .query .KeyValueQuery ;
34- import org .springframework .data .redis .connection .RedisConnection ;
3533import org .springframework .data .redis .connection .RedisGeoCommands .GeoLocation ;
3634import org .springframework .data .redis .core .convert .GeoIndexedPropertyValue ;
3735import org .springframework .data .redis .core .convert .RedisData ;
@@ -53,7 +51,7 @@ class RedisQueryEngine extends QueryEngine<RedisKeyValueAdapter, RedisOperationC
5351/**
5452 * Creates new {@link RedisQueryEngine} with defaults.
5553 */
56- public RedisQueryEngine () {
54+ RedisQueryEngine () {
5755this (new RedisCriteriaAccessor (), null );
5856}
5957
@@ -64,7 +62,7 @@ public RedisQueryEngine() {
6462 * @param sortAccessor
6563 * @see QueryEngine#QueryEngine(CriteriaAccessor, SortAccessor)
6664 */
67- public RedisQueryEngine (CriteriaAccessor <RedisOperationChain > criteriaAccessor ,
65+ private RedisQueryEngine (CriteriaAccessor <RedisOperationChain > criteriaAccessor ,
6866SortAccessor <Comparator <?>> sortAccessor ) {
6967super (criteriaAccessor , sortAccessor );
7068}
@@ -75,69 +73,64 @@ public RedisQueryEngine(CriteriaAccessor<RedisOperationChain> criteriaAccessor,
7573 */
7674@ Override
7775@ SuppressWarnings ("unchecked" )
78- public <T > Collection <T > execute (final RedisOperationChain criteria , final Comparator <?> sort , final long offset ,
79- final int rows , final String keyspace , Class <T > type ) {
76+ public <T > Collection <T > execute (RedisOperationChain criteria , Comparator <?> sort , long offset , int rows ,
77+ String keyspace , Class <T > type ) {
8078
8179if (criteria == null
8280|| (CollectionUtils .isEmpty (criteria .getOrSismember ()) && CollectionUtils .isEmpty (criteria .getSismember ()))
8381&& criteria .getNear () == null ) {
8482return (Collection <T >) getAdapter ().getAllOf (keyspace , offset , rows );
8583}
8684
87- RedisCallback <Map <byte [], Map <byte [], byte []>>> callback = new RedisCallback < Map < byte [], Map < byte [], byte []>>>() {
85+ RedisCallback <Map <byte [], Map <byte [], byte []>>> callback = connection -> {
8886
89- @ Override
90- public Map <byte [], Map <byte [], byte []>> doInRedis (RedisConnection connection ) throws DataAccessException {
91-
92- List <byte []> allKeys = new ArrayList <byte []>();
93- if (!criteria .getSismember ().isEmpty ()) {
94- allKeys .addAll (connection .sInter (keys (keyspace + ":" , criteria .getSismember ())));
95- }
87+ List <byte []> allKeys = new ArrayList <>();
88+ if (!criteria .getSismember ().isEmpty ()) {
89+ allKeys .addAll (connection .sInter (keys (keyspace + ":" , criteria .getSismember ())));
90+ }
9691
97- if (!criteria .getOrSismember ().isEmpty ()) {
98- allKeys .addAll (connection .sUnion (keys (keyspace + ":" , criteria .getOrSismember ())));
99- }
92+ if (!criteria .getOrSismember ().isEmpty ()) {
93+ allKeys .addAll (connection .sUnion (keys (keyspace + ":" , criteria .getOrSismember ())));
94+ }
10095
101- if (criteria .getNear () != null ) {
96+ if (criteria .getNear () != null ) {
10297
103- GeoResults <GeoLocation <byte []>> x = connection .geoRadius (geoKey (keyspace + ":" , criteria .getNear ()),
104- new Circle (criteria .getNear ().getPoint (), criteria .getNear ().getDistance ()));
105- for (GeoResult <GeoLocation <byte []>> y : x ) {
106- allKeys .add (y .getContent ().getName ());
107- }
98+ GeoResults <GeoLocation <byte []>> x = connection .geoRadius (geoKey (keyspace + ":" , criteria .getNear ()),
99+ new Circle (criteria .getNear ().getPoint (), criteria .getNear ().getDistance ()));
100+ for (GeoResult <GeoLocation <byte []>> y : x ) {
101+ allKeys .add (y .getContent ().getName ());
108102}
103+ }
109104
110- byte [] keyspaceBin = getAdapter ().getConverter ().getConversionService ().convert (keyspace + ":" , byte [].class );
111-
112- final Map <byte [], Map <byte [], byte []>> rawData = new LinkedHashMap <byte [], Map <byte [], byte []>>();
113-
114- if (allKeys .isEmpty () || allKeys .size () < offset ) {
115- return Collections .emptyMap ();
116- }
105+ byte [] keyspaceBin = getAdapter ().getConverter ().getConversionService ().convert (keyspace + ":" , byte [].class );
117106
118- int offsetToUse = Math .max (0 , (int ) offset );
119- if (rows > 0 ) {
120- allKeys = allKeys .subList (Math .max (0 , offsetToUse ), Math .min (offsetToUse + rows , allKeys .size ()));
121- }
122- for (byte [] id : allKeys ) {
107+ Map <byte [], Map <byte [], byte []>> rawData = new LinkedHashMap <>();
123108
124- byte [] singleKey = ByteUtils . concat ( keyspaceBin , id );
125- rawData . put ( id , connection . hGetAll ( singleKey ) );
126- }
109+ if ( allKeys . isEmpty () || allKeys . size () < offset ) {
110+ return Collections . emptyMap ( );
111+ }
127112
128- return rawData ;
113+ int offsetToUse = Math .max (0 , (int ) offset );
114+ if (rows > 0 ) {
115+ allKeys = allKeys .subList (Math .max (0 , offsetToUse ), Math .min (offsetToUse + rows , allKeys .size ()));
116+ }
117+ for (byte [] id : allKeys ) {
129118
119+ byte [] singleKey = ByteUtils .concat (keyspaceBin , id );
120+ rawData .put (id , connection .hGetAll (singleKey ));
130121}
122+
123+ return rawData ;
131124};
132125
133126Map <byte [], Map <byte [], byte []>> raw = this .getAdapter ().execute (callback );
134127
135- List <T > result = new ArrayList <T >(raw .size ());
128+ List <T > result = new ArrayList <>(raw .size ());
136129for (Map .Entry <byte [], Map <byte [], byte []>> entry : raw .entrySet ()) {
137130
138131RedisData data = new RedisData (entry .getValue ());
139132data .setId (getAdapter ().getConverter ().getConversionService ().convert (entry .getKey (), String .class ));
140- data .setKeyspace (keyspace . toString () );
133+ data .setKeyspace (keyspace );
141134
142135T converted = this .getAdapter ().getConverter ().read (type , data );
143136
@@ -153,8 +146,8 @@ public Map<byte[], Map<byte[], byte[]>> doInRedis(RedisConnection connection) th
153146 * @see org.springframework.data.keyvalue.core.QueryEngine#execute(java.lang.Object, java.lang.Object, int, int, java.lang.String)
154147 */
155148@ Override
156- public Collection <?> execute (final RedisOperationChain criteria , Comparator <?> sort , long offset , int rows ,
157- final String keyspace ) {
149+ public Collection <?> execute (RedisOperationChain criteria , Comparator <?> sort , long offset , int rows ,
150+ String keyspace ) {
158151return execute (criteria , sort , offset , rows , keyspace , Object .class );
159152}
160153
@@ -163,26 +156,22 @@ public Collection<?> execute(final RedisOperationChain criteria, Comparator<?> s
163156 * @see org.springframework.data.keyvalue.core.QueryEngine#count(java.lang.Object, java.lang.String)
164157 */
165158@ Override
166- public long count (final RedisOperationChain criteria , final String keyspace ) {
159+ public long count (RedisOperationChain criteria , String keyspace ) {
167160
168161if (criteria == null ) {
169162return this .getAdapter ().count (keyspace );
170163}
171164
172- return this .getAdapter ().execute (new RedisCallback < Long >() {
165+ return this .getAdapter ().execute (connection -> {
173166
174- @ Override
175- public Long doInRedis (RedisConnection connection ) throws DataAccessException {
176-
177- String key = keyspace + ":" ;
178- byte [][] keys = new byte [criteria .getSismember ().size ()][];
179- int i = 0 ;
180- for (Object o : criteria .getSismember ()) {
181- keys [i ] = getAdapter ().getConverter ().getConversionService ().convert (key + o , byte [].class );
182- }
183-
184- return (long ) connection .sInter (keys ).size ();
167+ String key = keyspace + ":" ;
168+ byte [][] keys = new byte [criteria .getSismember ().size ()][];
169+ int i = 0 ;
170+ for (Object o : criteria .getSismember ()) {
171+ keys [i ] = getAdapter ().getConverter ().getConversionService ().convert (key + o , byte [].class );
185172}
173+
174+ return (long ) connection .sInter (keys ).size ();
186175});
187176}
188177
0 commit comments