fix #430 : change queryParser to prototype scope

This commit is contained in:
Shinsuke Sugaya 2016-03-15 06:39:02 +09:00
parent 90e20a0d2c
commit 200d0453a8
4 changed files with 20 additions and 7 deletions

View file

@ -53,6 +53,7 @@ import org.codelibs.fess.entity.GeoInfo;
import org.codelibs.fess.entity.QueryContext;
import org.codelibs.fess.exception.InvalidQueryException;
import org.codelibs.fess.mylasta.direction.FessConfig;
import org.codelibs.fess.util.ComponentUtil;
import org.codelibs.fess.util.StreamUtil;
import org.dbflute.optional.OptionalThing;
import org.elasticsearch.common.unit.Fuzziness;
@ -92,9 +93,6 @@ public class QueryHelper implements Serializable {
@Resource
protected KeyMatchHelper keyMatchHelper;
@Resource
protected QueryParser queryParser;
protected Set<String> apiResponseFieldSet;
protected Set<String> highlightFieldSet = new HashSet<>();
@ -243,7 +241,7 @@ public class QueryHelper implements Serializable {
public void buildBaseQuery(final QueryContext queryContext, final Consumer<QueryContext> context) {
try {
final Query query = queryParser.parse(queryContext.getQueryString());
final Query query = getQueryParser().parse(queryContext.getQueryString());
final QueryBuilder queryBuilder = convertQuery(queryContext, query);
if (queryBuilder != null) {
queryContext.setQueryBuilder(queryBuilder);
@ -258,6 +256,10 @@ public class QueryHelper implements Serializable {
}
}
protected QueryParser getQueryParser() {
return ComponentUtil.getQueryParser();
}
protected QueryBuilder convertQuery(final QueryContext context, final Query query) {
if (query instanceof TermQuery) {
return convertTermQuery(context, (TermQuery) query);

View file

@ -15,6 +15,7 @@
*/
package org.codelibs.fess.util;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.codelibs.core.crypto.CachedCipher;
import org.codelibs.core.misc.DynamicProperties;
import org.codelibs.fess.api.WebApiManagerFactory;
@ -57,6 +58,8 @@ import org.lastaflute.job.JobManager;
import org.lastaflute.web.servlet.request.RequestManager;
public final class ComponentUtil {
private static final String QUERY_PARSER = "queryParser";
private static final String DOCUMENT_HELPER = "documentHelper";
private static final String ACTIVITY_HELPER = "activityHelper";
@ -298,6 +301,10 @@ public final class ComponentUtil {
return SingletonLaContainer.getComponent(DOCUMENT_HELPER);
}
public static QueryParser getQueryParser() {
return SingletonLaContainer.getComponent(QUERY_PARSER);
}
public static <T> T getComponent(final Class<T> clazz) {
return SingletonLaContainer.getComponent(clazz);
}

View file

@ -22,7 +22,7 @@
</component>
<component name="keyMatchHelper" class="org.codelibs.fess.helper.KeyMatchHelper">
</component>
<component name="queryParser" class="org.apache.lucene.queryparser.ext.ExtendableQueryParser">
<component name="queryParser" class="org.apache.lucene.queryparser.ext.ExtendableQueryParser" instance="prototype">
<arg>org.codelibs.fess.Constants.DEFAULT_FIELD</arg>
<arg>
<component class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"></component>

View file

@ -17,6 +17,7 @@ package org.codelibs.fess.helper;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.ext.ExtendableQueryParser;
import org.codelibs.fess.Constants;
import org.codelibs.fess.mylasta.direction.FessConfig;
@ -30,12 +31,15 @@ public class QueryHelperTest extends UnitFessTestCase {
@Override
public void setUp() throws Exception {
super.setUp();
queryHelper = new QueryHelper();
queryHelper = new QueryHelper() {
protected QueryParser getQueryParser() {
return new ExtendableQueryParser(Constants.DEFAULT_FIELD, new WhitespaceAnalyzer());
}
};
final FessConfig fessConfig = ComponentUtil.getFessConfig();
registerMockInstance(fessConfig);
registerMockInstance(new SystemHelper());
inject(queryHelper);
queryHelper.queryParser = new ExtendableQueryParser(Constants.DEFAULT_FIELD, new WhitespaceAnalyzer());
queryHelper.init();
}