[exo-jcr-commits] exo-jcr SVN: r2380 - in jcr/branches/1.12-LIC-709/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/api/core/query/lucene and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri May 14 11:07:43 EDT 2010
Author: nzamosenchuk
Date: 2010-05-14 11:07:42 -0400 (Fri, 14 May 2010)
New Revision: 2380
Added:
jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SingleIndex.java
Modified:
jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/IndexingAggregateTest.java
Log:
EXOJCR-709: first approaches of making POC
Modified: jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
===================================================================
--- jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2010-05-13 13:47:26 UTC (rev 2379)
+++ jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2010-05-14 15:07:42 UTC (rev 2380)
@@ -129,6 +129,7 @@
* calculated as follows: 2 *
* Runtime.getRuntime().availableProcessors().
*/
+ @Deprecated
public static final int DEFAULT_EXTRACTOR_POOL_SIZE = 0;
/**
@@ -173,6 +174,11 @@
private MultiIndex index;
/**
+ * Single actual index
+ */
+ private SingleIndex singleIndex;
+
+ /**
* The analyzer we use for indexing.
*/
private JcrStandartAnalyzer analyzer;
@@ -473,6 +479,7 @@
* if an error occurs while initializing this handler.
* @throws RepositoryException
*/
+ @Override
public void doInit() throws IOException, RepositoryException
{
QueryHandlerContext context = getContext();
@@ -542,6 +549,9 @@
analyzer.setIndexingConfig(indexingConfig);
index = new MultiIndex(this, context.getIndexingTree(), modeHandler, getIndexInfos(), getIndexUpdateMonitor());
+
+ singleIndex = new SingleIndex(this, indexDirectory, analyzer);
+
// if RW mode, create initial index and start check
if (modeHandler.getMode() == IndexerIoMode.READ_WRITE)
{
@@ -670,7 +680,42 @@
final Set<String> removedNodeIds = new HashSet<String>();
final Set<String> addedNodeIds = new HashSet<String>();
- index.update(IteratorUtils.toList(new TransformIterator(remove, new Transformer()
+// index.update(IteratorUtils.toList(new TransformIterator(remove, new Transformer()
+// {
+// public Object transform(Object input)
+// {
+// String uuid = ((String)input);
+// removedNodeIds.add(uuid);
+// return uuid;
+// }
+// })), IteratorUtils.toList(new TransformIterator(add, new Transformer()
+// {
+// public Object transform(Object input)
+// {
+// NodeData state = (NodeData)input;
+// if (state == null)
+// {
+// return null;
+// }
+// String uuid = state.getIdentifier();
+// addedNodeIds.add(uuid);
+// removedNodeIds.remove(uuid);
+// Document doc = null;
+// try
+// {
+// doc = createDocument(state, getNamespaceMappings(), index.getIndexFormatVersion());
+// retrieveAggregateRoot(state, aggregateRoots);
+// }
+// catch (RepositoryException e)
+// {
+// log
+// .warn("Exception while creating document for node: " + state.getIdentifier() + ": " + e.toString(), e);
+// }
+// return doc;
+// }
+// })));
+
+ singleIndex.update(IteratorUtils.toList(new TransformIterator(remove, new Transformer()
{
public Object transform(Object input)
{
@@ -693,7 +738,7 @@
Document doc = null;
try
{
- doc = createDocument(state, getNamespaceMappings(), index.getIndexFormatVersion());
+ doc = createDocument(state, getNamespaceMappings(), singleIndex.getIndexFormatVersion());
retrieveAggregateRoot(state, aggregateRoots);
}
catch (RepositoryException e)
@@ -703,7 +748,7 @@
}
return doc;
}
- })));
+ })));;
// remove any aggregateRoot nodes that are new
// and therefore already up-to-date
@@ -722,7 +767,7 @@
NodeData state = (NodeData)input;
try
{
- return createDocument(state, getNamespaceMappings(), index.getIndexFormatVersion());
+ return createDocument(state, getNamespaceMappings(), singleIndex.getIndexFormatVersion());
}
catch (RepositoryException e)
{
@@ -733,7 +778,7 @@
}
});
modified.addAll(aggregateRoots.values());
- index.update(aggregateRoots.keySet(), modified);
+ singleIndex.update(aggregateRoots.keySet(), modified);
}
}
@@ -824,7 +869,8 @@
{
spellChecker.close();
}
- index.close();
+ //index.close();
+ singleIndex.close();
getContext().destroy();
closed = true;
log.info("Index closed: " + path);
@@ -865,6 +911,7 @@
return new FilterMultiColumnQueryHits(searcher.execute(query, sort, resultFetchHint,
QueryImpl.DEFAULT_SELECTOR_NAME))
{
+ @Override
public void close() throws IOException
{
try
@@ -912,6 +959,7 @@
searcher.setSimilarity(getSimilarity());
return new FilterMultiColumnQueryHits(query.execute(searcher, sort, resultFetchHint))
{
+ @Override
public void close() throws IOException
{
try
@@ -1057,18 +1105,18 @@
if (getContext().getParentHandler() instanceof SearchIndex)
{
SearchIndex parent = (SearchIndex)getContext().getParentHandler();
- if (parent.getIndexFormatVersion().getVersion() < index.getIndexFormatVersion().getVersion())
+ if (parent.getIndexFormatVersion().getVersion() < singleIndex.getIndexFormatVersion().getVersion())
{
indexFormatVersion = parent.getIndexFormatVersion();
}
else
{
- indexFormatVersion = index.getIndexFormatVersion();
+ indexFormatVersion = singleIndex.getIndexFormatVersion();
}
}
else
{
- indexFormatVersion = index.getIndexFormatVersion();
+ indexFormatVersion = singleIndex.getIndexFormatVersion();
}
}
return indexFormatVersion;
@@ -1097,23 +1145,25 @@
protected IndexReader getIndexReader(boolean includeSystemIndex) throws IOException
{
QueryHandler parentHandler = getContext().getParentHandler();
- CachingMultiIndexReader parentReader = null;
- if (parentHandler instanceof SearchIndex && includeSystemIndex)
- {
- parentReader = ((SearchIndex)parentHandler).index.getIndexReader();
- }
+ IndexReader parentReader = null;
+// if (parentHandler instanceof SearchIndex && includeSystemIndex)
+// {
+// parentReader = ((SearchIndex)parentHandler).singleIndex.getIndexReader();
+// }
- IndexReader reader;
- if (parentReader != null)
+// IndexReader reader;
+// if (parentReader != null)
+// {
+// //CachingMultiIndexReader[] readers = {index.getIndexReader(), parentReader};
+// return singleIndex.createJcrSingleIndexReader(new MultiReader(new IndexReader[] {singleIndex.getIndexReader(), parentReader}));
+// // reader = new CombinedIndexReader(readers);
+// }
+// else
{
- CachingMultiIndexReader[] readers = {index.getIndexReader(), parentReader};
- reader = new CombinedIndexReader(readers);
+ return singleIndex.createJcrSingleIndexReader(singleIndex.getIndexReader());
+ //reader = index.getIndexReader();
}
- else
- {
- reader = index.getIndexReader();
- }
- return new JcrIndexReader(reader);
+ //return new JcrIndexReader(reader);
}
/**
@@ -1181,9 +1231,9 @@
*
* @return the actual index.
*/
- public MultiIndex getIndex()
+ public SingleIndex getIndex()
{
- return index;
+ return singleIndex;
}
/**
@@ -1457,7 +1507,7 @@
for (int j = 0; j < aggregates.length; j++)
{
Document aDoc =
- createDocument(aggregates[j], getNamespaceMappings(), index.getIndexFormatVersion());
+ createDocument(aggregates[j], getNamespaceMappings(), singleIndex.getIndexFormatVersion());
// transfer fields to doc if there are any
Fieldable[] fulltextFields = aDoc.getFieldables(FieldNames.FULLTEXT);
if (fulltextFields != null)
@@ -1638,7 +1688,7 @@
long time = System.currentTimeMillis();
try
{
- CachingMultiIndexReader reader = index.getIndexReader();
+ IndexReader reader = singleIndex.getIndexReader();
try
{
Term aggregateUUIDs = new Term(FieldNames.AGGREGATED_NODE_UUID, "");
@@ -1676,7 +1726,7 @@
}
finally
{
- reader.release();
+ reader.decRef();
}
}
catch (Exception e)
@@ -1798,6 +1848,7 @@
return hi;
}
+ @Override
public boolean equals(Object obj)
{
if (obj instanceof CombinedIndexReader)
@@ -1808,6 +1859,7 @@
return false;
}
+ @Override
public int hashCode()
{
int hash = 0;
Added: jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SingleIndex.java
===================================================================
--- jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SingleIndex.java (rev 0)
+++ jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SingleIndex.java 2010-05-14 15:07:42 UTC (rev 2380)
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.FilterIndexReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermDocs;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * This class implements basic functionality of single-index JCR search index.
+ *
+ * @author <a href="mailto:nikolazius at gmail.com">Nikolay Zamosenchuk</a>
+ * @version $Id: SingleIndex.java 34360 2009-07-22 23:58:59Z nzamosenchuk $
+ *
+ */
+public class SingleIndex
+{
+ private static final Logger log = LoggerFactory.getLogger("exo.jcr.component.core.SingleIndex");
+
+ /**
+ * Index writer instance
+ */
+ private IndexWriter writer;
+
+ /**
+ * Index directory instance
+ */
+ private Directory directory;
+
+ /**
+ * Index reader instance
+ */
+ private IndexReader reader;
+
+ private final DocNumberCache cache;
+
+ /**
+ * Creates instance of SingleIndex class
+ * @throws IOException
+ */
+ public SingleIndex(SearchIndex handler, File indexDirectory, Analyzer analyzer) throws IOException
+ {
+ String path = indexDirectory.getAbsolutePath() + "_new";
+ File indexDirectory2 = new File(path);
+ if (!indexDirectory2.exists())
+ {
+ if (!indexDirectory2.mkdirs())
+ {
+ log.error("DIRECTORY NOT CREATED!!!!!!!");
+ }
+ }
+ this.directory = FSDirectory.getDirectory(indexDirectory2);
+ this.writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
+ this.reader = IndexReader.open(directory, true);
+ this.cache = new DocNumberCache(handler.getCacheSize());
+
+ log.info("/!\\ \t\t Initialized on path:" + indexDirectory.getPath());
+ }
+
+ /**
+ * Closes index
+ */
+ public void close()
+ {
+ try
+ {
+ writer.close();
+ reader.close();
+ }
+ catch (IOException e)
+ {
+ // TODO Auto-generated catch block
+ log.error(e.getMessage());
+ }
+ }
+
+ /**
+ * Updates index by removing and adding documents
+ *
+ * @param remove
+ * @param add
+ * @throws IOException
+ */
+ public synchronized void update(Collection remove, Collection add) throws IOException
+ {
+ for (Iterator it = remove.iterator(); it.hasNext();)
+ {
+ Term idTerm = new Term(FieldNames.UUID, (String)it.next());
+ writer.deleteDocuments(idTerm);
+ }
+ for (Iterator it = add.iterator(); it.hasNext();)
+ {
+ Document doc = (Document)it.next();
+ if (doc != null)
+ {
+ writer.addDocument(doc);
+ }
+ }
+ writer.commit();
+ }
+
+ /**
+ * Returns up2date index reader
+ *
+ * @return
+ * @throws IOException
+ */
+ public IndexReader getIndexReader() throws IOException
+ {
+ if (!reader.isCurrent())
+ {
+ IndexReader oldReader = reader;
+ reader = reader.reopen();
+ if (reader != oldReader)
+ {
+ oldReader.close();
+ }
+ }
+ reader.incRef();
+ return reader;
+ }
+
+ public IndexReader createJcrSingleIndexReader(IndexReader reader) throws IOException
+ {
+ return new JcrSingleIndexReader(reader);
+ }
+
+ private class JcrSingleIndexReader extends FilterIndexReader implements HierarchyResolver
+ {
+ /**
+ * @param reader
+ */
+ public JcrSingleIndexReader(IndexReader reader)
+ {
+ super(reader);
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.impl.core.query.lucene.HierarchyResolver#getParents(int, int[])
+ */
+ public int[] getParents(int n, int[] docNumbers) throws IOException
+ {
+ Document doc = document(n, FieldSelectors.UUID_AND_PARENT);
+ String[] parentUUIDs = doc.getValues(FieldNames.PARENT);
+
+ Term id = new Term(FieldNames.UUID, parentUUIDs[0]);
+ TermDocs docs = termDocs(id);
+ int[] parents;
+ if (docs.next())
+ {
+ parents = new int[]{docs.doc()};
+ if (docs.next())
+ {
+ log.warn("/!\\ \t\t MULTIPLE PARENTS DETECTED!!! ");
+ }
+ }
+ else
+ {
+ parents = new int[0];
+ }
+ docs.close();
+ return parents;
+ }
+ }
+
+
+ public IndexFormatVersion getIndexFormatVersion()
+ {
+ return IndexFormatVersion.getVersion(reader);
+ }
+}
Property changes on: jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SingleIndex.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/IndexingAggregateTest.java
===================================================================
--- jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/IndexingAggregateTest.java 2010-05-13 13:47:26 UTC (rev 2379)
+++ jcr/branches/1.12-LIC-709/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/lucene/IndexingAggregateTest.java 2010-05-14 15:07:42 UTC (rev 2380)
@@ -17,23 +17,21 @@
package org.exoplatform.services.jcr.api.core.query.lucene;
import org.exoplatform.services.jcr.api.core.query.AbstractIndexingTest;
-import org.exoplatform.services.jcr.impl.core.query.lucene.IndexingQueue;
-import org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex;
-import javax.jcr.RepositoryException;
-import javax.jcr.Node;
-import javax.jcr.query.Query;
-
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.Writer;
import java.io.OutputStreamWriter;
-import java.io.ByteArrayInputStream;
-import java.util.Calendar;
-import java.util.List;
+import java.io.Writer;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collections;
import java.util.Iterator;
+import java.util.List;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.query.Query;
+
/**
* <code>IndexingAggregateTest</code> checks if the nt:file nt:resource
* aggregate defined in workspace indexing-test works properly.
@@ -104,16 +102,16 @@
protected void waitUntilQueueEmpty() throws Exception
{
- SearchIndex index = (SearchIndex)getQueryHandler();
- IndexingQueue queue = index.getIndex().getIndexingQueue();
- index.getIndex().flush();
- synchronized (index.getIndex())
- {
- while (queue.getNumPendingDocuments() > 0)
- {
- index.getIndex().wait(50);
- }
- }
+// SearchIndex index = (SearchIndex)getQueryHandler();
+// IndexingQueue queue = index.getIndex().getIndexingQueue();
+// index.getIndex().flush();
+// synchronized (index.getIndex())
+// {
+// while (queue.getNumPendingDocuments() > 0)
+// {
+// index.getIndex().wait(50);
+// }
+// }
}
public void testContentLastModified() throws RepositoryException
More information about the exo-jcr-commits
mailing list