⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testbackwardscompatibility.java

📁 lucene2.2.0版本
💻 JAVA
字号:
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 junit.framework.TestCase;import java.util.Vector;import java.util.Arrays;import java.io.ByteArrayOutputStream;import java.io.ObjectOutputStream;import java.io.IOException;import java.io.File;import org.apache.lucene.analysis.WhitespaceAnalyzer;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.TermQuery;import org.apache.lucene.search.Hits;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import java.io.*;import java.util.*;import java.util.zip.*;/*  Verify we can read the pre-2.1 file format, do searches  against it, and add documents to it.*/public class TestBackwardsCompatibility extends TestCase{  // Uncomment these cases & run in a pre-lockless checkout  // to create indices:  /*  public void testCreatePreLocklessCFS() throws IOException {    createIndex("src/test/org/apache/lucene/index/index.prelockless.cfs", true);  }  public void testCreatePreLocklessNoCFS() throws IOException {    createIndex("src/test/org/apache/lucene/index/index.prelockless.nocfs", false);  }  */  /* Unzips dirName + ".zip" --> dirName, removing dirName     first */  public void unzip(String zipName, String destDirName) throws IOException {    Enumeration entries;    ZipFile zipFile;    zipFile = new ZipFile(zipName + ".zip");    entries = zipFile.entries();    String dirName = fullDir(destDirName);    File fileDir = new File(dirName);    rmDir(destDirName);    fileDir.mkdir();    while (entries.hasMoreElements()) {      ZipEntry entry = (ZipEntry) entries.nextElement();      InputStream in = zipFile.getInputStream(entry);      OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(fileDir, entry.getName())));      byte[] buffer = new byte[8192];      int len;      while((len = in.read(buffer)) >= 0) {        out.write(buffer, 0, len);      }      in.close();      out.close();    }    zipFile.close();  }  public void testCreateCFS() throws IOException {    String dirName = "testindex.cfs";    createIndex(dirName, true);    rmDir(dirName);  }  public void testCreateNoCFS() throws IOException {    String dirName = "testindex.nocfs";    createIndex(dirName, true);    rmDir(dirName);  }  public void testSearchOldIndex() throws IOException {    String[] oldNames = {"prelockless.cfs", "prelockless.nocfs"};    for(int i=0;i<oldNames.length;i++) {      String dirName = "src/test/org/apache/lucene/index/index." + oldNames[i];      unzip(dirName, oldNames[i]);      searchIndex(oldNames[i]);      rmDir(oldNames[i]);    }  }  public void testIndexOldIndexNoAdds() throws IOException {    String[] oldNames = {"prelockless.cfs", "prelockless.nocfs"};    for(int i=0;i<oldNames.length;i++) {      String dirName = "src/test/org/apache/lucene/index/index." + oldNames[i];      unzip(dirName, oldNames[i]);      changeIndexNoAdds(oldNames[i], true);      rmDir(oldNames[i]);      unzip(dirName, oldNames[i]);      changeIndexNoAdds(oldNames[i], false);      rmDir(oldNames[i]);    }  }  public void testIndexOldIndex() throws IOException {    String[] oldNames = {"prelockless.cfs", "prelockless.nocfs"};    for(int i=0;i<oldNames.length;i++) {      String dirName = "src/test/org/apache/lucene/index/index." + oldNames[i];      unzip(dirName, oldNames[i]);      changeIndexWithAdds(oldNames[i], true);      rmDir(oldNames[i]);      unzip(dirName, oldNames[i]);      changeIndexWithAdds(oldNames[i], false);      rmDir(oldNames[i]);    }  }  public void searchIndex(String dirName) throws IOException {    //QueryParser parser = new QueryParser("contents", new WhitespaceAnalyzer());    //Query query = parser.parse("handle:1");    dirName = fullDir(dirName);    Directory dir = FSDirectory.getDirectory(dirName);    IndexSearcher searcher = new IndexSearcher(dir);        Hits hits = searcher.search(new TermQuery(new Term("content", "aaa")));    assertEquals(34, hits.length());    Document d = hits.doc(0);    // First document should be #21 since it's norm was increased:    assertEquals("didn't get the right document first", "21", d.get("id"));    searcher.close();    dir.close();  }  /* Open pre-lockless index, add docs, do a delete &   * setNorm, and search */  public void changeIndexWithAdds(String dirName, boolean autoCommit) throws IOException {    dirName = fullDir(dirName);    Directory dir = FSDirectory.getDirectory(dirName);    // open writer    IndexWriter writer = new IndexWriter(dir, autoCommit, new WhitespaceAnalyzer(), false);    // add 10 docs    for(int i=0;i<10;i++) {      addDoc(writer, 35+i);    }    // make sure writer sees right total -- writer seems not to know about deletes in .del?    assertEquals("wrong doc count", 45, writer.docCount());    writer.close();    // make sure searching sees right # hits    IndexSearcher searcher = new IndexSearcher(dir);    Hits hits = searcher.search(new TermQuery(new Term("content", "aaa")));    assertEquals("wrong number of hits", 44, hits.length());    Document d = hits.doc(0);    assertEquals("wrong first document", "21", d.get("id"));    searcher.close();    // make sure we can do delete & setNorm against this    // pre-lockless segment:    IndexReader reader = IndexReader.open(dir);    Term searchTerm = new Term("id", "6");    int delCount = reader.deleteDocuments(searchTerm);    assertEquals("wrong delete count", 1, delCount);    reader.setNorm(22, "content", (float) 2.0);    reader.close();    // make sure they "took":    searcher = new IndexSearcher(dir);    hits = searcher.search(new TermQuery(new Term("content", "aaa")));    assertEquals("wrong number of hits", 43, hits.length());    d = hits.doc(0);    assertEquals("wrong first document", "22", d.get("id"));    searcher.close();    // optimize    writer = new IndexWriter(dir, autoCommit, new WhitespaceAnalyzer(), false);    writer.optimize();    writer.close();    searcher = new IndexSearcher(dir);    hits = searcher.search(new TermQuery(new Term("content", "aaa")));    assertEquals("wrong number of hits", 43, hits.length());    d = hits.doc(0);    assertEquals("wrong first document", "22", d.get("id"));    searcher.close();    dir.close();  }  /* Open pre-lockless index, add docs, do a delete &   * setNorm, and search */  public void changeIndexNoAdds(String dirName, boolean autoCommit) throws IOException {    dirName = fullDir(dirName);    Directory dir = FSDirectory.getDirectory(dirName);    // make sure searching sees right # hits    IndexSearcher searcher = new IndexSearcher(dir);    Hits hits = searcher.search(new TermQuery(new Term("content", "aaa")));    assertEquals("wrong number of hits", 34, hits.length());    Document d = hits.doc(0);    assertEquals("wrong first document", "21", d.get("id"));    searcher.close();    // make sure we can do a delete & setNorm against this    // pre-lockless segment:    IndexReader reader = IndexReader.open(dir);    Term searchTerm = new Term("id", "6");    int delCount = reader.deleteDocuments(searchTerm);    assertEquals("wrong delete count", 1, delCount);    reader.setNorm(22, "content", (float) 2.0);    reader.close();    // make sure they "took":    searcher = new IndexSearcher(dir);    hits = searcher.search(new TermQuery(new Term("content", "aaa")));    assertEquals("wrong number of hits", 33, hits.length());    d = hits.doc(0);    assertEquals("wrong first document", "22", d.get("id"));    searcher.close();    // optimize    IndexWriter writer = new IndexWriter(dir, autoCommit, new WhitespaceAnalyzer(), false);    writer.optimize();    writer.close();    searcher = new IndexSearcher(dir);    hits = searcher.search(new TermQuery(new Term("content", "aaa")));    assertEquals("wrong number of hits", 33, hits.length());    d = hits.doc(0);    assertEquals("wrong first document", "22", d.get("id"));    searcher.close();    dir.close();  }  public void createIndex(String dirName, boolean doCFS) throws IOException {    rmDir(dirName);    dirName = fullDir(dirName);    Directory dir = FSDirectory.getDirectory(dirName);    IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);    writer.setUseCompoundFile(doCFS);        for(int i=0;i<35;i++) {      addDoc(writer, i);    }    assertEquals("wrong doc count", 35, writer.docCount());    writer.close();    // Delete one doc so we get a .del file:    IndexReader reader = IndexReader.open(dir);    Term searchTerm = new Term("id", "7");    int delCount = reader.deleteDocuments(searchTerm);    assertEquals("didn't delete the right number of documents", 1, delCount);    // Set one norm so we get a .s0 file:    reader.setNorm(21, "content", (float) 1.5);    reader.close();  }  /* Verifies that the expected file names were produced */  public void testExactFileNames() throws IOException {    for(int pass=0;pass<2;pass++) {      String outputDir = "lucene.backwardscompat0.index";      rmDir(outputDir);      try {        Directory dir = FSDirectory.getDirectory(fullDir(outputDir));        boolean autoCommit = 0 == pass;              IndexWriter writer = new IndexWriter(dir, autoCommit, new WhitespaceAnalyzer(), true);        //IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);        for(int i=0;i<35;i++) {          addDoc(writer, i);        }        assertEquals("wrong doc count", 35, writer.docCount());        writer.close();        // Delete one doc so we get a .del file:        IndexReader reader = IndexReader.open(dir);        Term searchTerm = new Term("id", "7");        int delCount = reader.deleteDocuments(searchTerm);        assertEquals("didn't delete the right number of documents", 1, delCount);        // Set one norm so we get a .s0 file:        reader.setNorm(21, "content", (float) 1.5);        reader.close();        // The numbering of fields can vary depending on which        // JRE is in use.  On some JREs we see content bound to        // field 0; on others, field 1.  So, here we have to        // figure out which field number corresponds to        // "content", and then set our expected file names below        // accordingly:        CompoundFileReader cfsReader = new CompoundFileReader(dir, "_2.cfs");        FieldInfos fieldInfos = new FieldInfos(cfsReader, "_2.fnm");        int contentFieldIndex = -1;        for(int i=0;i<fieldInfos.size();i++) {          FieldInfo fi = fieldInfos.fieldInfo(i);          if (fi.name.equals("content")) {            contentFieldIndex = i;            break;          }        }        cfsReader.close();        assertTrue("could not locate the 'content' field number in the _2.cfs segment", contentFieldIndex != -1);        // Now verify file names:        String[] expected = {"_0.cfs",                             "_0_1.del",                             "_1.cfs",                             "_2.cfs",                             "_2_1.s" + contentFieldIndex,                             "_3.cfs",                             "segments_a",                             "segments.gen"};        if (!autoCommit) {          expected[6] = "segments_3";        }        String[] actual = dir.list();        Arrays.sort(expected);        Arrays.sort(actual);        if (!Arrays.equals(expected, actual)) {          fail("incorrect filenames in index: expected:\n    " + asString(expected) + "\n  actual:\n    " + asString(actual));        }        dir.close();      } finally {        rmDir(outputDir);      }    }  }  private String asString(String[] l) {    String s = "";    for(int i=0;i<l.length;i++) {      if (i > 0) {        s += "\n    ";      }      s += l[i];    }    return s;  }  private void addDoc(IndexWriter writer, int id) throws IOException  {    Document doc = new Document();    doc.add(new Field("content", "aaa", Field.Store.NO, Field.Index.TOKENIZED));    doc.add(new Field("id", Integer.toString(id), Field.Store.YES, Field.Index.UN_TOKENIZED));    writer.addDocument(doc);  }  private void rmDir(String dir) throws IOException {    File fileDir = new File(fullDir(dir));    if (fileDir.exists()) {      File[] files = fileDir.listFiles();      if (files != null) {        for (int i = 0; i < files.length; i++) {          files[i].delete();        }      }      fileDir.delete();    }  }  public static String fullDir(String dirName) throws IOException {    return new File(System.getProperty("tempDir"), dirName).getCanonicalPath();  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -