Author: yonik
Date: Thu Aug 28 13:54:24 2008
New Revision: 689978

URL: http://svn.apache.org/viewvc?rev=689978&view=rev
Log:
SOLR-737: use a constant score query for wildcards

Added:
    lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java   
(with props)
Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/src/java/org/apache/solr/search/SolrQueryParser.java
    lucene/solr/trunk/src/test/org/apache/solr/ConvertedLegacyTest.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=689978&r1=689977&r2=689978&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Thu Aug 28 13:54:24 2008
@@ -396,6 +396,10 @@
 
  3. SOLR-647: reference count the SolrCore uses to prevent a premature
     close while a core is still in use.  (Henri Biestro, Noble Paul, yonik)
+
+ 4. SOLR-737: SolrQueryParser now uses a ConstantScoreQuery for wildcard
+    queries that prevent an exception from being thrown when the number
+    of matching terms exceeds the BooleanQuery clause limit.  (yonik)
     
 Optimizations
  1. SOLR-276: improve JSON writer speed. (yonik)

Modified: lucene/solr/trunk/src/java/org/apache/solr/search/SolrQueryParser.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/SolrQueryParser.java?rev=689978&r1=689977&r2=689978&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/SolrQueryParser.java 
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/SolrQueryParser.java Thu 
Aug 28 13:54:24 2008
@@ -22,6 +22,8 @@
 import org.apache.lucene.queryParser.QueryParser;
 import org.apache.lucene.search.ConstantScoreRangeQuery;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.WildcardQuery;
+import org.apache.lucene.search.ConstantScoreQuery;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.schema.FieldType;
@@ -144,4 +146,12 @@
     return new ConstantScorePrefixQuery(t);
   }
 
+  protected Query getWildcardQuery(String field, String termStr) throws 
ParseException {
+    Query q = super.getWildcardQuery(field, termStr);
+    if (q instanceof WildcardQuery) {
+      // use a constant score query to avoid overflowing clauses
+      return new ConstantScoreQuery(new 
WildcardFilter(((WildcardQuery)q).getTerm()));
+    }
+    return q;
+  }
 }

Added: lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java?rev=689978&view=auto
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java 
(added)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java Thu 
Aug 28 13:54:24 2008
@@ -0,0 +1,103 @@
+/**
+ * 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.
+ */
+
+package org.apache.solr.search;
+
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.WildcardTermEnum;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.TermEnum;
+import org.apache.lucene.index.TermDocs;
+import org.apache.lucene.util.OpenBitSet;
+
+import java.util.BitSet;
+import java.io.IOException;
+
+
+/**
+ *
+ * @version $Id$
+ */
+public class WildcardFilter extends Filter {
+  protected final Term term;
+
+  public WildcardFilter(Term wildcardTerm) {
+    this.term = wildcardTerm;
+  }
+
+  public Term getTerm() { return term; }
+
+  /**
+   * @deprecated Use [EMAIL PROTECTED] #getDocIdSet(IndexReader)} instead.
+   */
+  public BitSet bits(IndexReader reader) throws IOException {
+    final BitSet bitSet = new BitSet(reader.maxDoc());
+    new WildcardGenerator(term) {
+      public void handleDoc(int doc) {
+        bitSet.set(doc);
+      }
+    }.generate(reader);
+    return bitSet;
+  }
+
+  public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
+    final OpenBitSet bitSet = new OpenBitSet(reader.maxDoc());
+    new WildcardGenerator(term) {
+      public void handleDoc(int doc) {
+        bitSet.set(doc);
+      }
+    }.generate(reader);
+    return bitSet;
+  }
+
+  public String toString () {
+    StringBuilder sb = new StringBuilder();
+    sb.append("WildcardFilter(");
+    sb.append(term.toString());
+    sb.append(")");
+    return sb.toString();
+  }
+}
+
+
+abstract class WildcardGenerator implements IdGenerator {
+  protected final Term wildcard;
+
+  WildcardGenerator(Term wildcard) {
+    this.wildcard = wildcard;
+  }
+
+  public void generate(IndexReader reader) throws IOException {
+    TermEnum enumerator = new WildcardTermEnum(reader, wildcard);
+    TermDocs termDocs = reader.termDocs();
+    try {
+      do {
+        Term term = enumerator.term();
+        if (term==null) break;
+        termDocs.seek(term);
+        while (termDocs.next()) {
+          handleDoc(termDocs.doc());
+        }
+      } while (enumerator.next());
+    } finally {
+      termDocs.close();
+      enumerator.close();
+    }
+  }
+}

Propchange: 
lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
lucene/solr/trunk/src/java/org/apache/solr/search/WildcardFilter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: lucene/solr/trunk/src/test/org/apache/solr/ConvertedLegacyTest.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/ConvertedLegacyTest.java?rev=689978&r1=689977&r2=689978&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/ConvertedLegacyTest.java 
(original)
+++ lucene/solr/trunk/src/test/org/apache/solr/ConvertedLegacyTest.java Thu Aug 
28 13:54:24 2008
@@ -812,6 +812,9 @@
             );
     // val_s:* %//[EMAIL PROTECTED]"8"]
 
+    // test wildcard query
+    assertQ(req("val_s:a*p*") ,"//[EMAIL PROTECTED]'3']");
+    assertQ(req("val_s:p?a*") ,"//[EMAIL PROTECTED]'3']");
 
     assertU("<delete><query>id:[100 TO 110]</query></delete>");
 


Reply via email to