Skip to content

Commit 37f1612

Browse files
committed
Fix ScriptFilter cache key calculation
Fixes elastic#2651
1 parent 6b49457 commit 37f1612

File tree

2 files changed

+76
-14
lines changed

2 files changed

+76
-14
lines changed

src/main/java/org/elasticsearch/index/query/ScriptFilterParser.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,26 @@
1919

2020
package org.elasticsearch.index.query;
2121

22-
import com.google.common.collect.Maps;
2322
import org.apache.lucene.index.AtomicReaderContext;
2423
import org.apache.lucene.search.BitsFilteredDocIdSet;
2524
import org.apache.lucene.search.DocIdSet;
2625
import org.apache.lucene.search.Filter;
2726
import org.apache.lucene.util.Bits;
2827
import org.elasticsearch.ElasticSearchIllegalArgumentException;
29-
import org.elasticsearch.ElasticSearchIllegalStateException;
3028
import org.elasticsearch.common.Nullable;
3129
import org.elasticsearch.common.inject.Inject;
3230
import org.elasticsearch.common.lucene.docset.MatchDocIdSet;
3331
import org.elasticsearch.common.xcontent.XContentParser;
3432
import org.elasticsearch.index.cache.filter.support.CacheKeyFilter;
3533
import org.elasticsearch.script.ScriptService;
3634
import org.elasticsearch.script.SearchScript;
37-
import org.elasticsearch.search.internal.SearchContext;
35+
import org.elasticsearch.search.lookup.SearchLookup;
3836

3937
import java.io.IOException;
4038
import java.util.Map;
4139

40+
import static com.google.common.collect.Maps.newHashMap;
41+
4242
/**
4343
*
4444
*/
@@ -100,10 +100,10 @@ public Filter parse(QueryParseContext parseContext) throws IOException, QueryPar
100100
throw new QueryParsingException(parseContext.index(), "script must be provided with a [script] filter");
101101
}
102102
if (params == null) {
103-
params = Maps.newHashMap();
103+
params = newHashMap();
104104
}
105105

