package org.apache.lucene.search;
import java.io.IOException;
import java.util.Random;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.MockIndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.LuceneTestCase;
public class TestCollector extends LuceneTestCase {
protected String idField;
private Directory directory;
private IndexReader reader;
private IndexSearcher searcher;
private MockIndexWriter writer;
@Override
public void setUp() throws Exception {
super.setUp();
// all of these tried
// directory = newDirectory();
// writer = new RandomIndexWriter(random, directory);
// directory = newFSDirectory(new File(TEMP_DIR,"index-citations"));
// directory = SimpleFSDirectory.open(new
// File(TEMP_DIR,"index-citations"));
// directory = NIOFSDirectory.open(new
// File(TEMP_DIR,"index-citations"));
directory = new RAMDirectory();
reOpenWriter(OpenMode.CREATE);
writer.deleteAll();
writer.commit();
reader = writer.getReader();
searcher = newSearcher(reader);
}
@Override
public void tearDown() throws Exception {
writer.close();
reader.close();
directory.close();
super.tearDown();
}
private void reOpenWriter(OpenMode mode) throws CorruptIndexException,
LockObtainFailedException, IOException {
if (writer != null)
writer.close();
writer = new MockIndexWriter(directory, newIndexWriterConfig(
new WhitespaceAnalyzer()).setOpenMode(mode));
}
private void reOpenSearcher() throws IOException {
reader.close();
reader = writer.getReader();
searcher = newSearcher(reader);
}
public int[][] createRandomDocs(int start, int numDocs) throws IOException {
Random randomSeed = new Random();
int[] randData = new int[numDocs / 10];
for (int i = 0; i < randData.length; i++) {
randData[i] = randomSeed.nextInt(numDocs) - start;
}
int x = 0;
int[][] randi = new int[numDocs - start][];
for (int i = 0; i < numDocs - start; i++) {
int howMany = randomSeed.nextInt(6);
randi[i] = new int[howMany];
for (int j = 0; j < howMany; j++) {
if (x >= randData.length) {
x = 0;
}
randi[i][j] = randData[x++];
}
}
Document doc;
for (int k = 0; k < randi.length; k++) {
doc = new Document();
doc.add(newField("id", String.valueOf(k + start),
StringField.TYPE_STORED));
doc.add(newField("text_id", "x" + (k + start),
StringField.TYPE_STORED));
for (int v : randi[k]) {
doc.add(newField("reference", String.valueOf(v + start),
StringField.TYPE_STORED));
doc.add(newField("text_reference", "x" + (v + start),
StringField.TYPE_STORED));
}
writer.addDocument(doc);
}
System.out.println("Created random docs: " + start + " - " + numDocs);
return randi;
}
public void testCollector() throws Exception {
writer.commit();
int maxHits = 10000;
int[][] data = createRandomDocs(0, new Float(maxHits * 0.4f).intValue());
reOpenWriter(OpenMode.APPEND); // close the writer, create a new segment
createRandomDocs(new Float(maxHits * 0.4f).intValue(), new Float(
maxHits * 0.7f).intValue());
writer.commit();
reOpenWriter(OpenMode.APPEND); // close the writer, create a new segment
createRandomDocs(new Float(maxHits * 0.7f).intValue(), new Float(
maxHits * 1.0f).intValue());
writer.commit();
reOpenWriter(OpenMode.APPEND); // close the writer, create a new segment
reOpenSearcher();
// without this, errors happen (occassionally, not always)
// writer.optimize(true);
/*
* this doesn't help writer.commit(); reOpenWriter(OpenMode.APPEND);
* Thread.sleep(1000);
*/
searcher.search(new MatchAllDocsQuery(), new SimpleCollector() {
Scorer scorer;
IndexReader reader;
int docBase;
int visited = 0;
@Override
public void setScorer(Scorer scorer) throws IOException {
this.scorer = scorer;
}
@Override
public void collect(int doc) throws IOException {
visited++;
float score = scorer.score();
Document d = reader.document(doc);
// d.getValues("text_reference");
}
@Override
public void doSetNextReader(LeafReaderContext context)
throws IOException {
this.reader = context.reader();
this.docBase = context.docBase;
}
@Override
public boolean needsScores() {
return false;
}
});
}
// Uniquely for Junit 3
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(TestCollector.class);
}
}