If this is needed functionality, shouldn’t that be available as a public method or something? Maybe write a patch etc. ?
> Ariel Weisberg <ar...@weisberg.ws> kirjoitti 26.2.2018 kello 18.47: > > 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. 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! >