From e011ec27883963cbb61a542c0dba5236a968720d Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Fri, 4 May 2018 15:31:21 +0200 Subject: More tests --- .../java/com/yahoo/prelude/fastsearch/FastHit.java | 25 +++++++- .../prelude/fastsearch/SlimeSummaryTestCase.java | 72 +++++++++++++++++++--- 2 files changed, 88 insertions(+), 9 deletions(-) (limited to 'container-search') 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 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 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 expected, Hit hit) { + // fieldKeys + assertEquals(expected.keySet(), hit.fieldKeys()); + // getField + for (Map.Entry field : expected.entrySet()) + assertEquals(field.getValue(), hit.getField(field.getKey())); + // fields + assertEquals(expected, hit.fields()); + // fieldIterator + int iteratorFieldCount = 0; + for (Iterator> i = hit.fieldIterator(); i.hasNext(); ) { + iteratorFieldCount++; + Map.Entry 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(); -- cgit v1.2.3