/**
* 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.
*/
package org.apache.jena.larq;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.Closeable;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestLuceneNRT {
Directory directory = null;
IndexWriter writer = null;
Document doc1 = new Document();
Document doc2 = new Document();
@Before public void setUp() throws IOException {
// directory = FSDirectory.open(new File("/tmp/lucene"));
directory = new RAMDirectory();
writer = IndexWriterFactory.create(directory);
writer.commit();
doc1.add(new Field("foo", "bar1", Field.Store.NO, Field.Index.ANALYZED));
doc2.add(new Field("foo", "bar2", Field.Store.NO, Field.Index.ANALYZED));
}
@After public void tearDown() {
close(writer); writer = null;
close(directory); directory = null;
doc1 = null;
doc2 = null;
}
@Test public void setUpDone() {
assertNotNull(directory);
assertNotNull(writer);
assertNotNull(doc1);
assertNotNull(doc2);
}
@Test public void indexIsEmpty() throws Exception {
assertEquals(0, writer.numDocs());
assertEquals(0, writer.numRamDocs());
assertEquals(0, writer.maxDoc());
assertFalse(writer.hasDeletions());
}
@Test public void addDocument() throws Exception {
writer.addDocument(doc1);
assertEquals(1, writer.numDocs());
assertEquals(1, writer.numRamDocs());
assertEquals(1, writer.maxDoc());
assertFalse(writer.hasDeletions());
writer.commit();
assertEquals(1, writer.numDocs());
assertEquals(0, writer.numRamDocs());
assertEquals(1, writer.maxDoc());
assertFalse(writer.hasDeletions());
}
@Test public void deleteAllDocuments() throws Exception {
writer.addDocument(doc1);
assertEquals(1, writer.numDocs());
assertEquals(1, writer.numRamDocs());
assertEquals(1, writer.maxDoc());
assertFalse(writer.hasDeletions());
writer.deleteAll();
assertEquals(0, writer.numDocs());
assertEquals(0, writer.numRamDocs());
assertEquals(0, writer.maxDoc());
assertFalse(writer.hasDeletions());
}
@Test public void indexReaderOpenDirectory() throws Exception {
IndexReader reader = IndexReader.open(directory);
assertNotNull(reader);
assertSame(directory, reader.directory());
assertEquals(1, reader.getRefCount());
assertTrue(reader.isCurrent());
assertEquals(0, reader.maxDoc());
close(reader);
assertEquals(0, reader.getRefCount());
}
@Test public void indexReaderOpenDirectoryAddDocument() throws Exception {
IndexReader reader = IndexReader.open(directory);
writer.addDocument(doc1);
assertTrue(reader.isCurrent());
assertEquals(1, writer.maxDoc());
assertEquals(0, reader.maxDoc());
}
@Test public void indexReaderOpenDirectoryAddDocumentAndCommit() throws Exception {
IndexReader reader = IndexReader.open(directory);
writer.addDocument(doc1);
writer.commit();
assertFalse(reader.isCurrent());
assertEquals(1, writer.maxDoc());
assertEquals(0, reader.maxDoc());
}
@Test public void indexReaderOpenDirectoryDeleteDocumentAndCommit() throws Exception {
Term term = new Term ("foo", "bar1");
IndexReader reader = IndexReader.open(directory);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.commit();
assertEquals(2, writer.maxDoc());
assertFalse(reader.isCurrent());
assertEquals(0, reader.maxDoc());
assertEquals(0, count(reader, term));
reader = TestLARQUtils.openIfChanged(reader);
assertTrue(reader.isCurrent());
assertEquals(1, count(reader, term));
writer.deleteDocuments(term);
assertEquals(2, writer.maxDoc());
assertEquals(1, count(reader, term));
reader = TestLARQUtils.openIfChanged(reader);
assertEquals(1, count(reader, term));
writer.commit();
reader = TestLARQUtils.openIfChanged(reader);
assertEquals(2, writer.maxDoc());
assertEquals(0, count(reader, term));
reader = TestLARQUtils.openIfChanged(reader);
assertEquals(0, count(reader, term));
writer.forceMergeDeletes();
assertEquals(1, writer.maxDoc());
assertEquals(0, count(reader, term));
}
@Test public void indexReaderOpenDirectoryReopen() throws Exception {
IndexReader reader = IndexReader.open(directory);
writer.addDocument(doc1);
writer.commit();
assertFalse(reader.isCurrent());
assertEquals(0, reader.maxDoc());
reader = TestLARQUtils.openIfChanged(reader);
assertTrue(reader.isCurrent());
assertEquals(1, reader.maxDoc());
reader = IndexReader.open(directory);
assertTrue(reader.isCurrent());
assertEquals(1, reader.maxDoc());
}
@Test public void indexReaderOpenDirectoryNewInstance() throws Exception {
IndexReader reader = IndexReader.open(directory);
writer.addDocument(doc1);
writer.commit();
assertFalse(reader.isCurrent());
assertEquals(0, reader.maxDoc());
reader = IndexReader.open(directory);
assertTrue(reader.isCurrent());
assertEquals(1, reader.maxDoc());
}
@Test public void indexReaderOpenWriter() throws Exception {
IndexReader reader = IndexReader.open(writer, true);
assertNotNull(reader);
assertSame(directory, reader.directory());
assertEquals(1, reader.getRefCount());
assertTrue(reader.isCurrent());
assertEquals(0, reader.maxDoc());
close(reader);
assertEquals(0, reader.getRefCount());
}
@Test public void indexReaderOpenWriterAddDocument() throws Exception {
IndexReader reader = IndexReader.open(writer, true);
writer.addDocument(doc1);
assertFalse(reader.isCurrent());
assertEquals(1, writer.maxDoc());
assertEquals(0, reader.maxDoc());
}
@Test public void indexReaderOpenWriterAddDocumentAndCommit() throws Exception {
IndexReader reader = IndexReader.open(writer, true);
writer.addDocument(doc1);
writer.commit();
assertFalse(reader.isCurrent());
assertEquals(1, writer.maxDoc());
assertEquals(0, reader.maxDoc());
}
@Test public void indexReaderOpenWriterReopen() throws Exception {
IndexReader reader = IndexReader.open(writer, true);
writer.addDocument(doc1);
writer.commit();
assertFalse(reader.isCurrent());
assertEquals(0, reader.maxDoc());
reader = TestLARQUtils.openIfChanged(reader);
assertTrue(reader.isCurrent());
assertEquals(1, reader.maxDoc());
}
@Test public void indexReaderOpenWriterNewInstance() throws Exception {
IndexReader reader = IndexReader.open(writer, true);
writer.addDocument(doc1);
writer.commit();
assertFalse(reader.isCurrent());
assertEquals(0, reader.maxDoc());
reader = IndexReader.open(writer, true);
assertTrue(reader.isCurrent());
assertEquals(1, reader.maxDoc());
}
@Test public void indexReaderOpenWriterDeleteDocumentAndCommit() throws Exception {
Term term = new Term ("foo", "bar1");
IndexReader reader = IndexReader.open(writer, false);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.commit();
assertEquals(2, writer.maxDoc());
assertFalse(reader.isCurrent());
assertEquals(0, reader.maxDoc());
assertEquals(0, count(reader, term));
reader = TestLARQUtils.openIfChanged(reader);
assertTrue(reader.isCurrent());
assertEquals(1, count(reader, term));
writer.deleteDocuments(term);
assertEquals(2, writer.maxDoc());
assertEquals(1, count(reader, term));
reader = TestLARQUtils.openIfChanged(reader);
assertEquals(1, count(reader, term));
writer.commit();
reader = TestLARQUtils.openIfChanged(reader);
assertEquals(2, writer.maxDoc());
assertEquals(0, count(reader, term));
reader = TestLARQUtils.openIfChanged(reader);
assertEquals(0, count(reader, term));
writer.forceMergeDeletes();
assertEquals(1, writer.maxDoc());
assertEquals(0, count(reader, term));
}
private int count (IndexReader reader, Term term) throws IOException {
IndexSearcher searcher = null;
try {
searcher = new IndexSearcher(reader);
TopDocs hits = searcher.search(new TermQuery(term), 10);
return hits.totalHits;
} finally {
if ( searcher != null ) searcher.close();
}
}
private void close ( Closeable closeable ) {
if ( closeable != null ) {
try { closeable.close(); }
catch (IOException e) { e.printStackTrace(); }
}
}
}