Hi All,

I have a need where I get a raw CQL create table statement as a String and
I need to parse the keyspace, tablename, columns and so on..so I can use it
for various queries and send it to C*. I used the example below from this
link <https://github.com/tacoo/cassandra-antlr-sample>. I get the following
error.  And I thought maybe someone in this mailing list will be more
familiar with internals.

Exception in thread "main"
org.apache.cassandra.exceptions.ConfigurationException:
Keyspace test_keyspace doesn't exist
at org.apache.cassandra.cql3.statements.CreateTableStatement$
RawStatement.prepare(CreateTableStatement.java:200)
at com.hello.world.Test.main(Test.java:23)


Here is my code.

package com.hello.world;

import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.apache.cassandra.cql3.CqlLexer;
import org.apache.cassandra.cql3.CqlParser;
import org.apache.cassandra.cql3.statements.CreateTableStatement;
import org.apache.cassandra.cql3.statements.ParsedStatement;

public class Test {

    public static void main(String[] args) throws Exception {
        String stmt = "create table if not exists
test_keyspace.my_table (field1 text, field2 int, field3 set<ascii>,
field4 map<ascii, text>, primary key (field1) );";
        ANTLRStringStream stringStream = new ANTLRStringStream(stmt);
        CqlLexer cqlLexer = new CqlLexer(stringStream);
        CommonTokenStream token = new CommonTokenStream(cqlLexer);
        CqlParser parser = new CqlParser(token);
        ParsedStatement query = parser.query();
        if (query.getClass().getDeclaringClass() ==
CreateTableStatement.class) {
            CreateTableStatement.RawStatement cts =
(CreateTableStatement.RawStatement) query;
            System.out.println(cts.keyspace());
            System.out.println(cts.columnFamily());
            ParsedStatement.Prepared prepared = cts.prepare();
            CreateTableStatement cts2 = (CreateTableStatement)
prepared.statement;
            cts2.getCFMetaData()
                    .getColumnMetadata()
                    .values()
                    .stream()
                    .forEach(cd -> System.out.println(cd));
        }
    }
}

Thanks!

Reply via email to