From e45d370404cbd000e932f26c701bae40c963eabf Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 12 Apr 2016 14:05:11 +0300 Subject: [PATCH] MultiDecoder empty result handling fixed --- src/main/java/org/redisson/RedissonGeo.java | 21 +++++++++++-------- .../decoder/FlatNestedMultiDecoder.java | 4 ++++ .../protocol/decoder/NestedMultiDecoder.java | 16 ++++++++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/redisson/RedissonGeo.java b/src/main/java/org/redisson/RedissonGeo.java index 7a62e165c..527892d25 100644 --- a/src/main/java/org/redisson/RedissonGeo.java +++ b/src/main/java/org/redisson/RedissonGeo.java @@ -45,12 +45,19 @@ import io.netty.util.concurrent.Future; public class RedissonGeo extends RedissonExpirable implements RGeo { + MultiDecoder> postitionDecoder; + MultiDecoder> distanceDecoder; + public RedissonGeo(CommandAsyncExecutor connectionManager, String name) { super(connectionManager, name); + postitionDecoder = new NestedMultiDecoder(new GeoPositionDecoder(), new GeoDistanceDecoder(codec), new GeoMapReplayDecoder(), true); + distanceDecoder = new FlatNestedMultiDecoder(new GeoDistanceDecoder(codec), new GeoMapReplayDecoder(), true); } public RedissonGeo(Codec codec, CommandAsyncExecutor connectionManager, String name) { super(codec, connectionManager, name); + postitionDecoder = new NestedMultiDecoder(new GeoPositionDecoder(), new GeoDistanceDecoder(codec), new GeoMapReplayDecoder(), true); + distanceDecoder = new FlatNestedMultiDecoder(new GeoDistanceDecoder(codec), new GeoMapReplayDecoder(), true); } @Override @@ -119,7 +126,7 @@ public class RedissonGeo extends RedissonExpirable implements RGeo { params.add(getName()); params.addAll(Arrays.asList(members)); - MultiDecoder> decoder = new NestedMultiDecoder(new GeoPositionDecoder(), new GeoPositionMapDecoder(params)); + MultiDecoder> decoder = new NestedMultiDecoder(new GeoPositionDecoder(), new GeoPositionMapDecoder(params), true); RedisCommand> command = new RedisCommand>("GEOPOS", decoder, 2, ValueType.OBJECTS); return commandExecutor.readAsync(getName(), new ScoredCodec(codec), command, params.toArray()); } @@ -141,8 +148,7 @@ public class RedissonGeo extends RedissonExpirable implements RGeo { @Override public Future> radiusWithDistanceAsync(double longitude, double latitude, double radius, GeoUnit geoUnit) { - MultiDecoder> decoder = new FlatNestedMultiDecoder(new GeoDistanceDecoder(codec), new GeoMapReplayDecoder()); - RedisCommand> command = new RedisCommand>("GEORADIUS", decoder); + RedisCommand> command = new RedisCommand>("GEORADIUS", distanceDecoder); return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHDIST"); } @@ -153,8 +159,7 @@ public class RedissonGeo extends RedissonExpirable implements RGeo { @Override public Future> radiusWithPositionAsync(double longitude, double latitude, double radius, GeoUnit geoUnit) { - MultiDecoder> decoder = new NestedMultiDecoder(new GeoPositionDecoder(), new GeoDistanceDecoder(codec), new GeoMapReplayDecoder()); - RedisCommand> command = new RedisCommand>("GEORADIUS", decoder); + RedisCommand> command = new RedisCommand>("GEORADIUS", postitionDecoder); return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHCOORD"); } @@ -175,8 +180,7 @@ public class RedissonGeo extends RedissonExpirable implements RGeo { @Override public Future> radiusWithDistanceAsync(V member, double radius, GeoUnit geoUnit) { - MultiDecoder> decoder = new FlatNestedMultiDecoder(new GeoDistanceDecoder(codec), new GeoMapReplayDecoder()); - RedisCommand command = new RedisCommand("GEORADIUSBYMEMBER", decoder, 2); + RedisCommand command = new RedisCommand("GEORADIUSBYMEMBER", distanceDecoder, 2); return commandExecutor.readAsync(getName(), codec, command, getName(), member, radius, geoUnit, "WITHDIST"); } @@ -187,8 +191,7 @@ public class RedissonGeo extends RedissonExpirable implements RGeo { @Override public Future> radiusWithPositionAsync(V member, double radius, GeoUnit geoUnit) { - MultiDecoder> decoder = new NestedMultiDecoder(new GeoPositionDecoder(), new GeoDistanceDecoder(codec), new GeoMapReplayDecoder()); - RedisCommand> command = new RedisCommand>("GEORADIUSBYMEMBER", decoder, 2); + RedisCommand> command = new RedisCommand>("GEORADIUSBYMEMBER", postitionDecoder, 2); return commandExecutor.readAsync(getName(), codec, command, getName(), member, radius, geoUnit, "WITHCOORD"); } } diff --git a/src/main/java/org/redisson/client/protocol/decoder/FlatNestedMultiDecoder.java b/src/main/java/org/redisson/client/protocol/decoder/FlatNestedMultiDecoder.java index 413694b33..4bd04c8ee 100644 --- a/src/main/java/org/redisson/client/protocol/decoder/FlatNestedMultiDecoder.java +++ b/src/main/java/org/redisson/client/protocol/decoder/FlatNestedMultiDecoder.java @@ -27,6 +27,10 @@ public class FlatNestedMultiDecoder extends NestedMultiDecoder { super(firstDecoder, secondDecoder); } + public FlatNestedMultiDecoder(MultiDecoder firstDecoder, MultiDecoder secondDecoder, boolean handleEmpty) { + super(firstDecoder, secondDecoder, handleEmpty); + } + @Override public Object decode(ByteBuf buf, State state) throws IOException { return firstDecoder.decode(buf, state); diff --git a/src/main/java/org/redisson/client/protocol/decoder/NestedMultiDecoder.java b/src/main/java/org/redisson/client/protocol/decoder/NestedMultiDecoder.java index c2a5f5fdd..43b5266ac 100644 --- a/src/main/java/org/redisson/client/protocol/decoder/NestedMultiDecoder.java +++ b/src/main/java/org/redisson/client/protocol/decoder/NestedMultiDecoder.java @@ -58,19 +58,27 @@ public class NestedMultiDecoder implements MultiDecoder { protected final MultiDecoder firstDecoder; protected final MultiDecoder secondDecoder; private MultiDecoder thirdDecoder; + private boolean handleEmpty; public NestedMultiDecoder(MultiDecoder firstDecoder, MultiDecoder secondDecoder) { - this.firstDecoder = firstDecoder; - this.secondDecoder = secondDecoder; + this(firstDecoder, secondDecoder, false); + } + + public NestedMultiDecoder(MultiDecoder firstDecoder, MultiDecoder secondDecoder, boolean handleEmpty) { + this(firstDecoder, secondDecoder, null, handleEmpty); } public NestedMultiDecoder(MultiDecoder firstDecoder, MultiDecoder secondDecoder, MultiDecoder thirdDecoder) { + this(firstDecoder, secondDecoder, thirdDecoder, false); + } + + public NestedMultiDecoder(MultiDecoder firstDecoder, MultiDecoder secondDecoder, MultiDecoder thirdDecoder, boolean handleEmpty) { this.firstDecoder = firstDecoder; this.secondDecoder = secondDecoder; this.thirdDecoder = thirdDecoder; + this.handleEmpty = handleEmpty; } - @Override public Object decode(ByteBuf buf, State state) throws IOException { DecoderState ds = getDecoder(state); @@ -121,7 +129,7 @@ public class NestedMultiDecoder implements MultiDecoder { @Override public Object decode(List parts, State state) { - if (parts.isEmpty() && state.getDecoderState() == null) { + if (parts.isEmpty() && state.getDecoderState() == null && handleEmpty) { MultiDecoder decoder = secondDecoder; if (thirdDecoder != null) { decoder = thirdDecoder;