| /* |
| * 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.lucene.queryparser.flexible.core; |
| |
| import org.apache.lucene.queryparser.flexible.core.builders.QueryBuilder; |
| import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler; |
| import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; |
| import org.apache.lucene.queryparser.flexible.core.parser.SyntaxParser; |
| import org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessor; |
| |
| /** |
| * This class is a helper for the query parser framework, it does all the three |
| * query parser phrases at once: text parsing, query processing and query |
| * building. |
| * <p> |
| * It contains methods that allows the user to change the implementation used on |
| * the three phases. |
| * |
| * @see QueryNodeProcessor |
| * @see SyntaxParser |
| * @see QueryBuilder |
| * @see QueryConfigHandler |
| */ |
| public class QueryParserHelper { |
| |
| private QueryNodeProcessor processor; |
| |
| private SyntaxParser syntaxParser; |
| |
| private QueryBuilder builder; |
| |
| private QueryConfigHandler config; |
| |
| /** |
| * Creates a query parser helper object using the specified configuration, |
| * text parser, processor and builder. |
| * |
| * @param queryConfigHandler |
| * the query configuration handler that will be initially set to this |
| * helper |
| * @param syntaxParser |
| * the text parser that will be initially set to this helper |
| * @param processor |
| * the query processor that will be initially set to this helper |
| * @param builder |
| * the query builder that will be initially set to this helper |
| * |
| * @see QueryNodeProcessor |
| * @see SyntaxParser |
| * @see QueryBuilder |
| * @see QueryConfigHandler |
| */ |
| public QueryParserHelper(QueryConfigHandler queryConfigHandler, SyntaxParser syntaxParser, QueryNodeProcessor processor, |
| QueryBuilder builder) { |
| this.syntaxParser = syntaxParser; |
| this.config = queryConfigHandler; |
| this.processor = processor; |
| this.builder = builder; |
| |
| if (processor != null) { |
| processor.setQueryConfigHandler(queryConfigHandler); |
| } |
| |
| } |
| |
| /** |
| * Returns the processor object used to process the query node tree, it |
| * returns <code>null</code> if no processor is used. |
| * |
| * @return the actual processor used to process the query node tree, |
| * <code>null</code> if no processor is used |
| * |
| * @see QueryNodeProcessor |
| * @see #setQueryNodeProcessor(QueryNodeProcessor) |
| */ |
| public QueryNodeProcessor getQueryNodeProcessor() { |
| return processor; |
| } |
| |
| /** |
| * Sets the processor that will be used to process the query node tree. If |
| * there is any {@link QueryConfigHandler} returned by |
| * {@link #getQueryConfigHandler()}, it will be set on the processor. The |
| * argument can be <code>null</code>, which means that no processor will be |
| * used to process the query node tree. |
| * |
| * @param processor |
| * the processor that will be used to process the query node tree, |
| * this argument can be <code>null</code> |
| * |
| * @see #getQueryNodeProcessor() |
| * @see QueryNodeProcessor |
| */ |
| public void setQueryNodeProcessor(QueryNodeProcessor processor) { |
| this.processor = processor; |
| this.processor.setQueryConfigHandler(getQueryConfigHandler()); |
| |
| } |
| |
| /** |
| * Sets the text parser that will be used to parse the query string, it cannot |
| * be <code>null</code>. |
| * |
| * @param syntaxParser |
| * the text parser that will be used to parse the query string |
| * |
| * @see #getSyntaxParser() |
| * @see SyntaxParser |
| */ |
| public void setSyntaxParser(SyntaxParser syntaxParser) { |
| |
| if (syntaxParser == null) { |
| throw new IllegalArgumentException("textParser should not be null!"); |
| } |
| |
| this.syntaxParser = syntaxParser; |
| |
| } |
| |
| /** |
| * The query builder that will be used to build an object from the query node |
| * tree. It cannot be <code>null</code>. |
| * |
| * @param queryBuilder |
| * the query builder used to build something from the query node tree |
| * |
| * @see #getQueryBuilder() |
| * @see QueryBuilder |
| */ |
| public void setQueryBuilder(QueryBuilder queryBuilder) { |
| |
| if (queryBuilder == null) { |
| throw new IllegalArgumentException("queryBuilder should not be null!"); |
| } |
| |
| this.builder = queryBuilder; |
| |
| } |
| |
| /** |
| * Returns the query configuration handler, which is used during the query |
| * node tree processing. It can be <code>null</code>. |
| * |
| * @return the query configuration handler used on the query processing, |
| * <code>null</code> if not query configuration handler is defined |
| * |
| * @see QueryConfigHandler |
| * @see #setQueryConfigHandler(QueryConfigHandler) |
| */ |
| public QueryConfigHandler getQueryConfigHandler() { |
| return config; |
| } |
| |
| /** |
| * Returns the query builder used to build a object from the query node tree. |
| * The object produced by this builder is returned by |
| * {@link #parse(String, String)}. |
| * |
| * @return the query builder |
| * |
| * @see #setQueryBuilder(QueryBuilder) |
| * @see QueryBuilder |
| */ |
| public QueryBuilder getQueryBuilder() { |
| return this.builder; |
| } |
| |
| /** |
| * Returns the text parser used to build a query node tree from a query |
| * string. The default text parser instance returned by this method is a |
| * {@link SyntaxParser}. |
| * |
| * @return the text parse used to build query node trees. |
| * |
| * @see SyntaxParser |
| * @see #setSyntaxParser(SyntaxParser) |
| */ |
| public SyntaxParser getSyntaxParser() { |
| return this.syntaxParser; |
| } |
| |
| /** |
| * Sets the query configuration handler that will be used during query |
| * processing. It can be <code>null</code>. It's also set to the processor |
| * returned by {@link #getQueryNodeProcessor()}. |
| * |
| * @param config |
| * the query configuration handler used during query processing, it |
| * can be <code>null</code> |
| * |
| * @see #getQueryConfigHandler() |
| * @see QueryConfigHandler |
| */ |
| public void setQueryConfigHandler(QueryConfigHandler config) { |
| this.config = config; |
| QueryNodeProcessor processor = getQueryNodeProcessor(); |
| |
| if (processor != null) { |
| processor.setQueryConfigHandler(config); |
| } |
| |
| } |
| |
| /** |
| * Parses a query string to an object, usually some query object.<br> |
| * <br> |
| * In this method the three phases are executed: <br> |
| * <br> |
| * 1st - the query string is parsed using the |
| * text parser returned by {@link #getSyntaxParser()}, the result is a query |
| * node tree <br> |
| * <br> |
| * 2nd - the query node tree is processed by the |
| * processor returned by {@link #getQueryNodeProcessor()} <br> |
| * <br> |
| * 3th - a object is built from the query node |
| * tree using the builder returned by {@link #getQueryBuilder()} |
| * |
| * @param query |
| * the query string |
| * @param defaultField |
| * the default field used by the text parser |
| * |
| * @return the object built from the query |
| * |
| * @throws QueryNodeException |
| * if something wrong happens along the three phases |
| */ |
| public Object parse(String query, String defaultField) |
| throws QueryNodeException { |
| QueryNode queryTree = getSyntaxParser().parse(query, defaultField); |
| |
| QueryNodeProcessor processor = getQueryNodeProcessor(); |
| |
| if (processor != null) { |
| queryTree = processor.process(queryTree); |
| } |
| |
| return getQueryBuilder().build(queryTree); |
| |
| } |
| |
| } |