Yes ideally.  I’ve been spending a bit of time in the parser the last week.  
There’s a lot of internals which are still using old terminology and are pretty 
damn confusing.  I’m doing a little investigation into exposing some of the 
information while also modernizing it.  


> On Feb 26, 2018, at 10:02 AM, Hannu Kröger <hkro...@gmail.com> wrote:
> 
> 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 <mailto: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
>>>  
>>> <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/
>>>  
>>> <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 
>>> <mailto: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 
>>> <mailto: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 
>>> <mailto: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
>>>  
>>> <https://github.com/apache/cassandra/blob/trunk/test/unit/org/apache/cassandra/cql3/CQLTester.java>
>>> 
>>> --
>>> Rahul Singh
>>> rahul.si...@anant.us <mailto:rahul.si...@anant.us>
>>> 
>>> Anant Corporation
>>> 
>>> On Feb 5, 2018, 4:06 PM -0500, Kant Kodali <k...@peernova.com 
>>> <mailto: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 <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