Package org.voltdb.utils

Source Code of org.voltdb.utils.VoltTableComparator

package org.voltdb.utils;

import java.util.Comparator;

import org.voltdb.VoltTable;
import org.voltdb.VoltType;
import org.voltdb.types.SortDirectionType;
import org.voltdb.types.TimestampType;

/**
* @author pavlo
*/
public class VoltTableComparator implements Comparator<Object[]> {

    private final VoltTable table;
    private final Pair<Integer, SortDirectionType> cols[];
    private final VoltType types[];

    public VoltTableComparator(VoltTable table, Pair<Integer, SortDirectionType> cols[]) {
        this.table = table;
        this.cols = cols;

        this.types = new VoltType[this.cols.length];
        for (int i = 0; i < this.types.length; i++) {
            this.types[i] = this.table.getColumnType(cols[i].getFirst());
        } // FOR
    }

    @Override
    public int compare(Object[] o1, Object[] o2) {
        assert (o1 != null);
        assert (o2 != null);
        assert (o1.length == o2.length);
        int cmp = 0;
        int sort_idx = 0;
        for (Pair<Integer, SortDirectionType> p : this.cols) {
            int col_idx = p.getFirst();
            assert (col_idx < o1.length);
            SortDirectionType dir = p.getSecond();
            assert (dir != SortDirectionType.INVALID);

            switch (this.types[sort_idx]) {
                case TINYINT:
                    cmp = ((Byte) o1[col_idx]) - ((Byte) o2[col_idx]);
                    break;
                case SMALLINT:
                    cmp = ((Short) o1[col_idx]) - ((Short) o2[col_idx]);
                    break;
                case INTEGER:
                    cmp = ((Integer) o1[col_idx]) - ((Integer) o2[col_idx]);
                    break;
                case BIGINT:
                    cmp = (int) (((Long) o1[col_idx]) - ((Long) o2[col_idx]));
                    break;
                case FLOAT:
                    cmp = (int) (((Float) o1[col_idx]) - ((Float) o2[col_idx]));
                    break;
                case DECIMAL:
                    cmp = (int) (((Double) o1[col_idx]) - ((Double) o2[col_idx]));
                    break;
                case STRING:
                    cmp = ((String) o1[col_idx]).compareTo((String) o2[col_idx]);
                    break;
                case TIMESTAMP:
                    cmp = ((TimestampType) o1[col_idx]).compareTo((TimestampType) o2[col_idx]);
                    break;
                case BOOLEAN:
                    cmp = ((Boolean) o1[col_idx]).compareTo((Boolean) o2[col_idx]);
                    break;
                default:
                    assert (false) : "Unsupported sorting column type " + this.types[sort_idx];
            } // SWITCH
            if (cmp != 0)
                break;
            sort_idx++;
        } // FOR

        // TODO: Handle duplicates!
        return (cmp);
    }
}
TOP

Related Classes of org.voltdb.utils.VoltTableComparator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.