com.basho.riak.presto.SplitTask.java Source code

Java tutorial

Introduction

Here is the source code for com.basho.riak.presto.SplitTask.java

Source

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.basho.riak.presto;

import com.ericsson.otp.erlang.*;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

/**
 * Created by kuenishi on 14/03/27.
 */
public class SplitTask {
    private final String host;
    private final OtpErlangTuple task; // OtpErlangObject[] a = {vnode, filterVnodes};

    public SplitTask(String node, OtpErlangTuple task) {
        this.host = node2host(node);
        this.task = task;
    }

    // fromString(String)
    public SplitTask(String data) throws OtpErlangDecodeException, DecoderException {

        byte[] binary = Base64.decodeBase64(Hex.decodeHex(data.toCharArray()));
        task = (OtpErlangTuple) binary2term(binary);
        // task = {vnode, filterVnodes}
        OtpErlangTuple vnode = (OtpErlangTuple) task.elementAt(0);
        // vnode = {index, node}
        OtpErlangAtom erlangNode = (OtpErlangAtom) vnode.elementAt(1);
        // "dev" @ "127.0.0.1"
        this.host = node2host(erlangNode.atomValue());
    }

    private String node2host(String node) {
        String[] s = node.split("@");
        return s[1];
    }

    // @doc hostname without port number: Riak doesn't care about port number.
    public String getHost() {
        return host;
    }

    public String toString() {
        byte[] binary = term2binary(task);
        byte[] b = Base64.encodeBase64(binary);
        return Hex.encodeHexString(b);
    }

    public byte[] term2binary(OtpErlangObject o) {
        OtpOutputStream oos = new OtpOutputStream();
        oos.write_any(o);
        return oos.toByteArray();
    }

    public OtpErlangObject binary2term(byte[] data) throws OtpErlangDecodeException {
        OtpInputStream ois = new OtpInputStream(data);
        return ois.read_any();
    }

    public OtpErlangTuple getTask() {
        return this.task;
    }

    public OtpErlangList fetchAllData(DirectConnection conn, String schemaName, String tableName)
            throws OtpErlangDecodeException, OtpAuthException, OtpErlangExit {
        OtpErlangTuple t = (OtpErlangTuple) task;
        OtpErlangTuple vnode = (OtpErlangTuple) t.elementAt(0);
        OtpErlangList filterVnodes = (OtpErlangList) t.elementAt(1);

        try {
            OtpErlangList riakObjects = conn.processSplit(schemaName.getBytes(), tableName.getBytes(), vnode,
                    filterVnodes);
            //System.out.println(riakObjects);
            return riakObjects;
        } catch (java.io.IOException e) {
            System.err.println(e);
        }
        return new OtpErlangList();
    }

    public OtpErlangList fetchViaIndex(DirectConnection conn, String schemaName, String tableName,
            OtpErlangTuple query) throws OtpErlangDecodeException, OtpAuthException, OtpErlangExit {
        OtpErlangTuple t = (OtpErlangTuple) task;
        OtpErlangTuple vnode = (OtpErlangTuple) t.elementAt(0);
        OtpErlangList filterVnodes = (OtpErlangList) t.elementAt(1);

        try {
            OtpErlangTuple result = conn.processSplitIndex(schemaName.getBytes(), tableName.getBytes(), vnode,
                    filterVnodes, query);
            OtpErlangList riakObjects = (OtpErlangList) result.elementAt(1);
            //System.out.println(riakObjects);
            return riakObjects;
        } catch (java.io.IOException e) {
            System.err.println(e);
        }
        return new OtpErlangList();
    }

}