| package org.apache.lucene.index; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.Random; |
| |
| import org.apache.lucene.analysis.standard.StandardAnalyzer; |
| 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.index.CorruptIndexException; |
| import org.apache.lucene.index.IndexReader; |
| import org.apache.lucene.index.IndexWriter; |
| import org.apache.lucene.index.MultiReader; |
| import org.apache.lucene.index.Term; |
| import org.apache.lucene.index.TermDocs; import org.apache.lucene.store.FSDirectory; |
| import org.apache.lucene.store.LockObtainFailedException; |
| |
| import org.apache.lucene.util.LuceneTestCase; |
| |
| public class TestSkipTo extends LuceneTestCase { |
| |
| /** |
| * @throws IOException |
| * @throws LockObtainFailedException |
| * @throws CorruptIndexException |
| */ |
| public void testSkipTo() throws Exception { |
| Random rand = new Random(0); |
| FSDirectory[] dirs = new FSDirectory[10]; |
| boolean build = false; |
| final String tempDir = System.getProperty("java.io.tmpdir"); |
| for (int i = 0; i < dirs.length; i++) { |
| dirs[i] = FSDirectory.getDirectory(tempDir |
| + File.separator + "lucenetest" + File.separator |
| + Integer.toString(i)); |
| if (!IndexReader.indexExists(dirs[i])) { |
| if (!build) { |
| System.out.println("Building Test Index Start"); |
| } |
| build = true; |
| System.out.println("Building Index: " + dirs[i].getFile() |
| + " Start"); |
| IndexWriter writer = new IndexWriter(dirs[i], |
| new StandardAnalyzer(), true); |
| for (int j = 0; j < 100000; j++) { |
| Document doc = new Document(); |
| doc.add(new Field("i", Integer.toString(rand.nextInt(100)), |
| Store.YES, Index.UN_TOKENIZED)); |
| doc.add(new Field("j", |
| Integer.toString(rand.nextInt(1000)), Store.YES, |
| Index.UN_TOKENIZED)); |
| writer.addDocument(doc); |
| } |
| writer.optimize(); |
| writer.close(); |
| writer = null; |
| System.out.println("Building Index: " + dirs[i].getFile() |
| + " Complete"); |
| } |
| IndexReader reader = IndexReader.open(dirs[i]); |
| for (int j = 0; j < 1000; j++) { |
| reader.deleteDocument(rand.nextInt(reader.maxDoc())); |
| } |
| reader.close(); |
| } |
| if (build) { |
| System.out.println("Building Test Index Complete"); |
| } |
| System.out.println("Test Start"); |
| IndexReader[] readers = new IndexReader[dirs.length]; |
| for (int i = 0; i < dirs.length; i++) { |
| readers[i] = IndexReader.open(dirs[i]); |
| } |
| IndexReader reader = new MultiReader(readers); |
| TermDocs docs = reader.termDocs(); |
| for (int i = 0; i < 100; i++) { |
| for (int j = 0; j < 1000; j++) { |
| try { |
| doTest(reader, docs, Integer.toString(i), Integer.toString(j)); |
| } catch (Exception e) { |
| System.err.println("maxdoc=" + reader.maxDoc()); |
| System.err.println("Test Failed at i=" + i + " j=" + j); |
| throw e; |
| } |
| } |
| } |
| docs.close(); |
| reader.close(); |
| System.out.println("Test Complete"); |
| } |
| |
| private void doTest(IndexReader reader, TermDocs docs, String i, |
| String j) throws Exception { |
| docs.seek(new Term("i", i)); |
| while (docs.next()) |
| ; |
| docs.seek(new Term("j", j)); |
| while (docs.next()) |
| ; |
| docs.seek(new Term("i", i)); |
| if (docs.next()) { |
| int doc = docs.doc(); |
| try { |
| while (docs.skipTo(doc + 1000)) { |
| doc = docs.doc(); |
| } |
| } catch (Exception e) { |
| System.err.println("doc=" + (doc + 1000) + ": deleted=" |
| + reader.isDeleted(doc + 1000)); |
| throw e; |
| } |
| } |
| docs.seek(new Term("j", j)); |
| if (docs.next()) { |
| int doc = docs.doc(); |
| try { |
| while (docs.skipTo(doc + 1000)) { |
| doc = docs.doc(); |
| } |
| } catch (Exception e) { |
| System.err.println("doc=" + doc); |
| throw e; |
| } |
| } |
| } |
| |
| } |