Ok. I did assume the same, here is what i have tried to fetch composite
columns via thrift and CQL query as well!

Not sure why thrift API is returning me column name as empty!  (Tried with
Cassandra 1.1.5)

Here is the program:

/*******************************************************************************
 * * Copyright 2012 Impetus Infotech.
 *  *
 *  * 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.impetus.client.cassandra.thrift;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;

import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.CompositeType;
import org.apache.cassandra.db.marshal.CompositeType.Builder;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.locator.SimpleStrategy;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.CfDef;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnOrSuperColumn;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.Compression;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.CqlResult;
import org.apache.cassandra.thrift.CqlRow;
import org.apache.cassandra.thrift.KsDef;
import org.apache.cassandra.thrift.SlicePredicate;
import org.apache.cassandra.thrift.SliceRange;
import org.apache.cassandra.thrift.TBinaryProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.scale7.cassandra.pelops.Bytes;

/**
 * @author vivek.mishra
 *
 */
public class CompositeTypeRunner
{
    public static void main(String[] args) throws Exception {

        TSocket socket = new TSocket("localhost", 9160);
        TFramedTransport transport = new TFramedTransport(socket);

        Cassandra.Client client = new Cassandra.Client(new
TBinaryProtocol(transport));
        transport.open();
        client.set_cql_version("3.0.0");
        List<CfDef> cfDefs = new ArrayList<CfDef>();

        /*  CfDef cfDef = new CfDef();
        cfDef.setName("test");
        cfDef.keyspace = "bigdata";
        cfDef.setComparator_type("UTF8Type");
        cfDef.setDefault_validation_class("UTF8Type");
//        cfDef.setKey_validation_class("UTF8Type");

        cfDefs.add(cfDef);*/


       KsDef ksDef = new KsDef("bigdata", SimpleStrategy.class.getName(),
cfDefs);

        if (ksDef.strategy_options == null)
        {
            ksDef.strategy_options = new LinkedHashMap<String, String>();
        }

        ksDef.strategy_options.put("replication_factor", "1");
        client.system_add_keyspace(ksDef);
        client.set_keyspace("bigdata");

        String cql_Query = "create columnfamily test1 (name text, age text,
address text, PRIMARY KEY(name,age))";

