All Downloads are FREE. Search and download functionalities are using the official Maven repository.

oracle.kv.impl.api.table.FieldValueReaderImpl Maven / Gradle / Ivy

/*-
 * Copyright (C) 2011, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This file was distributed by Oracle as part of a version of Oracle NoSQL
 * Database made available at:
 *
 * http://www.oracle.com/technetwork/database/database-technologies/nosqldb/downloads/index.html
 *
 * Please see the LICENSE file included in the top-level directory of the
 * appropriate version of Oracle NoSQL Database for a copy of the license and
 * additional information.
 */

package oracle.kv.impl.api.table;

import static oracle.kv.impl.api.table.FieldDefImpl.binaryDef;
import static oracle.kv.impl.api.table.FieldDefImpl.booleanDef;
import static oracle.kv.impl.api.table.FieldDefImpl.doubleDef;
import static oracle.kv.impl.api.table.FieldDefImpl.floatDef;
import static oracle.kv.impl.api.table.FieldDefImpl.integerDef;
import static oracle.kv.impl.api.table.FieldDefImpl.longDef;
import static oracle.kv.impl.api.table.FieldDefImpl.numberDef;
import static oracle.kv.impl.api.table.FieldDefImpl.stringDef;

import java.util.Stack;

import oracle.kv.Version;
import oracle.kv.table.FieldDef;
import oracle.kv.table.Table;

/*
 * A class used to deserialize FieldValueImpl instance from bytes.
 */
class FieldValueReaderImpl
    implements ValueReader {

    private Stack complexValues;
    FieldValueImpl value;

    FieldValueReaderImpl() {
        this(null);
    }

    FieldValueReaderImpl(FieldValueImpl value) {
        this.value = value;
        complexValues = null;
    }

    @Override
    public void readInteger(String name, int val) {
        setFieldValue(name, integerDef.createInteger(val));
    }

    @Override
    public void readLong(String name, long val) {
        setFieldValue(name, longDef.createLong(val));
    }

    @Override
    public void readFloat(String name, float val) {
        setFieldValue(name, floatDef.createFloat(val));
    }

    @Override
    public void readDouble(String name, double val) {
        setFieldValue(name, doubleDef.createDouble(val));
    }

    @Override
    public void readNumber(String name, byte[] bytes) {
        setFieldValue(name, numberDef.createNumber(bytes));
    }

    @Override
    public void readTimestamp(String name, FieldDef def, byte[] bytes) {
        setFieldValue(name,
            ((TimestampDefImpl)def.asTimestamp()).createTimestamp(bytes));
    }

    @Override
    public void readBinary(String name, byte[] bytes) {
        setFieldValue(name,
            (FieldValueImpl)binaryDef.asBinary().createBinary(bytes));
    }

    @Override
    public void readFixedBinary(String name, FieldDef def, byte[] bytes) {
        setFieldValue(name,
            (FieldValueImpl)def.asFixedBinary().createFixedBinary(bytes));
    }

    @Override
    public void readString(String name, String val) {
        setFieldValue(name, stringDef.createString(val));
    }

    @Override
    public void readBoolean(String name, boolean val) {
        setFieldValue(name, booleanDef.createBoolean(val));
    }

    @Override
    public void readNull(String name) {
        setFieldValue(name, NullValueImpl.getInstance());
    }

    @Override
    public void readJsonNull(String name) {
        setFieldValue(name, NullJsonValueImpl.getInstance());
    }

    @Override
    public void readEmpty(String name) {
        setFieldValue(name, EmptyValueImpl.getInstance());
    }

    @Override
    public void readEnum(String name, FieldDef def, int index) {
        EnumDefImpl enumDef = (EnumDefImpl)def.asEnum();
        setFieldValue(name, enumDef.createEnum(index));
    }

    @Override
    public void startRecord(String name, FieldDef def) {
        RecordValueImpl rval = (RecordValueImpl)def.asRecord().createRecord();
        setFieldValue(name, rval);
        pushComplexValue(rval);
    }

    @Override
    public void endRecord() {
        popComplexValue();
    }

    @Override
    public void startMap(String name, FieldDef def) {
        MapValueImpl mval = (MapValueImpl)def.asMap().createMap();
        setFieldValue(name, mval);
        pushComplexValue(mval);
    }

    @Override
    public void endMap() {
        popComplexValue();
    }

    @Override
    public void startArray(String name, FieldDef def, FieldDef elemDef) {
        ArrayValueImpl aval = (ArrayValueImpl)def.asArray().createArray();
        if (elemDef != null) {
            aval.setHomogeneousType((FieldDefImpl)elemDef);
        }
        setFieldValue(name, aval);
        pushComplexValue(aval);
    }

    @Override
    public void endArray() {
        popComplexValue();
    }

    private void setFieldValue(String name, FieldValueImpl fieldValue) {
        if (value == null) {
            value = fieldValue;
            return;
        }

        ComplexValueImpl curVal;
        if (complexValues == null || complexValues.isEmpty()) {
            if (!value.isComplex()) {
                throw new IllegalStateException("value should be complex " +
                    "type, but " + value.getType());
            }
            curVal = (ComplexValueImpl)value;
        } else {
            curVal = complexValues.peek();
        }

        if (curVal.isRecord()) {
            ((RecordValueImpl)curVal).putInternal(name, fieldValue, false);
        } else if (curVal.isMap()) {
            curVal.asMap().put(name, fieldValue);
        } else {
            assert(curVal.isArray());
            curVal.asArray().add(fieldValue);
        }
    }

    private void pushComplexValue(ComplexValueImpl fieldValue) {
        if (complexValues == null) {
            complexValues = new Stack();
        }
        complexValues.push(fieldValue);
    }

    private void popComplexValue() {
        if (complexValues != null) {
            complexValues.pop();
        }
    }

    @Override
    public FieldValueImpl getValue() {
        return value;
    }

    @Override
    public Table getTable() {
        return null;
    }

    @Override
    public void setTableVersion(int tableVersion) {
    }

    @Override
    public void setExpirationTime(long expirationTime) {
    }

    @Override
    public void setVersion(Version version) {
    }

    @Override
    public void reset() {
        complexValues = null;
        value = null;
    }

    @Override
    public void setValue(FieldValueImpl value) {
        this.value = value;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy