summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-09-10 20:18:04 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-09-10 20:18:04 +0200
commitbe2d00845e704a77c66d9ce4443a7e18812a8b38 (patch)
tree90143136336991cd7cf133ce15dcf65f4a22ea0d
parent9b16a5917acf4fabc9c4f4ebbb30974262ccbc74 (diff)
Make fasthit leaner since it appears in considerable amounts during merging, and only a few are filled.
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java31
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/Hit.java15
3 files changed, 32 insertions, 20 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 da3c52969ca..1ade10f4f1f 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
@@ -63,7 +63,7 @@ public class FastHit extends Hit {
* that most fields passes through the container with no processing most
* of the time.
*/
- private List<SummaryData> summaries = new ArrayList<>(1);
+ private List<SummaryData> summaries = Collections.emptyList();
/** Removed field values, which should therefore not be returned if present in summary data */
private Set<String> removedFields = null;
@@ -73,13 +73,20 @@ public class FastHit extends Hit {
*/
public FastHit() { }
+ public FastHit(GlobalId gid, Relevance relevance, int partId, int distributionKey) {
+ super(relevance);
+ this.globalId = gid;
+ this.partId = partId;
+ this.distributionKey = distributionKey;
+ }
+
// Note: This constructor is only used for tests, production use is always of the empty constructor
public FastHit(String uri, double relevancy) {
this(uri, relevancy, null);
}
// Note: This constructor is only used for tests, production use is always of the empty constructor
- public FastHit(String uri, double relevance, String source) {
+ private FastHit(String uri, double relevance, String source) {
setId(uri);
setRelevance(new Relevance(relevance));
setSource(source);
@@ -167,11 +174,11 @@ public class FastHit extends Hit {
return (cmpRes != 0) ? cmpRes : super.compareTo(other);
}
- public boolean hasSortData(Sorting sorting) {
+ boolean hasSortData(Sorting sorting) {
return sortData != null && sortDataSorting != null && sortDataSorting.equals(sorting);
}
- public static int compareSortData(FastHit left, FastHit right, Sorting sorting) {
+ static int compareSortData(FastHit left, FastHit right, Sorting sorting) {
if (!left.hasSortData(sorting) || !right.hasSortData(sorting)) {
return 0; // cannot sort
}
@@ -185,14 +192,14 @@ public class FastHit extends Hit {
}
int vl = (int) left.sortData[i] & 0xFF;
int vr = (int) right.sortData[i] & 0xFF;
- int diff = vl - vr;
- return diff;
+ return vl - vr;
}
/** For internal use */
public void addSummary(DocsumDefinition docsumDef, Inspector value) {
if (removedFields != null)
removedFields.removeAll(docsumDef.fieldNames());
+ if ( ! (summaries instanceof ArrayList) ) summaries = new ArrayList<>(8);
summaries.add(0, new SummaryData(this, docsumDef, value, 1 + summaries.size()));
}
@@ -392,7 +399,7 @@ public class FastHit extends Hit {
/** The computed set of fields. Lazily created as it is not always needed. */
private Set<String> fieldSet = null;
- public FieldSet(FastHit hit) {
+ FieldSet(FastHit hit) {
this.hit = hit;
}
@@ -629,7 +636,7 @@ public class FastHit extends Hit {
protected abstract VALUE toValue(Map.Entry<String, Inspector> field);
- protected void advanceNext() {
+ void advanceNext() {
while (fieldIterator.hasNext()) {
Map.Entry<String, Inspector> nextEntry = fieldIterator.next();
String fieldName = nextEntry.getKey();
@@ -667,7 +674,7 @@ public class FastHit extends Hit {
private final String key;
private final Object value;
- public SummaryFieldEntry(String key, Object value) {
+ SummaryFieldEntry(String key, Object value) {
this.key = key;
this.value = value;
}
@@ -716,7 +723,7 @@ public class FastHit extends Hit {
private Iterator<VALUE> currentIterator;
private VALUE previousReturned = null;
- public SummaryIterator(FastHit hit, Iterator<VALUE> mapFieldsIterator) {
+ SummaryIterator(FastHit hit, Iterator<VALUE> mapFieldsIterator) {
this.hit = hit;
this.currentIterator = mapFieldsIterator;
}
@@ -763,7 +770,7 @@ public class FastHit extends Hit {
/** Iterator over all the field content of a FastHit */
private static class FieldIterator extends SummaryIterator<Map.Entry<String, Object>> {
- public FieldIterator(FastHit hit, Iterator<Map.Entry<String, Object>> mapFieldsIterator) {
+ FieldIterator(FastHit hit, Iterator<Map.Entry<String, Object>> mapFieldsIterator) {
super(hit, mapFieldsIterator);
}
@@ -782,7 +789,7 @@ public class FastHit extends Hit {
/** Iterator over all the field names stored in a FastHit */
private static class FieldNameIterator extends SummaryIterator<String> {
- public FieldNameIterator(FastHit hit, Iterator<String> mapFieldNamesIterator) {
+ FieldNameIterator(FastHit hit, Iterator<String> mapFieldNamesIterator) {
super(hit, mapFieldNamesIterator);
}
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
index 080e358d083..74de675684c 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java
@@ -222,18 +222,14 @@ public class ProtobufSerialization {
var sorting = query.getRanking().getSorting();
for (var replyHit : protobuf.getHitsList()) {
- FastHit hit = new FastHit();
+ FastHit hit = new FastHit(new GlobalId(replyHit.getGlobalId().toByteArray()), new Relevance(replyHit.getRelevance()), partId, distKey);
hit.setQuery(query);
- hit.setRelevance(new Relevance(replyHit.getRelevance()));
- hit.setGlobalId(new GlobalId(replyHit.getGlobalId().toByteArray()));
if (!replyHit.getSortData().isEmpty()) {
hit.setSortData(replyHit.getSortData().toByteArray(), sorting);
}
hit.setFillable();
hit.setCached(false);
- hit.setPartId(partId);
- hit.setDistributionKey(distKey);
hit.setSource(source);
result.hits().add(hit);
diff --git a/container-search/src/main/java/com/yahoo/search/result/Hit.java b/container-search/src/main/java/com/yahoo/search/result/Hit.java
index 10fa7d24d1a..4a2d6c58423 100644
--- a/container-search/src/main/java/com/yahoo/search/result/Hit.java
+++ b/container-search/src/main/java/com/yahoo/search/result/Hit.java
@@ -61,7 +61,7 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi
private URI id;
/** The types of this hit */
- private Set<String> types = new ArraySet<>(1);
+ private Set<String> types = null;
/** The relevance of this hit */
private Relevance relevance;
@@ -107,6 +107,9 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi
/** Creates an (invalid) empty hit. Id and relevance must be set before handoff */
protected Hit() {}
+ protected Hit(Relevance relevance) {
+ this.relevance = relevance;
+ }
/**
* Creates a minimal valid hit having relevance 1000
@@ -510,7 +513,12 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi
}
/** Returns the types of this as a modifiable set. Modifications to this set are directly reflected in this hit */
- public Set<String> types() { return types; }
+ //TODO This shoudld not be exposed as a modifiable set
+ public Set<String> types() {
+ if (types == null)
+ types = new ArraySet<>(1);
+ return types;
+ }
/**
* Returns the add number, assigned when adding the hit to a Result.
@@ -655,7 +663,8 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi
hit.fields = fields != null ? new LinkedHashMap<>(fields) : null;
hit.unmodifiableFieldMap = null;
- hit.types = new LinkedHashSet<>(types);
+ if (types != null)
+ hit.types = new LinkedHashSet<>(types);
if (filled != null) {
hit.setFilledInternal(new HashSet<>(filled));
}