Hi, I took a similar approach and it worked fine. I was able to build a tool that parsed production query logs. I used a helper method that would just grab a private field out of an object by name using reflection. Ariel
On Sun, Feb 25, 2018, at 11:58 PM, Jonathan Haddad wrote: > I had to do something similar recently. Take a look at > org.apache.cassandra.cql3.QueryProcessor.parseStatement(). I've got > some sample code here [1] as well as a blog post [2] that explains how > to access the private variables, since there's no access provided. It > wasn't really designed to be used as a library, so YMMV with future > changes.> > [1] > https://github.com/rustyrazorblade/rustyrazorblade-examples/blob/master/privatevaraccess/src/main/kotlin/com/rustyrazorblade/privatevaraccess/CreateTableParser.kt> > [2] > http://rustyrazorblade.com/post/2018/2018-02-25-accessing-private-variables-in-jvm/> > > On Mon, Feb 5, 2018 at 2:27 PM Kant Kodali <k...@peernova.com> wrote:>> I > just did some trial and error. Looks like this would work >> >> *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.cqlStatement(); >> >> >> * if *(query.getClass().getDeclaringClass() == >> CreateTableStatement.*class*) { >>>> CreateTableStatement.RawStatement cts = >> (CreateTableStatement.RawStatement) query; >>>> CFMetaData >> >> .*compile*(stmt, cts.keyspace()) >> >> >> >> .getColumnMetadata() >> >> .values() >> >> .stream() >> >> .forEach(cd -> System.**out**.println(cd)); >> >> >> } >> } >> } >> >> On Mon, Feb 5, 2018 at 2:13 PM, Kant Kodali >> <k...@peernova.com> wrote:>>> Hi Anant, >>> >>> I just have CQL create table statement as a string I want to extract >>> all the parts like, tableName, KeySpaceName, regular Columns, >>> partitionKey, ClusteringKey, Clustering Order and so on. Thats >>> really it!>>> >>> Thanks! >>> >>> On Mon, Feb 5, 2018 at 1:50 PM, Rahul Singh >>> <rahul.xavier.si...@gmail.com> wrote:>>>> I think I understand what you are >>> trying to do … but what is your >>>> goal? What do you mean “use it for different” queries… Maybe you >>>> want to do an event and have an event processor? Seems like you are >>>> trying to basically by pass that pattern and parse a query and >>>> split it into several actions?>>>> >>>> Did you look into this unit test folder? >>>> >>>> https://github.com/apache/cassandra/blob/trunk/test/unit/org/apache/cassandra/cql3/CQLTester.java>>>> >>>> >>>> -- >>>> Rahul Singh >>>> rahul.si...@anant.us >>>> >>>> Anant Corporation >>>> >>>> On Feb 5, 2018, 4:06 PM -0500, Kant Kodali <k...@peernova.com>, >>>> wrote:>>>> >>>>> 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[1]. 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$RawS- >>>>> tatement.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! Links: 1. https://github.com/tacoo/cassandra-antlr-sample