diff options
author | Jon Bratseth <bratseth@oath.com> | 2020-09-01 23:46:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-01 23:46:37 +0200 |
commit | 1cce6c15c29e59200aa9db5e7b61da4fabc25cf3 (patch) | |
tree | b8358520ea48b9632aa903450e06495bccef5130 /container-search/src | |
parent | 7e0da683d39e7e6e4a290a061d03651e3c7cac59 (diff) | |
parent | 3915f6345c80abc5d5fc03d3ec5ae9ea45294248 (diff) |
Merge pull request #14232 from vespa-engine/bratseth/decode-once
Decode once
Diffstat (limited to 'container-search/src')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/result/FeatureData.java | 26 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java | 2 |
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 = "{" + |