aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-04-18 13:41:55 +0200
committerGitHub <noreply@github.com>2023-04-18 13:41:55 +0200
commita84c5411af876cd2c3352ac702d6c3a4bf9c048d (patch)
tree6abf7511b43cd8a0268003afd35985376bac81ef
parent4dd12fde1043fb42eeac2917d40e77e2682403e4 (diff)
parentddee8ec7eb9c4a3c7374bf6bb42da23034ae4479 (diff)
Merge pull request #26767 from vespa-engine/balder/unify-rendering-of-rawdata
Consolidate rendering of raw data by using the same representation as…
-rw-r--r--container-search/abi-spec.json3
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/hitfield/RawBase64.java18
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/result/BucketGroupId.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/result/HitRenderer.java24
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/result/RawBucketId.java9
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/result/RawId.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java27
-rw-r--r--container-search/src/test/java/com/yahoo/search/grouping/result/GroupIdTestCase.java7
-rw-r--r--container-search/src/test/java/com/yahoo/search/grouping/result/HitRendererTestCase.java4
9 files changed, 42 insertions, 58 deletions
diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json
index 50aba749570..fbcf84f5b5d 100644
--- a/container-search/abi-spec.json
+++ b/container-search/abi-spec.json
@@ -210,8 +210,11 @@
"methods" : [
"public void <init>(byte[])",
"public void <init>(byte[], boolean)",
+ "public byte[] value()",
"public int compareTo(com.yahoo.prelude.hitfield.RawBase64)",
"public java.lang.String toString()",
+ "public boolean equals(java.lang.Object)",
+ "public int hashCode()",
"public bridge synthetic int compareTo(java.lang.Object)"
],
"fields" : [ ]
diff --git a/container-search/src/main/java/com/yahoo/prelude/hitfield/RawBase64.java b/container-search/src/main/java/com/yahoo/prelude/hitfield/RawBase64.java
index ada0797ab02..71964054e0d 100644
--- a/container-search/src/main/java/com/yahoo/prelude/hitfield/RawBase64.java
+++ b/container-search/src/main/java/com/yahoo/prelude/hitfield/RawBase64.java
@@ -3,8 +3,10 @@ package com.yahoo.prelude.hitfield;
import java.util.Arrays;
import java.util.Base64;
+import java.util.Objects;
/**
+ * Wraps a byte [] and renders it as base64 encoded string
* @author baldersheim
*/
public class RawBase64 implements Comparable<RawBase64> {
@@ -14,10 +16,13 @@ public class RawBase64 implements Comparable<RawBase64> {
this(content, false);
}
public RawBase64(byte[] content, boolean withoutPadding) {
+ Objects.requireNonNull(content);
this.content = content;
this.withoutPadding = withoutPadding;
}
+ public byte [] value() { return content; }
+
@Override
public int compareTo(RawBase64 rhs) {
return Arrays.compareUnsigned(content, rhs.content);
@@ -29,4 +34,17 @@ public class RawBase64 implements Comparable<RawBase64> {
? Base64.getEncoder().withoutPadding().encodeToString(content)
: Base64.getEncoder().encodeToString(content);
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RawBase64 rawBase64 = (RawBase64) o;
+ return Arrays.equals(content, rawBase64.content);
+ }
+
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(content);
+ }
}
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/result/BucketGroupId.java b/container-search/src/main/java/com/yahoo/search/grouping/result/BucketGroupId.java
index 05efc134465..0bea390ad63 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/result/BucketGroupId.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/result/BucketGroupId.java
@@ -1,8 +1,6 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.grouping.result;
-import static com.yahoo.text.Lowercase.toLowerCase;
-
/**
* This abstract class is used in {@link Group} instances where the identifying expression evaluated to a {@link
* com.yahoo.search.grouping.request.BucketValue}. The range is inclusive-from and exclusive-to.
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/result/HitRenderer.java b/container-search/src/main/java/com/yahoo/search/grouping/result/HitRenderer.java
index 343fea82b6e..91c46960ab0 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/result/HitRenderer.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/result/HitRenderer.java
@@ -7,7 +7,6 @@ import com.yahoo.text.Utf8String;
import com.yahoo.text.XMLWriter;
import java.io.IOException;
-import java.util.Arrays;
import java.util.Map;
/**
@@ -63,28 +62,15 @@ public abstract class HitRenderer {
private static void renderGroupId(GroupId id, XMLWriter writer) {
writer.openTag(TAG_GROUP_ID).attribute(ATR_TYPE, id.getTypeName());
- if (id instanceof ValueGroupId) {
- writer.content(getIdValue((ValueGroupId)id), false);
- } else if (id instanceof BucketGroupId) {
- BucketGroupId bucketId = (BucketGroupId)id;
- writer.openTag(TAG_BUCKET_FROM).content(getBucketFrom(bucketId), false).closeTag();
- writer.openTag(TAG_BUCKET_TO).content(getBucketTo(bucketId), false).closeTag();
+ if (id instanceof ValueGroupId<?> valueGroupId) {
+ writer.content(valueGroupId.getValue(), false);
+ } else if (id instanceof BucketGroupId bucketId) {
+ writer.openTag(TAG_BUCKET_FROM).content(bucketId.getFrom(), false).closeTag();
+ writer.openTag(TAG_BUCKET_TO).content(bucketId.getTo(), false).closeTag();
}
writer.closeTag();
}
- private static Object getIdValue(ValueGroupId id) {
- return id instanceof RawId ? Arrays.toString(((RawId)id).getValue()) : id.getValue();
- }
-
- private static Object getBucketFrom(BucketGroupId id) {
- return id instanceof RawBucketId ? Arrays.toString(((RawBucketId)id).getFrom()) : id.getFrom();
- }
-
- private static Object getBucketTo(BucketGroupId id) {
- return id instanceof RawBucketId ? Arrays.toString(((RawBucketId)id).getTo()) : id.getTo();
- }
-
private static void renderContinuations(Map<String, Continuation> continuations, XMLWriter writer) {
for (Map.Entry<String, Continuation> entry : continuations.entrySet()) {
renderContinuation(entry.getKey(), entry.getValue(), writer);
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/result/RawBucketId.java b/container-search/src/main/java/com/yahoo/search/grouping/result/RawBucketId.java
index 129c6aadee8..dc8a2efb5cb 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/result/RawBucketId.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/result/RawBucketId.java
@@ -1,8 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.grouping.result;
-import java.util.Arrays;
-import java.util.Base64;
+import com.yahoo.prelude.hitfield.RawBase64;
/**
* This class is used in {@link Group} instances where the identifying
@@ -10,7 +9,7 @@ import java.util.Base64;
*
* @author Ulf Lilleengen
*/
-public class RawBucketId extends BucketGroupId<byte[]> {
+public class RawBucketId extends BucketGroupId<RawBase64> {
/**
* Constructs a new instance of this class.
@@ -20,7 +19,7 @@ public class RawBucketId extends BucketGroupId<byte[]> {
*/
public RawBucketId(byte[] from, byte[] to) {
super("raw_bucket",
- from, Base64.getEncoder().withoutPadding().encodeToString(from),
- to, Base64.getEncoder().withoutPadding().encodeToString(to));
+ new RawBase64(from, true),
+ new RawBase64(to, true));
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/result/RawId.java b/container-search/src/main/java/com/yahoo/search/grouping/result/RawId.java
index f160f9b66af..f0ae9628c22 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/result/RawId.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/result/RawId.java
@@ -1,14 +1,14 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.grouping.result;
-import java.util.Base64;
+import com.yahoo.prelude.hitfield.RawBase64;
/**
* This class is used in {@link Group} instances where the identifying expression evaluated to a {@link Byte} array.
*
* @author Simon Thoresen Hult
*/
-public class RawId extends ValueGroupId<byte[]> {
+public class RawId extends ValueGroupId<RawBase64> {
/**
* Constructs a new instance of this class.
@@ -16,6 +16,6 @@ public class RawId extends ValueGroupId<byte[]> {
* @param value The identifying byte array.
*/
public RawId(byte[] value) {
- super("raw", value, Base64.getEncoder().withoutPadding().encodeToString(value));
+ super("raw", new RawBase64(value, true));
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
index 500227e2607..90f4e6ae65c 100644
--- a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
+++ b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
@@ -32,8 +32,6 @@ import com.yahoo.search.grouping.result.AbstractList;
import com.yahoo.search.grouping.result.BucketGroupId;
import com.yahoo.search.grouping.result.Group;
import com.yahoo.search.grouping.result.GroupId;
-import com.yahoo.search.grouping.result.RawBucketId;
-import com.yahoo.search.grouping.result.RawId;
import com.yahoo.search.grouping.result.RootGroup;
import com.yahoo.search.grouping.result.ValueGroupId;
import com.yahoo.search.result.Coverage;
@@ -57,7 +55,6 @@ import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
-import java.util.Base64;
import java.util.Deque;
import java.util.Map;
import java.util.Optional;
@@ -423,34 +420,16 @@ public class JsonRenderer extends AsynchronousSectionedRenderer<Result> {
if (!(id instanceof ValueGroupId<?> || id instanceof BucketGroupId)) return;
if (id instanceof ValueGroupId<?> valueId) {
- generator.writeStringField(GROUPING_VALUE, getIdValue(valueId));
+ generator.writeStringField(GROUPING_VALUE, valueId.getValue().toString());
} else {
BucketGroupId<?> bucketId = (BucketGroupId<?>) id;
generator.writeObjectFieldStart(BUCKET_LIMITS);
- generator.writeStringField(BUCKET_FROM, getBucketFrom(bucketId));
- generator.writeStringField(BUCKET_TO, getBucketTo(bucketId));
+ generator.writeStringField(BUCKET_FROM, bucketId.getFrom().toString());
+ generator.writeStringField(BUCKET_TO, bucketId.getTo().toString());
generator.writeEndObject();
}
}
- private static String getIdValue(ValueGroupId<?> id) {
- return (id instanceof RawId raw)
- ? Base64.getEncoder().withoutPadding().encodeToString(raw.getValue())
- : id.getValue().toString();
- }
-
- private static String getBucketFrom(BucketGroupId<?> id) {
- if (id instanceof RawBucketId rawBucketId)
- return Base64.getEncoder().withoutPadding().encodeToString(rawBucketId.getFrom());
- return id.getFrom().toString();
- }
-
- private static String getBucketTo(BucketGroupId<?> id) {
- if (id instanceof RawBucketId rawBucketId)
- return Base64.getEncoder().withoutPadding().encodeToString(rawBucketId.getTo());
- return id.getTo().toString();
- }
-
protected void renderTotalHitCount(Hit hit) throws IOException {
if ( ! (getRecursionLevel() == 1 && hit instanceof HitGroup)) return;
diff --git a/container-search/src/test/java/com/yahoo/search/grouping/result/GroupIdTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/result/GroupIdTestCase.java
index f986c593fae..bdc52685140 100644
--- a/container-search/src/test/java/com/yahoo/search/grouping/result/GroupIdTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/grouping/result/GroupIdTestCase.java
@@ -1,6 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.grouping.result;
+import com.yahoo.prelude.hitfield.RawBase64;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@@ -25,10 +26,10 @@ public class GroupIdTestCase {
assertEquals(9L, rangeId.getTo());
valueId = new RawId(new byte[]{6, 9});
- assertArrayEquals(new byte[]{6, 9}, (byte[]) valueId.getValue());
+ assertEquals(new RawBase64(new byte[]{6, 9}, true), valueId.getValue());
rangeId = new RawBucketId(new byte[]{6, 9}, new byte[]{9, 6});
- assertArrayEquals(new byte[]{6, 9}, (byte[]) rangeId.getFrom());
- assertArrayEquals(new byte[]{9, 6}, (byte[]) rangeId.getTo());
+ assertEquals(new RawBase64(new byte[]{6, 9}, true), rangeId.getFrom());
+ assertEquals(new RawBase64(new byte[]{9, 6}, true), rangeId.getTo());
valueId = new StringId("69");
assertEquals("69", valueId.getValue());
diff --git a/container-search/src/test/java/com/yahoo/search/grouping/result/HitRendererTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/result/HitRendererTestCase.java
index 8e98f49df48..69bd848ebcd 100644
--- a/container-search/src/test/java/com/yahoo/search/grouping/result/HitRendererTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/grouping/result/HitRendererTestCase.java
@@ -57,7 +57,7 @@ public class HitRendererTestCase {
"</group>\n");
assertRender(newGroup(new RawId(Utf8.toBytes("foo"))),
"<group relevance=\"1.0\">\n" +
- "<id type=\"raw\">[102, 111, 111]</id>\n" +
+ "<id type=\"raw\">Zm9v</id>\n" +
"</group>\n");
assertRender(newGroup(new StringId("foo")),
"<group relevance=\"1.0\">\n" +
@@ -85,7 +85,7 @@ public class HitRendererTestCase {
"</group>\n");
assertRender(newGroup(new RawBucketId(Utf8.toBytes("bar"), Utf8.toBytes("baz"))),
"<group relevance=\"1.0\">\n" +
- "<id type=\"raw_bucket\">\n<from>[98, 97, 114]</from>\n<to>[98, 97, 122]</to>\n</id>\n" +
+ "<id type=\"raw_bucket\">\n<from>YmFy</from>\n<to>YmF6</to>\n</id>\n" +
"</group>\n");
}