summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/result/FeatureData.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/result/FeatureData.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/result/FeatureData.java26
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;