mirror of https://github.com/apache/lucene.git
LUCENE-2634: NRT reader's isCurrent should return false if changes were just committed in the writer
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@994979 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f4d567eb06
commit
d0ae4d8260
|
@ -507,6 +507,9 @@ Bug fixes
|
||||||
|
|
||||||
* LUCENE-2272: Fix explain in PayloadNearQuery and also fix scoring issue (Peter Keegan via Grant Ingersoll)
|
* LUCENE-2272: Fix explain in PayloadNearQuery and also fix scoring issue (Peter Keegan via Grant Ingersoll)
|
||||||
|
|
||||||
|
* LUCENE-2634: isCurrent on an NRT reader was failing to return false
|
||||||
|
if the writer had just committed (Nikolay Zamosenchuk via Mike McCandless)
|
||||||
|
|
||||||
New features
|
New features
|
||||||
|
|
||||||
* LUCENE-2128: Parallelized fetching document frequencies during weight
|
* LUCENE-2128: Parallelized fetching document frequencies during weight
|
||||||
|
|
|
@ -4542,6 +4542,10 @@ public class IndexWriter implements Closeable {
|
||||||
// if any structural changes (new segments), we are
|
// if any structural changes (new segments), we are
|
||||||
// stale
|
// stale
|
||||||
return false;
|
return false;
|
||||||
|
} else if (infos.getGeneration() != segmentInfos.getGeneration()) {
|
||||||
|
// if any commit took place since we were opened, we
|
||||||
|
// are stale
|
||||||
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return !docWriter.anyChanges();
|
return !docWriter.anyChanges();
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,10 +110,18 @@ public class RandomIndexWriter implements Closeable {
|
||||||
w.commit();
|
w.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int numDocs() throws IOException {
|
||||||
|
return w.numDocs();
|
||||||
|
}
|
||||||
|
|
||||||
public int maxDoc() {
|
public int maxDoc() {
|
||||||
return w.maxDoc();
|
return w.maxDoc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void deleteAll() throws IOException {
|
||||||
|
w.deleteAll();
|
||||||
|
}
|
||||||
|
|
||||||
public IndexReader getReader() throws IOException {
|
public IndexReader getReader() throws IOException {
|
||||||
// If we are writing with PreFlexRW, force a full
|
// If we are writing with PreFlexRW, force a full
|
||||||
// IndexReader.open so terms are sorted in codepoint
|
// IndexReader.open so terms are sorted in codepoint
|
||||||
|
|
|
@ -156,7 +156,7 @@ public class TestIndexWriterReader extends LuceneTestCase {
|
||||||
assertTrue(r1.isCurrent());
|
assertTrue(r1.isCurrent());
|
||||||
|
|
||||||
writer.commit();
|
writer.commit();
|
||||||
assertTrue(r1.isCurrent());
|
assertFalse(r1.isCurrent());
|
||||||
|
|
||||||
assertEquals(200, r1.maxDoc());
|
assertEquals(200, r1.maxDoc());
|
||||||
|
|
||||||
|
@ -725,12 +725,12 @@ public class TestIndexWriterReader extends LuceneTestCase {
|
||||||
final Random r = new Random();
|
final Random r = new Random();
|
||||||
do {
|
do {
|
||||||
try {
|
try {
|
||||||
for(int i=0;i<10;i++) {
|
for(int docUpto=0;docUpto<10;docUpto++) {
|
||||||
writer.addDocument(createDocument(10*count+i, "test", 4));
|
writer.addDocument(createDocument(10*count+docUpto, "test", 4));
|
||||||
}
|
}
|
||||||
count++;
|
count++;
|
||||||
final int limit = count*10;
|
final int limit = count*10;
|
||||||
for(int i=0;i<5;i++) {
|
for(int delUpto=0;delUpto<5;delUpto++) {
|
||||||
int x = r.nextInt(limit);
|
int x = r.nextInt(limit);
|
||||||
writer.deleteDocuments(new Term("field3", "b"+x));
|
writer.deleteDocuments(new Term("field3", "b"+x));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
package org.apache.lucene.index;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.lucene.document.Document;
|
||||||
|
import org.apache.lucene.document.Field;
|
||||||
|
import org.apache.lucene.document.Field.Index;
|
||||||
|
import org.apache.lucene.document.Field.Store;
|
||||||
|
import org.apache.lucene.util.*;
|
||||||
|
import org.apache.lucene.analysis.*;
|
||||||
|
import org.apache.lucene.store.*;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class TestIsCurrent extends LuceneTestCaseJ4 {
|
||||||
|
|
||||||
|
private RandomIndexWriter writer;
|
||||||
|
|
||||||
|
private Directory directory;
|
||||||
|
|
||||||
|
private Random rand;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
rand = newRandom();
|
||||||
|
|
||||||
|
// initialize directory
|
||||||
|
directory = newDirectory(rand);
|
||||||
|
writer = new RandomIndexWriter(rand, directory);
|
||||||
|
|
||||||
|
// write document
|
||||||
|
Document doc = new Document();
|
||||||
|
doc.add(new Field("UUID", "1", Store.YES, Index.ANALYZED));
|
||||||
|
writer.addDocument(doc);
|
||||||
|
writer.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
super.tearDown();
|
||||||
|
writer.close();
|
||||||
|
directory.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Failing testcase showing the trouble
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testDeleteByTermIsCurrent() throws IOException {
|
||||||
|
|
||||||
|
// get reader
|
||||||
|
IndexReader reader = writer.getReader();
|
||||||
|
|
||||||
|
// assert index has a document and reader is up2date
|
||||||
|
assertEquals("One document should be in the index", 1, writer.numDocs());
|
||||||
|
assertTrue("Document added, reader should be stale ", reader.isCurrent());
|
||||||
|
|
||||||
|
// remove document
|
||||||
|
Term idTerm = new Term("UUID", "1");
|
||||||
|
writer.deleteDocuments(idTerm);
|
||||||
|
writer.commit();
|
||||||
|
|
||||||
|
// assert document has been deleted (index changed), reader is stale
|
||||||
|
assertEquals("Document should be removed", 0, writer.numDocs());
|
||||||
|
assertFalse("Reader should be stale", reader.isCurrent());
|
||||||
|
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testcase for example to show that writer.deleteAll() is working as expected
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testDeleteAllIsCurrent() throws IOException {
|
||||||
|
|
||||||
|
// get reader
|
||||||
|
IndexReader reader = writer.getReader();
|
||||||
|
|
||||||
|
// assert index has a document and reader is up2date
|
||||||
|
assertEquals("One document should be in the index", 1, writer.numDocs());
|
||||||
|
assertTrue("Document added, reader should be stale ", reader.isCurrent());
|
||||||
|
|
||||||
|
// remove all documents
|
||||||
|
writer.deleteAll();
|
||||||
|
writer.commit();
|
||||||
|
|
||||||
|
// assert document has been deleted (index changed), reader is stale
|
||||||
|
assertEquals("Document should be removed", 0, writer.numDocs());
|
||||||
|
assertFalse("Reader should be stale", reader.isCurrent());
|
||||||
|
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue