X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/CoreParser.java diff --git a/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/CoreParser.java b/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/CoreParser.java new file mode 100644 index 0000000..c84b90a --- /dev/null +++ b/lucene-java-3.5.0/lucene/contrib/xml-query-parser/src/java/org/apache/lucene/xmlparser/CoreParser.java @@ -0,0 +1,170 @@ +package org.apache.lucene.xmlparser; + +import java.io.InputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.queryParser.QueryParser; +import org.apache.lucene.search.Query; +import org.apache.lucene.xmlparser.builders.*; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * 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. + */ +/** + * Assembles a QueryBuilder which uses only core Lucene Query objects + * + */ +public class CoreParser implements QueryBuilder +{ + + protected Analyzer analyzer; + protected QueryParser parser; + protected QueryBuilderFactory queryFactory; + protected FilterBuilderFactory filterFactory; + //Controls the max size of the LRU cache used for QueryFilter objects parsed. + public static int maxNumCachedFilters=20; + + + /** + * Construct an XML parser that uses a single instance QueryParser for handling + * UserQuery tags - all parse operations are synchronised on this parser + * @param analyzer + * @param parser A QueryParser which will be synchronized on during parse calls. + */ + public CoreParser(Analyzer analyzer, QueryParser parser) + { + this(null,analyzer,parser); + } + + /** + * Constructs an XML parser that creates a QueryParser for each UserQuery request. + * @param defaultField The default field name used by QueryParsers constructed for UserQuery tags + * @param analyzer + */ + public CoreParser(String defaultField, Analyzer analyzer) + { + this(defaultField,analyzer,null); + } + + protected CoreParser(String defaultField,Analyzer analyzer, QueryParser parser) + { + this.analyzer=analyzer; + this.parser=parser; + filterFactory = new FilterBuilderFactory(); + filterFactory.addBuilder("RangeFilter",new RangeFilterBuilder()); + filterFactory.addBuilder("NumericRangeFilter",new NumericRangeFilterBuilder()); + + queryFactory = new QueryBuilderFactory(); + queryFactory.addBuilder("TermQuery",new TermQueryBuilder()); + queryFactory.addBuilder("TermsQuery",new TermsQueryBuilder(analyzer)); + queryFactory.addBuilder("MatchAllDocsQuery",new MatchAllDocsQueryBuilder()); + queryFactory.addBuilder("BooleanQuery",new BooleanQueryBuilder(queryFactory)); + queryFactory.addBuilder("NumericRangeQuery",new NumericRangeQueryBuilder()); + if(parser!=null) + { + queryFactory.addBuilder("UserQuery",new UserInputQueryBuilder(parser)); + } + else + { + queryFactory.addBuilder("UserQuery",new UserInputQueryBuilder(defaultField,analyzer)); + } + queryFactory.addBuilder("FilteredQuery",new FilteredQueryBuilder(filterFactory,queryFactory)); + queryFactory.addBuilder("ConstantScoreQuery",new ConstantScoreQueryBuilder(filterFactory)); + + filterFactory.addBuilder("CachedFilter",new CachedFilterBuilder(queryFactory, + filterFactory, maxNumCachedFilters)); + + + SpanQueryBuilderFactory sqof=new SpanQueryBuilderFactory(); + + SpanNearBuilder snb=new SpanNearBuilder(sqof); + sqof.addBuilder("SpanNear",snb); + queryFactory.addBuilder("SpanNear",snb); + + BoostingTermBuilder btb=new BoostingTermBuilder(); + sqof.addBuilder("BoostingTermQuery",btb); + queryFactory.addBuilder("BoostingTermQuery",btb); + + SpanTermBuilder snt=new SpanTermBuilder(); + sqof.addBuilder("SpanTerm",snt); + queryFactory.addBuilder("SpanTerm",snt); + + SpanOrBuilder sot=new SpanOrBuilder(sqof); + sqof.addBuilder("SpanOr",sot); + queryFactory.addBuilder("SpanOr",sot); + + SpanOrTermsBuilder sots=new SpanOrTermsBuilder(analyzer); + sqof.addBuilder("SpanOrTerms",sots); + queryFactory.addBuilder("SpanOrTerms",sots); + + SpanFirstBuilder sft=new SpanFirstBuilder(sqof); + sqof.addBuilder("SpanFirst",sft); + queryFactory.addBuilder("SpanFirst",sft); + + SpanNotBuilder snot=new SpanNotBuilder(sqof); + sqof.addBuilder("SpanNot",snot); + queryFactory.addBuilder("SpanNot",snot); + } + + public Query parse(InputStream xmlStream) throws ParserException + { + return getQuery(parseXML(xmlStream).getDocumentElement()); + } + + public void addQueryBuilder(String nodeName,QueryBuilder builder) + { + queryFactory.addBuilder(nodeName,builder); + } + public void addFilterBuilder(String nodeName,FilterBuilder builder) + { + filterFactory.addBuilder(nodeName,builder); + } + + private static Document parseXML(InputStream pXmlFile) throws ParserException + { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = null; + try + { + db = dbf.newDocumentBuilder(); + } + catch (Exception se) + { + throw new ParserException("XML Parser configuration error", se); + } + org.w3c.dom.Document doc = null; + try + { + doc = db.parse(pXmlFile); + } + catch (Exception se) + { + throw new ParserException("Error parsing XML stream:" + se, se); + } + return doc; + } + + + public Query getQuery(Element e) throws ParserException + { + return queryFactory.getQuery(e); + } +}