Index: src/java/org/apache/lucene/search/MultiPhraseQuery.java =================================================================== --- src/java/org/apache/lucene/search/MultiPhraseQuery.java (revision 828825) +++ src/java/org/apache/lucene/search/MultiPhraseQuery.java (working copy) @@ -134,9 +134,10 @@ this.similarity = getSimilarity(searcher); // compute idf + final int maxDoc = searcher.maxDoc(); for(final Term[] terms: termArrays) { for (Term term: terms) { - idf += getSimilarity(searcher).idf(term, searcher); + idf += this.similarity.idf(searcher.docFreq(term), maxDoc); } } } Index: src/java/org/apache/lucene/search/Similarity.java =================================================================== --- src/java/org/apache/lucene/search/Similarity.java (revision 828825) +++ src/java/org/apache/lucene/search/Similarity.java (working copy) @@ -704,27 +704,6 @@ */ public abstract float tf(float freq); - /** Computes a score factor for a simple term. - * - *

The default implementation is:

-   *   return idf(searcher.docFreq(term), searcher.maxDoc());
-   * 
- * - * Note that {@link Searcher#maxDoc()} is used instead of - * {@link org.apache.lucene.index.IndexReader#numDocs() IndexReader#numDocs()} because also - * {@link Searcher#docFreq(Term)} is used, and when the latter - * is inaccurate, so is {@link Searcher#maxDoc()}, and in the same direction. - * In addition, {@link Searcher#maxDoc()} is more efficient to compute - * - * @param term the term in question - * @param searcher the document collection being searched - * @return a score factor for the term - * @deprecated see {@link #idfExplain(Term, Searcher)} - */ - public float idf(Term term, Searcher searcher) throws IOException { - return idf(searcher.docFreq(term), searcher.maxDoc()); - } - /** * Computes a score factor for a simple term and returns an explanation * for that score factor. @@ -749,19 +728,6 @@ * @throws IOException */ public IDFExplanation idfExplain(final Term term, final Searcher searcher) throws IOException { - if(supportedMethods.overridesTermIDF) { - final float idf = idf(term, searcher); - return new IDFExplanation() { - @Override - public float getIdf() { - return idf; - } - @Override - public String explain() { - return "Inexplicable"; - } - }; - } final int df = searcher.docFreq(term); final int max = searcher.maxDoc(); final float idf = idf(df, max); @@ -777,25 +743,6 @@ }}; } - /** Computes a score factor for a phrase. - * - *

The default implementation sums the {@link #idf(Term,Searcher)} factor - * for each term in the phrase. - * - * @param terms the terms in the phrase - * @param searcher the document collection being searched - * @return idf score factor - * @deprecated see {@link #idfExplain(Collection, Searcher)} - */ - public float idf(Collection terms, Searcher searcher) throws IOException { - float idf = 0.0f; - - for(final Term term: terms) { - idf += idf(term, searcher); - } - return idf; - } - /** * Computes a score factor for a phrase. * @@ -811,19 +758,6 @@ * @throws IOException */ public IDFExplanation idfExplain(Collection terms, Searcher searcher) throws IOException { - if(supportedMethods.overridesCollectionIDF) { - final float idf = idf(terms, searcher); - return new IDFExplanation() { - @Override - public float getIdf() { - return idf; - } - @Override - public String explain() { - return "Inexplicable"; - } - }; - } final int max = searcher.maxDoc(); float idf = 0.0f; final StringBuilder exp = new StringBuilder(); @@ -877,9 +811,6 @@ */ public abstract float coord(int overlap, int maxOverlap); - - - /** * Calculate a scoring factor based on the data in the payload. Overriding implementations * are responsible for interpreting what is in the payload. Lucene makes no assumptions about @@ -887,28 +818,6 @@ *

* The default implementation returns 1. * - * @param fieldName The fieldName of the term this payload belongs to - * @param payload The payload byte array to be scored - * @param offset The offset into the payload array - * @param length The length in the array - * @return An implementation dependent float to be used as a scoring factor - * - * @deprecated See {@link #scorePayload(int, String, int, int, byte[], int, int)} - */ - //TODO: When removing this, set the default value below to return 1. - public float scorePayload(String fieldName, byte [] payload, int offset, int length) - { - //Do nothing - return 1; - } - - /** - * Calculate a scoring factor based on the data in the payload. Overriding implementations - * are responsible for interpreting what is in the payload. Lucene makes no assumptions about - * what is in the byte array. - *

- * The default implementation returns 1. - * * @param docId The docId currently being scored. If this value is {@link #NO_DOC_ID_PROVIDED}, then it should be assumed that the PayloadQuery implementation does not provide document information * @param fieldName The fieldName of the term this payload belongs to * @param start The start position of the payload @@ -921,48 +830,9 @@ */ public float scorePayload(int docId, String fieldName, int start, int end, byte [] payload, int offset, int length) { - //TODO: When removing the deprecated scorePayload above, set this to return 1 - return scorePayload(fieldName, payload, offset, length); + return 1; } - /** @deprecated Remove this when old API is removed! */ - private final MethodSupport supportedMethods = getSupportedMethods(this.getClass()); - - /** @deprecated Remove this when old API is removed! */ - private static final class MethodSupport implements Serializable { - final boolean overridesCollectionIDF, overridesTermIDF; - - MethodSupport(Class clazz) { - overridesCollectionIDF = isMethodOverridden(clazz, "idf", Collection.class, Searcher.class); - overridesTermIDF = isMethodOverridden(clazz, "idf", Term.class, Searcher.class); - } - - private static boolean isMethodOverridden(Class clazz, String name, Class... params) { - try { - return clazz.getMethod(name, params).getDeclaringClass() != Similarity.class; - } catch (NoSuchMethodException e) { - // should not happen - throw new RuntimeException(e); - } - } - } - - /** @deprecated Remove this when old API is removed! */ - private static final IdentityHashMap,MethodSupport> knownMethodSupport - = new IdentityHashMap,MethodSupport>(); - - /** @deprecated Remove this when old API is removed! */ - private static MethodSupport getSupportedMethods(Class clazz) { - MethodSupport supportedMethods; - synchronized(knownMethodSupport) { - supportedMethods = (MethodSupport) knownMethodSupport.get(clazz); - if (supportedMethods == null) { - knownMethodSupport.put(clazz, supportedMethods = new MethodSupport(clazz)); - } - } - return supportedMethods; - } - /** The Similarity implementation used by default. * TODO: move back to top when old API is removed! **/ Index: src/java/org/apache/lucene/search/SimilarityDelegator.java =================================================================== --- src/java/org/apache/lucene/search/SimilarityDelegator.java (revision 828825) +++ src/java/org/apache/lucene/search/SimilarityDelegator.java (working copy) @@ -62,7 +62,7 @@ return delegee.coord(overlap, maxOverlap); } - public float scorePayload(String fieldName, byte[] payload, int offset, int length) { - return delegee.scorePayload(fieldName, payload, offset, length); + public float scorePayload(int docId, String fieldName, int start, int end, byte [] payload, int offset, int length) { + return delegee.scorePayload(docId, fieldName, start, end, payload, offset, length); } } Index: src/test/org/apache/lucene/index/TestOmitTf.java =================================================================== --- src/test/org/apache/lucene/index/TestOmitTf.java (revision 828825) +++ src/test/org/apache/lucene/index/TestOmitTf.java (working copy) @@ -36,23 +36,32 @@ import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.store.Directory; import org.apache.lucene.store.MockRAMDirectory; +import org.apache.lucene.search.Explanation.IDFExplanation; public class TestOmitTf extends LuceneTestCase { public static class SimpleSimilarity extends Similarity { - public float lengthNorm(String field, int numTerms) { return 1.0f; } - public float queryNorm(float sumOfSquaredWeights) { return 1.0f; } - - public float tf(float freq) { return freq; } - - public float sloppyFreq(int distance) { return 2.0f; } - public float idf(Collection terms, Searcher searcher) { return 1.0f; } - public float idf(int docFreq, int numDocs) { return 1.0f; } - public float coord(int overlap, int maxOverlap) { return 1.0f; } + @Override public float lengthNorm(String field, int numTerms) { return 1.0f; } + @Override public float queryNorm(float sumOfSquaredWeights) { return 1.0f; } + @Override public float tf(float freq) { return freq; } + @Override public float sloppyFreq(int distance) { return 2.0f; } + @Override public float idf(int docFreq, int numDocs) { return 1.0f; } + @Override public float coord(int overlap, int maxOverlap) { return 1.0f; } + @Override public IDFExplanation idfExplain(Collection terms, Searcher searcher) throws IOException { + return new IDFExplanation() { + @Override + public float getIdf() { + return 1.0f; + } + @Override + public String explain() { + return "Inexplicable"; + } + }; + } } - // Tests whether the DocumentWriter correctly enable the // omitTermFreqAndPositions bit in the FieldInfo public void testOmitTermFreqAndPositions() throws Exception { Index: src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java =================================================================== --- src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java (revision 828825) +++ src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java (working copy) @@ -41,6 +41,7 @@ import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.English; import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.search.Explanation.IDFExplanation; public class TestPayloadNearQuery extends LuceneTestCase { @@ -223,35 +224,45 @@ // must be static for weight serialization tests static class BoostingSimilarity extends DefaultSimilarity { - // TODO: Remove warning after API has been finalized - public float scorePayload(int docId, String fieldName, int start, int end, byte[] payload, int offset, int length) { + @Override public float scorePayload(int docId, String fieldName, int start, int end, byte[] payload, int offset, int length) { //we know it is size 4 here, so ignore the offset/length return payload[0]; } + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //Make everything else 1 so we see the effect of the payload //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - public float lengthNorm(String fieldName, int numTerms) { - return 1; + @Override public float lengthNorm(String fieldName, int numTerms) { + return 1.0f; } - public float queryNorm(float sumOfSquaredWeights) { - return 1; + @Override public float queryNorm(float sumOfSquaredWeights) { + return 1.0f; } - public float sloppyFreq(int distance) { - return 1; + @Override public float sloppyFreq(int distance) { + return 1.0f; } - public float coord(int overlap, int maxOverlap) { - return 1; + @Override public float coord(int overlap, int maxOverlap) { + return 1.0f; } - public float tf(float freq) { - return 1; + @Override public float tf(float freq) { + return 1.0f; } + // idf used for phrase queries - public float idf(Collection terms, Searcher searcher) { - return 1; + @Override public IDFExplanation idfExplain(Collection terms, Searcher searcher) throws IOException { + return new IDFExplanation() { + @Override + public float getIdf() { + return 1.0f; + } + @Override + public String explain() { + return "Inexplicable"; + } + }; } } } Index: src/test/org/apache/lucene/search/TestSimilarity.java =================================================================== --- src/test/org/apache/lucene/search/TestSimilarity.java (revision 828825) +++ src/test/org/apache/lucene/search/TestSimilarity.java (working copy) @@ -29,6 +29,7 @@ import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; +import org.apache.lucene.search.Explanation.IDFExplanation; /** Similarity unit test. * @@ -41,13 +42,24 @@ } public static class SimpleSimilarity extends Similarity { - public float lengthNorm(String field, int numTerms) { return 1.0f; } - public float queryNorm(float sumOfSquaredWeights) { return 1.0f; } - public float tf(float freq) { return freq; } - public float sloppyFreq(int distance) { return 2.0f; } - public float idf(Collection terms, Searcher searcher) { return 1.0f; } - public float idf(int docFreq, int numDocs) { return 1.0f; } - public float coord(int overlap, int maxOverlap) { return 1.0f; } + @Override public float lengthNorm(String field, int numTerms) { return 1.0f; } + @Override public float queryNorm(float sumOfSquaredWeights) { return 1.0f; } + @Override public float tf(float freq) { return freq; } + @Override public float sloppyFreq(int distance) { return 2.0f; } + @Override public float idf(int docFreq, int numDocs) { return 1.0f; } + @Override public float coord(int overlap, int maxOverlap) { return 1.0f; } + @Override public IDFExplanation idfExplain(Collection terms, Searcher searcher) throws IOException { + return new IDFExplanation() { + @Override + public float getIdf() { + return 1.0f; + } + @Override + public String explain() { + return "Inexplicable"; + } + }; + } } public void testSimilarity() throws Exception { @@ -80,7 +92,7 @@ this.scorer = scorer; } public final void collect(int doc) throws IOException { - assertTrue(scorer.score() == 1.0f); + assertEquals(1.0f, scorer.score()); } public void setNextReader(IndexReader reader, int docBase) {} public boolean acceptsDocsOutOfOrder() { @@ -100,7 +112,7 @@ } public final void collect(int doc) throws IOException { //System.out.println("Doc=" + doc + " score=" + score); - assertTrue(scorer.score() == (float)doc+base+1); + assertEquals((float)doc+base+1, scorer.score()); } public void setNextReader(IndexReader reader, int docBase) { base = docBase; @@ -114,8 +126,7 @@ pq.add(a); pq.add(c); //System.out.println(pq.toString("field")); - searcher.search - (pq, + searcher.search(pq, new Collector() { private Scorer scorer; public void setScorer(Scorer scorer) throws IOException { @@ -123,7 +134,7 @@ } public final void collect(int doc) throws IOException { //System.out.println("Doc=" + doc + " score=" + score); - assertTrue(scorer.score() == 1.0f); + assertEquals(1.0f, scorer.score()); } public void setNextReader(IndexReader reader, int docBase) {} public boolean acceptsDocsOutOfOrder() { @@ -140,7 +151,7 @@ } public final void collect(int doc) throws IOException { //System.out.println("Doc=" + doc + " score=" + score); - assertTrue(scorer.score() == 2.0f); + assertEquals(2.0f, scorer.score()); } public void setNextReader(IndexReader reader, int docBase) {} public boolean acceptsDocsOutOfOrder() { Index: src/test/org/apache/lucene/search/TestTermVectors.java =================================================================== --- src/test/org/apache/lucene/search/TestTermVectors.java (revision 828825) +++ src/test/org/apache/lucene/search/TestTermVectors.java (working copy) @@ -258,7 +258,7 @@ //System.out.println("Doc Id: " + docId + " freq " + freq); TermFreqVector vector = knownSearcher.reader.getTermFreqVector(docId, "field"); float tf = sim.tf(freq); - float idf = sim.idf(term, knownSearcher); + float idf = sim.idf(knownSearcher.docFreq(term), knownSearcher.maxDoc()); //float qNorm = sim.queryNorm() //This is fine since we don't have stop words float lNorm = sim.lengthNorm("field", vector.getTerms().length);