add --shared
[pylucene.git] / lucene-java-3.4.0 / lucene / contrib / queryparser / src / java / org / apache / lucene / queryParser / standard / processors / DefaultPhraseSlopQueryNodeProcessor.java
1 package org.apache.lucene.queryParser.standard.processors;
2
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import java.util.List;
21
22 import org.apache.lucene.queryParser.core.QueryNodeException;
23 import org.apache.lucene.queryParser.core.config.QueryConfigHandler;
24 import org.apache.lucene.queryParser.core.nodes.QueryNode;
25 import org.apache.lucene.queryParser.core.nodes.SlopQueryNode;
26 import org.apache.lucene.queryParser.core.nodes.TokenizedPhraseQueryNode;
27 import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl;
28 import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.ConfigurationKeys;
29 import org.apache.lucene.queryParser.standard.nodes.MultiPhraseQueryNode;
30
31 /**
32  * This processor verifies if {@link ConfigurationKeys#PHRASE_SLOP}
33  * is defined in the {@link QueryConfigHandler}. If it is, it looks for every
34  * {@link TokenizedPhraseQueryNode} and {@link MultiPhraseQueryNode} that does
35  * not have any {@link SlopQueryNode} applied to it and creates an
36  * {@link SlopQueryNode} and apply to it. The new {@link SlopQueryNode} has the
37  * same slop value defined in the configuration. <br/>
38  * 
39  * @see SlopQueryNode
40  * @see ConfigurationKeys#PHRASE_SLOP
41  */
42 public class DefaultPhraseSlopQueryNodeProcessor extends QueryNodeProcessorImpl {
43
44   private boolean processChildren = true;
45
46   private int defaultPhraseSlop;
47
48   public DefaultPhraseSlopQueryNodeProcessor() {
49     // empty constructor
50   }
51
52   @Override
53   public QueryNode process(QueryNode queryTree) throws QueryNodeException {
54     QueryConfigHandler queryConfig = getQueryConfigHandler();
55
56     if (queryConfig != null) {
57       Integer defaultPhraseSlop = queryConfig.get(ConfigurationKeys.PHRASE_SLOP); 
58       
59       if (defaultPhraseSlop != null) {
60         this.defaultPhraseSlop = defaultPhraseSlop;
61
62         return super.process(queryTree);
63
64       }
65
66     }
67
68     return queryTree;
69
70   }
71
72   @Override
73   protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {
74
75     if (node instanceof TokenizedPhraseQueryNode
76         || node instanceof MultiPhraseQueryNode) {
77
78       return new SlopQueryNode(node, this.defaultPhraseSlop);
79
80     }
81
82     return node;
83
84   }
85
86   @Override
87   protected QueryNode preProcessNode(QueryNode node) throws QueryNodeException {
88
89     if (node instanceof SlopQueryNode) {
90       this.processChildren = false;
91
92     }
93
94     return node;
95
96   }
97
98   @Override
99   protected void processChildren(QueryNode queryTree) throws QueryNodeException {
100
101     if (this.processChildren) {
102       super.processChildren(queryTree);
103
104     } else {
105       this.processChildren = true;
106     }
107
108   }
109
110   @Override
111   protected List<QueryNode> setChildrenOrder(List<QueryNode> children)
112       throws QueryNodeException {
113
114     return children;
115
116   }
117
118 }