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

Reply via email to