diff options
Diffstat (limited to 'document/src/main/java/com/yahoo/document/json/readers/TensorReader.java')
-rw-r--r-- | document/src/main/java/com/yahoo/document/json/readers/TensorReader.java | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/document/src/main/java/com/yahoo/document/json/readers/TensorReader.java b/document/src/main/java/com/yahoo/document/json/readers/TensorReader.java new file mode 100644 index 00000000000..5dd32753ed6 --- /dev/null +++ b/document/src/main/java/com/yahoo/document/json/readers/TensorReader.java @@ -0,0 +1,65 @@ +// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.document.json.readers; + +import com.yahoo.document.datatypes.TensorFieldValue; +import com.yahoo.document.json.TokenBuffer; +import com.yahoo.tensor.MappedTensor; +import com.yahoo.tensor.Tensor; + +import static com.yahoo.document.json.readers.JsonParserHelpers.*; + +public class TensorReader { + public static final String TENSOR_ADDRESS = "address"; + public static final String TENSOR_DIMENSIONS = "dimensions"; + public static final String TENSOR_CELLS = "cells"; + public static final String TENSOR_VALUE = "value"; + + public static void fillTensor(TokenBuffer buffer, TensorFieldValue tensorFieldValue) { + Tensor.Builder tensorBuilder = Tensor.Builder.of(tensorFieldValue.getDataType().getTensorType()); + expectObjectStart(buffer.currentToken()); + int initNesting = buffer.nesting(); + /* read tensor cell fields and ignore everything else */ + for (buffer.next(); buffer.nesting() >= initNesting; buffer.next()) { + if (TensorReader.TENSOR_CELLS.equals(buffer.currentName())) + readTensorCells(buffer, tensorBuilder); + } + expectObjectEnd(buffer.currentToken()); + tensorFieldValue.assign(tensorBuilder.build()); + } + + public static void readTensorCells(TokenBuffer buffer, Tensor.Builder tensorBuilder) { + expectArrayStart(buffer.currentToken()); + int initNesting = buffer.nesting(); + for (buffer.next(); buffer.nesting() >= initNesting; buffer.next()) + readTensorCell(buffer, tensorBuilder); + expectCompositeEnd(buffer.currentToken()); + } + + public static void readTensorCell(TokenBuffer buffer, Tensor.Builder tensorBuilder) { + expectObjectStart(buffer.currentToken()); + int initNesting = buffer.nesting(); + double cellValue = 0.0; + Tensor.Builder.CellBuilder cellBuilder = tensorBuilder.cell(); + for (buffer.next(); buffer.nesting() >= initNesting; buffer.next()) { + String currentName = buffer.currentName(); + if (TensorReader.TENSOR_ADDRESS.equals(currentName)) { + readTensorAddress(buffer, cellBuilder); + } else if (TensorReader.TENSOR_VALUE.equals(currentName)) { + cellValue = Double.valueOf(buffer.currentText()); + } + } + expectObjectEnd(buffer.currentToken()); + cellBuilder.value(cellValue); + } + + public static void readTensorAddress(TokenBuffer buffer, MappedTensor.Builder.CellBuilder cellBuilder) { + expectObjectStart(buffer.currentToken()); + int initNesting = buffer.nesting(); + for (buffer.next(); buffer.nesting() >= initNesting; buffer.next()) { + String dimension = buffer.currentName(); + String label = buffer.currentText(); + cellBuilder.label(dimension, label); + } + expectObjectEnd(buffer.currentToken()); + } +} |