summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-05-04 15:31:21 +0200
committerJon Bratseth <bratseth@oath.com>2018-05-04 15:31:21 +0200
commite011ec27883963cbb61a542c0dba5236a968720d (patch)
tree0b965afd0a53ec7fd549a816c5689b1a20f42308 /container-search
parent40c5ae419aeb153492e2fa64bcd00e37df976e1d (diff)
More tests
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java25
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java72
2 files changed, 88 insertions, 9 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
index f3232bd2d2a..e6cb3b3e18a 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
@@ -441,6 +441,23 @@ public class FastHit extends Hit {
return hit.fieldNameIterator();
}
+ @Override
+ public int hashCode() {
+ return createSet().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) return true;
+ if ( ! (o instanceof Set)) return false;
+ return createSet().equals(o);
+ }
+
+ @Override
+ public String toString() {
+ return createSet().toString();
+ }
+
private Set<String> createSet() {
if ( ! hit.hasFields() && hit.summaries.isEmpty()) return Collections.emptySet(); // shortcut
@@ -450,7 +467,8 @@ public class FastHit extends Hit {
for (SummaryData summaryData : hit.summaries)
summaryData.data.traverse((ObjectTraverser)(name, __) -> fields.add(name));
- fields.removeAll(hit.removedFields);
+ if (hit.removedFields != null)
+ fields.removeAll(hit.removedFields);
this.fieldSet = fields;
@@ -536,7 +554,8 @@ public class FastHit extends Hit {
private void advanceNext() {
while (fieldIterator.hasNext()) {
next = fieldIterator.next();
- if (!hit.hasField(next.getKey()) && !hit.removedFields.contains(next.getKey()))
+ if ( ! hit.hasField(next.getKey()) &&
+ ! (hit.removedFields != null && hit.removedFields.contains(next.getKey())))
break;
}
next = null;
@@ -633,6 +652,8 @@ public class FastHit extends Hit {
throw new IllegalStateException();
if ( ! ( currentIterator instanceof SummaryData.SummaryDataIterator))
currentIterator.remove(); // remove from the map
+ if (hit.removedFields == null)
+ hit.removedFields = new HashSet<>();
hit.removedFields.add(nameOf(previousReturned));
previousReturned = null;
}
diff --git a/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java b/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java
index 06431fcdae0..d36d33a0f33 100644
--- a/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/fastsearch/SlimeSummaryTestCase.java
@@ -6,12 +6,16 @@ import com.yahoo.container.search.LegacyEmulationConfig;
import com.yahoo.prelude.hitfield.RawData;
import com.yahoo.prelude.hitfield.XMLString;
import com.yahoo.prelude.hitfield.JSONString;
+import com.yahoo.search.result.Hit;
import com.yahoo.search.result.NanNumber;
import com.yahoo.search.result.StructuredData;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import com.yahoo.slime.BinaryFormat;
import com.yahoo.slime.Cursor;
@@ -21,8 +25,10 @@ import com.yahoo.tensor.serialization.TypedBinaryFormat;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
public class SlimeSummaryTestCase {
@@ -128,15 +134,51 @@ public class SlimeSummaryTestCase {
assertEquals(tensor2, hit.getField("tensor_field2"));
}
- // TODO: Things we need to check that we test:
- // - removing, then adding a field
- // - removing from field and field name iterators
- // - removing fields, both summary and map, then iterating
- // - removing all fields in some summary, then iterating
- // - adding a field from the iterator
- // - iterating with fields set and multiple summaries, where some summaries have overlapping fields (TODO: Or ensure no overlapping fields?)
+ @Test
+ public void testFieldAccessAPI() {
+ DocsumDefinitionSet set = createDocsumDefinitionSet(summary_cf);
+ FastHit hit = new FastHit();
+
+ set.lazyDecode("default", partialSummary1(), hit);
+ Map<String, Object> expected = new HashMap<>();
+ expected.put("integer_field", 4);
+ expected.put("short_field", (short) 2);
+ assertFields(expected, hit);
+
+ set.lazyDecode("default", partialSummary2(), hit);
+ expected.put("float_field", 4.5F);
+ expected.put("double_field", 8.75D);
+ assertFields(expected, hit);
+
+ // TODO: Things we need to check that we test:
+ // - removing, then adding a field
+ // - removing from field and field name iterators
+ // - removing fields, both summary and map, then iterating
+ // - removing all fields in some summary, then iterating
+ // - adding a field from the iterator
+ // - Ensure no overlapping fields between summaries?
+ }
+ /** Asserts that the expected fields are what is returned from every access method of Hit */
+ private void assertFields(Map<String, Object> expected, Hit hit) {
+ // fieldKeys
+ assertEquals(expected.keySet(), hit.fieldKeys());
+ // getField
+ for (Map.Entry<String, Object> field : expected.entrySet())
+ assertEquals(field.getValue(), hit.getField(field.getKey()));
+ // fields
+ assertEquals(expected, hit.fields());
+ // fieldIterator
+ int iteratorFieldCount = 0;
+ for (Iterator<Map.Entry<String, Object>> i = hit.fieldIterator(); i.hasNext(); ) {
+ iteratorFieldCount++;
+ Map.Entry<String, Object> field = i.next();
+ assertEquals(field.getValue(), expected.get(field.getKey()));
+ }
+ assertEquals(expected.size(), iteratorFieldCount);
+ }
+
private byte[] emptySummary() {
Slime slime = new Slime();
slime.setObject();
@@ -149,6 +191,22 @@ public class SlimeSummaryTestCase {
return encode((slime));
}
+ private byte[] partialSummary1() {
+ Slime slime = new Slime();
+ Cursor docsum = slime.setObject();
+ docsum.setLong("integer_field", 4);
+ docsum.setLong("short_field", 2);
+ return encode((slime));
+ }
+
+ private byte[] partialSummary2() {
+ Slime slime = new Slime();
+ Cursor docsum = slime.setObject();
+ docsum.setDouble("float_field", 4.5);
+ docsum.setDouble("double_field", 8.75);
+ return encode((slime));
+ }
+
private byte[] fullSummary(Tensor tensor1, Tensor tensor2) {
Slime slime = new Slime();
Cursor docsum = slime.setObject();