summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2020-09-01 23:46:37 +0200
committerGitHub <noreply@github.com>2020-09-01 23:46:37 +0200
commit1cce6c15c29e59200aa9db5e7b61da4fabc25cf3 (patch)
treeb8358520ea48b9632aa903450e06495bccef5130
parent7e0da683d39e7e6e4a290a061d03651e3c7cac59 (diff)
parent3915f6345c80abc5d5fc03d3ec5ae9ea45294248 (diff)
Merge pull request #14232 from vespa-engine/bratseth/decode-once
Decode once
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/FeatureData.java26
-rw-r--r--container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java2
2 files changed, 28 insertions, 0 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 4895db04462..f0637473ef5 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
@@ -14,7 +14,9 @@ import com.yahoo.tensor.serialization.TypedBinaryFormat;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Map;
import java.util.Optional;
import java.util.Set;
@@ -31,6 +33,10 @@ public class FeatureData implements Inspectable, JsonProducer {
private Set<String> featureNames = null;
+ /** Cached decoded values */
+ private Map<String, Double> decodedDoubles = null;
+ private Map<String, Tensor> decodedTensors = null;
+
private String jsonForm = null;
public FeatureData(Inspector value) {
@@ -68,6 +74,16 @@ 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);
+ return value;
+ }
+
+ private Double decodeDouble(String featureName) {
Inspector featureValue = getInspector(featureName);
if ( ! featureValue.valid()) return null;
@@ -83,6 +99,16 @@ 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);
+ return value;
+ }
+
+ private Tensor decodeTensor(String featureName) {
Inspector featureValue = getInspector(featureName);
if ( ! featureValue.valid()) return null;
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 9cc7cc743fc..f9b89b64e5b 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
@@ -34,10 +34,12 @@ public class FeatureDataTestCase {
featureData.featureNames().stream().sorted().collect(Collectors.joining(",")));
assertEquals(1.5, featureData.getDouble("scalar1"), delta);
assertEquals(2.5, featureData.getDouble("scalar2"), delta);
+ assertEquals("Cached lookup", 2.5, featureData.getDouble("scalar2"), delta);
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"));
String expectedJson =
"{" +