aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2020-09-03 23:40:57 +0200
committerGitHub <noreply@github.com>2020-09-03 23:40:57 +0200
commit2a238d333516e658eb96f02af2ae27d91ac4bd1a (patch)
treedb9b613dad2bda6efd217e635b54f26ac03c88ae /container-search
parent6ed3b95da481156c71aa1a70ceb9106310d7a7f9 (diff)
parentfd5acdd85349977a2f063b2b28ef0318e0457741 (diff)
Merge pull request #14258 from vespa-engine/bratseth/even-faster-featuredata
Optimize for looking up values that are present
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/FeatureData.java22
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java8
2 files changed, 22 insertions, 8 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/result/FeatureData.java b/container-search/src/main/java/com/yahoo/search/result/FeatureData.java
index f0637473ef5..fd41d4ee10c 100644
--- a/container-search/src/main/java/com/yahoo/search/result/FeatureData.java
+++ b/container-search/src/main/java/com/yahoo/search/result/FeatureData.java
@@ -74,12 +74,15 @@ public class FeatureData implements Inspectable, JsonProducer {
* (that is, if it is a tensor with nonzero rank)
*/
public Double getDouble(String featureName) {
- if (decodedDoubles != null && decodedDoubles.containsKey(featureName))
- return decodedDoubles.get(featureName);
- Double value = decodeDouble(featureName);
if (decodedDoubles == null)
decodedDoubles = new HashMap<>();
- decodedDoubles.put(featureName, value);
+
+ Double value = decodedDoubles.get(featureName);
+ if (value != null) return value;
+
+ value = decodeDouble(featureName);
+ if (value != null)
+ decodedDoubles.put(featureName, value);
return value;
}
@@ -99,12 +102,15 @@ public class FeatureData implements Inspectable, JsonProducer {
* This will return any feature value: Scalars are returned as a rank 0 tensor.
*/
public Tensor getTensor(String featureName) {
- if (decodedTensors != null && decodedTensors.containsKey(featureName))
- return decodedTensors.get(featureName);
- Tensor value = decodeTensor(featureName);
if (decodedTensors == null)
decodedTensors = new HashMap<>();
- decodedTensors.put(featureName, value);
+
+ Tensor value = decodedTensors.get(featureName);
+ if (value != null) return value;
+
+ value = decodeTensor(featureName);
+ if (value != null)
+ decodedTensors.put(featureName, value);
return value;
}
diff --git a/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java b/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java
index f9b89b64e5b..3c8e147029c 100644
--- a/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java
@@ -11,6 +11,7 @@ import org.junit.Test;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
/**
* @author bratseth
@@ -32,14 +33,21 @@ public class FeatureDataTestCase {
FeatureData featureData = new FeatureData(new SlimeAdapter(features));
assertEquals("scalar1,scalar2,tensor1,tensor2",
featureData.featureNames().stream().sorted().collect(Collectors.joining(",")));
+ assertNull(featureData.getDouble("nosuch1"));
assertEquals(1.5, featureData.getDouble("scalar1"), delta);
assertEquals(2.5, featureData.getDouble("scalar2"), delta);
assertEquals("Cached lookup", 2.5, featureData.getDouble("scalar2"), delta);
+ assertNull(featureData.getDouble("nosuch2"));
+ assertNull(featureData.getDouble("nosuch2"));
+
+ assertNull(featureData.getTensor("nosuch1"));
assertEquals(Tensor.from(1.5), featureData.getTensor("scalar1"));
assertEquals(Tensor.from(2.5), featureData.getTensor("scalar2"));
assertEquals(tensor1, featureData.getTensor("tensor1"));
assertEquals(tensor2, featureData.getTensor("tensor2"));
assertEquals("Cached lookup", tensor2, featureData.getTensor("tensor2"));
+ assertNull(featureData.getTensor("nosuch2"));
+ assertNull(featureData.getTensor("nosuch2"));
String expectedJson =
"{" +