cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: Extracting tokens from an expression and matching an object against that expression without parsing twice
Date Sun, 16 Nov 2014 13:57:16 GMT
I second John's assessment. 

BTW, what are the tokens for? Do you actually need to have access to the lexical structure
of the String? As of course parsed Expression object is a tree itself and gives you access
to its own structure either directly ('getOperand(int)') or via 'traverse' and 'transform'
methods.

Andrus

> On Nov 14, 2014, at 9:54 PM, John Huss <johnthuss@gmail.com> wrote:
> 
> This looks like a serious micro optimization.  Is the performance for this
> really that critical?  Have you demonstrated that this is your
> application's crucial hot spot?
> 
> On Fri, Nov 14, 2014 at 7:35 AM, Davide Vecchi <dv@amc.dk> wrote:
> 
>> Hi all,
>> 
>> I have an expression in a string, and I use Cayenne to parse the
>> expression into tokens, which are needed for a specific purpose.
>> 
>> However in addition to having the tokens I also need to evaluate an object
>> against that expression, to see if that object matches the expression.
>> 
>> My problem is that the way I'm doing it causes the parsing to be done
>> twice on the same expression, and I would like to avoid to parse the same
>> expression twice.
>> 
>> The token creation I'm doing it like this:
>> 
>> -----------------------------------
>> String where = "myField=0";
>> 
>> Reader reader = new StringReader(where);
>> 
>> ExpressionParser parser = new ExpressionParser(reader);
>> 
>> List<Token> tokens = new ArrayList<>();
>> 
>> Token token = parser.getNextToken();
>> 
>> while (token != null) {
>> 
>>     tokens.add(token);
>> 
>>     token = parser.getNextToken();
>> }
>> -----------------------------------
>> 
>> The object matching I'm doing it like this:
>> 
>> -----------------------------------
>> String where = "myField=0";
>> 
>> Expression expression = Expression.fromString(where);
>> 
>> boolean matches = expression.match(object);
>> -----------------------------------
>> 
>> The call to Expression.fromString made in the object matching operation
>> performs a parsing, but the parsing of the same expression had already been
>> done in the token creation operation.
>> 
>> Is there a way to redesign this process in order to get the tokens and
>> also match an object against the expression without parsing the same
>> expression twice ?
>> 
>> For example, I believe that the call to Expression.fromString must have
>> created the tokens, because it has parsed the string. So I thought I could
>> reverse the order and do the object matching first, keep the Expression
>> instance created in that process and use it to extract the tokens. But I
>> can't see how to extract the tokens from an Expression instance instead of
>> from an ExpressionParser instance as I'm currently doing.
>> 
>> Or another possibility could be that I keep creating the tokens first, and
>> then I match my object against them, instead of against the string
>> expression that generated those tokens. But I can't see how to match an
>> object against tokens.
>> 
>> So I'm looking for some ideas.
>> 
>> Thanks in advance.
>> 
>> Davide Vecchi
>> 


Mime
View raw message