        client.execute_cql_query(ByteBuffer.wrap(("USE
bigdata").getBytes("UTF-8")) , Compression.NONE);


client.execute_cql_query(ByteBuffer.wrap((cql_Query).getBytes("UTF-8")) ,
Compression.NONE);

        /*ColumnParent parent = new ColumnParent("test1");

        List<AbstractType<?>> keyTypes = new ArrayList<AbstractType<?>>();
        keyTypes.add(UTF8Type.instance);
        keyTypes.add(UTF8Type.instance);
        CompositeType compositeKey = CompositeType.getInstance(keyTypes);

        Builder builder = new Builder(compositeKey);
        builder.add(ByteBuffer.wrap("1".getBytes()));
        builder.add(ByteBuffer.wrap("2".getBytes()));
        ByteBuffer rowid = builder.build();

        Column column = new Column();
        column.setName("value".getBytes());
        column.setValue("aaa".getBytes());
        column.setTimestamp(System.currentTimeMillis());

        client.insert(rowid, parent, column, ConsistencyLevel.ONE);*/

        ColumnParent parent = new ColumnParent("test1");

        List<AbstractType<?>> keyTypes = new ArrayList<AbstractType<?>>();
        keyTypes.add(UTF8Type.instance);
        keyTypes.add(UTF8Type.instance);
        CompositeType compositeKey = CompositeType.getInstance(keyTypes);

        Builder builder = new Builder(compositeKey);
        builder.add(ByteBuffer.wrap("3".getBytes()));
        builder.add(ByteBuffer.wrap("address".getBytes()));
        ByteBuffer columnName = builder.build();


        Column column = new Column();
        column.setName(columnName);
        column.setValue("4".getBytes());
        column.setTimestamp(System.currentTimeMillis());

        client.insert(ByteBuffer.wrap("1".getBytes()), parent, column,
ConsistencyLevel.ONE);


        SlicePredicate slicePredicate = new SlicePredicate();
        slicePredicate.setSlice_range(new
SliceRange(Bytes.EMPTY.getBytes(), Bytes.EMPTY.getBytes(), true, 10000));
        List<ColumnOrSuperColumn> columns =
client.get_slice(ByteBuffer.wrap("1".getBytes()), parent, slicePredicate,
ConsistencyLevel.ONE);

        for(ColumnOrSuperColumn col : columns)
        {
            if(col.column != null)
            {
                System.out.println(new String(col.getColumn().getName()));
  // Printing "EMPTY" String!
                System.out.println(new String(col.getColumn().getValue()));
            } else if(col.super_column != null)
            {

            } else if(col.counter_column != null)
            {

            } else if(col.counter_super_column != null)
            {

            }
        }

        // On cql select query.

        String selectQuery = "Select * from test1";
        CqlResult result =
client.execute_cql_query(ByteBuffer.wrap(selectQuery.getBytes("UTF-8")),
Compression.NONE);
        Iterator<CqlRow> rows = result.getRowsIterator();
        while(rows.hasNext())
        {
            CqlRow row = rows.next();
            List<Column> cols =  row.getColumns();
            for(Column c : cols)
            {
                System.out.println(new String(c.getName()) + "=>" + new
String(c.getValue()));

            }
        }
    }
}


Why there is a difference with data set return by CQL and via "slice
query"? I know about "interpolation" but wondering what is the best way to
interact with cassandra in near future?


-Vivek

On Thu, Oct 18, 2012 at 4:28 PM, aaron morton <aa...@thelastpickle.com>wrote:

> Yes, i understand that. Reason why i am asking is, with this i need to
> split
> them to get actual column name using ":" as a seperator.
>
> The ":" is a artefact of the cassandra-cli, nothing something you will
> have to deal with via the thrift API. Internally we do not store the values
> with ":" separators.
>
> Any idiomatic API will take care of parsing the raw wire format, see the
> pycassa example here...
>
> http://pycassa.github.com/pycassa/assorted/composite_types.html
>
> Cheers
>
> -----------------
> Aaron Morton
> Freelance Developer
> @aaronmorton
> http://www.thelastpickle.com
>
> On 18/10/2012, at 2:58 AM, Sylvain Lebresne <sylv...@datastax.com> wrote:
>
> Yes, i understand that. Reason why i am asking is, with this i need to
> split
> them to get actual column name using ":" as a seperator.
> Though i did not try it yet, but wondering if column name is like
> "alliance:movement", then how do it compute it?
>
>
> You've lost me, sorry.
>
> --
> Sylvain
>
>
>
> On Wed, Oct 17, 2012 at 1:04 PM, Sylvain Lebresne <sylv...@datastax.com>
> wrote:
>
>
> On Wed, Oct 17, 2012 at 3:17 AM, Vivek Mishra <mishra.v...@gmail.com>
> wrote:
>
> column name will be "2012-07-24:2:alliance_involvement" or
> "alliance_involvement"?
>
>
> The former. Though let's clarify that
> "2012-07-24:2:alliance_involvement" is the string representation of a
> composite name (i.e. one compatible with CompositeType) for display by
> the cli. What you will get is a composite containing 3 components, the
> first will be the string '2012-07-24', the second one will be the int
> 2 and the last one will be the string 'alliance_involvement'.
>
> --
> Sylvain
>
>
> -Vivek
>
> On Tue, Oct 16, 2012 at 10:25 PM, Sylvain Lebresne
> <sylv...@datastax.com>
> wrote:
>
>
> On Tue, Oct 16, 2012 at 12:31 PM, Vivek Mishra <mishra.v...@gmail.com>
> wrote:
>
> Thanks Sylvain. I missed it. If i try to access these via thrift API,
> what
> will be the column names?
>
>
> I'm not sure I understand the question. The cli output is pretty much
> what you get via the thrift API.
>
> --
> Sylvain
>
>
>
>
>
>
>

Reply via email to