package org.apache.lucene.search; /** * Copyright 2004 The Apache Software Foundation * * Licensed 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.chunk.SpanChunkedNotQuery; import org.apache.lucene.chunk.SpanDechunkingQuery; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.spans.SpanNearQuery; import org.apache.lucene.search.spans.SpanNotNearQuery; import org.apache.lucene.search.spans.SpanNotQuery; import org.apache.lucene.search.spans.SpanOrNearQuery; import org.apache.lucene.search.spans.SpanOrQuery; import org.apache.lucene.search.spans.SpanQuery; import org.apache.lucene.search.spans.SpanRangeQuery; import org.apache.lucene.search.spans.SpanTermQuery; import org.apache.lucene.search.spans.SpanWildcardQuery; /** * Utility class for performing external traversal tasks on Lucene queries. * The base class simply provides a framework. Derived classes should override * methods for those parts of a query they need to process, rewrite, and the * base will take care of calling them properly. */ public abstract class QueryTraverser { /** * Traverse a query of any supported type. * * @param q Query to traverse */ public void traverseQuery(Query q) { if (q instanceof BooleanQuery) traverse((BooleanQuery)q); else if (q instanceof SpanNearQuery) traverse((SpanNearQuery)q); else if (q instanceof SpanOrNearQuery) traverse((SpanOrNearQuery)q); else if (q instanceof SpanOrQuery) traverse((SpanOrQuery)q); else if (q instanceof SpanChunkedNotQuery) traverse((SpanChunkedNotQuery)q); else if (q instanceof SpanNotQuery) traverse((SpanNotQuery)q); else if (q instanceof SpanNotNearQuery) traverse((SpanNotNearQuery)q); else if (q instanceof SpanDechunkingQuery) traverse((SpanDechunkingQuery)q); else if (q instanceof TermQuery) traverse((TermQuery)q); else if (q instanceof SpanWildcardQuery) // must be before SpanTermQuery traverse((SpanWildcardQuery)q); else if (q instanceof SpanTermQuery) traverse((SpanTermQuery)q); else if (q instanceof SpanRangeQuery) traverse((SpanRangeQuery)q); else assert false : "unsupported query type for traversal"; } // traverseQuery() /** * Traverse a BooleanQuery. * * @param bq The query to traverse */ protected void traverse(BooleanQuery bq) { BooleanClause[] clauses = bq.getClauses(); for (int i = 0; i < clauses.length; i++) traverseQuery(clauses[i].getQuery()); } // traverse() /** * Traverse a span NEAR query. * * @param nq The query to traverse */ protected void traverse(SpanNearQuery nq) { SpanQuery[] clauses = nq.getClauses(); for (int i = 0; i < clauses.length; i++) traverseQuery(clauses[i]); } // traverse() /** * Traverse a span OR-NEAR query. * * @param nq The query to traverse */ protected void traverse(SpanOrNearQuery nq) { SpanQuery[] clauses = nq.getClauses(); for (int i = 0; i < clauses.length; i++) traverseQuery(clauses[i]); } // traverse() /** * Traverse a span-based OR query. * * @param oq The query to traverse */ protected void traverse(SpanOrQuery oq) { SpanQuery[] clauses = oq.getClauses(); for (int i = 0; i < clauses.length; i++) traverseQuery(clauses[i]); } // traverse() /** * Traverse a span-based chunked NOT query. * * @param nq The query to traverse */ protected void traverse(SpanChunkedNotQuery nq) { traverseQuery(nq.getInclude()); traverseQuery(nq.getExclude()); } // traverse() /** * Traverse a span-based NOT query. * * @param nq The query to traverse */ protected void traverse(SpanNotQuery nq) { traverseQuery(nq.getInclude()); traverseQuery(nq.getExclude()); } // traverse() /** * Traverse a span-based NOT NEAR query. * * @param nq The query to traverse */ protected void traverse(SpanNotNearQuery nq) { traverseQuery(nq.getInclude()); traverseQuery(nq.getExclude()); } // traverse() /** * Traverse a span dechunking query. * * @param nq The query to traverse */ protected void traverse(SpanDechunkingQuery nq) { traverseQuery(nq.getWrapped()); } // traverse() /** * Traverse a term query. The base class does nothing. * * @param q The query to traverse */ protected void traverse(TermQuery q) { } /** * Traverse a span term query. * * @param q The query to traverse */ protected void traverse(SpanTermQuery q) { } /** * Traverse a span wildcard query. The base class does nothing. * * @param q The query to traverse */ protected void traverse(SpanWildcardQuery q) { } /** * Traverse a span range query. The base class does nothing. * * @param q The query to traverse */ protected void traverse(SpanRangeQuery q) { } }