1 package org.apache.lucene.xmlparser;
3 import java.io.InputStream;
5 import javax.xml.parsers.DocumentBuilder;
6 import javax.xml.parsers.DocumentBuilderFactory;
8 import org.apache.lucene.analysis.Analyzer;
9 import org.apache.lucene.queryParser.QueryParser;
10 import org.apache.lucene.search.Query;
11 import org.apache.lucene.xmlparser.builders.*;
12 import org.w3c.dom.Document;
13 import org.w3c.dom.Element;
16 * Licensed to the Apache Software Foundation (ASF) under one or more
17 * contributor license agreements. See the NOTICE file distributed with
18 * this work for additional information regarding copyright ownership.
19 * The ASF licenses this file to You under the Apache License, Version 2.0
20 * (the "License"); you may not use this file except in compliance with
21 * the License. You may obtain a copy of the License at
23 * http://www.apache.org/licenses/LICENSE-2.0
25 * Unless required by applicable law or agreed to in writing, software
26 * distributed under the License is distributed on an "AS IS" BASIS,
27 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28 * See the License for the specific language governing permissions and
29 * limitations under the License.
32 * Assembles a QueryBuilder which uses only core Lucene Query objects
35 public class CoreParser implements QueryBuilder
38 protected Analyzer analyzer;
39 protected QueryParser parser;
40 protected QueryBuilderFactory queryFactory;
41 protected FilterBuilderFactory filterFactory;
42 //Controls the max size of the LRU cache used for QueryFilter objects parsed.
43 public static int maxNumCachedFilters=20;
47 * Construct an XML parser that uses a single instance QueryParser for handling
48 * UserQuery tags - all parse operations are synchronised on this parser
50 * @param parser A QueryParser which will be synchronized on during parse calls.
52 public CoreParser(Analyzer analyzer, QueryParser parser)
54 this(null,analyzer,parser);
58 * Constructs an XML parser that creates a QueryParser for each UserQuery request.
59 * @param defaultField The default field name used by QueryParsers constructed for UserQuery tags
62 public CoreParser(String defaultField, Analyzer analyzer)
64 this(defaultField,analyzer,null);
67 protected CoreParser(String defaultField,Analyzer analyzer, QueryParser parser)
69 this.analyzer=analyzer;
71 filterFactory = new FilterBuilderFactory();
72 filterFactory.addBuilder("RangeFilter",new RangeFilterBuilder());
73 filterFactory.addBuilder("NumericRangeFilter",new NumericRangeFilterBuilder());
75 queryFactory = new QueryBuilderFactory();
76 queryFactory.addBuilder("TermQuery",new TermQueryBuilder());
77 queryFactory.addBuilder("TermsQuery",new TermsQueryBuilder(analyzer));
78 queryFactory.addBuilder("MatchAllDocsQuery",new MatchAllDocsQueryBuilder());
79 queryFactory.addBuilder("BooleanQuery",new BooleanQueryBuilder(queryFactory));
80 queryFactory.addBuilder("NumericRangeQuery",new NumericRangeQueryBuilder());
83 queryFactory.addBuilder("UserQuery",new UserInputQueryBuilder(parser));
87 queryFactory.addBuilder("UserQuery",new UserInputQueryBuilder(defaultField,analyzer));
89 queryFactory.addBuilder("FilteredQuery",new FilteredQueryBuilder(filterFactory,queryFactory));
90 queryFactory.addBuilder("ConstantScoreQuery",new ConstantScoreQueryBuilder(filterFactory));
92 filterFactory.addBuilder("CachedFilter",new CachedFilterBuilder(queryFactory,
93 filterFactory, maxNumCachedFilters));
96 SpanQueryBuilderFactory sqof=new SpanQueryBuilderFactory();
98 SpanNearBuilder snb=new SpanNearBuilder(sqof);
99 sqof.addBuilder("SpanNear",snb);
100 queryFactory.addBuilder("SpanNear",snb);
102 BoostingTermBuilder btb=new BoostingTermBuilder();
103 sqof.addBuilder("BoostingTermQuery",btb);
104 queryFactory.addBuilder("BoostingTermQuery",btb);
106 SpanTermBuilder snt=new SpanTermBuilder();
107 sqof.addBuilder("SpanTerm",snt);
108 queryFactory.addBuilder("SpanTerm",snt);
110 SpanOrBuilder sot=new SpanOrBuilder(sqof);
111 sqof.addBuilder("SpanOr",sot);
112 queryFactory.addBuilder("SpanOr",sot);
114 SpanOrTermsBuilder sots=new SpanOrTermsBuilder(analyzer);
115 sqof.addBuilder("SpanOrTerms",sots);
116 queryFactory.addBuilder("SpanOrTerms",sots);
118 SpanFirstBuilder sft=new SpanFirstBuilder(sqof);
119 sqof.addBuilder("SpanFirst",sft);
120 queryFactory.addBuilder("SpanFirst",sft);
122 SpanNotBuilder snot=new SpanNotBuilder(sqof);
123 sqof.addBuilder("SpanNot",snot);
124 queryFactory.addBuilder("SpanNot",snot);
127 public Query parse(InputStream xmlStream) throws ParserException
129 return getQuery(parseXML(xmlStream).getDocumentElement());
132 public void addQueryBuilder(String nodeName,QueryBuilder builder)
134 queryFactory.addBuilder(nodeName,builder);
136 public void addFilterBuilder(String nodeName,FilterBuilder builder)
138 filterFactory.addBuilder(nodeName,builder);
141 private static Document parseXML(InputStream pXmlFile) throws ParserException
143 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
144 DocumentBuilder db = null;
147 db = dbf.newDocumentBuilder();
151 throw new ParserException("XML Parser configuration error", se);
153 org.w3c.dom.Document doc = null;
156 doc = db.parse(pXmlFile);
160 throw new ParserException("Error parsing XML stream:" + se, se);
166 public Query getQuery(Element e) throws ParserException
168 return queryFactory.getQuery(e);