From ddee8ec7eb9c4a3c7374bf6bb42da23034ae4479 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 18 Apr 2023 11:47:36 +0200 Subject: Consolidate rendering of raw data by using the same representation as in normal hits by using RawBase64. --- container-search/abi-spec.json | 3 +++ .../java/com/yahoo/prelude/hitfield/RawBase64.java | 18 +++++++++++++++ .../search/grouping/result/BucketGroupId.java | 2 -- .../yahoo/search/grouping/result/HitRenderer.java | 24 ++++--------------- .../yahoo/search/grouping/result/RawBucketId.java | 9 ++++---- .../com/yahoo/search/grouping/result/RawId.java | 6 ++--- .../com/yahoo/search/rendering/JsonRenderer.java | 27 +++------------------- .../search/grouping/result/GroupIdTestCase.java | 7 +++--- .../grouping/result/HitRendererTestCase.java | 4 ++-- 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 (byte[])", "public void (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 { @@ -14,10 +16,13 @@ public class RawBase64 implements Comparable { 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 { ? 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 continuations, XMLWriter writer) { for (Map.Entry 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 { +public class RawBucketId extends BucketGroupId { /** * Constructs a new instance of this class. @@ -20,7 +19,7 @@ public class RawBucketId extends BucketGroupId { */ 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 { +public class RawId extends ValueGroupId { /** * Constructs a new instance of this class. @@ -16,6 +16,6 @@ public class RawId extends ValueGroupId { * @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 { 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 { "\n"); assertRender(newGroup(new RawId(Utf8.toBytes("foo"))), "\n" + - "[102, 111, 111]\n" + + "Zm9v\n" + "\n"); assertRender(newGroup(new StringId("foo")), "\n" + @@ -85,7 +85,7 @@ public class HitRendererTestCase { "\n"); assertRender(newGroup(new RawBucketId(Utf8.toBytes("bar"), Utf8.toBytes("baz"))), "\n" + - "\n[98, 97, 114]\n[98, 97, 122]\n\n" + + "\nYmFy\nYmF6\n\n" + "\n"); } -- cgit v1.2.3