Merge pull request #15328 from rmuir/shave_mustache
Factor mustache -> modules/lang-mustache
This commit is contained in:
commit
1ef24d2a85
|
@ -65,7 +65,6 @@ public class PluginBuildPlugin extends BuildPlugin {
|
|||
// with a full elasticsearch server that includes optional deps
|
||||
provided "com.spatial4j:spatial4j:${project.versions.spatial4j}"
|
||||
provided "com.vividsolutions:jts:${project.versions.jts}"
|
||||
provided "com.github.spullara.mustache.java:compiler:${project.versions.mustache}"
|
||||
provided "log4j:log4j:${project.versions.log4j}"
|
||||
provided "log4j:apache-log4j-extras:${project.versions.log4j}"
|
||||
provided "org.slf4j:slf4j-api:${project.versions.slf4j}"
|
||||
|
|
|
@ -4,7 +4,6 @@ lucene = 5.4.0-snapshot-1715952
|
|||
# optional dependencies
|
||||
spatial4j = 0.5
|
||||
jts = 1.13
|
||||
mustache = 0.9.1
|
||||
jackson = 2.6.2
|
||||
log4j = 1.2.17
|
||||
slf4j = 1.6.2
|
||||
|
|
|
@ -74,9 +74,6 @@ dependencies {
|
|||
compile "com.spatial4j:spatial4j:${versions.spatial4j}", optional
|
||||
compile "com.vividsolutions:jts:${versions.jts}", optional
|
||||
|
||||
// templating
|
||||
compile "com.github.spullara.mustache.java:compiler:${versions.mustache}", optional
|
||||
|
||||
// logging
|
||||
compile "log4j:log4j:${versions.log4j}", optional
|
||||
compile "log4j:apache-log4j-extras:${versions.log4j}", optional
|
||||
|
|
|
@ -18,25 +18,15 @@
|
|||
*/
|
||||
package org.elasticsearch.index.query;
|
||||
|
||||
import org.elasticsearch.ElasticsearchParseException;
|
||||
import org.elasticsearch.common.HasContextAndHeaders;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.ParseFieldMatcher;
|
||||
import org.elasticsearch.common.bytes.BytesReference;
|
||||
import org.elasticsearch.common.lease.Releasables;
|
||||
import org.elasticsearch.common.xcontent.XContent;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
import org.elasticsearch.script.*;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.elasticsearch.common.Strings.hasLength;
|
||||
|
||||
/**
|
||||
* In the simplest case, parse template string and variables from the request,
|
||||
* compile the template and execute the template against the given variables.
|
||||
|
|
|
@ -41,7 +41,6 @@ import org.elasticsearch.rest.action.support.RestBuilderListener;
|
|||
import org.elasticsearch.script.Script.ScriptField;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.Template;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -89,7 +88,7 @@ public class RestRenderSearchTemplateAction extends BaseRestHandler {
|
|||
throw new ElasticsearchParseException("failed to parse request. unknown field [{}] of type [{}]", currentFieldName, token);
|
||||
}
|
||||
}
|
||||
template = new Template(templateId, ScriptType.INDEXED, MustacheScriptEngineService.NAME, null, params);
|
||||
template = new Template(templateId, ScriptType.INDEXED, Template.DEFAULT_LANG, null, params);
|
||||
}
|
||||
renderSearchTemplateRequest = new RenderSearchTemplateRequest();
|
||||
renderSearchTemplateRequest.template(template);
|
||||
|
|
|
@ -24,7 +24,7 @@ import org.elasticsearch.common.settings.Settings;
|
|||
import org.elasticsearch.rest.RestController;
|
||||
import org.elasticsearch.rest.RestRequest;
|
||||
import org.elasticsearch.rest.action.script.RestDeleteIndexedScriptAction;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.script.Template;
|
||||
|
||||
import static org.elasticsearch.rest.RestRequest.Method.DELETE;
|
||||
|
||||
|
@ -38,6 +38,6 @@ public class RestDeleteSearchTemplateAction extends RestDeleteIndexedScriptActio
|
|||
|
||||
@Override
|
||||
protected String getScriptLang(RestRequest request) {
|
||||
return MustacheScriptEngineService.NAME;
|
||||
return Template.DEFAULT_LANG;
|
||||
}
|
||||
}
|
|
@ -25,7 +25,7 @@ import org.elasticsearch.common.xcontent.XContentBuilderString;
|
|||
import org.elasticsearch.rest.RestController;
|
||||
import org.elasticsearch.rest.RestRequest;
|
||||
import org.elasticsearch.rest.action.script.RestGetIndexedScriptAction;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.script.Template;
|
||||
|
||||
import static org.elasticsearch.rest.RestRequest.Method.GET;
|
||||
|
||||
|
@ -42,7 +42,7 @@ public class RestGetSearchTemplateAction extends RestGetIndexedScriptAction {
|
|||
|
||||
@Override
|
||||
protected String getScriptLang(RestRequest request) {
|
||||
return MustacheScriptEngineService.NAME;
|
||||
return Template.DEFAULT_LANG;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.elasticsearch.common.inject.Inject;
|
|||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.rest.*;
|
||||
import org.elasticsearch.rest.action.script.RestPutIndexedScriptAction;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.script.Template;
|
||||
|
||||
import static org.elasticsearch.rest.RestRequest.Method.POST;
|
||||
import static org.elasticsearch.rest.RestRequest.Method.PUT;
|
||||
|
@ -59,6 +59,6 @@ public class RestPutSearchTemplateAction extends RestPutIndexedScriptAction {
|
|||
|
||||
@Override
|
||||
protected String getScriptLang(RestRequest request) {
|
||||
return MustacheScriptEngineService.NAME;
|
||||
return Template.DEFAULT_LANG;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,9 +22,7 @@ package org.elasticsearch.script;
|
|||
import org.elasticsearch.common.inject.AbstractModule;
|
||||
import org.elasticsearch.common.inject.multibindings.MapBinder;
|
||||
import org.elasticsearch.common.inject.multibindings.Multibinder;
|
||||
import org.elasticsearch.common.logging.Loggers;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
@ -75,13 +73,6 @@ public class ScriptModule extends AbstractModule {
|
|||
|
||||
Multibinder<ScriptEngineService> multibinder = Multibinder.newSetBinder(binder(), ScriptEngineService.class);
|
||||
multibinder.addBinding().to(NativeScriptEngineService.class);
|
||||
|
||||
try {
|
||||
Class.forName("com.github.mustachejava.Mustache");
|
||||
multibinder.addBinding().to(MustacheScriptEngineService.class).asEagerSingleton();
|
||||
} catch (Throwable t) {
|
||||
Loggers.getLogger(ScriptService.class, settings).debug("failed to load mustache", t);
|
||||
}
|
||||
|
||||
for (Class<? extends ScriptEngineService> scriptEngine : scriptEngines) {
|
||||
multibinder.addBinding().to(scriptEngine).asEagerSingleton();
|
||||
|
|
|
@ -29,13 +29,15 @@ import org.elasticsearch.common.xcontent.XContentFactory;
|
|||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
import org.elasticsearch.common.xcontent.XContentType;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
public class Template extends Script {
|
||||
|
||||
/** Default templating language */
|
||||
public static final String DEFAULT_LANG = "mustache";
|
||||
|
||||
private XContentType contentType;
|
||||
|
||||
|
@ -51,7 +53,7 @@ public class Template extends Script {
|
|||
* The inline template.
|
||||
*/
|
||||
public Template(String template) {
|
||||
super(template, MustacheScriptEngineService.NAME);
|
||||
super(template, DEFAULT_LANG);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -73,7 +75,7 @@ public class Template extends Script {
|
|||
*/
|
||||
public Template(String template, ScriptType type, @Nullable String lang, @Nullable XContentType xContentType,
|
||||
@Nullable Map<String, Object> params) {
|
||||
super(template, type, lang == null ? MustacheScriptEngineService.NAME : lang, params);
|
||||
super(template, type, lang == null ? DEFAULT_LANG : lang, params);
|
||||
this.contentType = xContentType;
|
||||
}
|
||||
|
||||
|
@ -120,16 +122,16 @@ public class Template extends Script {
|
|||
}
|
||||
|
||||
public static Script parse(Map<String, Object> config, boolean removeMatchedEntries, ParseFieldMatcher parseFieldMatcher) {
|
||||
return new TemplateParser(Collections.emptyMap(), MustacheScriptEngineService.NAME).parse(config, removeMatchedEntries, parseFieldMatcher);
|
||||
return new TemplateParser(Collections.emptyMap(), DEFAULT_LANG).parse(config, removeMatchedEntries, parseFieldMatcher);
|
||||
}
|
||||
|
||||
public static Template parse(XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException {
|
||||
return new TemplateParser(Collections.emptyMap(), MustacheScriptEngineService.NAME).parse(parser, parseFieldMatcher);
|
||||
return new TemplateParser(Collections.emptyMap(), DEFAULT_LANG).parse(parser, parseFieldMatcher);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static Template parse(XContentParser parser, Map<String, ScriptType> additionalTemplateFieldNames, ParseFieldMatcher parseFieldMatcher) throws IOException {
|
||||
return new TemplateParser(additionalTemplateFieldNames, MustacheScriptEngineService.NAME).parse(parser, parseFieldMatcher);
|
||||
return new TemplateParser(additionalTemplateFieldNames, DEFAULT_LANG).parse(parser, parseFieldMatcher);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
|
@ -172,7 +174,7 @@ public class Template extends Script {
|
|||
|
||||
@Override
|
||||
protected Template createSimpleScript(XContentParser parser) throws IOException {
|
||||
return new Template(String.valueOf(parser.objectText()), ScriptType.INLINE, MustacheScriptEngineService.NAME, contentType, null);
|
||||
return new Template(String.valueOf(parser.objectText()), ScriptType.INLINE, DEFAULT_LANG, contentType, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -59,7 +59,6 @@ import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
|||
import org.elasticsearch.script.ScriptContextRegistry;
|
||||
import org.elasticsearch.script.ScriptEngineService;
|
||||
import org.elasticsearch.script.ScriptService;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.elasticsearch.test.IndexSettingsModule;
|
||||
import org.elasticsearch.test.engine.MockEngineFactory;
|
||||
|
@ -102,7 +101,6 @@ public class IndexModuleTests extends ESTestCase {
|
|||
BigArrays bigArrays = new BigArrays(recycler, circuitBreakerService);
|
||||
IndicesFieldDataCache indicesFieldDataCache = new IndicesFieldDataCache(settings, new IndicesFieldDataCacheListener(circuitBreakerService), threadPool);
|
||||
Set<ScriptEngineService> scriptEngines = new HashSet<>();
|
||||
scriptEngines.add(new MustacheScriptEngineService(settings));
|
||||
scriptEngines.addAll(Arrays.asList(scriptEngineServices));
|
||||
ScriptService scriptService = new ScriptService(settings, environment, scriptEngines, new ResourceWatcherService(settings, threadPool), new ScriptContextRegistry(Collections.emptyList()));
|
||||
IndicesQueriesRegistry indicesQueriesRegistry = new IndicesQueriesRegistry(settings, Collections.emptySet(), new NamedWriteableRegistry());
|
||||
|
|
|
@ -84,7 +84,6 @@ import org.elasticsearch.indices.mapper.MapperRegistry;
|
|||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||
import org.elasticsearch.script.*;
|
||||
import org.elasticsearch.script.Script.ScriptParseException;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.search.internal.SearchContext;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.elasticsearch.test.IndexSettingsModule;
|
||||
|
@ -205,15 +204,8 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
|
|||
MockScriptEngine mockScriptEngine = new MockScriptEngine();
|
||||
Multibinder<ScriptEngineService> multibinder = Multibinder.newSetBinder(binder(), ScriptEngineService.class);
|
||||
multibinder.addBinding().toInstance(mockScriptEngine);
|
||||
try {
|
||||
Class.forName("com.github.mustachejava.Mustache");
|
||||
} catch(ClassNotFoundException e) {
|
||||
throw new IllegalStateException("error while loading mustache", e);
|
||||
}
|
||||
MustacheScriptEngineService mustacheScriptEngineService = new MustacheScriptEngineService(settings);
|
||||
Set<ScriptEngineService> engines = new HashSet<>();
|
||||
engines.add(mockScriptEngine);
|
||||
engines.add(mustacheScriptEngineService);
|
||||
List<ScriptContext.Plugin> customContexts = new ArrayList<>();
|
||||
bind(ScriptContextRegistry.class).toInstance(new ScriptContextRegistry(customContexts));
|
||||
try {
|
||||
|
|
|
@ -51,7 +51,7 @@ public class TemplateQueryBuilderTests extends AbstractQueryTestCase<TemplateQue
|
|||
|
||||
@Override
|
||||
protected TemplateQueryBuilder doCreateTestQueryBuilder() {
|
||||
return new TemplateQueryBuilder(new Template(templateBase.toString()));
|
||||
return new TemplateQueryBuilder(new Template(templateBase.toString(), ScriptType.INLINE, "mockscript", null, null));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -19,12 +19,9 @@
|
|||
package org.elasticsearch.script;
|
||||
|
||||
import org.elasticsearch.common.ContextAndHeaderHolder;
|
||||
import org.elasticsearch.common.bytes.BytesArray;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.env.Environment;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
@ -32,9 +29,6 @@ import java.util.Collections;
|
|||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.elasticsearch.common.settings.Settings.settingsBuilder;
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
|
||||
// TODO: these really should just be part of ScriptService tests, there is nothing special about them
|
||||
public class FileScriptTests extends ESTestCase {
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@ package org.elasticsearch.script;
|
|||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.search.lookup.SearchLookup;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.junit.After;
|
||||
|
@ -45,7 +44,7 @@ import static org.hamcrest.Matchers.containsString;
|
|||
// TODO: this needs to be a base test class, and all scripting engines extend it
|
||||
public class ScriptModesTests extends ESTestCase {
|
||||
private static final Set<String> ALL_LANGS = unmodifiableSet(
|
||||
newHashSet(MustacheScriptEngineService.NAME, "custom", "test"));
|
||||
newHashSet("custom", "test"));
|
||||
|
||||
static final String[] ENABLE_VALUES = new String[]{"on", "true", "yes", "1"};
|
||||
static final String[] DISABLE_VALUES = new String[]{"off", "false", "no", "0"};
|
||||
|
@ -73,7 +72,6 @@ public class ScriptModesTests extends ESTestCase {
|
|||
scriptContextRegistry = new ScriptContextRegistry(contexts.values());
|
||||
scriptContexts = scriptContextRegistry.scriptContexts().toArray(new ScriptContext[scriptContextRegistry.scriptContexts().size()]);
|
||||
scriptEngines = buildScriptEnginesByLangMap(newHashSet(
|
||||
new MustacheScriptEngineService(Settings.EMPTY),
|
||||
//add the native engine just to make sure it gets filtered out
|
||||
new NativeScriptEngineService(Settings.EMPTY, Collections.<String, NativeScriptFactory>emptyMap()),
|
||||
new CustomScriptEngineService()));
|
||||
|
@ -93,8 +91,8 @@ public class ScriptModesTests extends ESTestCase {
|
|||
public void assertAllSettingsWereChecked() {
|
||||
if (assertScriptModesNonNull) {
|
||||
assertThat(scriptModes, notNullValue());
|
||||
//3 is the number of engines (native excluded), custom is counted twice though as it's associated with two different names
|
||||
int numberOfSettings = 3 * ScriptType.values().length * scriptContextRegistry.scriptContexts().size();
|
||||
//2 is the number of engines (native excluded), custom is counted twice though as it's associated with two different names
|
||||
int numberOfSettings = 2 * ScriptType.values().length * scriptContextRegistry.scriptContexts().size();
|
||||
assertThat(scriptModes.scriptModes.size(), equalTo(numberOfSettings));
|
||||
if (assertAllSettingsWereChecked) {
|
||||
assertThat(checkedSettings.size(), equalTo(numberOfSettings));
|
||||
|
@ -190,21 +188,6 @@ public class ScriptModesTests extends ESTestCase {
|
|||
assertScriptModes(ScriptMode.SANDBOX, ALL_LANGS, new ScriptType[]{ScriptType.INLINE}, complementOf);
|
||||
}
|
||||
|
||||
public void testInteractionBetweenGenericAndEngineSpecificSettings() {
|
||||
Settings.Builder builder = Settings.builder().put("script.inline", randomFrom(DISABLE_VALUES))
|
||||
.put(specificEngineOpSettings(MustacheScriptEngineService.NAME, ScriptType.INLINE, ScriptContext.Standard.AGGS), randomFrom(ENABLE_VALUES))
|
||||
.put(specificEngineOpSettings(MustacheScriptEngineService.NAME, ScriptType.INLINE, ScriptContext.Standard.SEARCH), randomFrom(ENABLE_VALUES));
|
||||
Set<String> mustacheLangSet = singleton(MustacheScriptEngineService.NAME);
|
||||
Set<String> allButMustacheLangSet = new HashSet<>(ALL_LANGS);
|
||||
allButMustacheLangSet.remove(MustacheScriptEngineService.NAME);
|
||||
this.scriptModes = new ScriptModes(scriptEngines, scriptContextRegistry, builder.build());
|
||||
assertScriptModes(ScriptMode.ON, mustacheLangSet, new ScriptType[]{ScriptType.INLINE}, ScriptContext.Standard.AGGS, ScriptContext.Standard.SEARCH);
|
||||
assertScriptModes(ScriptMode.OFF, mustacheLangSet, new ScriptType[]{ScriptType.INLINE}, complementOf(ScriptContext.Standard.AGGS, ScriptContext.Standard.SEARCH));
|
||||
assertScriptModesAllOps(ScriptMode.OFF, allButMustacheLangSet, ScriptType.INLINE);
|
||||
assertScriptModesAllOps(ScriptMode.SANDBOX, ALL_LANGS, ScriptType.INDEXED);
|
||||
assertScriptModesAllOps(ScriptMode.ON, ALL_LANGS, ScriptType.FILE);
|
||||
}
|
||||
|
||||
private void assertScriptModesAllOps(ScriptMode expectedScriptMode, Set<String> langs, ScriptType... scriptTypes) {
|
||||
assertScriptModes(expectedScriptMode, langs, scriptTypes, scriptContexts);
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ import org.elasticsearch.common.io.Streams;
|
|||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.env.Environment;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.search.lookup.SearchLookup;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.elasticsearch.watcher.ResourceWatcherService;
|
||||
|
@ -73,8 +72,7 @@ public class ScriptServiceTests extends ESTestCase {
|
|||
.put("path.conf", genericConfigFolder)
|
||||
.build();
|
||||
resourceWatcherService = new ResourceWatcherService(baseSettings, null);
|
||||
scriptEngineServices = newHashSet(new TestEngineService(),
|
||||
new MustacheScriptEngineService(baseSettings));
|
||||
scriptEngineServices = newHashSet(new TestEngineService());
|
||||
scriptEnginesByLangMap = ScriptModesTests.buildScriptEnginesByLangMap(scriptEngineServices);
|
||||
//randomly register custom script contexts
|
||||
int randomInt = randomIntBetween(0, 3);
|
||||
|
@ -199,10 +197,6 @@ public class ScriptServiceTests extends ESTestCase {
|
|||
createFileScripts("groovy", "mustache", "test");
|
||||
|
||||
for (ScriptContext scriptContext : scriptContexts) {
|
||||
//mustache engine is sandboxed, all scripts are enabled by default
|
||||
assertCompileAccepted(MustacheScriptEngineService.NAME, "script", ScriptType.INLINE, scriptContext, contextAndHeaders);
|
||||
assertCompileAccepted(MustacheScriptEngineService.NAME, "script", ScriptType.INDEXED, scriptContext, contextAndHeaders);
|
||||
assertCompileAccepted(MustacheScriptEngineService.NAME, "file_script", ScriptType.FILE, scriptContext, contextAndHeaders);
|
||||
//custom engine is sandboxed, all scripts are enabled by default
|
||||
assertCompileAccepted("test", "script", ScriptType.INLINE, scriptContext, contextAndHeaders);
|
||||
assertCompileAccepted("test", "script", ScriptType.INDEXED, scriptContext, contextAndHeaders);
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
{"size":"{{size}}","query":{"match":{"foo":"{{value}}"}},"aggs":{"objects":{"terms":{"field":"{{value}}","size":"{{size}}"}}}}
|
|
@ -27,16 +27,13 @@ import org.elasticsearch.action.ActionModule;
|
|||
import org.elasticsearch.action.ActionRequest;
|
||||
import org.elasticsearch.action.ActionRequestBuilder;
|
||||
import org.elasticsearch.action.ActionResponse;
|
||||
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
|
||||
import org.elasticsearch.action.get.GetRequest;
|
||||
import org.elasticsearch.action.index.IndexRequest;
|
||||
import org.elasticsearch.action.index.IndexRequestBuilder;
|
||||
import org.elasticsearch.action.indexedscripts.put.PutIndexedScriptRequest;
|
||||
import org.elasticsearch.action.indexedscripts.put.PutIndexedScriptResponse;
|
||||
import org.elasticsearch.action.percolate.PercolateResponse;
|
||||
import org.elasticsearch.action.search.SearchRequest;
|
||||
import org.elasticsearch.action.search.SearchRequestBuilder;
|
||||
import org.elasticsearch.action.search.SearchResponse;
|
||||
import org.elasticsearch.action.support.ActionFilter;
|
||||
import org.elasticsearch.action.termvectors.MultiTermVectorsRequest;
|
||||
|
@ -47,8 +44,6 @@ import org.elasticsearch.common.inject.Inject;
|
|||
import org.elasticsearch.common.inject.Module;
|
||||
import org.elasticsearch.common.lucene.search.function.CombineFunction;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.http.HttpServerTransport;
|
||||
import org.elasticsearch.index.query.BoolQueryBuilder;
|
||||
import org.elasticsearch.index.query.GeoShapeQueryBuilder;
|
||||
|
@ -62,15 +57,8 @@ import org.elasticsearch.plugins.Plugin;
|
|||
import org.elasticsearch.rest.RestController;
|
||||
import org.elasticsearch.script.Script;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.Template;
|
||||
import org.elasticsearch.script.groovy.GroovyPlugin;
|
||||
import org.elasticsearch.script.groovy.GroovyScriptEngineService;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.search.aggregations.AggregationBuilders;
|
||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregatorBuilders;
|
||||
import org.elasticsearch.search.suggest.Suggest;
|
||||
import org.elasticsearch.search.suggest.SuggestBuilder;
|
||||
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
|
||||
import org.elasticsearch.test.ESIntegTestCase;
|
||||
import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
|
||||
import org.elasticsearch.test.rest.client.http.HttpRequestBuilder;
|
||||
|
@ -79,13 +67,10 @@ import org.junit.After;
|
|||
import org.junit.Before;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
|
||||
|
@ -284,172 +269,6 @@ public class ContextAndHeaderTransportTests extends ESIntegTestCase {
|
|||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
public void testThatIndexedScriptGetRequestInTemplateQueryContainsContextAndHeaders() throws Exception {
|
||||
PutIndexedScriptResponse scriptResponse = transportClient()
|
||||
.preparePutIndexedScript(
|
||||
MustacheScriptEngineService.NAME,
|
||||
"my_script",
|
||||
jsonBuilder().startObject().field("script", "{ \"match\": { \"name\": \"Star Wars\" }}").endObject()
|
||||
.string()).get();
|
||||
assertThat(scriptResponse.isCreated(), is(true));
|
||||
|
||||
transportClient().prepareIndex(queryIndex, "type", "1")
|
||||
.setSource(jsonBuilder().startObject().field("name", "Star Wars - The new republic").endObject()).get();
|
||||
transportClient().admin().indices().prepareRefresh(queryIndex).get();
|
||||
|
||||
SearchResponse searchResponse = transportClient()
|
||||
.prepareSearch(queryIndex)
|
||||
.setQuery(
|
||||
QueryBuilders.templateQuery(new Template("my_script", ScriptType.INDEXED,
|
||||
MustacheScriptEngineService.NAME, null, null))).get();
|
||||
assertNoFailures(searchResponse);
|
||||
assertHitCount(searchResponse, 1);
|
||||
|
||||
assertGetRequestsContainHeaders(".scripts");
|
||||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
public void testThatIndexedScriptGetRequestInReducePhaseContainsContextAndHeaders() throws Exception {
|
||||
PutIndexedScriptResponse scriptResponse = transportClient().preparePutIndexedScript(GroovyScriptEngineService.NAME, "my_script",
|
||||
jsonBuilder().startObject().field("script", "_value0 * 10").endObject().string()).get();
|
||||
assertThat(scriptResponse.isCreated(), is(true));
|
||||
|
||||
transportClient().prepareIndex(queryIndex, "type", "1")
|
||||
.setSource(jsonBuilder().startObject().field("s_field", "foo").field("l_field", 10).endObject()).get();
|
||||
transportClient().admin().indices().prepareRefresh(queryIndex).get();
|
||||
|
||||
SearchResponse searchResponse = transportClient()
|
||||
.prepareSearch(queryIndex)
|
||||
.addAggregation(
|
||||
AggregationBuilders
|
||||
.terms("terms")
|
||||
.field("s_field")
|
||||
.subAggregation(AggregationBuilders.max("max").field("l_field"))
|
||||
.subAggregation(
|
||||
PipelineAggregatorBuilders.bucketScript("scripted").setBucketsPaths("max").script(
|
||||
new Script("my_script", ScriptType.INDEXED, GroovyScriptEngineService.NAME, null)))).get();
|
||||
assertNoFailures(searchResponse);
|
||||
assertHitCount(searchResponse, 1);
|
||||
|
||||
assertGetRequestsContainHeaders(".scripts");
|
||||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
public void testThatSearchTemplatesWithIndexedTemplatesGetRequestContainsContextAndHeaders() throws Exception {
|
||||
PutIndexedScriptResponse scriptResponse = transportClient().preparePutIndexedScript(MustacheScriptEngineService.NAME, "the_template",
|
||||
jsonBuilder().startObject().startObject("template").startObject("query").startObject("match")
|
||||
.field("name", "{{query_string}}").endObject().endObject().endObject().endObject().string()
|
||||
).get();
|
||||
assertThat(scriptResponse.isCreated(), is(true));
|
||||
|
||||
transportClient().prepareIndex(queryIndex, "type", "1")
|
||||
.setSource(jsonBuilder().startObject().field("name", "Star Wars - The new republic").endObject())
|
||||
.get();
|
||||
transportClient().admin().indices().prepareRefresh(queryIndex).get();
|
||||
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
params.put("query_string", "star wars");
|
||||
|
||||
SearchResponse searchResponse = transportClient().prepareSearch(queryIndex).setTemplate(new Template("the_template", ScriptType.INDEXED, MustacheScriptEngineService.NAME, null, params))
|
||||
.get();
|
||||
|
||||
assertNoFailures(searchResponse);
|
||||
assertHitCount(searchResponse, 1);
|
||||
|
||||
assertGetRequestsContainHeaders(".scripts");
|
||||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
public void testThatIndexedScriptGetRequestInPhraseSuggestContainsContextAndHeaders() throws Exception {
|
||||
CreateIndexRequestBuilder builder = transportClient().admin().indices().prepareCreate("test").setSettings(settingsBuilder()
|
||||
.put(indexSettings())
|
||||
.put(SETTING_NUMBER_OF_SHARDS, 1) // A single shard will help to keep the tests repeatable.
|
||||
.put("index.analysis.analyzer.text.tokenizer", "standard")
|
||||
.putArray("index.analysis.analyzer.text.filter", "lowercase", "my_shingle")
|
||||
.put("index.analysis.filter.my_shingle.type", "shingle")
|
||||
.put("index.analysis.filter.my_shingle.output_unigrams", true)
|
||||
.put("index.analysis.filter.my_shingle.min_shingle_size", 2)
|
||||
.put("index.analysis.filter.my_shingle.max_shingle_size", 3));
|
||||
|
||||
XContentBuilder mapping = XContentFactory.jsonBuilder()
|
||||
.startObject()
|
||||
.startObject("type1")
|
||||
.startObject("properties")
|
||||
.startObject("title")
|
||||
.field("type", "string")
|
||||
.field("analyzer", "text")
|
||||
.endObject()
|
||||
.endObject()
|
||||
.endObject()
|
||||
.endObject();
|
||||
assertAcked(builder.addMapping("type1", mapping));
|
||||
ensureGreen();
|
||||
|
||||
List<String> titles = new ArrayList<>();
|
||||
|
||||
titles.add("United States House of Representatives Elections in Washington 2006");
|
||||
titles.add("United States House of Representatives Elections in Washington 2005");
|
||||
titles.add("State");
|
||||
titles.add("Houses of Parliament");
|
||||
titles.add("Representative Government");
|
||||
titles.add("Election");
|
||||
|
||||
List<IndexRequestBuilder> builders = new ArrayList<>();
|
||||
for (String title: titles) {
|
||||
transportClient().prepareIndex("test", "type1").setSource("title", title).get();
|
||||
}
|
||||
transportClient().admin().indices().prepareRefresh("test").get();
|
||||
|
||||
String filterStringAsFilter = XContentFactory.jsonBuilder()
|
||||
.startObject()
|
||||
.startObject("match_phrase")
|
||||
.field("title", "{{suggestion}}")
|
||||
.endObject()
|
||||
.endObject()
|
||||
.string();
|
||||
|
||||
PutIndexedScriptResponse scriptResponse = transportClient()
|
||||
.preparePutIndexedScript(
|
||||
MustacheScriptEngineService.NAME,
|
||||
"my_script",
|
||||
jsonBuilder().startObject().field("script", filterStringAsFilter).endObject()
|
||||
.string()).get();
|
||||
assertThat(scriptResponse.isCreated(), is(true));
|
||||
|
||||
PhraseSuggestionBuilder suggest = phraseSuggestion("title")
|
||||
.field("title")
|
||||
.addCandidateGenerator(PhraseSuggestionBuilder.candidateGenerator("title")
|
||||
.suggestMode("always")
|
||||
.maxTermFreq(.99f)
|
||||
.size(10)
|
||||
.maxInspections(200)
|
||||
)
|
||||
.confidence(0f)
|
||||
.maxErrors(2f)
|
||||
.shardSize(30000)
|
||||
.size(10);
|
||||
|
||||
PhraseSuggestionBuilder filteredFilterSuggest = suggest.collateQuery(new Template("my_script", ScriptType.INDEXED,
|
||||
MustacheScriptEngineService.NAME, null, null));
|
||||
|
||||
SearchRequestBuilder searchRequestBuilder = transportClient().prepareSearch("test").setSize(0);
|
||||
SuggestBuilder suggestBuilder = new SuggestBuilder();
|
||||
String suggestText = "united states house of representatives elections in washington 2006";
|
||||
if (suggestText != null) {
|
||||
suggestBuilder.setText(suggestText);
|
||||
}
|
||||
suggestBuilder.addSuggestion(filteredFilterSuggest);
|
||||
searchRequestBuilder.suggest(suggestBuilder);
|
||||
SearchResponse actionGet = searchRequestBuilder.execute().actionGet();
|
||||
assertThat(Arrays.toString(actionGet.getShardFailures()), actionGet.getFailedShards(), equalTo(0));
|
||||
Suggest searchSuggest = actionGet.getSuggest();
|
||||
|
||||
assertSuggestionSize(searchSuggest, 0, 2, "title");
|
||||
|
||||
assertGetRequestsContainHeaders(".scripts");
|
||||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
public void testThatRelevantHttpHeadersBecomeRequestHeaders() throws Exception {
|
||||
String releventHeaderName = "relevant_" + randomHeaderKey;
|
||||
for (RestController restController : internalCluster().getDataNodeInstances(RestController.class)) {
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
renamed: core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java -> plugins/lang-groovy/src/test/java/org/elasticsearch/messy/tests/CardinalityTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/search/child/ChildQuerySearchIT.java -> plugins/lang-groovy/src/test/java/org/elasticsearch/messy/tests/ChildQuerySearchTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/transport/ContextAndHeaderTransportIT.java -> plugins/lang-groovy/src/test/java/org/elasticsearch/messy/tests/ContextAndHeaderTransportTests.java
|
||||
^^^^^ note: the methods from this test using mustache were moved to the mustache module under its messy tests package.
|
||||
renamed: core/src/test/java/org/elasticsearch/search/aggregations/bucket/DateHistogramIT.java -> plugins/lang-groovy/src/test/java/org/elasticsearch/messy/tests/DateHistogramTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/search/aggregations/bucket/DateRangeIT.java -> plugins/lang-groovy/src/test/java/org/elasticsearch/messy/tests/DateRangeTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/search/aggregations/bucket/DoubleTermsIT.java -> plugins/lang-groovy/src/test/java/org/elasticsearch/messy/tests/DoubleTermsTests.java
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
esplugin {
|
||||
description 'Mustache scripting integration for Elasticsearch'
|
||||
classname 'org.elasticsearch.script.mustache.MustachePlugin'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile "com.github.spullara.mustache.java:compiler:0.9.1"
|
||||
}
|
||||
|
||||
compileTestJava.options.compilerArgs << '-Xlint:-rawtypes,-unchecked'
|
||||
|
||||
integTest {
|
||||
cluster {
|
||||
systemProperty 'es.script.inline', 'on'
|
||||
systemProperty 'es.script.indexed', 'on'
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.script.mustache;
|
||||
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.script.ScriptModule;
|
||||
|
||||
public class MustachePlugin extends Plugin {
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "lang-mustache";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "Mustache scripting integration for Elasticsearch";
|
||||
}
|
||||
|
||||
public void onModule(ScriptModule module) {
|
||||
module.addScriptEngine(MustacheScriptEngineService.class);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,389 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.messy.tests;
|
||||
|
||||
import org.elasticsearch.action.Action;
|
||||
import org.elasticsearch.action.ActionListener;
|
||||
import org.elasticsearch.action.ActionModule;
|
||||
import org.elasticsearch.action.ActionRequest;
|
||||
import org.elasticsearch.action.ActionRequestBuilder;
|
||||
import org.elasticsearch.action.ActionResponse;
|
||||
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
|
||||
import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
|
||||
import org.elasticsearch.action.get.GetRequest;
|
||||
import org.elasticsearch.action.index.IndexRequest;
|
||||
import org.elasticsearch.action.index.IndexRequestBuilder;
|
||||
import org.elasticsearch.action.indexedscripts.put.PutIndexedScriptRequest;
|
||||
import org.elasticsearch.action.indexedscripts.put.PutIndexedScriptResponse;
|
||||
import org.elasticsearch.action.search.SearchRequestBuilder;
|
||||
import org.elasticsearch.action.search.SearchResponse;
|
||||
import org.elasticsearch.action.support.ActionFilter;
|
||||
import org.elasticsearch.client.Client;
|
||||
import org.elasticsearch.client.FilterClient;
|
||||
import org.elasticsearch.common.inject.AbstractModule;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.inject.Module;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.Template;
|
||||
import org.elasticsearch.script.mustache.MustachePlugin;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.search.suggest.Suggest;
|
||||
import org.elasticsearch.search.suggest.SuggestBuilder;
|
||||
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
|
||||
import org.elasticsearch.test.ESIntegTestCase;
|
||||
import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
|
||||
import static org.elasticsearch.common.settings.Settings.settingsBuilder;
|
||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||
import static org.elasticsearch.node.Node.HTTP_ENABLED;
|
||||
import static org.elasticsearch.search.suggest.SuggestBuilders.phraseSuggestion;
|
||||
import static org.elasticsearch.test.ESIntegTestCase.Scope.SUITE;
|
||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures;
|
||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSuggestionSize;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.greaterThan;
|
||||
import static org.hamcrest.Matchers.hasSize;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
|
||||
@ClusterScope(scope = SUITE)
|
||||
public class ContextAndHeaderTransportTests extends ESIntegTestCase {
|
||||
private static final List<ActionRequest> requests = new CopyOnWriteArrayList<>();
|
||||
private String randomHeaderKey = randomAsciiOfLength(10);
|
||||
private String randomHeaderValue = randomAsciiOfLength(20);
|
||||
private String queryIndex = "query-" + randomAsciiOfLength(10).toLowerCase(Locale.ROOT);
|
||||
private String lookupIndex = "lookup-" + randomAsciiOfLength(10).toLowerCase(Locale.ROOT);
|
||||
|
||||
@Override
|
||||
protected Settings nodeSettings(int nodeOrdinal) {
|
||||
return settingsBuilder()
|
||||
.put(super.nodeSettings(nodeOrdinal))
|
||||
.put("script.indexed", "on")
|
||||
.put(HTTP_ENABLED, true)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Collection<Class<? extends Plugin>> nodePlugins() {
|
||||
return pluginList(ActionLoggingPlugin.class, MustachePlugin.class);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void createIndices() throws Exception {
|
||||
String mapping = jsonBuilder().startObject().startObject("type")
|
||||
.startObject("properties")
|
||||
.startObject("location").field("type", "geo_shape").endObject()
|
||||
.startObject("name").field("type", "string").endObject()
|
||||
.endObject()
|
||||
.endObject().endObject().string();
|
||||
|
||||
Settings settings = settingsBuilder()
|
||||
.put(indexSettings())
|
||||
.put(SETTING_NUMBER_OF_SHARDS, 1) // A single shard will help to keep the tests repeatable.
|
||||
.build();
|
||||
assertAcked(transportClient().admin().indices().prepareCreate(lookupIndex)
|
||||
.setSettings(settings).addMapping("type", mapping));
|
||||
assertAcked(transportClient().admin().indices().prepareCreate(queryIndex)
|
||||
.setSettings(settings).addMapping("type", mapping));
|
||||
ensureGreen(queryIndex, lookupIndex);
|
||||
|
||||
requests.clear();
|
||||
}
|
||||
|
||||
@After
|
||||
public void checkAllRequestsContainHeaders() {
|
||||
assertRequestsContainHeader(IndexRequest.class);
|
||||
assertRequestsContainHeader(RefreshRequest.class);
|
||||
}
|
||||
|
||||
public void testThatIndexedScriptGetRequestInTemplateQueryContainsContextAndHeaders() throws Exception {
|
||||
PutIndexedScriptResponse scriptResponse = transportClient()
|
||||
.preparePutIndexedScript(
|
||||
MustacheScriptEngineService.NAME,
|
||||
"my_script",
|
||||
jsonBuilder().startObject().field("script", "{ \"match\": { \"name\": \"Star Wars\" }}").endObject()
|
||||
.string()).get();
|
||||
assertThat(scriptResponse.isCreated(), is(true));
|
||||
|
||||
transportClient().prepareIndex(queryIndex, "type", "1")
|
||||
.setSource(jsonBuilder().startObject().field("name", "Star Wars - The new republic").endObject()).get();
|
||||
transportClient().admin().indices().prepareRefresh(queryIndex).get();
|
||||
|
||||
SearchResponse searchResponse = transportClient()
|
||||
.prepareSearch(queryIndex)
|
||||
.setQuery(
|
||||
QueryBuilders.templateQuery(new Template("my_script", ScriptType.INDEXED,
|
||||
MustacheScriptEngineService.NAME, null, null))).get();
|
||||
assertNoFailures(searchResponse);
|
||||
assertHitCount(searchResponse, 1);
|
||||
|
||||
assertGetRequestsContainHeaders(".scripts");
|
||||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
public void testThatSearchTemplatesWithIndexedTemplatesGetRequestContainsContextAndHeaders() throws Exception {
|
||||
PutIndexedScriptResponse scriptResponse = transportClient().preparePutIndexedScript(MustacheScriptEngineService.NAME, "the_template",
|
||||
jsonBuilder().startObject().startObject("template").startObject("query").startObject("match")
|
||||
.field("name", "{{query_string}}").endObject().endObject().endObject().endObject().string()
|
||||
).get();
|
||||
assertThat(scriptResponse.isCreated(), is(true));
|
||||
|
||||
transportClient().prepareIndex(queryIndex, "type", "1")
|
||||
.setSource(jsonBuilder().startObject().field("name", "Star Wars - The new republic").endObject())
|
||||
.get();
|
||||
transportClient().admin().indices().prepareRefresh(queryIndex).get();
|
||||
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
params.put("query_string", "star wars");
|
||||
|
||||
SearchResponse searchResponse = transportClient().prepareSearch(queryIndex).setTemplate(new Template("the_template", ScriptType.INDEXED, MustacheScriptEngineService.NAME, null, params))
|
||||
.get();
|
||||
|
||||
assertNoFailures(searchResponse);
|
||||
assertHitCount(searchResponse, 1);
|
||||
|
||||
assertGetRequestsContainHeaders(".scripts");
|
||||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
public void testThatIndexedScriptGetRequestInPhraseSuggestContainsContextAndHeaders() throws Exception {
|
||||
CreateIndexRequestBuilder builder = transportClient().admin().indices().prepareCreate("test").setSettings(settingsBuilder()
|
||||
.put(indexSettings())
|
||||
.put(SETTING_NUMBER_OF_SHARDS, 1) // A single shard will help to keep the tests repeatable.
|
||||
.put("index.analysis.analyzer.text.tokenizer", "standard")
|
||||
.putArray("index.analysis.analyzer.text.filter", "lowercase", "my_shingle")
|
||||
.put("index.analysis.filter.my_shingle.type", "shingle")
|
||||
.put("index.analysis.filter.my_shingle.output_unigrams", true)
|
||||
.put("index.analysis.filter.my_shingle.min_shingle_size", 2)
|
||||
.put("index.analysis.filter.my_shingle.max_shingle_size", 3));
|
||||
|
||||
XContentBuilder mapping = XContentFactory.jsonBuilder()
|
||||
.startObject()
|
||||
.startObject("type1")
|
||||
.startObject("properties")
|
||||
.startObject("title")
|
||||
.field("type", "string")
|
||||
.field("analyzer", "text")
|
||||
.endObject()
|
||||
.endObject()
|
||||
.endObject()
|
||||
.endObject();
|
||||
assertAcked(builder.addMapping("type1", mapping));
|
||||
ensureGreen();
|
||||
|
||||
List<String> titles = new ArrayList<>();
|
||||
|
||||
titles.add("United States House of Representatives Elections in Washington 2006");
|
||||
titles.add("United States House of Representatives Elections in Washington 2005");
|
||||
titles.add("State");
|
||||
titles.add("Houses of Parliament");
|
||||
titles.add("Representative Government");
|
||||
titles.add("Election");
|
||||
|
||||
List<IndexRequestBuilder> builders = new ArrayList<>();
|
||||
for (String title: titles) {
|
||||
transportClient().prepareIndex("test", "type1").setSource("title", title).get();
|
||||
}
|
||||
transportClient().admin().indices().prepareRefresh("test").get();
|
||||
|
||||
String filterStringAsFilter = XContentFactory.jsonBuilder()
|
||||
.startObject()
|
||||
.startObject("match_phrase")
|
||||
.field("title", "{{suggestion}}")
|
||||
.endObject()
|
||||
.endObject()
|
||||
.string();
|
||||
|
||||
PutIndexedScriptResponse scriptResponse = transportClient()
|
||||
.preparePutIndexedScript(
|
||||
MustacheScriptEngineService.NAME,
|
||||
"my_script",
|
||||
jsonBuilder().startObject().field("script", filterStringAsFilter).endObject()
|
||||
.string()).get();
|
||||
assertThat(scriptResponse.isCreated(), is(true));
|
||||
|
||||
PhraseSuggestionBuilder suggest = phraseSuggestion("title")
|
||||
.field("title")
|
||||
.addCandidateGenerator(PhraseSuggestionBuilder.candidateGenerator("title")
|
||||
.suggestMode("always")
|
||||
.maxTermFreq(.99f)
|
||||
.size(10)
|
||||
.maxInspections(200)
|
||||
)
|
||||
.confidence(0f)
|
||||
.maxErrors(2f)
|
||||
.shardSize(30000)
|
||||
.size(10);
|
||||
|
||||
PhraseSuggestionBuilder filteredFilterSuggest = suggest.collateQuery(new Template("my_script", ScriptType.INDEXED,
|
||||
MustacheScriptEngineService.NAME, null, null));
|
||||
|
||||
SearchRequestBuilder searchRequestBuilder = transportClient().prepareSearch("test").setSize(0);
|
||||
SuggestBuilder suggestBuilder = new SuggestBuilder();
|
||||
String suggestText = "united states house of representatives elections in washington 2006";
|
||||
if (suggestText != null) {
|
||||
suggestBuilder.setText(suggestText);
|
||||
}
|
||||
suggestBuilder.addSuggestion(filteredFilterSuggest);
|
||||
searchRequestBuilder.suggest(suggestBuilder);
|
||||
SearchResponse actionGet = searchRequestBuilder.execute().actionGet();
|
||||
assertThat(Arrays.toString(actionGet.getShardFailures()), actionGet.getFailedShards(), equalTo(0));
|
||||
Suggest searchSuggest = actionGet.getSuggest();
|
||||
|
||||
assertSuggestionSize(searchSuggest, 0, 2, "title");
|
||||
|
||||
assertGetRequestsContainHeaders(".scripts");
|
||||
assertRequestsContainHeader(PutIndexedScriptRequest.class);
|
||||
}
|
||||
|
||||
private <T> List<T> getRequests(Class<T> clazz) {
|
||||
List<T> results = new ArrayList<>();
|
||||
for (ActionRequest request : requests) {
|
||||
if (request.getClass().equals(clazz)) {
|
||||
results.add((T) request);
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
private void assertRequestsContainHeader(Class<? extends ActionRequest> clazz) {
|
||||
List<? extends ActionRequest> classRequests = getRequests(clazz);
|
||||
for (ActionRequest request : classRequests) {
|
||||
assertRequestContainsHeader(request);
|
||||
}
|
||||
}
|
||||
|
||||
private void assertGetRequestsContainHeaders() {
|
||||
assertGetRequestsContainHeaders(this.lookupIndex);
|
||||
}
|
||||
|
||||
private void assertGetRequestsContainHeaders(String index) {
|
||||
List<GetRequest> getRequests = getRequests(GetRequest.class);
|
||||
assertThat(getRequests, hasSize(greaterThan(0)));
|
||||
|
||||
for (GetRequest request : getRequests) {
|
||||
if (!request.index().equals(index)) {
|
||||
continue;
|
||||
}
|
||||
assertRequestContainsHeader(request);
|
||||
}
|
||||
}
|
||||
|
||||
private void assertRequestContainsHeader(ActionRequest request) {
|
||||
String msg = String.format(Locale.ROOT, "Expected header %s to be in request %s", randomHeaderKey, request.getClass().getName());
|
||||
if (request instanceof IndexRequest) {
|
||||
IndexRequest indexRequest = (IndexRequest) request;
|
||||
msg = String.format(Locale.ROOT, "Expected header %s to be in index request %s/%s/%s", randomHeaderKey,
|
||||
indexRequest.index(), indexRequest.type(), indexRequest.id());
|
||||
}
|
||||
assertThat(msg, request.hasHeader(randomHeaderKey), is(true));
|
||||
assertThat(request.getHeader(randomHeaderKey).toString(), is(randomHeaderValue));
|
||||
}
|
||||
|
||||
/**
|
||||
* a transport client that adds our random header
|
||||
*/
|
||||
private Client transportClient() {
|
||||
Client transportClient = internalCluster().transportClient();
|
||||
FilterClient filterClient = new FilterClient(transportClient) {
|
||||
@Override
|
||||
protected <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void doExecute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) {
|
||||
request.putHeader(randomHeaderKey, randomHeaderValue);
|
||||
super.doExecute(action, request, listener);
|
||||
}
|
||||
};
|
||||
|
||||
return filterClient;
|
||||
}
|
||||
|
||||
public static class ActionLoggingPlugin extends Plugin {
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "test-action-logging";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "Test action logging";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Module> nodeModules() {
|
||||
return Collections.<Module>singletonList(new ActionLoggingModule());
|
||||
}
|
||||
|
||||
public void onModule(ActionModule module) {
|
||||
module.registerFilter(LoggingFilter.class);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ActionLoggingModule extends AbstractModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
bind(LoggingFilter.class).asEagerSingleton();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class LoggingFilter extends ActionFilter.Simple {
|
||||
|
||||
@Inject
|
||||
public LoggingFilter(Settings settings) {
|
||||
super(settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int order() {
|
||||
return 999;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean apply(String action, ActionRequest request, ActionListener listener) {
|
||||
requests.add(request);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean apply(String action, ActionResponse response, ActionListener listener) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,19 +17,27 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.validate;
|
||||
package org.elasticsearch.messy.tests;
|
||||
|
||||
import org.elasticsearch.action.admin.cluster.validate.template.RenderSearchTemplateResponse;
|
||||
import org.elasticsearch.common.bytes.BytesArray;
|
||||
import org.elasticsearch.common.bytes.BytesReference;
|
||||
import org.elasticsearch.common.io.FileSystemUtils;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentHelper;
|
||||
import org.elasticsearch.common.xcontent.XContentType;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.Template;
|
||||
import org.elasticsearch.script.mustache.MustachePlugin;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.test.ESIntegTestCase;
|
||||
import org.elasticsearch.test.rest.support.FileUtils;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -38,9 +46,14 @@ import static org.hamcrest.Matchers.equalTo;
|
|||
import static org.hamcrest.Matchers.notNullValue;
|
||||
|
||||
@ESIntegTestCase.SuiteScopeTestCase
|
||||
public class RenderSearchTemplateIT extends ESIntegTestCase {
|
||||
public class RenderSearchTemplateTests extends ESIntegTestCase {
|
||||
private static final String TEMPLATE_CONTENTS = "{\"size\":\"{{size}}\",\"query\":{\"match\":{\"foo\":\"{{value}}\"}},\"aggs\":{\"objects\":{\"terms\":{\"field\":\"{{value}}\",\"size\":\"{{size}}\"}}}}";
|
||||
|
||||
@Override
|
||||
protected Collection<Class<? extends Plugin>> nodePlugins() {
|
||||
return Collections.singleton(MustachePlugin.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setupSuiteScopeCluster() throws Exception {
|
||||
client().preparePutIndexedScript(MustacheScriptEngineService.NAME, "index_template_1", "{ \"template\": " + TEMPLATE_CONTENTS + " }").get();
|
||||
|
@ -48,9 +61,16 @@ public class RenderSearchTemplateIT extends ESIntegTestCase {
|
|||
|
||||
@Override
|
||||
public Settings nodeSettings(int nodeOrdinal) {
|
||||
//Set path so ScriptService will pick up the test scripts
|
||||
Path configDir = createTempDir();
|
||||
Path scriptsDir = configDir.resolve("scripts");
|
||||
try {
|
||||
Files.createDirectories(scriptsDir);
|
||||
Files.write(scriptsDir.resolve("file_template_1.mustache"), TEMPLATE_CONTENTS.getBytes("UTF-8"));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return settingsBuilder().put(super.nodeSettings(nodeOrdinal))
|
||||
.put("path.conf", this.getDataPath("config")).build();
|
||||
.put("path.conf", configDir).build();
|
||||
}
|
||||
|
||||
public void testInlineTemplate() {
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.search.suggest;
|
||||
package org.elasticsearch.messy.tests;
|
||||
|
||||
|
||||
import org.elasticsearch.ElasticsearchException;
|
||||
|
@ -33,6 +33,10 @@ import org.elasticsearch.action.suggest.SuggestResponse;
|
|||
import org.elasticsearch.common.io.PathUtils;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.script.mustache.MustachePlugin;
|
||||
import org.elasticsearch.search.suggest.Suggest;
|
||||
import org.elasticsearch.search.suggest.SuggestBuilder;
|
||||
import org.elasticsearch.search.suggest.SuggestBuilder.SuggestionBuilder;
|
||||
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
|
||||
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder.DirectCandidateGenerator;
|
||||
|
@ -46,6 +50,7 @@ import java.nio.charset.StandardCharsets;
|
|||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -76,7 +81,13 @@ import static org.hamcrest.Matchers.nullValue;
|
|||
* possible these tests should declare for the first request, make the request, modify the configuration for the next request, make that
|
||||
* request, modify again, request again, etc. This makes it very obvious what changes between requests.
|
||||
*/
|
||||
public class SuggestSearchIT extends ESIntegTestCase {
|
||||
public class SuggestSearchTests extends ESIntegTestCase {
|
||||
|
||||
@Override
|
||||
protected Collection<Class<? extends Plugin>> nodePlugins() {
|
||||
return Collections.singleton(MustachePlugin.class);
|
||||
}
|
||||
|
||||
// see #3196
|
||||
public void testSuggestAcrossMultipleIndices() throws IOException {
|
||||
createIndex("test");
|
||||
|
@ -609,7 +620,7 @@ public class SuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
|
||||
private List<String> readMarvelHeroNames() throws IOException, URISyntaxException {
|
||||
return Files.readAllLines(PathUtils.get(SuggestSearchIT.class.getResource("/config/names.txt").toURI()), StandardCharsets.UTF_8);
|
||||
return Files.readAllLines(PathUtils.get(Suggest.class.getResource("/config/names.txt").toURI()), StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
public void testSizePararm() throws IOException {
|
|
@ -16,7 +16,7 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.elasticsearch.index.query;
|
||||
package org.elasticsearch.messy.tests;
|
||||
|
||||
import org.apache.lucene.search.MatchAllDocsQuery;
|
||||
import org.apache.lucene.search.Query;
|
||||
|
@ -45,6 +45,8 @@ import org.elasticsearch.index.analysis.AnalysisService;
|
|||
import org.elasticsearch.index.cache.bitset.BitsetFilterCache;
|
||||
import org.elasticsearch.index.fielddata.IndexFieldDataService;
|
||||
import org.elasticsearch.index.mapper.MapperService;
|
||||
import org.elasticsearch.index.query.QueryShardContext;
|
||||
import org.elasticsearch.index.query.TemplateQueryParser;
|
||||
import org.elasticsearch.index.query.functionscore.ScoreFunctionParser;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
import org.elasticsearch.index.similarity.SimilarityService;
|
||||
|
@ -57,6 +59,7 @@ import org.elasticsearch.indices.mapper.MapperRegistry;
|
|||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||
import org.elasticsearch.script.ScriptModule;
|
||||
import org.elasticsearch.script.ScriptService;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.elasticsearch.test.IndexSettingsModule;
|
||||
import org.elasticsearch.threadpool.ThreadPool;
|
||||
|
@ -89,11 +92,14 @@ public class TemplateQueryParserTests extends ESTestCase {
|
|||
.build();
|
||||
final Client proxy = (Client) Proxy.newProxyInstance(
|
||||
Client.class.getClassLoader(),
|
||||
new Class[]{Client.class}, (proxy1, method, args) -> {
|
||||
new Class<?>[]{Client.class}, (proxy1, method, args) -> {
|
||||
throw new UnsupportedOperationException("client is just a dummy");
|
||||
});
|
||||
Index index = new Index("test");
|
||||
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings(index, settings);
|
||||
ScriptModule scriptModule = new ScriptModule(settings);
|
||||
// TODO: make this use a mock engine instead of mustache and it will no longer be messy!
|
||||
scriptModule.addScriptEngine(MustacheScriptEngineService.class);
|
||||
injector = new ModulesBuilder().add(
|
||||
new EnvironmentModule(new Environment(settings)),
|
||||
new SettingsModule(settings, new SettingsFilter(settings)),
|
||||
|
@ -105,7 +111,7 @@ public class TemplateQueryParserTests extends ESTestCase {
|
|||
bindQueryParsersExtension();
|
||||
}
|
||||
},
|
||||
new ScriptModule(settings),
|
||||
scriptModule,
|
||||
new IndexSettingsModule(index, settings),
|
||||
new AbstractModule() {
|
||||
@Override
|
|
@ -16,7 +16,7 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.elasticsearch.index.query;
|
||||
package org.elasticsearch.messy.tests;
|
||||
|
||||
import org.elasticsearch.action.index.IndexRequest.OpType;
|
||||
import org.elasticsearch.action.index.IndexRequestBuilder;
|
||||
|
@ -31,9 +31,14 @@ import org.elasticsearch.common.ParseFieldMatcher;
|
|||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
import org.elasticsearch.index.query.TemplateQueryBuilder;
|
||||
import org.elasticsearch.index.query.TemplateQueryParser;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.script.ScriptService;
|
||||
import org.elasticsearch.script.ScriptService.ScriptType;
|
||||
import org.elasticsearch.script.Template;
|
||||
import org.elasticsearch.script.mustache.MustachePlugin;
|
||||
import org.elasticsearch.script.mustache.MustacheScriptEngineService;
|
||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||
import org.elasticsearch.test.ESIntegTestCase;
|
||||
|
@ -41,6 +46,8 @@ import org.junit.Before;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -58,7 +65,12 @@ import static org.hamcrest.Matchers.is;
|
|||
* Full integration test of the template query plugin.
|
||||
*/
|
||||
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE)
|
||||
public class TemplateQueryIT extends ESIntegTestCase {
|
||||
public class TemplateQueryTests extends ESIntegTestCase {
|
||||
|
||||
@Override
|
||||
protected Collection<Class<? extends Plugin>> nodePlugins() {
|
||||
return Collections.singleton(MustachePlugin.class);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setup() throws IOException {
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
/**
|
||||
* This package contains tests that use mustache to test what looks
|
||||
* to be unrelated functionality, or functionality that should be
|
||||
* tested with a mock instead. Instead of doing an epic battle
|
||||
* with these tests, they are temporarily moved here to the mustache
|
||||
* module's tests, but that is likely not where they belong. Please
|
||||
* help by cleaning them up and we can remove this package!
|
||||
*
|
||||
* <ul>
|
||||
* <li>If the test is actually testing mustache specifically, move to
|
||||
* the org.elasticsearch.script.mustache tests package of this module</li>
|
||||
* <li>If the test is testing templating integration with another core subsystem,
|
||||
* fix it to use a mock instead, so it can be in the core tests again</li>
|
||||
* <li>If the test is just being lazy, and does not really need templating to test
|
||||
* something, clean it up!</li>
|
||||
* </ul>
|
||||
*/
|
||||
/* List of renames that took place:
|
||||
renamed: core/src/test/java/org/elasticsearch/validate/RenderSearchTemplateIT.java -> modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/RenderSearchTemplateTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/search/suggest/SuggestSearchIT.java -> modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/SuggestSearchTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/index/query/TemplateQueryParserTests.java -> modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryParserTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/index/query/TemplateQueryIT.java -> modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryTests.java
|
||||
renamed: core/src/test/java/org/elasticsearch/transport/ContextAndHeaderTransportIT.java -> module/lang-mustache/src/test/java/org/elasticsearch/messy/tests/ContextAndHeaderTransportTests.java
|
||||
^^^^^ note: just the methods from this test using mustache were moved here, the others use groovy and are in the groovy module under its messy tests package.
|
||||
renamed: rest-api-spec/test/msearch/10_basic.yaml -> module/lang-mustache/src/test/resources/rest-api-spec/test/lang_mustache/50_messy_test_msearch.yaml
|
||||
*/
|
||||
|
||||
package org.elasticsearch.messy.tests;
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.script.mustache;
|
||||
|
||||
import com.carrotsearch.randomizedtesting.annotations.Name;
|
||||
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.test.rest.ESRestTestCase;
|
||||
import org.elasticsearch.test.rest.RestTestCandidate;
|
||||
import org.elasticsearch.test.rest.parser.RestTestParseException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
|
||||
public class MustacheRestIT extends ESRestTestCase {
|
||||
|
||||
@Override
|
||||
protected Collection<Class<? extends Plugin>> nodePlugins() {
|
||||
return pluginList(MustachePlugin.class);
|
||||
}
|
||||
|
||||
public MustacheRestIT(@Name("yaml") RestTestCandidate testCandidate) {
|
||||
super(testCandidate);
|
||||
}
|
||||
|
||||
@ParametersFactory
|
||||
public static Iterable<Object[]> parameters() throws IOException, RestTestParseException {
|
||||
return ESRestTestCase.createParameters(0, 1);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +1,18 @@
|
|||
# Integration tests for Mustache scripts
|
||||
#
|
||||
"Mustache loaded":
|
||||
- do:
|
||||
cluster.state: {}
|
||||
|
||||
# Get master node id
|
||||
- set: { master_node: master }
|
||||
|
||||
- do:
|
||||
nodes.info: {}
|
||||
|
||||
- match: { nodes.$master.modules.0.name: lang-mustache }
|
||||
- match: { nodes.$master.modules.0.jvm: true }
|
||||
|
||||
---
|
||||
"Indexed template":
|
||||
|
|
@ -51,3 +51,4 @@
|
|||
- query:
|
||||
{ "template": { "query": { "term": { "foo": { "value": "{{template}}" } } }, "params": { "template": "bar" } } }
|
||||
- match: { responses.0.hits.total: 1 }
|
||||
|
|
@ -11,6 +11,7 @@ List projects = [
|
|||
'test-framework',
|
||||
'modules:lang-expression',
|
||||
'modules:lang-groovy',
|
||||
'modules:lang-mustache',
|
||||
'plugins:analysis-icu',
|
||||
'plugins:analysis-kuromoji',
|
||||
'plugins:analysis-phonetic',
|
||||
|
|
|
@ -21,6 +21,8 @@ package org.elasticsearch.script;
|
|||
|
||||
import org.apache.lucene.index.LeafReaderContext;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.bytes.BytesArray;
|
||||
import org.elasticsearch.common.bytes.BytesReference;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.search.lookup.SearchLookup;
|
||||
|
||||
|
@ -71,12 +73,17 @@ public class MockScriptEngine implements ScriptEngineService {
|
|||
|
||||
@Override
|
||||
public Object compile(String script) {
|
||||
return Integer.parseInt(script);
|
||||
return script;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExecutableScript executable(CompiledScript compiledScript, @Nullable Map<String, Object> vars) {
|
||||
return null;
|
||||
return new AbstractExecutableScript() {
|
||||
@Override
|
||||
public Object run() {
|
||||
return new BytesArray((String)compiledScript.compiled());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
Loading…
Reference in New Issue