Return-Path: Delivered-To: apmail-lucene-java-commits-archive@www.apache.org Received: (qmail 39179 invoked from network); 14 Nov 2009 12:26:07 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 14 Nov 2009 12:26:07 -0000 Received: (qmail 40751 invoked by uid 500); 14 Nov 2009 12:26:07 -0000 Delivered-To: apmail-lucene-java-commits-archive@lucene.apache.org Received: (qmail 40686 invoked by uid 500); 14 Nov 2009 12:26:07 -0000 Mailing-List: contact java-commits-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: java-dev@lucene.apache.org Delivered-To: mailing list java-commits@lucene.apache.org Received: (qmail 40677 invoked by uid 99); 14 Nov 2009 12:26:07 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 14 Nov 2009 12:26:07 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 14 Nov 2009 12:26:04 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id A657723888D8; Sat, 14 Nov 2009 12:25:42 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r836161 - /lucene/java/trunk/contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java Date: Sat, 14 Nov 2009 12:25:42 -0000 To: java-commits@lucene.apache.org From: simonw@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091114122542.A657723888D8@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: simonw Date: Sat Nov 14 12:25:42 2009 New Revision: 836161 URL: http://svn.apache.org/viewvc?rev=836161&view=rev Log: LUCENE-2064: Highlighter support all MultiTermQuery subclasses without explicit casts Modified: lucene/java/trunk/contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java Modified: lucene/java/trunk/contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java?rev=836161&r1=836160&r2=836161&view=diff ============================================================================== --- lucene/java/trunk/contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java (original) +++ lucene/java/trunk/contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java Sat Nov 14 12:25:42 2009 @@ -28,8 +28,10 @@ import org.apache.lucene.analysis.CachingTokenFilter; import org.apache.lucene.analysis.TokenStream; +import org.apache.lucene.index.FilterIndexReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; +import org.apache.lucene.index.TermEnum; import org.apache.lucene.index.memory.MemoryIndex; import org.apache.lucene.search.*; import org.apache.lucene.search.spans.FieldMaskingSpanQuery; @@ -144,22 +146,14 @@ } else if (query instanceof MultiTermQuery && expandMultiTermQuery) { MultiTermQuery mtq = ((MultiTermQuery)query); if(mtq.getRewriteMethod() != MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE) { - mtq = copyMultiTermQuery(mtq); + mtq = (MultiTermQuery) mtq.clone(); mtq.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE); query = mtq; } - String field = null; - if(mtq instanceof TermRangeQuery) { - field = ((TermRangeQuery)mtq).getField(); - } else if (mtq instanceof PrefixQuery) { - field = ((PrefixQuery) mtq).getPrefix().field(); - } else if (mtq instanceof WildcardQuery) { - field = ((WildcardQuery) mtq).getTerm().field(); - } else if (mtq instanceof FuzzyQuery) { - field = ((FuzzyQuery) mtq).getTerm().field(); - } - if (field != null) { - IndexReader ir = getReaderForField(field); + FakeReader fReader = new FakeReader(); + MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE.rewrite(fReader, mtq); + if (fReader.field != null) { + IndexReader ir = getReaderForField(fReader.field); extract(query.rewrite(ir), terms); } } else if (query instanceof MultiPhraseQuery) { @@ -527,29 +521,6 @@ } - private MultiTermQuery copyMultiTermQuery(MultiTermQuery query) { - if(query instanceof TermRangeQuery) { - TermRangeQuery q = (TermRangeQuery)query; - q.setBoost(query.getBoost()); - return new TermRangeQuery(q.getField(), q.getLowerTerm(), q.getUpperTerm(), q.includesLower(), q.includesUpper()); - } else if(query instanceof WildcardQuery) { - MultiTermQuery q = new WildcardQuery(((WildcardQuery) query).getTerm()); - q.setBoost(query.getBoost()); - return q; - } else if(query instanceof PrefixQuery) { - MultiTermQuery q = new PrefixQuery(((PrefixQuery) query).getPrefix()); - q.setBoost(q.getBoost()); - return q; - } else if(query instanceof FuzzyQuery) { - FuzzyQuery q = (FuzzyQuery)query; - q.setBoost(q.getBoost()); - return new FuzzyQuery(q.getTerm(), q.getMinSimilarity(), q.getPrefixLength()); - } - - return query; - } - - public boolean getExpandMultiTermQuery() { return expandMultiTermQuery; } @@ -578,4 +549,49 @@ public void setWrapIfNotCachingTokenFilter(boolean wrap) { this.wrapToCaching = wrap; } + + /** + * + * A fake IndexReader class to extract the field from a MultiTermQuery + * + */ + static final class FakeReader extends FilterIndexReader { + + private static final IndexReader EMPTY_MEMORY_INDEX_READER = + new MemoryIndex().createSearcher().getIndexReader(); + + String field; + + FakeReader() { + super(EMPTY_MEMORY_INDEX_READER); + } + + @Override + public TermEnum terms(Term t) throws IOException { + field = t.field(); + return new TermEnum() { + + @Override + public Term term() { + return null; + } + + @Override + public boolean next() throws IOException { + return false; + } + + @Override + public int docFreq() { + return 0; + } + + @Override + public void close() throws IOException { + } + }; + } + + } + }