From 296c55c548f681b4e326850f17eab7177095b3ff Mon Sep 17 00:00:00 2001 From: Andrew Hind Date: Tue, 10 Apr 2007 12:04:21 +0000 Subject: [PATCH] Index deletions by string ID (not NodeRef) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5468 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../lucene/FilterIndexReaderByNodeRefs2.java | 11 +++--- .../repo/search/impl/lucene/LuceneBase2.java | 2 +- .../search/impl/lucene/LuceneIndexer2.java | 2 +- .../impl/lucene/LuceneIndexerImpl2.java | 14 +++++--- .../repo/search/impl/lucene/LuceneTest2.java | 2 +- .../search/impl/lucene/index/IndexInfo.java | 27 +++++++-------- .../impl/lucene/index/IndexInfoTest.java | 34 +++++++++---------- 7 files changed, 48 insertions(+), 44 deletions(-) diff --git a/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByNodeRefs2.java b/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByNodeRefs2.java index 63eb0fc3af..f0b385b46e 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByNodeRefs2.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByNodeRefs2.java @@ -29,7 +29,6 @@ import java.util.BitSet; import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.service.cmr.repository.NodeRef; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.document.Document; @@ -52,7 +51,7 @@ public class FilterIndexReaderByNodeRefs2 extends FilterIndexReader private String id; - public FilterIndexReaderByNodeRefs2(String id, IndexReader reader, Set deletions, boolean deleteNodesOnly) + public FilterIndexReaderByNodeRefs2(String id, IndexReader reader, Set deletions, boolean deleteNodesOnly) { super(reader); this.id = id; @@ -68,9 +67,9 @@ public class FilterIndexReaderByNodeRefs2 extends FilterIndexReader { if (!deleteNodesOnly) { - for (NodeRef nodeRef : deletions) + for (String stringRef : deletions) { - TermDocs td = reader.termDocs(new Term("ID", nodeRef.toString())); + TermDocs td = reader.termDocs(new Term("ID", stringRef)); while (td.next()) { deletedDocuments.set(td.doc(), true); @@ -81,9 +80,9 @@ public class FilterIndexReaderByNodeRefs2 extends FilterIndexReader { Searcher searcher = new IndexSearcher(reader); - for (NodeRef nodeRef : deletions) + for (String stringRef : deletions) { - TermQuery query = new TermQuery(new Term("ID", nodeRef.toString())); + TermQuery query = new TermQuery(new Term("ID", stringRef)); Hits hits = searcher.search(query); if (hits.length() > 0) { diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneBase2.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneBase2.java index b2dcb992d4..e54d74de7e 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneBase2.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneBase2.java @@ -246,7 +246,7 @@ public abstract class LuceneBase2 closeDeltaWriter(); } - protected void setInfo(long docs, Set deletions, boolean deleteNodesOnly) throws IOException + protected void setInfo(long docs, Set deletions, boolean deleteNodesOnly) throws IOException { indexInfo.setPreparedState(deltaId, deletions, docs, deleteNodesOnly); } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexer2.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexer2.java index ff96637a1b..682c9582ad 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexer2.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexer2.java @@ -49,7 +49,7 @@ public interface LuceneIndexer2 extends IndexerSPI public String getDeltaId(); public void flushPending() throws LuceneIndexException; - public Set getDeletions(); + public Set getDeletions(); public boolean getDeleteOnlyNodes(); public R doWithWriteLock(IndexInfo.LockWork lockWork); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexerImpl2.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexerImpl2.java index 9805b3de52..8c79485f19 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexerImpl2.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneIndexerImpl2.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -546,7 +547,7 @@ public class LuceneIndexerImpl2 extends LuceneBase2 implements LuceneIndexer2 // } // Merge // mergeDeltaIntoMain(terms); - setInfo(docs, deletions, false); + setInfo(docs, getDeletions(), false); luceneFullTextSearchIndexer.requiresIndex(store); } } @@ -674,7 +675,7 @@ public class LuceneIndexerImpl2 extends LuceneBase2 implements LuceneIndexer2 } } - setInfo(docs, deletions, true); + setInfo(docs, getDeletions(), true); // mergeDeltaIntoMain(new LinkedHashSet()); } catch (IOException e) @@ -2134,9 +2135,14 @@ public class LuceneIndexerImpl2 extends LuceneBase2 implements LuceneIndexer2 this.luceneFullTextSearchIndexer = luceneFullTextSearchIndexer; } - public Set getDeletions() + public Set getDeletions() { - return Collections.unmodifiableSet(deletions); + HashSet deletedRefAsString = new HashSet(deletions.size()); + for(NodeRef ref : deletions) + { + deletedRefAsString.add(ref.toString()); + } + return deletedRefAsString; } public boolean getDeleteOnlyNodes() diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java index fc6ab7827a..d90efac3f6 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java @@ -1107,7 +1107,7 @@ public class LuceneTest2 extends TestCase for (int j = 0; j < i; j++) { ChildAssociationRef test = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, - QName.createQName("{namespace}test"), testSuperType); + QName.createQName("{namespace}test_" + getName() + "_" + i + "_" +j), testSuperType); refs.add(test); } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java index 9feed3e698..82549291a5 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java @@ -57,7 +57,6 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.search.IndexerException; import org.alfresco.repo.search.impl.lucene.FilterIndexReaderByNodeRefs2; import org.alfresco.repo.search.impl.lucene.analysis.AlfrescoStandardAnalyser; -import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.util.GUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -814,14 +813,14 @@ public class IndexInfo * @return * @throws IOException */ - public Set getDeletions(String id) throws IOException + public Set getDeletions(String id) throws IOException { if (id == null) { throw new IndexerException("\"null\" is not a valid identifier for a transaction"); } // Check state - Set deletions = new HashSet(); + Set deletions = new HashSet(); File location = new File(indexDirectory, id).getCanonicalFile(); File file = new File(location, INDEX_INFO_DELETIONS).getCanonicalFile(); if (!file.exists()) @@ -830,14 +829,14 @@ public class IndexInfo { s_logger.debug("No deletions for " + id); } - return Collections. emptySet(); + return Collections. emptySet(); } DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); int size = is.readInt(); for (int i = 0; i < size; i++) { String ref = is.readUTF(); - deletions.add(new NodeRef(ref)); + deletions.add(ref); } is.close(); if (s_logger.isDebugEnabled()) @@ -861,7 +860,7 @@ public class IndexInfo * should deletions on apply to nodes (ie not to containers) * @throws IOException */ - public void setPreparedState(String id, Set toDelete, long documents, boolean deleteNodesOnly) + public void setPreparedState(String id, Set toDelete, long documents, boolean deleteNodesOnly) throws IOException { if (id == null) @@ -883,9 +882,9 @@ public class IndexInfo DataOutputStream os = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(location, INDEX_INFO_DELETIONS).getCanonicalFile()))); os.writeInt(toDelete.size()); - for (NodeRef ref : toDelete) + for (String ref : toDelete) { - os.writeUTF(ref.toString()); + os.writeUTF(ref); } os.flush(); os.close(); @@ -993,7 +992,7 @@ public class IndexInfo * @return * @throws IOException */ - public IndexReader getMainIndexReferenceCountingReadOnlyIndexReader(String id, Set deletions, + public IndexReader getMainIndexReferenceCountingReadOnlyIndexReader(String id, Set deletions, boolean deleteOnlyNodes) throws IOException { if (id == null) @@ -2534,17 +2533,17 @@ public class IndexInfo for (IndexEntry currentDelete : toDelete.values()) { - Set deletions = getDeletions(currentDelete.getName()); + Set deletions = getDeletions(currentDelete.getName()); for (String key : readers.keySet()) { IndexReader reader = readers.get(key); - for (NodeRef nodeRef : deletions) + for (String stringRef : deletions) { if (currentDelete.isDeletOnlyNodes()) { Searcher searcher = new IndexSearcher(reader); - TermQuery query = new TermQuery(new Term("ID", nodeRef.toString())); + TermQuery query = new TermQuery(new Term("ID", stringRef)); Hits hits = searcher.search(query); if (hits.length() > 0) { @@ -2569,7 +2568,7 @@ public class IndexInfo int deletedCount = 0; try { - deletedCount = reader.deleteDocuments(new Term("ID", nodeRef.toString())); + deletedCount = reader.deleteDocuments(new Term("ID", stringRef)); } catch (IOException ioe) { @@ -2584,7 +2583,7 @@ public class IndexInfo if (s_logger.isDebugEnabled()) { s_logger.debug("Deleted " - + deletedCount + " from " + key + " for id " + nodeRef.toString() + + deletedCount + " from " + key + " for id " + stringRef + " remaining docs " + reader.numDocs()); } invalidIndexes.add(key); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfoTest.java b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfoTest.java index b8e2789944..699ffca54e 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfoTest.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfoTest.java @@ -29,11 +29,13 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; +import junit.framework.TestCase; + +import org.alfresco.repo.search.impl.lucene.analysis.AlfrescoStandardAnalyser; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.util.GUID; import org.alfresco.util.TempFileProvider; -import org.alfresco.repo.search.impl.lucene.analysis.AlfrescoStandardAnalyser; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; @@ -41,8 +43,6 @@ import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermDocs; -import junit.framework.TestCase; - public class IndexInfoTest extends TestCase { @@ -84,10 +84,10 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " System.setProperty("disableLuceneLocks", "true"); // no deletions - create only - HashSet deletions = new HashSet(); + HashSet deletions = new HashSet(); for (int i = 0; i < 0; i++) { - deletions.add(new NodeRef(new StoreRef("woof", "bingle"), GUID.generate())); + deletions.add(new NodeRef(new StoreRef("woof", "bingle"), GUID.generate()).toString()); } File tempLocation = TempFileProvider.getTempDir(); @@ -217,7 +217,7 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " ii.closeDeltaIndexWriter(guid); ii.setStatus(guid, TransactionStatus.PREPARING, null, null); - ii.setPreparedState(guid, new HashSet(), 1, false); + ii.setPreparedState(guid, new HashSet(), 1, false); ii.getDeletions(guid); ii.setStatus(guid, TransactionStatus.PREPARED, null, null); @@ -238,7 +238,7 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " } reader.close(); - reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(guid, new HashSet(), false); + reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(guid, new HashSet(), false); assertEquals(reader.numDocs(), i + 1); for (int j = 0; j < CREATE_LIST.length; j++) { @@ -279,8 +279,8 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " for (int i = 0; i < CREATE_LIST.length; i++) { - HashSet deletions = new HashSet(); - deletions.add(nodeRefs.get(i)); + HashSet deletions = new HashSet(); + deletions.add(nodeRefs.get(i).toString()); IndexReader reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(); assertEquals(reader.numDocs(), CREATE_LIST.length - i); @@ -406,7 +406,7 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " ii.closeDeltaIndexWriter(guid); ii.setStatus(guid, TransactionStatus.PREPARING, null, null); - ii.setPreparedState(guid, new HashSet(), 1, false); + ii.setPreparedState(guid, new HashSet(), 1, false); ii.getDeletions(guid); ii.setStatus(guid, TransactionStatus.PREPARED, null, null); @@ -427,7 +427,7 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " } reader.close(); - reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(guid, new HashSet(), false); + reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(guid, new HashSet(), false); assertEquals(reader.numDocs(), i + 1); for (int j = 0; j < CREATE_LIST.length; j++) { @@ -468,8 +468,8 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " for (int i = 0; i < UPDATE_LIST.length; i++) { - HashSet deletions = new HashSet(); - deletions.add(nodeRefs.get(i)); + HashSet deletions = new HashSet(); + deletions.add(nodeRefs.get(i).toString()); IndexReader reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(); assertEquals(reader.numDocs(), UPDATE_LIST.length); @@ -672,7 +672,7 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " ii.closeDeltaIndexWriter(guid); ii.setStatus(guid, TransactionStatus.PREPARING, null, null); - ii.setPreparedState(guid, new HashSet(), 1, false); + ii.setPreparedState(guid, new HashSet(), 1, false); ii.getDeletions(guid); ii.setStatus(guid, TransactionStatus.PREPARED, null, null); @@ -696,7 +696,7 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " } reader.close(); - reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(guid, new HashSet(), false); + reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader(guid, new HashSet(), false); lastDoc = -1; for (int j = 0; j < create.length; j++) { @@ -739,8 +739,8 @@ public static final String[] UPDATE_LIST_2 = { "alpha2", "bravo2", "charlie2", " for (int i = 0; i < update.length; i++) { - HashSet deletions = new HashSet(); - deletions.add(nodeRefs.get(i)); + HashSet deletions = new HashSet(); + deletions.add(nodeRefs.get(i).toString()); IndexReader reader = ii.getMainIndexReferenceCountingReadOnlyIndexReader();