106-
Filter filter = new ScriptFilter(scriptLang, script, params, parseContext.scriptService());
106+
Filter filter = new ScriptFilter(scriptLang, script, params, parseContext.scriptService(), parseContext.lookup());
107107
if (cache) {
108108
filter = parseContext.cacheFilter(filter, cacheKey);
109109
}
@@ -121,16 +121,11 @@ public static class ScriptFilter extends Filter {
121121

122122
private final SearchScript searchScript;
123123

124-
private ScriptFilter(String scriptLang, String script, Map<String, Object> params, ScriptService scriptService) {
124+
public ScriptFilter(String scriptLang, String script, Map<String, Object> params, ScriptService scriptService, SearchLookup searchLookup) {
125125
this.script = script;
126126
this.params = params;
127127

128-
SearchContext context = SearchContext.current();
129-
if (context == null) {
130-
throw new ElasticSearchIllegalStateException("No search context on going...");
131-
}
132-
133-
this.searchScript = context.scriptService().search(context.lookup(), scriptLang, script, params);
128+
this.searchScript = scriptService.search(searchLookup, scriptLang, script, newHashMap(params));
134129
}
135130

136131
@Override

src/test/java/org/elasticsearch/test/integration/search/scriptfilter/ScriptFilterSearchTests.java

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@
3030
import org.testng.annotations.BeforeMethod;
3131
import org.testng.annotations.Test;
3232

33+
import java.util.concurrent.atomic.AtomicInteger;
34+
3335
import static org.elasticsearch.client.Requests.refreshRequest;
3436
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
3537
import static org.elasticsearch.index.query.FilterBuilders.scriptFilter;
36-
import static org.elasticsearch.index.query.QueryBuilders.filteredQuery;
37-
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
38+
import static org.elasticsearch.index.query.QueryBuilders.*;
3839
import static org.hamcrest.MatcherAssert.assertThat;
3940
import static org.hamcrest.Matchers.equalTo;
4041

@@ -68,6 +69,11 @@ protected Client getClient() {
6869

6970
@Test
7071
public void testCustomScriptBoost() throws Exception {
72+
try {
73+
client.admin().indices().prepareDelete("test").execute().actionGet();
74+
} catch (Exception ex) {
75+
//
76+
}
7177
client.admin().indices().prepareCreate("test").execute().actionGet();
7278
client.prepareIndex("test", "type1", "1")
7379
.setSource(jsonBuilder().startObject().field("test", "value beck").field("num1", 1.0f).endObject())
@@ -121,4 +127,65 @@ public void testCustomScriptBoost() throws Exception {
121127
assertThat(response.hits().getAt(2).id(), equalTo("3"));
122128
assertThat((Double) response.hits().getAt(2).fields().get("sNum1").values().get(0), equalTo(3.0));
123129
}
130+
131+
private static AtomicInteger scriptCounter = new AtomicInteger(0);
132+
133+
public static int incrementScriptCounter() {
134+
return scriptCounter.incrementAndGet();
135+
}
136+
137+
@Test
138+
public void testCustomScriptCache() throws Exception {
139+
try {
140+
client.admin().indices().prepareDelete("test").execute().actionGet();
141+
} catch (Exception ex) {
142+
//
143+
}
144+
client.admin().indices().prepareCreate("test").execute().actionGet();
145+
client.prepareIndex("test", "type1", "1").setSource(jsonBuilder().startObject().field("test", "1").field("num", 1.0f).endObject()).execute().actionGet();
146+
client.admin().indices().prepareFlush().execute().actionGet();
147+
client.prepareIndex("test", "type1", "2").setSource(jsonBuilder().startObject().field("test", "2").field("num", 2.0f).endObject()).execute().actionGet();
148+
client.admin().indices().prepareFlush().execute().actionGet();
149+
client.prepareIndex("test", "type1", "3").setSource(jsonBuilder().startObject().field("test", "3").field("num", 3.0f).endObject()).execute().actionGet();
150+
client.admin().indices().prepareFlush().execute().actionGet();
151+
client.admin().indices().refresh(refreshRequest()).actionGet();
152+
153+
String script = "org.elasticsearch.test.integration.search.scriptfilter.ScriptFilterSearchTests.incrementScriptCounter() > 0";
154+
155+
scriptCounter.set(0);
156+
logger.info("running script filter the first time");
157+
SearchResponse response = client.prepareSearch()
158+
.setQuery(filteredQuery(termQuery("test", "1"), scriptFilter(script).cache(true)))
159+
.execute().actionGet();
160+
161+
assertThat(response.hits().totalHits(), equalTo(1l));
162+
assertThat(scriptCounter.get(), equalTo(3));
163+
164+
scriptCounter.set(0);
165+
logger.info("running script filter the second time");
166+
response = client.prepareSearch()
167+
.setQuery(filteredQuery(termQuery("test", "2"), scriptFilter(script).cache(true)))
168+
.execute().actionGet();
169+
170+
assertThat(response.hits().totalHits(), equalTo(1l));
171+
assertThat(scriptCounter.get(), equalTo(0));
172+
173+
scriptCounter.set(0);
174+
logger.info("running script filter with new parameters");
175+
response = client.prepareSearch()
176+
.setQuery(filteredQuery(termQuery("test", "1"), scriptFilter(script).addParam("param1", "1").cache(true)))
177+
.execute().actionGet();
178+
179+
assertThat(response.hits().totalHits(), equalTo(1l));
180+
assertThat(scriptCounter.get(), equalTo(3));
181+
182+
scriptCounter.set(0);
183+
logger.info("running script filter with same parameters");
184+
response = client.prepareSearch()
185+
.setQuery(filteredQuery(matchAllQuery(), scriptFilter(script).addParam("param1", "1").cache(true)))
186+
.execute().actionGet();
187+
188+
assertThat(response.hits().totalHits(), equalTo(3l));
189+
assertThat(scriptCounter.get(), equalTo(0));
190+
}
124191
}

0 commit comments

Comments
 (0)