/** * Copyright 2014 National University of Ireland, Galway. * * This file is part of the SIREn project. Project and contact information: * * https://github.com/rdelbru/SIREn * * 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. */ package org.sindice.siren.qparser.keyword; import java.util.Map; import java.util.Properties; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler; import org.apache.lucene.queryparser.flexible.standard.StandardQueryParser; import org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler.Operator; import org.apache.lucene.search.Query; import org.sindice.siren.qparser.keyword.builders.KeywordQueryTreeBuilder; import org.sindice.siren.qparser.keyword.config.KeywordQueryConfigHandler; import org.sindice.siren.qparser.keyword.config.KeywordQueryConfigHandler.KeywordConfigurationKeys; import org.sindice.siren.qparser.keyword.processors.KeywordQueryNodeProcessorPipeline; import org.sindice.siren.search.node.TwigQuery; /** * This class is a helper that enables to create easily a boolean of twig * queries. * * <p> * * To construct a {@link Query} object from a query string, use the * {@link #parse(String, String)} method: * <pre> * KeywordQueryParser queryParser = new KeywordQueryParser(); <br/> * Query query = queryParser.parse("a : b", "sirenField"); * </pre> * * * To change any configuration before parsing the query string do, for example: * <pre> * queryParser.getQueryConfigHandler().setDefaultOperator(Operator.AND); * </pre> * * or use the setter methods: * <pre> * queryParser.setDefaultOperator(Operator.AND); * </pre> * * <p> * * Examples of appropriately formatted queries can be found in the <a * href="{@docRoot}/org/sindice/siren/qparser/keyword/package-summary.html#package_description"> * query syntax documentation</a>. * * <p> * * The text parser used by this helper is a {@link KeywordSyntaxParser}. The * BNF grammar of this parser is available <a href="{@docRoot}/../jjdoc/KeywordSyntaxParser.html">here</a>. * * <p> * * The {@link QueryConfigHandler} used by this helper is a * {@link KeywordQueryConfigHandler}. * * <p> * * The query node processor used by this helper is a * {@link KeywordQueryNodeProcessorPipeline}. * * <p> * * The builder used by this helper is a {@link KeywordQueryTreeBuilder}. * * @see KeywordQueryConfigHandler * @see KeywordSyntaxParser * @see KeywordQueryNodeProcessorPipeline * @see KeywordQueryTreeBuilder */ public class KeywordQueryParser extends StandardQueryParser { /** * Constructs a {@link KeywordQueryParser} object. */ public KeywordQueryParser() { super(); this.setSyntaxParser(new KeywordSyntaxParser()); this.setQueryConfigHandler(new KeywordQueryConfigHandler()); this.setQueryNodeProcessor(new KeywordQueryNodeProcessorPipeline(this.getQueryConfigHandler())); this.setQueryBuilder(new KeywordQueryTreeBuilder()); } /** * Sets the boolean operator of the QueryParser. In default mode ( * {@link Operator#OR}) terms without any modifiers are considered optional: * for example <code>capital of Hungary</code> is equal to * <code>capital OR of OR Hungary</code>.<br/> * In {@link Operator#AND} mode terms are considered to be in conjunction: the * above mentioned query is parsed as <code>capital AND of AND Hungary</code> * <p> * Default: {@link Operator#AND} */ @Override public void setDefaultOperator(final Operator operator) { if (operator == Operator.OR) { super.setDefaultOperator(Operator.OR); } else { super.setDefaultOperator(Operator.AND); } } /** * Set the set of qnames to URI mappings. * <p> * Default: <code>null</code>. */ public void setQNames(final Properties qnames) { this.getQueryConfigHandler().set(KeywordConfigurationKeys.QNAMES, qnames); } /** * Set to <code>true</code> to allow fuzzy and wildcard queries. * <p> * Default: <code>true</code>. */ public void setAllowFuzzyAndWildcard(final boolean allowFuzzyWildcard) { this.getQueryConfigHandler().set(KeywordConfigurationKeys.ALLOW_FUZZY_AND_WILDCARD, allowFuzzyWildcard); } /** * Set the {@link Map} that associates a datatype to its {@link Analyzer}. * <p> * Default: * <pre> * map.put(XSDDatatype.XSD_STRING, new StandardAnalyzer(Version.LUCENE_40)); * map.put(JSONDatatype.JSON_FIELD, new WhitespaceAnalyzer(Version.LUCENE_40)); * </pre> */ public void setDatatypeAnalyzers(final Map<String, Analyzer> dtAnalyzers) { this.getQueryConfigHandler().set(KeywordConfigurationKeys.DATATYPES_ANALYZERS, dtAnalyzers); } @Override public void setAnalyzer(final Analyzer analyzer) { throw new IllegalAccessError("Use #setDatatypesAnalyzers instead."); } /** * Set the default root level of a {@link TwigQuery} * <p> * Default: 1 */ public void setRootLevel(final int level) { this.getQueryConfigHandler().set(KeywordConfigurationKeys.ROOT_LEVEL, level); } /** * Enable or not {@link TwigQuery} * <p> * Default: <code>true</code> */ public void setAllowTwig(final boolean allowTwig) { this.getQueryConfigHandler().set(KeywordConfigurationKeys.ALLOW_TWIG, allowTwig); } @Override public String toString(){ return "<KeywordQueryParser config=\"" + this.getQueryConfigHandler() + "\"/>"; } }