aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/test/java/com/yahoo/search
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-09-18 07:03:13 +0200
committerGitHub <noreply@github.com>2019-09-18 07:03:13 +0200
commit89a1b3ae32347c00e1177576668385ebfe3a6a68 (patch)
tree2856305bc733d52b7e6a26e0a36afacef8209ccb /container-search/src/test/java/com/yahoo/search
parentf6b49bf9f9e98b5778d9c8856e128a1fcdb5e017 (diff)
Revert "Revert "Balder/no more fs4 dispatching from fastsearcher""
Diffstat (limited to 'container-search/src/test/java/com/yahoo/search')
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/MockSearchCluster.java5
-rw-r--r--container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java14
-rw-r--r--container-search/src/test/java/com/yahoo/search/query/test/RankFeaturesTestCase.java140
3 files changed, 140 insertions, 19 deletions
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/MockSearchCluster.java b/container-search/src/test/java/com/yahoo/search/dispatch/MockSearchCluster.java
index 42a22f6f86b..7ee62ae9978 100644
--- a/container-search/src/test/java/com/yahoo/search/dispatch/MockSearchCluster.java
+++ b/container-search/src/test/java/com/yahoo/search/dispatch/MockSearchCluster.java
@@ -89,11 +89,6 @@ public class MockSearchCluster extends SearchCluster {
}
@Override
- public ImmutableMultimap<String, Node> nodesByHost() {
- return nodesByHost;
- }
-
- @Override
public Optional<Node> directDispatchTarget() {
return Optional.empty();
}
diff --git a/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java
index 6ed8a209cc5..7bdf1916d85 100644
--- a/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java
@@ -3,7 +3,6 @@ package com.yahoo.search.grouping.vespa;
import com.yahoo.document.DocumentId;
import com.yahoo.document.GlobalId;
-import com.yahoo.fs4.QueryPacketData;
import com.yahoo.net.URI;
import com.yahoo.prelude.fastsearch.GroupingListHit;
import com.yahoo.prelude.fastsearch.DocsumDefinitionSet;
@@ -62,19 +61,6 @@ public class HitConverterTestCase {
}
@Test
- public void requireThatHitTagIsCopiedFromGroupingListContext() {
- QueryPacketData ctxTag = new QueryPacketData();
- GroupingListHit ctxHit = context();
- ctxHit.setQueryPacketData(ctxTag);
-
- HitConverter converter = new HitConverter(new MySearcher(), new Query());
- Hit hit = converter.toSearchHit("default", new FS4Hit(1, createGlobalId(2), 3).setContext(ctxHit));
- assertNotNull(hit);
- assertTrue(hit instanceof FastHit);
- assertSame(ctxTag, ((FastHit)hit).getQueryPacketData());
- }
-
- @Test
public void requireThatSummaryClassIsSet() {
Searcher searcher = new MySearcher();
HitConverter converter = new HitConverter(searcher, new Query());
diff --git a/container-search/src/test/java/com/yahoo/search/query/test/RankFeaturesTestCase.java b/container-search/src/test/java/com/yahoo/search/query/test/RankFeaturesTestCase.java
new file mode 100644
index 00000000000..8aff81a90db
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/query/test/RankFeaturesTestCase.java
@@ -0,0 +1,140 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.query.test;
+
+import com.yahoo.io.GrowableByteBuffer;
+import com.yahoo.search.query.ranking.RankFeatures;
+import com.yahoo.search.query.ranking.RankProperties;
+import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.TensorType;
+import com.yahoo.tensor.serialization.TypedBinaryFormat;
+import com.yahoo.text.Utf8;
+import org.junit.Test;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author geirst
+ */
+public class RankFeaturesTestCase {
+
+ @Test
+ public void requireThatRankPropertiesTakesBothStringAndObject() {
+ RankProperties p = new RankProperties();
+ p.put("string", "b");
+ p.put("object", 7);
+ assertEquals("7", p.get("object").get(0));
+ assertEquals("b", p.get("string").get(0));
+ }
+
+ @Test
+ public void requireThatRankFeaturesUsingDoubleAndDoubleToStringEncodeTheSameWay() {
+ RankFeatures withDouble = new RankFeatures();
+ withDouble.put("query(myDouble)", 3.8);
+ assertEquals(3.8, withDouble.getDouble("query(myDouble)").getAsDouble(), 0.000001);
+
+ RankFeatures withString = new RankFeatures();
+ withString.put("query(myDouble)", String.valueOf(3.8));
+
+ RankProperties withDoubleP = new RankProperties();
+ withDouble.prepare(withDoubleP);
+ RankProperties withStringP = new RankProperties();
+ withString.prepare(withStringP);
+
+ byte[] withDoubleEncoded = encode(withDoubleP);
+ byte[] withStringEncoded = encode(withStringP);
+ assertEquals(Arrays.toString(withStringEncoded), Arrays.toString(withDoubleEncoded));
+ }
+
+ @Test
+ public void requireThatSingleTensorIsBinaryEncoded() {
+ TensorType type = new TensorType.Builder().mapped("x").mapped("y").mapped("z").build();
+ Tensor tensor = Tensor.from(type, "{ {x:a, y:b, z:c}:2.0, {x:a, y:b, z:c2}:3.0 }");
+ assertTensorEncodingAndDecoding(type, "query(my_tensor)", "my_tensor", tensor);
+ assertTensorEncodingAndDecoding(type, "$my_tensor", "my_tensor", tensor);
+ }
+
+ @Test
+ public void requireThatMultipleTensorsAreBinaryEncoded() {
+ TensorType type = new TensorType.Builder().mapped("x").mapped("y").mapped("z").build();
+ Tensor tensor1 = Tensor.from(type, "{ {x:a, y:b, z:c}:2.0, {x:a, y:b, z:c2}:3.0 }");
+ Tensor tensor2 = Tensor.from(type, "{ {x:a, y:b, z:c}:5.0 }");
+ assertTensorEncodingAndDecoding(type, Arrays.asList(
+ new Entry("query(tensor1)", "tensor1", tensor1),
+ new Entry("$tensor2", "tensor2", tensor2)));
+ }
+
+ private static class Entry {
+ final String key;
+ final String normalizedKey;
+ final Tensor tensor;
+ Entry(String key, String normalizedKey, Tensor tensor) {
+ this.key = key;
+ this.normalizedKey = normalizedKey;
+ this.tensor = tensor;
+ }
+ }
+
+ private static void assertTensorEncodingAndDecoding(TensorType type, List<Entry> entries) {
+ RankProperties properties = createRankPropertiesWithTensors(entries);
+ assertEquals(entries.size(), properties.asMap().size());
+
+ Map<String, Object> decodedProperties = decode(type, encode(properties));
+ assertEquals(entries.size(), properties.asMap().size());
+ assertEquals(entries.size(), decodedProperties.size());
+ for (Entry entry : entries) {
+ assertEquals(entry.tensor, decodedProperties.get(entry.normalizedKey));
+ }
+ }
+
+ private static void assertTensorEncodingAndDecoding(TensorType type, String key, String normalizedKey, Tensor tensor) {
+ assertTensorEncodingAndDecoding(type, Arrays.asList(new Entry(key, normalizedKey, tensor)));
+ }
+
+ private static RankProperties createRankPropertiesWithTensors(List<Entry> entries) {
+ RankFeatures features = new RankFeatures();
+ for (Entry entry : entries) {
+ features.put(entry.key, entry.tensor);
+ }
+ RankProperties properties = new RankProperties();
+ features.prepare(properties);
+ return properties;
+ }
+
+ private static byte[] encode(RankProperties properties) {
+ ByteBuffer buffer = ByteBuffer.allocate(512);
+ properties.encode(buffer, true);
+ byte[] result = new byte[buffer.position()];
+ buffer.rewind();
+ buffer.get(result);
+ return result;
+ }
+
+ private static Map<String, Object> decode(TensorType type, byte[] encodedProperties) {
+ GrowableByteBuffer buffer = GrowableByteBuffer.wrap(encodedProperties);
+ byte[] mapNameBytes = new byte[buffer.getInt()];
+ buffer.get(mapNameBytes);
+ int numEntries = buffer.getInt();
+ Map<String, Object> result = new HashMap<>();
+ for (int i = 0; i < numEntries; ++i) {
+ byte[] keyBytes = new byte[buffer.getInt()];
+ buffer.get(keyBytes);
+ String key = Utf8.toString(keyBytes);
+ byte[] value = new byte[buffer.getInt()];
+ buffer.get(value);
+ if (key.contains(".type")) {
+ result.put(key, Utf8.toString(value));
+ } else {
+ result.put(key, TypedBinaryFormat.decode(Optional.of(type), GrowableByteBuffer.wrap(value)));
+ }
+ }
+ return result;
+ }
+
+}