summaryrefslogtreecommitdiff
path: root/redis/commands/search/suggestion.py
diff options
context:
space:
mode:
Diffstat (limited to 'redis/commands/search/suggestion.py')
-rw-r--r--redis/commands/search/suggestion.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/redis/commands/search/suggestion.py b/redis/commands/search/suggestion.py
new file mode 100644
index 0000000..550c514
--- /dev/null
+++ b/redis/commands/search/suggestion.py
@@ -0,0 +1,54 @@
+from six.moves import xrange
+from ._util import to_string
+
+
+class Suggestion(object):
+ """
+ Represents a single suggestion being sent or returned from the
+ autocomplete server
+ """
+
+ def __init__(self, string, score=1.0, payload=None):
+ self.string = to_string(string)
+ self.payload = to_string(payload)
+ self.score = score
+
+ def __repr__(self):
+ return self.string
+
+
+class SuggestionParser(object):
+ """
+ Internal class used to parse results from the `SUGGET` command.
+ This needs to consume either 1, 2, or 3 values at a time from
+ the return value depending on what objects were requested
+ """
+
+ def __init__(self, with_scores, with_payloads, ret):
+ self.with_scores = with_scores
+ self.with_payloads = with_payloads
+
+ if with_scores and with_payloads:
+ self.sugsize = 3
+ self._scoreidx = 1
+ self._payloadidx = 2
+ elif with_scores:
+ self.sugsize = 2
+ self._scoreidx = 1
+ elif with_payloads:
+ self.sugsize = 2
+ self._payloadidx = 1
+ else:
+ self.sugsize = 1
+ self._scoreidx = -1
+
+ self._sugs = ret
+
+ def __iter__(self):
+ for i in xrange(0, len(self._sugs), self.sugsize):
+ ss = self._sugs[i]
+ score = float(self._sugs[i + self._scoreidx]) \
+ if self.with_scores else 1.0
+ payload = self._sugs[i + self._payloadidx] \
+ if self.with_payloads else None
+ yield Suggestion(ss, score, payload)