summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/query/StringInItem.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/query/StringInItem.java')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/StringInItem.java87
1 files changed, 87 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/StringInItem.java b/container-search/src/main/java/com/yahoo/prelude/query/StringInItem.java
new file mode 100644
index 00000000000..ebcf0de1a21
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/prelude/query/StringInItem.java
@@ -0,0 +1,87 @@
+// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.prelude.query;
+
+import com.yahoo.compress.IntegerCompressor;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+/*
+ * Class representing an IN operator with a set of string values.
+ *
+ * @author toregge
+ */
+public class StringInItem extends InItem {
+ private Set<String> tokens;
+
+ public StringInItem(String indexName) {
+ super(indexName);
+ tokens = new HashSet<>(1000);
+ }
+
+ @Override
+ public ItemType getItemType() {
+ return ItemType.STRING_IN;
+ }
+
+ @Override
+ public int encode(ByteBuffer buffer) {
+ encodeThis(buffer);
+ return 1;
+ }
+
+ @Override
+ protected void encodeThis(ByteBuffer buffer) {
+ super.encodeThis(buffer);
+ IntegerCompressor.putCompressedPositiveNumber(tokens.size(), buffer);
+ putString(getIndexName(), buffer);
+ for (var entry : tokens) {
+ putString(entry, buffer);
+ }
+ }
+
+ @Override
+ public int getTermCount() {
+ return 1;
+ }
+
+ @Override
+ protected void appendBodyString(StringBuilder buffer) {
+ buffer.append(getIndexName());
+ buffer.append("{");
+ for (var entry : tokens) {
+ buffer.append("\"");
+ buffer.append(entry);
+ buffer.append("\",");
+ }
+ if (!tokens.isEmpty()) {
+ buffer.deleteCharAt(buffer.length() - 1); // remove extra ","
+ }
+ buffer.append("}");
+ }
+
+ public void addToken(String token) {
+ Objects.requireNonNull(token, "Token string must not be null");
+ tokens.add(token);
+ }
+
+ public Collection<String> getTokens() { return Set.copyOf(tokens); }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) return true;
+ if ( ! super.equals(o)) return false;
+ var other = (StringInItem)o;
+ if ( ! Objects.equals(this.tokens, other.tokens)) return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), tokens);
+ }
+
+}