You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2005/07/21 10:13:19 UTC
svn commit: r220022 - in /incubator/jackrabbit/trunk/core/src: grammar/sql/
java/org/apache/jackrabbit/core/query/lucene/
java/org/apache/jackrabbit/core/query/sql/
java/org/apache/jackrabbit/core/query/xpath/
Author: mreutegg
Date: Thu Jul 21 01:13:17 2005
New Revision: 220022
URL: http://svn.apache.org/viewcvs?rev=220022&view=rev
Log:
- Optimize query execution. document frequency for UUID and PARENT field can be served from cache.
- Reuse query parsers. Results in much lower memory consumption
Modified:
incubator/jackrabbit/trunk/core/src/grammar/sql/JCRSQL.jjt
incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java
incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java
incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java
Modified: incubator/jackrabbit/trunk/core/src/grammar/sql/JCRSQL.jjt
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/grammar/sql/JCRSQL.jjt?rev=220022&r1=220021&r2=220022&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/grammar/sql/JCRSQL.jjt (original)
+++ incubator/jackrabbit/trunk/core/src/grammar/sql/JCRSQL.jjt Thu Jul 21 01:13:17 2005
@@ -65,7 +65,7 @@
return parser.Query();
}
- private void setNamespaceResolver(NamespaceResolver resolver) {
+ void setNamespaceResolver(NamespaceResolver resolver) {
this.resolver = resolver;
}
Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java?rev=220022&r1=220021&r2=220022&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java Thu Jul 21 01:13:17 2005
@@ -146,6 +146,28 @@
}
/**
+ * Provides an efficient lookup of document frequency for terms with field
+ * {@link FieldNames#UUID} and {@link FieldNames#PARENT}. All other calles
+ * are handled by the base class.
+ *
+ * @param t the term to look up the document frequency.
+ * @return the document frequency of term <code>t</code>.
+ * @throws IOException if an error occurs while reading from the index.
+ */
+ public int docFreq(Term t) throws IOException {
+ synchronized (this) {
+ cacheInit();
+ if (t.field() == FieldNames.UUID) {
+ return idCache.containsKey(t.text()) ? 1 : 0;
+ } else if (t.field() == FieldNames.PARENT) {
+ List children = (List) parentCache.get(t.text());
+ return children == null ? 0 : children.size();
+ }
+ }
+ return super.docFreq(t);
+ }
+
+ /**
* Removes the <code>TermEnum</code> from the idCache and calls the base
* <code>IndexReader</code>.
* @param n the number of the document to delete.
Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java?rev=220022&r1=220021&r2=220022&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/sql/JCRSQLQueryBuilder.java Thu Jul 21 01:13:17 2005
@@ -46,6 +46,9 @@
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.io.StringReader;
/**
* Implements the query builder for the JCR SQL syntax.
@@ -64,6 +67,12 @@
private static final String DATE_PATTERN = "yyyy-MM-dd";
/**
+ * Map of reusable JCRSQL parser instances indexed by NamespaceResolver.
+ */
+ private static Map parsers = new WeakHashMap();
+
+
+ /**
* The root node of the sql query syntax tree
*/
private final ASTQuery stmt;
@@ -111,7 +120,23 @@
public static QueryRootNode createQuery(String statement, NamespaceResolver resolver)
throws InvalidQueryException {
try {
- JCRSQLQueryBuilder builder = new JCRSQLQueryBuilder(JCRSQLParser.parse(statement, resolver), resolver);
+ // get parser
+ JCRSQLParser parser;
+ synchronized (parsers) {
+ parser = (JCRSQLParser) parsers.get(resolver);
+ if (parser == null) {
+ parser = new JCRSQLParser(new StringReader(statement));
+ parser.setNamespaceResolver(resolver);
+ parsers.put(resolver, parser);
+ }
+ }
+
+ JCRSQLQueryBuilder builder;
+ // guard against concurrent use within same session
+ synchronized (parser) {
+ parser.ReInit(new StringReader(statement));
+ builder = new JCRSQLQueryBuilder(parser.Query(), resolver);
+ }
return builder.getRootNode();
} catch (ParseException e) {
throw new InvalidQueryException(e.getMessage());
Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java?rev=220022&r1=220021&r2=220022&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/query/xpath/XPathQueryBuilder.java Thu Jul 21 01:13:17 2005
@@ -45,6 +45,8 @@
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
/**
* Query builder that translates a XPath statement into a query tree structure.
@@ -192,12 +194,17 @@
private static final String OP_SIGN_LE = "<=";
/**
+ * Map of reusable XPath parser instances indexed by NamespaceResolver.
+ */
+ private static Map parsers = new WeakHashMap();
+
+ /**
* The root <code>QueryNode</code>
*/
private final QueryRootNode root = new QueryRootNode();
/**
- * The {@link org.apache.jackrabbit.core.NamespaceResolver} in use
+ * The {@link NamespaceResolver} in use
*/
private final NamespaceResolver resolver;
@@ -220,8 +227,23 @@
// create an XQuery statement because we're actually using an
// XQuery parser.
statement = "for $v in " + statement + " return $v";
- XPath query = new XPath(new StringReader(statement));
- query.XPath2().jjtAccept(this, root);
+ // get parser
+ XPath parser;
+ synchronized (parsers) {
+ parser = (XPath) parsers.get(resolver);
+ if (parser == null) {
+ parser = new XPath(new StringReader(statement));
+ parsers.put(resolver, parser);
+ }
+ }
+
+ SimpleNode query;
+ // guard against concurrent use within same session
+ synchronized (parser) {
+ parser.ReInit(new StringReader(statement));
+ query = parser.XPath2();
+ }
+ query.jjtAccept(this, root);
} catch (ParseException e) {
throw new InvalidQueryException(e.getMessage(), e);
} catch (Throwable t) {