I just solved it.
It was my mistake with using ByteBuffer.. the array() method returns the entire array without considering the index offset into the array.
It works using
    String rowName = Charset.forName(UTF_8).decode(entry.getKey()).toString();

Ross


On 1 February 2012 22:42, Ross Black <ross.w.black@gmail.com> wrote:
Hi,

I am trying to get multiget_slice working with the raw thrift client, but am having problems interpreting the returned keys.
I assume I am doing something wrong but figure what.

Here is the test program...

import org.apache.cassandra.thrift.*;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public class TestMultiGet {

    private static final String KEYSPACE = "junk";
    private static final String COLUMN_FAMILY = "blah";

    public static void main(String[] args) throws Exception {
        TTransport transport = new TFramedTransport(new TSocket("localhost", 9160, 30 * 1000));
        transport.open();
        TProtocol protocol = new TBinaryProtocol(transport);
        Cassandra.Client client = new Cassandra.Client(protocol);

        ByteBuffer rowKey = ByteBuffer.wrap("row111".getBytes());
        ByteBuffer colKey = ByteBuffer.wrap("BBB".getBytes());
        ByteBuffer value = ByteBuffer.wrap("datadata".getBytes());
        long timestamp = System.currentTimeMillis();
        ColumnParent columnParent = new ColumnParent(COLUMN_FAMILY);
        Column column = new Column().setName(colKey).setValue(value).setTimestamp(timestamp);

        client.set_keyspace(KEYSPACE);
        client.insert(rowKey, columnParent, column, ConsistencyLevel.ONE);

        SlicePredicate predicate = new SlicePredicate().setColumn_names(Collections.singletonList(colKey));
        Map<ByteBuffer, List<ColumnOrSuperColumn>> sliceMap = client.multiget_slice(Collections.singletonList(rowKey), columnParent, predicate, ConsistencyLevel.QUORUM);
        for (Map.Entry<ByteBuffer, List<ColumnOrSuperColumn>> entry : sliceMap.entrySet()) {
            byte[] key = entry.getKey().array();
            System.err.println("Row bytes = " + Arrays.toString(key));
            System.err.println("Row = ###\n" + new String(key) + "###");

            List<ColumnOrSuperColumn> columns = entry.getValue();
            for (ColumnOrSuperColumn col : columns) {
                byte[] name = col.getColumn().getName();
                System.err.println("Column = " + new String(name));
            }
        }
    }
}


And here is the output I get when I run it...
Row bytes = [-128, 1, 0, 2, 0, 0, 0, 14, 109, 117, 108, 116, 105, 103, 101, 116, 95, 115, 108, 105, 99, 101, 0, 0, 0, 3, 13, 0, 0, 11, 15, 0, 0, 0, 1, 0, 0, 0, 6, 114, 111, 119, 49, 49, 49, 12, 0, 0, 0, 1, 12, 0, 1, 11, 0, 1, 0, 0, 0, 3, 66, 66, 66, 11, 0, 2, 0, 0, 0, 8, 100, 97, 116, 97, 100, 97, 116, 97, 10, 0, 3, 0, 0, 1, 53, 56, -84, 0, 87, 0, 0, 0]
Row = ###@row111@BBB@datadata@###
Column = BBB

where the @ represents unprintable chars.

I assumed that the keys in the returned Map would be the same as the keys passed in, but they instead seem to contain the entire result.
I have tried this with 0.8.x and 1.0.7 with the same result.

Should the returned keys be the same as the requested keys, or do they need to be interpreted as some other data structure?
What do I need to do to fix this?


Thanks,
Ross