Author: aadamchik
Date: Wed Feb 22 11:17:45 2012
New Revision: 1292239
URL: http://svn.apache.org/viewvc?rev=1292239&view=rev
Log:
CAY-1667 Expression parser performance optimization
avoid wasting memory on processing buffers larger than the input
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java?rev=1292239&r1=1292238&r2=1292239&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java
Wed Feb 22 11:17:45 2012
@@ -32,6 +32,8 @@ import java.util.Map;
import org.apache.cayenne.exp.parser.ASTScalar;
import org.apache.cayenne.exp.parser.ExpressionParser;
+import org.apache.cayenne.exp.parser.ExpressionParserTokenManager;
+import org.apache.cayenne.exp.parser.JavaCharStream;
import org.apache.cayenne.exp.parser.ParseException;
import org.apache.cayenne.util.ConversionUtil;
import org.apache.cayenne.util.Util;
@@ -117,6 +119,9 @@ public abstract class Expression impleme
public static final int NOT_LIKE = 37;
public static final int NOT_LIKE_IGNORE_CASE = 38;
+
+ private static final int PARSE_BUFFER_MAX_SIZE = 4096;
+
protected int type;
/**
@@ -131,9 +136,17 @@ public abstract class Expression impleme
throw new NullPointerException("Null expression string.");
}
+ // optimizing parser buffers per CAY-1667...
+ int bufferSize = expressionString.length() > PARSE_BUFFER_MAX_SIZE
+ ? PARSE_BUFFER_MAX_SIZE
+ : expressionString.length();
Reader reader = new StringReader(expressionString);
+ JavaCharStream stream = new JavaCharStream(reader, 1, 1, bufferSize);
+ ExpressionParserTokenManager tm = new
ExpressionParserTokenManager(stream);
+ ExpressionParser parser = new ExpressionParser(tm);
+
try {
- return new ExpressionParser(reader).expression();
+ return parser.expression();
}
catch (ParseException ex) {
throw new ExpressionException(ex.getMessage(), ex);