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 2008/01/25 14:46:15 UTC
svn commit: r615223 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene:
CachingIndexReader.java DocId.java IndexMerger.java
Author: mreutegg
Date: Fri Jan 25 05:46:15 2008
New Revision: 615223
URL: http://svn.apache.org/viewvc?rev=615223&view=rev
Log:
JCR-1337: Optimize first execution queries for DescendantSelfAxisWeight/ChildAxisQuery
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DocId.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java?rev=615223&r1=615222&r2=615223&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java Fri Jan 25 05:46:15 2008
@@ -22,11 +22,16 @@
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.TermEnum;
+import org.apache.jackrabbit.uuid.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.BitSet;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.text.NumberFormat;
/**
* Implements an <code>IndexReader</code> that maintains caches to resolve
@@ -69,11 +74,14 @@
* @param delegatee the base <code>IndexReader</code>.
* @param cache a document number cache, or <code>null</code> if not
* available to this reader.
+ * @throws IOException if an error occurs while reading from the index.
*/
- CachingIndexReader(IndexReader delegatee, DocNumberCache cache) {
+ CachingIndexReader(IndexReader delegatee, DocNumberCache cache)
+ throws IOException {
super(delegatee);
this.cache = cache;
parents = new DocId[delegatee.maxDoc()];
+ initializeParents(delegatee);
}
/**
@@ -211,6 +219,74 @@
private static long getNextCreationTick() {
synchronized (CachingIndexReader.class) {
return currentTick++;
+ }
+ }
+
+ /**
+ * Initializes the {@link #parents} <code>DocId</code> array.
+ *
+ * @param reader the underlying index reader.
+ * @throws IOException if an error occurs while reading from the index.
+ */
+ private void initializeParents(IndexReader reader) throws IOException {
+ long time = System.currentTimeMillis();
+ Map docs = new HashMap();
+ for (int i = 0; i < reader.maxDoc(); i++) {
+ if (!reader.isDeleted(i)) {
+ Document doc = reader.document(i, FieldSelectors.UUID_AND_PARENT);
+ UUID uuid = UUID.fromString(doc.get(FieldNames.UUID));
+ UUID parent = null;
+ try {
+ parent = UUID.fromString(doc.get(FieldNames.PARENT));
+ } catch (IllegalArgumentException e) {
+ // root node does not have a parent
+ }
+ NodeInfo info = new NodeInfo(i, uuid, parent);
+ docs.put(uuid, info);
+ }
+ }
+ double foreignParents = 0;
+ for (Iterator it = docs.values().iterator(); it.hasNext(); ) {
+ NodeInfo info = (NodeInfo) it.next();
+ NodeInfo parent = (NodeInfo) docs.get(info.parent);
+ if (parent != null) {
+ parents[info.docId] = DocId.create(parent.docId);
+ } else if (info.parent != null) {
+ foreignParents++;
+ parents[info.docId] = DocId.create(info.parent);
+ } else {
+ // no parent -> root node
+ parents[info.docId] = DocId.NULL;
+ }
+ }
+ if (log.isDebugEnabled()) {
+ NumberFormat nf = NumberFormat.getPercentInstance();
+ nf.setMaximumFractionDigits(1);
+ time = System.currentTimeMillis() - time;
+ if (parents.length > 0) {
+ foreignParents /= parents.length;
+ }
+ log.debug("initialized {} DocIds in {} ms, {} foreign parents",
+ new Object[]{
+ new Integer(parents.length),
+ new Long(time),
+ nf.format(foreignParents)
+ });
+ }
+ }
+
+ private static class NodeInfo {
+
+ final int docId;
+
+ final UUID uuid;
+
+ final UUID parent;
+
+ public NodeInfo(int docId, UUID uuid, UUID parent) {
+ this.docId = docId;
+ this.uuid = uuid;
+ this.parent = parent;
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DocId.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DocId.java?rev=615223&r1=615222&r2=615223&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DocId.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/DocId.java Fri Jan 25 05:46:15 2008
@@ -107,8 +107,19 @@
*
* @param uuid the node uuid.
* @return a <code>DocId</code> based on a node UUID.
+ * @throws IllegalArgumentException if the <code>uuid</code> is malformed.
*/
static DocId create(String uuid) {
+ return create(UUID.fromString(uuid));
+ }
+
+ /**
+ * Creates a <code>DocId</code> based on a node UUID.
+ *
+ * @param uuid the node uuid.
+ * @return a <code>DocId</code> based on a node UUID.
+ */
+ static DocId create(UUID uuid) {
return new UUIDDocId(uuid);
}
@@ -188,13 +199,10 @@
* Creates a <code>DocId</code> based on a Node uuid.
*
* @param uuid the Node uuid.
- * @throws IllegalArgumentException if the <code>uuid</code> is
- * malformed.
*/
- UUIDDocId(String uuid) {
- UUID tmp = UUID.fromString(uuid);
- this.lsb = tmp.getLeastSignificantBits();
- this.msb = tmp.getMostSignificantBits();
+ UUIDDocId(UUID uuid) {
+ this.lsb = uuid.getLeastSignificantBits();
+ this.msb = uuid.getMostSignificantBits();
}
/**
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java?rev=615223&r1=615222&r2=615223&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/IndexMerger.java Fri Jan 25 05:46:15 2008
@@ -302,6 +302,12 @@
docCount += readers[i].numDocs();
}
log.info("merged " + docCount + " documents in " + time + " ms into " + index.getName() + ".");
+
+ // force initializing of caches
+ time = System.currentTimeMillis();
+ index.getReadOnlyIndexReader().close();
+ time = System.currentTimeMillis() - time;
+ log.debug("reader obtained in {} ms", new Long(time));
} finally {
for (int i = 0; i < readers.length; i++) {
try {