--- /dev/null
+package org.apache.lucene.queryParser.surround.query;
+/**
+ * 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 java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.Query;
+
+public abstract class SimpleTerm
+ extends SrndQuery
+ implements DistanceSubQuery, Comparable<SimpleTerm>
+{
+ public SimpleTerm(boolean q) {quoted = q;}
+
+ private boolean quoted;
+ boolean isQuoted() {return quoted;}
+
+ public String getQuote() {return "\"";}
+ public String getFieldOperator() {return "/";}
+
+ public abstract String toStringUnquoted();
+
+ public int compareTo(SimpleTerm ost) {
+ /* for ordering terms and prefixes before using an index, not used */
+ return this.toStringUnquoted().compareTo( ost.toStringUnquoted());
+ }
+
+ protected void suffixToString(StringBuilder r) {} /* override for prefix query */
+
+ @Override
+ public String toString() {
+ StringBuilder r = new StringBuilder();
+ if (isQuoted()) {
+ r.append(getQuote());
+ }
+ r.append(toStringUnquoted());
+ if (isQuoted()) {
+ r.append(getQuote());
+ }
+ suffixToString(r);
+ weightToString(r);
+ return r.toString();
+ }
+
+ public abstract void visitMatchingTerms(
+ IndexReader reader,
+ String fieldName,
+ MatchingTermVisitor mtv) throws IOException;
+
+ public interface MatchingTermVisitor {
+ void visitMatchingTerm(Term t)throws IOException;
+ }
+
+ public String distanceSubQueryNotAllowed() {return null;}
+
+
+ @Override
+ public Query makeLuceneQueryFieldNoBoost(final String fieldName, final BasicQueryFactory qf) {
+ return new Query() {
+ @Override
+ public String toString(String fn) {
+ return getClass().toString() + " " + fieldName + " (" + fn + "?)";
+ }
+
+ @Override
+ public Query rewrite(IndexReader reader) throws IOException {
+ final List<Query> luceneSubQueries = new ArrayList<Query>();
+ visitMatchingTerms( reader, fieldName,
+ new MatchingTermVisitor() {
+ public void visitMatchingTerm(Term term) throws IOException {
+ luceneSubQueries.add(qf.newTermQuery(term));
+ }
+ });
+ return (luceneSubQueries.size() == 0) ? SrndQuery.theEmptyLcnQuery
+ : (luceneSubQueries.size() == 1) ? luceneSubQueries.get(0)
+ : SrndBooleanQuery.makeBooleanQuery(
+ /* luceneSubQueries all have default weight */
+ luceneSubQueries, BooleanClause.Occur.SHOULD); /* OR the subquery terms */
+ }
+ };
+ }
+
+ public void addSpanQueries(final SpanNearClauseFactory sncf) throws IOException {
+ visitMatchingTerms(
+ sncf.getIndexReader(),
+ sncf.getFieldName(),
+ new MatchingTermVisitor() {
+ public void visitMatchingTerm(Term term) throws IOException {
+ sncf.addTermWeighted(term, getWeight());
+ }
+ });
+ }
+}
+
+
+