X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.5.0/lucene/src/test/org/apache/lucene/search/function/FunctionTestSetup.java diff --git a/lucene-java-3.5.0/lucene/src/test/org/apache/lucene/search/function/FunctionTestSetup.java b/lucene-java-3.5.0/lucene/src/test/org/apache/lucene/search/function/FunctionTestSetup.java new file mode 100755 index 0000000..cb9011a --- /dev/null +++ b/lucene-java-3.5.0/lucene/src/test/org/apache/lucene/search/function/FunctionTestSetup.java @@ -0,0 +1,167 @@ +package org.apache.lucene.search.function; + +/** + * 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.analysis.Analyzer; +import org.apache.lucene.analysis.MockAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.Fieldable; +import org.apache.lucene.index.RandomIndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.store.Directory; +import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.util._TestUtil; +import org.junit.AfterClass; +import org.junit.Ignore; + +/** + * Setup for function tests + */ +@Ignore +public abstract class FunctionTestSetup extends LuceneTestCase { + + /** + * Actual score computation order is slightly different than assumptios + * this allows for a small amount of variation + */ + protected static float TEST_SCORE_TOLERANCE_DELTA = 0.001f; + + protected static final int N_DOCS = 17; // select a primary number > 2 + + protected static final String ID_FIELD = "id"; + protected static final String TEXT_FIELD = "text"; + protected static final String INT_FIELD = "iii"; + protected static final String FLOAT_FIELD = "fff"; + + private static final String DOC_TEXT_LINES[] = { + "Well, this is just some plain text we use for creating the ", + "test documents. It used to be a text from an online collection ", + "devoted to first aid, but if there was there an (online) lawyers ", + "first aid collection with legal advices, \"it\" might have quite ", + "probably advised one not to include \"it\"'s text or the text of ", + "any other online collection in one's code, unless one has money ", + "that one don't need and one is happy to donate for lawyers ", + "charity. Anyhow at some point, rechecking the usage of this text, ", + "it became uncertain that this text is free to use, because ", + "the web site in the disclaimer of he eBook containing that text ", + "was not responding anymore, and at the same time, in projGut, ", + "searching for first aid no longer found that eBook as well. ", + "So here we are, with a perhaps much less interesting ", + "text for the test, but oh much much safer. ", + }; + + protected static Directory dir; + protected static Analyzer anlzr; + + @AfterClass + public static void afterClassFunctionTestSetup() throws Exception { + dir.close(); + dir = null; + anlzr = null; + } + + protected static void createIndex(boolean doMultiSegment) throws Exception { + if (VERBOSE) { + System.out.println("TEST: setUp"); + } + // prepare a small index with just a few documents. + dir = newDirectory(); + anlzr = new MockAnalyzer(random); + IndexWriterConfig iwc = newIndexWriterConfig( TEST_VERSION_CURRENT, anlzr).setMergePolicy(newLogMergePolicy()); + RandomIndexWriter iw = new RandomIndexWriter(random, dir, iwc); + if (doMultiSegment) { + iw.w.setMaxBufferedDocs(_TestUtil.nextInt(random, 2, 7)); + } + + iw.w.setInfoStream(VERBOSE ? System.out : null); + // add docs not exactly in natural ID order, to verify we do check the order of docs by scores + int remaining = N_DOCS; + boolean done[] = new boolean[N_DOCS]; + int i = 0; + while (remaining > 0) { + if (done[i]) { + throw new Exception("to set this test correctly N_DOCS=" + N_DOCS + " must be primary and greater than 2!"); + } + addDoc(iw, i); + done[i] = true; + i = (i + 4) % N_DOCS; + remaining --; + } + if (!doMultiSegment) { + if (VERBOSE) { + System.out.println("TEST: setUp full merge"); + } + iw.forceMerge(1); + } + iw.close(); + if (VERBOSE) { + System.out.println("TEST: setUp done close"); + } + } + + private static void addDoc(RandomIndexWriter iw, int i) throws Exception { + Document d = new Document(); + Fieldable f; + int scoreAndID = i + 1; + + f = newField(ID_FIELD, id2String(scoreAndID), Field.Store.YES, Field.Index.NOT_ANALYZED); // for debug purposes + f.setOmitNorms(true); + d.add(f); + + f = newField(TEXT_FIELD, "text of doc" + scoreAndID + textLine(i), Field.Store.NO, Field.Index.ANALYZED); // for regular search + f.setOmitNorms(true); + d.add(f); + + f = newField(INT_FIELD, "" + scoreAndID, Field.Store.NO, Field.Index.NOT_ANALYZED); // for function scoring + f.setOmitNorms(true); + d.add(f); + + f = newField(FLOAT_FIELD, scoreAndID + ".000", Field.Store.NO, Field.Index.NOT_ANALYZED); // for function scoring + f.setOmitNorms(true); + d.add(f); + + iw.addDocument(d); + log("added: " + d); + } + + // 17 --> ID00017 + protected static String id2String(int scoreAndID) { + String s = "000000000" + scoreAndID; + int n = ("" + N_DOCS).length() + 3; + int k = s.length() - n; + return "ID" + s.substring(k); + } + + // some text line for regular search + private static String textLine(int docNum) { + return DOC_TEXT_LINES[docNum % DOC_TEXT_LINES.length]; + } + + // extract expected doc score from its ID Field: "ID7" --> 7.0 + protected static float expectedFieldScore(String docIDFieldVal) { + return Float.parseFloat(docIDFieldVal.substring(2)); + } + + // debug messages (change DBG to true for anything to print) + protected static void log(Object o) { + if (VERBOSE) { + System.out.println(o.toString()); + } + } +}