diff options
author | Jon Bratseth <bratseth@gmail.com> | 2020-09-01 20:38:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2020-09-01 20:38:44 +0200 |
commit | 3915f6345c80abc5d5fc03d3ec5ae9ea45294248 (patch) | |
tree | b8358520ea48b9632aa903450e06495bccef5130 /container-search/src/main/java/com/yahoo/search/result | |
parent | 1838608019b8004a6a86c6b6c530a60bc151f633 (diff) |
Decode once
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/result')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/result/FeatureData.java | 26 |
1 files changed, 26 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; |