From ec45f9501dbaa6e9224e0474c1b784f93cbe492a Mon Sep 17 00:00:00 2001 From: jruaux Date: Thu, 18 Feb 2021 21:19:26 -0800 Subject: [PATCH] fixed null pointer exception in sugget --- .../lettusearch/RediSearchCommandBuilder.java | 18 +++++++--- .../lettusearch/output/SuggestOutput.java | 36 ++++++++++++------- ...{TestSuggestions.java => TestSuggest.java} | 9 ++++- 3 files changed, 44 insertions(+), 19 deletions(-) rename src/test/java/com/redislabs/lettusearch/{TestSuggestions.java => TestSuggest.java} (81%) diff --git a/src/main/java/com/redislabs/lettusearch/RediSearchCommandBuilder.java b/src/main/java/com/redislabs/lettusearch/RediSearchCommandBuilder.java index b073c58..5f0408b 100644 --- a/src/main/java/com/redislabs/lettusearch/RediSearchCommandBuilder.java +++ b/src/main/java/com/redislabs/lettusearch/RediSearchCommandBuilder.java @@ -34,7 +34,7 @@ protected Command createCommand(CommandType type, CommandOutp public Command create(K index, CreateOptions options, Field... fields) { assertNotNull(index, "index"); - LettuceAssert.isTrue(fields.length>0, "At least one field is required."); + LettuceAssert.isTrue(fields.length > 0, "At least one field is required."); RediSearchCommandArgs args = createArgs(index); if (options != null) { options.build(args); @@ -167,18 +167,26 @@ public Command sugadd(K key, Suggestion suggestion, boolean incre } public Command>> sugget(K key, V prefix) { - return sugget(key, prefix, SuggetOptions.builder().build()); + return sugget(key, prefix, null); } public Command>> sugget(K key, V prefix, SuggetOptions options) { assertNotNull(key, "key"); assertNotNull(prefix, "prefix"); - assertNotNull(options, "options"); RediSearchCommandArgs args = new RediSearchCommandArgs<>(codec); args.addKey(key); args.addValue(prefix); - options.build(args); - return createCommand(SUGGET, new SuggestOutput<>(codec, options), args); + if (options != null) { + options.build(args); + } + return createCommand(SUGGET, suggestOutput(options), args); + } + + private SuggestOutput suggestOutput(SuggetOptions options) { + if (options == null) { + return new SuggestOutput<>(codec); + } + return new SuggestOutput<>(codec, options.isWithScores(), options.isWithPayloads()); } public Command sugdel(K key, V string) { diff --git a/src/main/java/com/redislabs/lettusearch/output/SuggestOutput.java b/src/main/java/com/redislabs/lettusearch/output/SuggestOutput.java index 95f9118..54fd9be 100644 --- a/src/main/java/com/redislabs/lettusearch/output/SuggestOutput.java +++ b/src/main/java/com/redislabs/lettusearch/output/SuggestOutput.java @@ -1,41 +1,50 @@ package com.redislabs.lettusearch.output; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.List; - import com.redislabs.lettusearch.Suggestion; -import com.redislabs.lettusearch.SuggetOptions; - import io.lettuce.core.codec.RedisCodec; import io.lettuce.core.output.CommandOutput; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + public class SuggestOutput extends CommandOutput>> { + private final boolean withScores; + private final boolean withPayloads; private Suggestion current; - private final SuggetOptions options; + private boolean payloadSet = false; + private boolean scoreSet = false; + + public SuggestOutput(RedisCodec codec) { + this(codec, false, false); + } - public SuggestOutput(RedisCodec codec, SuggetOptions options) { + public SuggestOutput(RedisCodec codec, boolean withScores, boolean withPayloads) { super(codec, new ArrayList<>()); - this.options = options; + this.withScores = withScores; + this.withPayloads = withPayloads; } @Override public void set(ByteBuffer bytes) { if (current == null) { current = new Suggestion<>(); + payloadSet = false; + scoreSet = false; if (bytes != null) { current.setString(codec.decodeValue(bytes)); } output.add(current); - if (!options.isWithScores() && !options.isWithPayloads()) { + if (!withScores && !withPayloads) { current = null; } } else { - if (current.getPayload() == null && options.isWithPayloads()) { + if (withPayloads && !payloadSet) { if (bytes != null) { current.setPayload(codec.decodeValue(bytes)); } + payloadSet = true; current = null; } } @@ -43,9 +52,10 @@ public void set(ByteBuffer bytes) { @Override public void set(double number) { - if (current.getScore() == null && options.isWithScores()) { + if (withScores && !scoreSet) { current.setScore(number); - if (!options.isWithPayloads()) { + scoreSet = true; + if (!withPayloads) { current = null; } } diff --git a/src/test/java/com/redislabs/lettusearch/TestSuggestions.java b/src/test/java/com/redislabs/lettusearch/TestSuggest.java similarity index 81% rename from src/test/java/com/redislabs/lettusearch/TestSuggestions.java rename to src/test/java/com/redislabs/lettusearch/TestSuggest.java index 36880fa..f8a1ad1 100644 --- a/src/test/java/com/redislabs/lettusearch/TestSuggestions.java +++ b/src/test/java/com/redislabs/lettusearch/TestSuggest.java @@ -8,10 +8,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -public class TestSuggestions extends AbstractBaseTest { +public class TestSuggest extends AbstractBaseTest { @Test public void testSugget() throws IOException { + createBeerSuggestions(); + List> results = sync.sugget(SUGINDEX, "Ame"); + assertEquals(5, results.size()); + } + + @Test + public void testSuggetOptions() throws IOException { createBeerSuggestions(); List> results = sync.sugget(SUGINDEX, "Ame", SuggetOptions.builder().max(1000L).build()); assertEquals(8, results.size());