diff --git a/src/main/java/org/codelibs/fess/rank/fusion/RankFusionProcessor.java b/src/main/java/org/codelibs/fess/rank/fusion/RankFusionProcessor.java index 3314269c7..6dcdcad9d 100644 --- a/src/main/java/org/codelibs/fess/rank/fusion/RankFusionProcessor.java +++ b/src/main/java/org/codelibs/fess/rank/fusion/RankFusionProcessor.java @@ -31,6 +31,8 @@ import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -48,6 +50,10 @@ import org.codelibs.fess.util.DocumentUtil; import org.codelibs.fess.util.FacetResponse; import org.codelibs.fess.util.QueryResponseList; import org.dbflute.optional.OptionalThing; +import org.lastaflute.di.core.ExternalContext; +import org.lastaflute.di.core.factory.SingletonLaContainerFactory; +import org.lastaflute.web.util.LaRequestUtil; +import org.lastaflute.web.util.LaResponseUtil; public class RankFusionProcessor implements AutoCloseable { @@ -130,6 +136,9 @@ public class RankFusionProcessor implements AutoCloseable { params.getStartPosition(), pageSize, offset); } + final ExternalContext externalContext = SingletonLaContainerFactory.getExternalContext(); + final OptionalThing requestOpt = LaRequestUtil.getOptionalRequest(); + final OptionalThing responseOpt = LaResponseUtil.getOptionalResponse(); final FessConfig fessConfig = ComponentUtil.getFessConfig(); final int rankConstant = fessConfig.getRankFusionRankConstantAsInteger(); final int size = windowSize / searchers.length; @@ -140,7 +149,20 @@ public class RankFusionProcessor implements AutoCloseable { for (int i = 0; i < searchers.length; i++) { final SearchRequestParams reqParams = new SearchRequestParamsWrapper(params, 0, i == 0 ? windowSize : size); final RankFusionSearcher searcher = searchers[i]; - resultList.add(executorService.submit(() -> searcher.search(query, reqParams, userBean))); + resultList.add(executorService.submit(() -> { + try { + if (externalContext != null) { + requestOpt.ifPresent(externalContext::setRequest); + responseOpt.ifPresent(externalContext::setResponse); + } + return searcher.search(query, reqParams, userBean); + } finally { + if (externalContext != null) { + externalContext.setRequest(null); + externalContext.setResponse(null); + } + } + })); } final SearchResult[] results = resultList.stream().map(f -> { try { @@ -349,6 +371,41 @@ public class RankFusionProcessor implements AutoCloseable { public String getSimilarDocHash() { return parent.getSimilarDocHash(); } + + @Override + public String getTrackTotalHits() { + return parent.getTrackTotalHits(); + } + + @Override + public Float getMinScore() { + return parent.getMinScore(); + } + + @Override + public boolean hasConditionQuery() { + return parent.hasConditionQuery(); + } + + @Override + public String[] getResponseFields() { + return parent.getResponseFields(); + } + + @Override + public int hashCode() { + return parent.hashCode(); + } + + @Override + public boolean equals(final Object obj) { + return parent.equals(obj); + } + + @Override + public String toString() { + return parent.toString(); + } } public void setSeacher(final RankFusionSearcher searcher) {