fixes for compile errors due to search request refactoring in core

Original commit: elastic/x-pack-elasticsearch@8808789912
This commit is contained in:
Colin Goodheart-Smithe 2015-10-15 20:16:46 +01:00
parent 4dd5bfe0e7
commit 4cd02142a2
19 changed files with 300 additions and 211 deletions

View File

@ -16,7 +16,11 @@ import org.elasticsearch.cluster.ClusterService;
import org.elasticsearch.common.inject.util.Providers; import org.elasticsearch.common.inject.util.Providers;
import org.elasticsearch.common.network.NetworkAddress; import org.elasticsearch.common.network.NetworkAddress;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.*; import org.elasticsearch.common.transport.BoundTransportAddress;
import org.elasticsearch.common.transport.DummyTransportAddress;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.LocalTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.env.Environment; import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.index.IndexNotFoundException;
import org.elasticsearch.index.cache.IndexCacheModule; import org.elasticsearch.index.cache.IndexCacheModule;
@ -46,7 +50,11 @@ import org.junit.Test;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.*; import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import static org.elasticsearch.shield.audit.index.IndexNameResolver.Rollover.DAILY; import static org.elasticsearch.shield.audit.index.IndexNameResolver.Rollover.DAILY;
import static org.elasticsearch.shield.audit.index.IndexNameResolver.Rollover.HOURLY; import static org.elasticsearch.shield.audit.index.IndexNameResolver.Rollover.HOURLY;
@ -59,9 +67,9 @@ import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;

View File

@ -9,9 +9,9 @@ import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
@ -43,6 +43,7 @@ public class ExecutableSearchInput extends ExecutableInput<SearchInput, SearchIn
this.timeout = input.getTimeout() != null ? input.getTimeout() : defaultTimeout; this.timeout = input.getTimeout() != null ? input.getTimeout() : defaultTimeout;
} }
@Override
public SearchInput.Result execute(WatchExecutionContext ctx) { public SearchInput.Result execute(WatchExecutionContext ctx) {
SearchRequest request = null; SearchRequest request = null;
try { try {
@ -56,8 +57,8 @@ public class ExecutableSearchInput extends ExecutableInput<SearchInput, SearchIn
SearchInput.Result doExecute(WatchExecutionContext ctx, SearchRequest request) throws Exception { SearchInput.Result doExecute(WatchExecutionContext ctx, SearchRequest request) throws Exception {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
BytesReference source = request.source() != null ? request.source() : request.templateSource(); ToXContent source = request.source() != null ? request.source() : request.template();
logger.trace("[{}] running query for [{}] [{}]", ctx.id(), ctx.watch().id(), XContentHelper.convertToJson(source, false, true)); logger.trace("[{}] running query for [{}] [{}]", ctx.id(), ctx.watch().id(), XContentHelper.toString(source));
} }
SearchResponse response = client.search(request, timeout); SearchResponse response = client.search(request, timeout);

View File

@ -13,6 +13,7 @@ import org.elasticsearch.common.ParseFieldMatcher;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.watcher.input.Input; import org.elasticsearch.watcher.input.Input;
import org.elasticsearch.watcher.support.SearchRequestEquivalence; import org.elasticsearch.watcher.support.SearchRequestEquivalence;
import org.elasticsearch.watcher.support.WatcherDateTimeUtils; import org.elasticsearch.watcher.support.WatcherDateTimeUtils;
@ -109,7 +110,7 @@ public class SearchInput implements Input {
return builder; return builder;
} }
public static SearchInput parse(String watchId, XContentParser parser) throws IOException { public static SearchInput parse(String watchId, XContentParser parser, QueryParseContext context) throws IOException {
SearchRequest request = null; SearchRequest request = null;
Set<String> extract = null; Set<String> extract = null;
TimeValue timeout = null; TimeValue timeout = null;
@ -122,7 +123,7 @@ public class SearchInput implements Input {
currentFieldName = parser.currentName(); currentFieldName = parser.currentName();
} else if (ParseFieldMatcher.STRICT.match(currentFieldName, Field.REQUEST)) { } else if (ParseFieldMatcher.STRICT.match(currentFieldName, Field.REQUEST)) {
try { try {
request = WatcherUtils.readSearchRequest(parser, ExecutableSearchInput.DEFAULT_SEARCH_TYPE); request = WatcherUtils.readSearchRequest(parser, ExecutableSearchInput.DEFAULT_SEARCH_TYPE, context);
} catch (ElasticsearchParseException srpe) { } catch (ElasticsearchParseException srpe) {
throw new ElasticsearchParseException("could not parse [{}] input for watch [{}]. failed to parse [{}]", srpe, TYPE, watchId, currentFieldName); throw new ElasticsearchParseException("could not parse [{}] input for watch [{}]. failed to parse [{}]", srpe, TYPE, watchId, currentFieldName);
} }

View File

@ -10,6 +10,8 @@ import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.watcher.input.InputFactory; import org.elasticsearch.watcher.input.InputFactory;
import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput; import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.ClientProxy;
@ -23,11 +25,13 @@ public class SearchInputFactory extends InputFactory<SearchInput, SearchInput.Re
private final ClientProxy client; private final ClientProxy client;
private final TimeValue defaultTimeout; private final TimeValue defaultTimeout;
private IndicesQueriesRegistry queryRegistry;
@Inject @Inject
public SearchInputFactory(Settings settings, ClientProxy client) { public SearchInputFactory(Settings settings, ClientProxy client, IndicesQueriesRegistry queryRegistry) {
super(Loggers.getLogger(ExecutableSimpleInput.class, settings)); super(Loggers.getLogger(ExecutableSimpleInput.class, settings));
this.client = client; this.client = client;
this.queryRegistry = queryRegistry;
this.defaultTimeout = settings.getAsTime("watcher.input.search.default_timeout", null); this.defaultTimeout = settings.getAsTime("watcher.input.search.default_timeout", null);
} }
@ -38,7 +42,9 @@ public class SearchInputFactory extends InputFactory<SearchInput, SearchInput.Re
@Override @Override
public SearchInput parseInput(String watchId, XContentParser parser) throws IOException { public SearchInput parseInput(String watchId, XContentParser parser) throws IOException {
return SearchInput.parse(watchId, parser); QueryParseContext context = new QueryParseContext(queryRegistry);
context.reset(parser);
return SearchInput.parse(watchId, parser, context);
} }
@Override @Override

View File

@ -9,22 +9,29 @@ import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParseFieldMatcher;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.*; import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.script.ScriptService.ScriptType;
import org.elasticsearch.script.Template;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.execution.WatchExecutionContext;
import org.elasticsearch.watcher.support.text.TextTemplate;
import org.elasticsearch.watcher.watch.Payload; import org.elasticsearch.watcher.watch.Payload;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.elasticsearch.watcher.support.WatcherDateTimeUtils.formatDate; import static org.elasticsearch.watcher.support.WatcherDateTimeUtils.formatDate;
@ -64,62 +71,67 @@ public final class WatcherUtils {
// Due the inconsistency with templates in ES 1.x, we maintain our own template format. // Due the inconsistency with templates in ES 1.x, we maintain our own template format.
// This template format we use now, will become the template structure in ES 2.0 // This template format we use now, will become the template structure in ES 2.0
Map<String, Object> watcherContextParams = Variables.createCtxModel(ctx, payload); Map<String, Object> watcherContextParams = Variables.createCtxModel(ctx, payload);
if (Strings.hasLength(requestPrototype.source())) { if (requestPrototype.source() != null) {
// Here we convert a watch search request body into an inline search template, // Here we convert a watch search request body into an inline search template,
// this way if any Watcher related context variables are used, they will get resolved, // this way if any Watcher related context variables are used, they will get resolved,
// by ES search template support // by ES search template support
XContentBuilder builder = jsonBuilder(); XContentBuilder builder = jsonBuilder();
builder.startObject(); requestPrototype.source().toXContent(builder, ToXContent.EMPTY_PARAMS);
XContentHelper.writeRawField("template", requestPrototype.source(), builder, ToXContent.EMPTY_PARAMS); Template template = new Template(builder.string(), ScriptType.INLINE, null, builder.contentType(), watcherContextParams);
builder.field("params", watcherContextParams);
builder.endObject();
// Unfortunately because of SearchRequest#templateSource(BytesReference, boolean) has been removed in 1.6 and // Unfortunately because of SearchRequest#templateSource(BytesReference, boolean) has been removed in 1.6 and
// SearchRequest#templateSource(BytesReference) doesn't exist in 1.5, we are forced to use SearchRequest#templateSource(String) // SearchRequest#templateSource(BytesReference) doesn't exist in 1.5, we are forced to use SearchRequest#templateSource(String)
// that exist in both 1.5 and 1.6 // that exist in both 1.5 and 1.6
// TODO (2.0 upgrade): move back to BytesReference // TODO (2.0 upgrade): move back to BytesReference
request.templateSource(builder.string()); request.template(template);
} else if (Strings.hasLength(requestPrototype.templateSource())) { } else if (requestPrototype.template() != null) {
// Here we convert watcher template into a ES core templates. Due to the different format we use, we // Here we convert watcher template into a ES core templates. Due to the different format we use, we
// convert to the template format used in ES core // convert to the template format used in ES core
BytesReference templateSource = requestPrototype.templateSource(); // BytesReference templateSource =
try (XContentParser sourceParser = XContentFactory.xContent(templateSource).createParser(templateSource)) { // requestPrototype.templateSource();
sourceParser.nextToken(); // try (XContentParser sourceParser =
TextTemplate template = TextTemplate.parse(sourceParser); // XContentFactory.xContent(templateSource).createParser(templateSource))
// {
// sourceParser.nextToken();
// TextTemplate template = TextTemplate.parse(sourceParser);
// Convert to the ES template format: // Convert to the ES template format:
XContentBuilder builder = jsonBuilder(); // XContentBuilder builder = jsonBuilder();
builder.startObject(); // builder.startObject();
switch (template.getType()) { // switch (template.getType()) {
case INDEXED: // case INDEXED:
builder.startObject("template"); // builder.startObject("template");
builder.field("id", template.getTemplate()); // builder.field("id", template.getTemplate());
builder.endObject(); // builder.endObject();
break; // break;
case FILE: // case FILE:
builder.startObject("template"); // builder.startObject("template");
builder.field("file", template.getTemplate()); // builder.field("file", template.getTemplate());
builder.endObject(); // builder.endObject();
break; // break;
case INLINE: // case INLINE:
XContentHelper.writeRawField("template", new BytesArray(template.getTemplate()), builder, ToXContent.EMPTY_PARAMS); // XContentHelper.writeRawField("template", new
break; // BytesArray(template.getTemplate()), builder,
} // ToXContent.EMPTY_PARAMS);
Map<String, Object> params = new HashMap<>(); // break;
params.putAll(watcherContextParams); // }
params.putAll(template.getParams()); // Map<String, Object> params = new HashMap<>();
builder.field("params", params); // params.putAll(watcherContextParams);
builder.endObject(); // params.putAll(template.getParams());
// builder.field("params", params);
// builder.endObject();
// Unfortunately because of SearchRequest#templateSource(BytesReference, boolean) has been removed in 1.6 and // Unfortunately because of SearchRequest#templateSource(BytesReference, boolean) has been removed in 1.6 and
// SearchRequest#templateSource(BytesReference) doesn't exist in 1.5, we are forced to use SearchRequest#templateSource(String) // SearchRequest#templateSource(BytesReference) doesn't exist in 1.5, we are forced to use SearchRequest#templateSource(String)
// that exist in both 1.5 and 1.6 // that exist in both 1.5 and 1.6
// TODO (2.0 upgrade): move back to BytesReference // TODO (2.0 upgrade): move back to BytesReference
request.templateSource(builder.string()); request.template(requestPrototype.template());
} // }
} else if (requestPrototype.templateName() != null) {
// In Watcher templates on all places can be defined in one format
// Can only be set via the Java api
throw Exceptions.illegalArgument("SearchRequest's templateName isn't supported, templates should be defined in the request body");
} }
// else if (requestPrototype.templateName() != null) {
// // In Watcher templates on all places can be defined in one format
// // Can only be set via the Java api
// throw
// Exceptions.illegalArgument("SearchRequest's templateName isn't supported, templates should be defined in the request body");
// }
// falling back to an empty body // falling back to an empty body
return request; return request;
} }
@ -128,9 +140,10 @@ public final class WatcherUtils {
/** /**
* Reads a new search request instance for the specified parser. * Reads a new search request instance for the specified parser.
*/ */
public static SearchRequest readSearchRequest(XContentParser parser, SearchType searchType) throws IOException { public static SearchRequest readSearchRequest(XContentParser parser, SearchType searchType, QueryParseContext context)
BytesReference searchBody = null; throws IOException {
String templateBody = null; // BytesReference searchBody = null;
// String templateBody = null;
IndicesOptions indicesOptions = DEFAULT_INDICES_OPTIONS; IndicesOptions indicesOptions = DEFAULT_INDICES_OPTIONS;
SearchRequest searchRequest = new SearchRequest(); SearchRequest searchRequest = new SearchRequest();
@ -165,9 +178,11 @@ public final class WatcherUtils {
} }
} else if (token == XContentParser.Token.START_OBJECT) { } else if (token == XContentParser.Token.START_OBJECT) {
if (ParseFieldMatcher.STRICT.match(currentFieldName, BODY_FIELD)) { if (ParseFieldMatcher.STRICT.match(currentFieldName, BODY_FIELD)) {
XContentBuilder builder = XContentBuilder.builder(parser.contentType().xContent()); // XContentBuilder builder =
builder.copyCurrentStructure(parser); // XContentBuilder.builder(parser.contentType().xContent());
searchBody = builder.bytes(); // builder.copyCurrentStructure(parser);
// searchBody = builder.bytes();
searchRequest.source(SearchSourceBuilder.parseSearchSource(parser, context));
} else if (ParseFieldMatcher.STRICT.match(currentFieldName, INDICES_OPTIONS_FIELD)) { } else if (ParseFieldMatcher.STRICT.match(currentFieldName, INDICES_OPTIONS_FIELD)) {
boolean expandOpen = DEFAULT_INDICES_OPTIONS.expandWildcardsOpen(); boolean expandOpen = DEFAULT_INDICES_OPTIONS.expandWildcardsOpen();
boolean expandClosed = DEFAULT_INDICES_OPTIONS.expandWildcardsClosed(); boolean expandClosed = DEFAULT_INDICES_OPTIONS.expandWildcardsClosed();
@ -213,7 +228,8 @@ public final class WatcherUtils {
} else if (ParseFieldMatcher.STRICT.match(currentFieldName, TEMPLATE_FIELD)) { } else if (ParseFieldMatcher.STRICT.match(currentFieldName, TEMPLATE_FIELD)) {
XContentBuilder builder = XContentBuilder.builder(parser.contentType().xContent()); XContentBuilder builder = XContentBuilder.builder(parser.contentType().xContent());
builder.copyCurrentStructure(parser); builder.copyCurrentStructure(parser);
templateBody = builder.string(); String templateBody = builder.string();
searchRequest.template(new Template(templateBody, ScriptType.INLINE, null, builder.contentType(), null));
} else { } else {
throw new ElasticsearchParseException("could not read search request. unexpected object field [" + currentFieldName + "]"); throw new ElasticsearchParseException("could not read search request. unexpected object field [" + currentFieldName + "]");
} }
@ -239,17 +255,20 @@ public final class WatcherUtils {
} }
searchRequest.searchType(searchType); searchRequest.searchType(searchType);
searchRequest.indicesOptions(indicesOptions); searchRequest.indicesOptions(indicesOptions);
if (searchBody != null) { // if (searchBody != null) {
assert searchBody.hasArray(); // assert searchBody.hasArray();
searchRequest.source(searchBody); // searchRequest.source(searchBody);
} // }
if (templateBody != null) { // if (templateBody != null) {
// Unfortunately because of SearchRequest#templateSource(BytesReference, boolean) has been removed in 1.6 and // // Unfortunately because of
// SearchRequest#templateSource(BytesReference) doesn't exist in 1.5, we are forced to use SearchRequest#templateSource(String) // SearchRequest#templateSource(BytesReference, boolean) has been
// that exist in both 1.5 and 1.6 // removed in 1.6 and
// TODO (2.0 upgrade): move back to BytesReference // // SearchRequest#templateSource(BytesReference) doesn't exist in 1.5,
searchRequest.templateSource(templateBody); // we are forced to use SearchRequest#templateSource(String)
} // // that exist in both 1.5 and 1.6
// // TODO (2.0 upgrade): move back to BytesReference
// searchRequest.templateSource(templateBody);
// }
return searchRequest; return searchRequest;
} }
@ -272,11 +291,11 @@ public final class WatcherUtils {
if (searchRequest.types() != null) { if (searchRequest.types() != null) {
builder.array(TYPES_FIELD.getPreferredName(), searchRequest.types()); builder.array(TYPES_FIELD.getPreferredName(), searchRequest.types());
} }
if (Strings.hasLength(searchRequest.source())) { if (searchRequest.source() != null) {
XContentHelper.writeRawField(BODY_FIELD.getPreferredName(), searchRequest.source(), builder, params); builder.field(BODY_FIELD.getPreferredName(), searchRequest.source());
} }
if (Strings.hasLength(searchRequest.templateSource())) { if (searchRequest.template() != null) {
XContentHelper.writeRawField(TEMPLATE_FIELD.getPreferredName(), searchRequest.templateSource(), builder, params); builder.field(TEMPLATE_FIELD.getPreferredName(), searchRequest.template());
} }
if (searchRequest.indicesOptions() != DEFAULT_INDICES_OPTIONS) { if (searchRequest.indicesOptions() != DEFAULT_INDICES_OPTIONS) {

View File

@ -13,6 +13,7 @@ import org.elasticsearch.common.ParseFieldMatcher;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.watcher.support.SearchRequestEquivalence; import org.elasticsearch.watcher.support.SearchRequestEquivalence;
import org.elasticsearch.watcher.support.WatcherDateTimeUtils; import org.elasticsearch.watcher.support.WatcherDateTimeUtils;
import org.elasticsearch.watcher.support.WatcherUtils; import org.elasticsearch.watcher.support.WatcherUtils;
@ -91,7 +92,7 @@ public class SearchTransform implements Transform {
return builder; return builder;
} }
public static SearchTransform parse(String watchId, XContentParser parser) throws IOException { public static SearchTransform parse(String watchId, XContentParser parser, QueryParseContext context) throws IOException {
SearchRequest request = null; SearchRequest request = null;
TimeValue timeout = null; TimeValue timeout = null;
DateTimeZone dynamicNameTimeZone = null; DateTimeZone dynamicNameTimeZone = null;
@ -103,7 +104,7 @@ public class SearchTransform implements Transform {
currentFieldName = parser.currentName(); currentFieldName = parser.currentName();
} else if (ParseFieldMatcher.STRICT.match(currentFieldName, Field.REQUEST)) { } else if (ParseFieldMatcher.STRICT.match(currentFieldName, Field.REQUEST)) {
try { try {
request = WatcherUtils.readSearchRequest(parser, ExecutableSearchTransform.DEFAULT_SEARCH_TYPE); request = WatcherUtils.readSearchRequest(parser, ExecutableSearchTransform.DEFAULT_SEARCH_TYPE, context);
} catch (ElasticsearchParseException srpe) { } catch (ElasticsearchParseException srpe) {
throw new ElasticsearchParseException("could not parse [{}] transform for watch [{}]. failed to parse [{}]", srpe, TYPE, watchId, currentFieldName); throw new ElasticsearchParseException("could not parse [{}] transform for watch [{}]. failed to parse [{}]", srpe, TYPE, watchId, currentFieldName);
} }

View File

@ -10,6 +10,8 @@ import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.ClientProxy;
import org.elasticsearch.watcher.transform.TransformFactory; import org.elasticsearch.watcher.transform.TransformFactory;
@ -22,11 +24,13 @@ public class SearchTransformFactory extends TransformFactory<SearchTransform, Se
protected final ClientProxy client; protected final ClientProxy client;
private final TimeValue defaultTimeout; private final TimeValue defaultTimeout;
private IndicesQueriesRegistry queryRegistry;
@Inject @Inject
public SearchTransformFactory(Settings settings, ClientProxy client) { public SearchTransformFactory(Settings settings, ClientProxy client, IndicesQueriesRegistry queryRegistry) {
super(Loggers.getLogger(ExecutableSearchTransform.class, settings)); super(Loggers.getLogger(ExecutableSearchTransform.class, settings));
this.client = client; this.client = client;
this.queryRegistry = queryRegistry;
this.defaultTimeout = settings.getAsTime("watcher.transform.search.default_timeout", null); this.defaultTimeout = settings.getAsTime("watcher.transform.search.default_timeout", null);
} }
@ -37,7 +41,9 @@ public class SearchTransformFactory extends TransformFactory<SearchTransform, Se
@Override @Override
public SearchTransform parseTransform(String watchId, XContentParser parser) throws IOException { public SearchTransform parseTransform(String watchId, XContentParser parser) throws IOException {
return SearchTransform.parse(watchId, parser); QueryParseContext context = new QueryParseContext(queryRegistry);
context.reset(parser);
return SearchTransform.parse(watchId, parser, context);
} }
@Override @Override

View File

@ -98,8 +98,7 @@ public class IndexActionTests extends ESIntegTestCase {
.setTypes("test-type") .setTypes("test-type")
.setSource(searchSource() .setSource(searchSource()
.query(matchAllQuery()) .query(matchAllQuery())
.aggregation(terms("timestamps").field(customTimestampField ? timestampField : "_timestamp")) .aggregation(terms("timestamps").field(customTimestampField ? timestampField : "_timestamp")))
.buildAsBytes())
.get(); .get();
assertThat(searchResponse.getHits().totalHits(), equalTo(1L)); assertThat(searchResponse.getHits().totalHits(), equalTo(1L));
@ -165,8 +164,7 @@ public class IndexActionTests extends ESIntegTestCase {
.addSort("foo", SortOrder.ASC) .addSort("foo", SortOrder.ASC)
.setSource(searchSource() .setSource(searchSource()
.query(matchAllQuery()) .query(matchAllQuery())
.aggregation(terms("timestamps").field(customTimestampField ? timestampField : "_timestamp")) .aggregation(terms("timestamps").field(customTimestampField ? timestampField : "_timestamp")))
.buildAsBytes())
.get(); .get();
assertThat(searchResponse.getHits().totalHits(), equalTo(2L)); assertThat(searchResponse.getHits().totalHits(), equalTo(2L));

View File

@ -103,8 +103,7 @@ public class HistoryTemplateEmailMappingsTests extends AbstractWatcherIntegratio
.aggregation(terms("to").field("result.actions.email.message.to")) .aggregation(terms("to").field("result.actions.email.message.to"))
.aggregation(terms("cc").field("result.actions.email.message.cc")) .aggregation(terms("cc").field("result.actions.email.message.cc"))
.aggregation(terms("bcc").field("result.actions.email.message.bcc")) .aggregation(terms("bcc").field("result.actions.email.message.bcc"))
.aggregation(terms("reply_to").field("result.actions.email.message.reply_to")) .aggregation(terms("reply_to").field("result.actions.email.message.reply_to")))
.buildAsBytes())
.get(); .get();
assertThat(response, notNullValue()); assertThat(response, notNullValue());

View File

@ -99,8 +99,7 @@ public class HistoryTemplateHttpMappingsTests extends AbstractWatcherIntegration
SearchResponse response = client().prepareSearch(HistoryStore.INDEX_PREFIX + "*").setSource(searchSource() SearchResponse response = client().prepareSearch(HistoryStore.INDEX_PREFIX + "*").setSource(searchSource()
.aggregation(terms("input_result_path").field("result.input.http.request.path")) .aggregation(terms("input_result_path").field("result.input.http.request.path"))
.aggregation(terms("input_result_host").field("result.input.http.request.host")) .aggregation(terms("input_result_host").field("result.input.http.request.host"))
.aggregation(terms("webhook_path").field("result.actions.webhook.request.path")) .aggregation(terms("webhook_path").field("result.actions.webhook.request.path")))
.buildAsBytes())
.get(); .get();
assertThat(response, notNullValue()); assertThat(response, notNullValue());

View File

@ -60,8 +60,7 @@ public class HistoryTemplateIndexActionMappingsTests extends AbstractWatcherInte
SearchResponse response = client().prepareSearch(HistoryStore.INDEX_PREFIX + "*").setSource(searchSource() SearchResponse response = client().prepareSearch(HistoryStore.INDEX_PREFIX + "*").setSource(searchSource()
.aggregation(terms("index_action_indices").field("result.actions.index.response.index")) .aggregation(terms("index_action_indices").field("result.actions.index.response.index"))
.aggregation(terms("index_action_types").field("result.actions.index.response.type")) .aggregation(terms("index_action_types").field("result.actions.index.response.type")))
.buildAsBytes())
.get(); .get();
assertThat(response, notNullValue()); assertThat(response, notNullValue());

View File

@ -72,8 +72,7 @@ public class HistoryTemplateSearchInputMappingsTests extends AbstractWatcherInte
.aggregation(terms("input_search_type").field("result.input.search.request.search_type")) .aggregation(terms("input_search_type").field("result.input.search.request.search_type"))
.aggregation(terms("input_indices").field("result.input.search.request.indices")) .aggregation(terms("input_indices").field("result.input.search.request.indices"))
.aggregation(terms("input_types").field("result.input.search.request.types")) .aggregation(terms("input_types").field("result.input.search.request.types"))
.aggregation(terms("input_body").field("result.input.search.request.body")) .aggregation(terms("input_body").field("result.input.search.request.body")))
.buildAsBytes())
.get(); .get();
assertThat(response, notNullValue()); assertThat(response, notNullValue());

View File

@ -8,14 +8,17 @@ package org.elasticsearch.watcher.input.search;
import org.elasticsearch.action.indexedscripts.put.PutIndexedScriptRequest; import org.elasticsearch.action.indexedscripts.put.PutIndexedScriptRequest;
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.io.Streams;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.script.ScriptService.ScriptType;
import org.elasticsearch.script.Template;
import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
@ -55,11 +58,10 @@ import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
import static org.elasticsearch.index.query.QueryBuilders.rangeQuery; import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
import static org.elasticsearch.search.builder.SearchSourceBuilder.searchSource; import static org.elasticsearch.search.builder.SearchSourceBuilder.searchSource;
import static org.elasticsearch.test.ESIntegTestCase.Scope.SUITE; import static org.elasticsearch.test.ESIntegTestCase.Scope.SUITE;
import static org.elasticsearch.watcher.test.WatcherTestUtils.areJsonEquivalent;
import static org.elasticsearch.watcher.test.WatcherTestUtils.getRandomSupportedSearchType; import static org.elasticsearch.watcher.test.WatcherTestUtils.getRandomSupportedSearchType;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.startsWith; import static org.hamcrest.Matchers.notNullValue;
import static org.joda.time.DateTimeZone.UTC; import static org.joda.time.DateTimeZone.UTC;
/** /**
@ -140,26 +142,36 @@ public class SearchInputTests extends ESIntegTestCase {
public void testSearch_InlineTemplate() throws Exception { public void testSearch_InlineTemplate() throws Exception {
WatchExecutionContext ctx = createContext(); WatchExecutionContext ctx = createContext();
final String expectedQuery = "{\"template\":{\"query\":{\"filtered\":{\"query\":{\"match\":{\"event_type\":{\"query\":\"a\"," + final String expectedTemplateString = "{\"query\":{\"filtered\":{\"query\":{\"match\":{\"event_type\":{\"query\":\"a\","
+
"\"type\":\"boolean\"}}},\"filter\":{\"range\":{\"_timestamp\":" + "\"type\":\"boolean\"}}},\"filter\":{\"range\":{\"_timestamp\":" +
"{\"from\":\"{{ctx.trigger.scheduled_time}}||-{{seconds_param}}\",\"to\":\"{{ctx.trigger.scheduled_time}}\"," + "{\"from\":\"{{ctx.trigger.scheduled_time}}||-{{seconds_param}}\",\"to\":\"{{ctx.trigger.scheduled_time}}\"," +
"\"include_lower\":true,\"include_upper\":true}}}}}},\"params\":{\"seconds_param\":\"30s\",\"ctx\":{\"id\":\"" + ctx.id().value() + "\",\"metadata\":null,\"vars\":{},\"watch_id\":\"test-watch\",\"trigger\":{\"triggered_time\":\"1970-01-01T00:01:00.000Z\",\"scheduled_time\":\"1970-01-01T00:01:00.000Z\"},\"execution_time\":\"1970-01-01T00:01:00.000Z\"}}}"; "\"include_lower\":true,\"include_upper\":true}}}}}}";
Map<String, Object> triggerParams = new HashMap<String, Object>();
triggerParams.put("triggered_time", "1970-01-01T00:01:00.000Z");
triggerParams.put("scheduled_time", "1970-01-01T00:01:00.000Z");
Map<String, Object> ctxParams = new HashMap<String, Object>();
ctxParams.put("id", ctx.id().value());
ctxParams.put("metadata", null);
ctxParams.put("vars", new HashMap<String, Object>());
ctxParams.put("watch_id", "test-watch");
ctxParams.put("trigger", triggerParams);
ctxParams.put("execution_time", "1970-01-01T00:01:00.000Z");
Map<String, Object> expectedParams = new HashMap<String, Object>();
expectedParams.put("seconds_param", "30s");
expectedParams.put("ctx", ctxParams);
Template expectedTemplate = new Template(expectedTemplateString, ScriptType.INLINE, null, XContentType.JSON, expectedParams);
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
params.put("seconds_param", "30s"); params.put("seconds_param", "30s");
BytesReference templateSource = jsonBuilder() Template template = new Template(TEMPLATE_QUERY, ScriptType.INLINE, null, XContentType.JSON, params);
.value(TextTemplate.inline(TEMPLATE_QUERY).params(params).build())
.bytes(); SearchRequest request = client().prepareSearch().setSearchType(ExecutableSearchInput.DEFAULT_SEARCH_TYPE)
SearchRequest request = client() .setIndices("test-search-index").setTemplate(template).request();
.prepareSearch()
.setSearchType(ExecutableSearchInput.DEFAULT_SEARCH_TYPE)
.setIndices("test-search-index")
.setTemplateSource(templateSource)
.request();
SearchInput.Result executedResult = executeSearchInput(request, ctx); SearchInput.Result executedResult = executeSearchInput(request, ctx);
assertThat(areJsonEquivalent(executedResult.executedRequest().templateSource().toUtf8(), expectedQuery), is(true)); assertThat(executedResult.executedRequest().template(), equalTo(expectedTemplate));
} }
@Test @Test
@ -172,18 +184,17 @@ public class SearchInputTests extends ESIntegTestCase {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
params.put("seconds_param", "30s"); params.put("seconds_param", "30s");
BytesReference templateSource = jsonBuilder() Template template = new Template("test-template", ScriptType.INDEXED, null, null, params);
.value(TextTemplate.indexed("test-template").params(params).build())
.bytes(); jsonBuilder().value(TextTemplate.indexed("test-template").params(params).build()).bytes();
SearchRequest request = client() SearchRequest request = client().prepareSearch().setSearchType(ExecutableSearchInput.DEFAULT_SEARCH_TYPE)
.prepareSearch() .setIndices("test-search-index").setTemplate(template).request();
.setSearchType(ExecutableSearchInput.DEFAULT_SEARCH_TYPE)
.setIndices("test-search-index")
.setTemplateSource(templateSource)
.request();
SearchInput.Result executedResult = executeSearchInput(request, ctx); SearchInput.Result executedResult = executeSearchInput(request, ctx);
assertThat(executedResult.executedRequest().templateSource().toUtf8(), startsWith("{\"template\":{\"id\":\"test-template\"")); Template resultTemplate = executedResult.executedRequest().template();
assertThat(resultTemplate, notNullValue());
assertThat(resultTemplate.getScript(), equalTo("test-template"));
assertThat(resultTemplate.getType(), equalTo(ScriptType.INDEXED));
} }
@Test @Test
@ -193,18 +204,15 @@ public class SearchInputTests extends ESIntegTestCase {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
params.put("seconds_param", "30s"); params.put("seconds_param", "30s");
BytesReference templateSource = jsonBuilder() Template template = new Template("test_disk_template", ScriptType.FILE, null, null, params);
.value(TextTemplate.file("test_disk_template").params(params).build()) SearchRequest request = client().prepareSearch().setSearchType(ExecutableSearchInput.DEFAULT_SEARCH_TYPE)
.bytes(); .setIndices("test-search-index").setTemplate(template).request();
SearchRequest request = client()
.prepareSearch()
.setSearchType(ExecutableSearchInput.DEFAULT_SEARCH_TYPE)
.setIndices("test-search-index")
.setTemplateSource(templateSource)
.request();
SearchInput.Result executedResult = executeSearchInput(request, ctx); SearchInput.Result executedResult = executeSearchInput(request, ctx);
assertThat(executedResult.executedRequest().templateSource().toUtf8(), startsWith("{\"template\":{\"file\":\"test_disk_template\"")); Template resultTemplate = executedResult.executedRequest().template();
assertThat(resultTemplate, notNullValue());
assertThat(resultTemplate.getScript(), equalTo("test_disk_template"));
assertThat(resultTemplate.getType(), equalTo(ScriptType.FILE));
} }
@Test @Test
@ -256,7 +264,8 @@ public class SearchInputTests extends ESIntegTestCase {
XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes()); XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes());
parser.nextToken(); parser.nextToken();
SearchInputFactory factory = new SearchInputFactory(Settings.EMPTY, ClientProxy.of(client())); IndicesQueriesRegistry indicesQueryRegistry = internalCluster().getInstance(IndicesQueriesRegistry.class);
SearchInputFactory factory = new SearchInputFactory(Settings.EMPTY, ClientProxy.of(client()), indicesQueryRegistry);
SearchInput searchInput = factory.parseInput("_id", parser); SearchInput searchInput = factory.parseInput("_id", parser);
assertEquals(SearchInput.TYPE, searchInput.type()); assertEquals(SearchInput.TYPE, searchInput.type());

View File

@ -11,13 +11,19 @@ import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchAllQueryParser;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.script.Template;
import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.watcher.input.search.ExecutableSearchInput; import org.elasticsearch.watcher.input.search.ExecutableSearchInput;
@ -26,10 +32,7 @@ import org.elasticsearch.watcher.support.text.TextTemplate;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.*;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import static java.util.Collections.singletonMap; import static java.util.Collections.singletonMap;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
@ -103,10 +106,7 @@ public class WatcherUtilsTests extends ESTestCase {
expectedRequest.searchType(getRandomSupportedSearchType()); expectedRequest.searchType(getRandomSupportedSearchType());
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource().query(QueryBuilders.matchAllQuery()).size(11); SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource().query(QueryBuilders.matchAllQuery()).size(11);
XContentBuilder searchSourceJsonBuilder = jsonBuilder(); expectedRequest.source(searchSourceBuilder);
searchSourceBuilder.toXContent(searchSourceJsonBuilder, ToXContent.EMPTY_PARAMS);
BytesReference expectedSource = searchSourceJsonBuilder.bytes();
expectedRequest.source(expectedSource);
if (randomBoolean()) { if (randomBoolean()) {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
@ -122,21 +122,24 @@ public class WatcherUtilsTests extends ESTestCase {
TextTemplate.file(text).params(params).build(), TextTemplate.file(text).params(params).build(),
TextTemplate.indexed(text).params(params).build() TextTemplate.indexed(text).params(params).build()
); );
expectedRequest.templateSource(jsonBuilder().startObject().field("template", template).endObject().string()); expectedRequest.template(new Template(template.getTemplate(), template.getType(), null, template.getContentType(), template.getParams()));
} }
XContentBuilder builder = jsonBuilder(); XContentBuilder builder = jsonBuilder();
builder = WatcherUtils.writeSearchRequest(expectedRequest, builder, ToXContent.EMPTY_PARAMS); builder = WatcherUtils.writeSearchRequest(expectedRequest, builder, ToXContent.EMPTY_PARAMS);
XContentParser parser = XContentHelper.createParser(builder.bytes()); XContentParser parser = XContentHelper.createParser(builder.bytes());
assertThat(parser.nextToken(), equalTo(XContentParser.Token.START_OBJECT)); assertThat(parser.nextToken(), equalTo(XContentParser.Token.START_OBJECT));
SearchRequest result = WatcherUtils.readSearchRequest(parser, ExecutableSearchInput.DEFAULT_SEARCH_TYPE); IndicesQueriesRegistry registry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry());
QueryParseContext context = new QueryParseContext(registry);
context.reset(parser);
SearchRequest result = WatcherUtils.readSearchRequest(parser, ExecutableSearchInput.DEFAULT_SEARCH_TYPE, context);
assertThat(result.indices(), arrayContainingInAnyOrder(expectedRequest.indices())); assertThat(result.indices(), arrayContainingInAnyOrder(expectedRequest.indices()));
assertThat(result.types(), arrayContainingInAnyOrder(expectedRequest.types())); assertThat(result.types(), arrayContainingInAnyOrder(expectedRequest.types()));
assertThat(result.indicesOptions(), equalTo(expectedRequest.indicesOptions())); assertThat(result.indicesOptions(), equalTo(expectedRequest.indicesOptions()));
assertThat(result.searchType(), equalTo(expectedRequest.searchType())); assertThat(result.searchType(), equalTo(expectedRequest.searchType()));
assertThat(result.source().toUtf8(), equalTo(expectedSource.toUtf8())); assertThat(result.source(), equalTo(searchSourceBuilder));
assertThat(result.templateSource(), equalTo(expectedRequest.templateSource())); assertThat(result.template(), equalTo(expectedRequest.template()));
} }
public void testDeserializeSearchRequest() throws Exception { public void testDeserializeSearchRequest() throws Exception {
@ -190,8 +193,7 @@ public class WatcherUtilsTests extends ESTestCase {
source = searchSourceBuilder.buildAsBytes(XContentType.JSON); source = searchSourceBuilder.buildAsBytes(XContentType.JSON);
builder.rawField("body", source); builder.rawField("body", source);
} }
Template templateSource = null;
BytesReference templateSource = null;
if (randomBoolean()) { if (randomBoolean()) {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
if (randomBoolean()) { if (randomBoolean()) {
@ -207,19 +209,22 @@ public class WatcherUtilsTests extends ESTestCase {
TextTemplate.indexed(text).params(params).build() TextTemplate.indexed(text).params(params).build()
); );
builder.field("template", template); builder.field("template", template);
templateSource = jsonBuilder().value(template).bytes(); templateSource = new Template(template.getTemplate(), template.getType(), null, template.getContentType(), template.getParams());
} }
XContentParser parser = XContentHelper.createParser(builder.bytes()); XContentParser parser = XContentHelper.createParser(builder.bytes());
assertThat(parser.nextToken(), equalTo(XContentParser.Token.START_OBJECT)); assertThat(parser.nextToken(), equalTo(XContentParser.Token.START_OBJECT));
SearchRequest result = WatcherUtils.readSearchRequest(parser, ExecutableSearchInput.DEFAULT_SEARCH_TYPE); IndicesQueriesRegistry registry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry());
QueryParseContext context = new QueryParseContext(registry);
context.reset(parser);
SearchRequest result = WatcherUtils.readSearchRequest(parser, ExecutableSearchInput.DEFAULT_SEARCH_TYPE, context);
assertThat(result.indices(), arrayContainingInAnyOrder(indices)); assertThat(result.indices(), arrayContainingInAnyOrder(indices));
assertThat(result.types(), arrayContainingInAnyOrder(types)); assertThat(result.types(), arrayContainingInAnyOrder(types));
assertThat(result.indicesOptions(), equalTo(indicesOptions)); assertThat(result.indicesOptions(), equalTo(indicesOptions));
assertThat(result.searchType(), equalTo(searchType)); assertThat(result.searchType(), equalTo(searchType));
assertThat(result.source(), equalTo(source)); assertThat(result.source(), equalTo(source));
assertThat(result.templateSource(), equalTo(templateSource)); assertThat(result.template(), equalTo(templateSource));
} }
} }

View File

@ -32,8 +32,15 @@ import org.elasticsearch.shield.crypto.InternalCryptoService;
import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
import org.elasticsearch.test.TestCluster; import org.elasticsearch.test.TestCluster;
import org.elasticsearch.watcher.*; import org.elasticsearch.watcher.WatcherLifeCycleService;
import org.elasticsearch.watcher.actions.email.service.*; import org.elasticsearch.watcher.WatcherModule;
import org.elasticsearch.watcher.WatcherPlugin;
import org.elasticsearch.watcher.WatcherService;
import org.elasticsearch.watcher.WatcherState;
import org.elasticsearch.watcher.actions.email.service.Authentication;
import org.elasticsearch.watcher.actions.email.service.Email;
import org.elasticsearch.watcher.actions.email.service.EmailService;
import org.elasticsearch.watcher.actions.email.service.Profile;
import org.elasticsearch.watcher.client.WatcherClient; import org.elasticsearch.watcher.client.WatcherClient;
import org.elasticsearch.watcher.execution.ExecutionService; import org.elasticsearch.watcher.execution.ExecutionService;
import org.elasticsearch.watcher.execution.ExecutionState; import org.elasticsearch.watcher.execution.ExecutionState;
@ -60,14 +67,25 @@ import java.io.OutputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import static org.elasticsearch.index.query.QueryBuilders.boolQuery; import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery; import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
import static org.elasticsearch.test.ESIntegTestCase.Scope.SUITE; import static org.elasticsearch.test.ESIntegTestCase.Scope.SUITE;
import static org.elasticsearch.watcher.WatcherModule.*; import static org.elasticsearch.watcher.WatcherModule.HISTORY_TEMPLATE_NAME;
import static org.hamcrest.Matchers.*; import static org.elasticsearch.watcher.WatcherModule.TRIGGERED_TEMPLATE_NAME;
import static org.elasticsearch.watcher.WatcherModule.WATCHES_TEMPLATE_NAME;
import static org.hamcrest.Matchers.emptyArray;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.core.Is.is; import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.not; import static org.hamcrest.core.IsNot.not;
@ -258,7 +276,7 @@ public abstract class AbstractWatcherIntegrationTestCase extends ESIntegTestCase
protected long docCount(String index, String type, SearchSourceBuilder source) { protected long docCount(String index, String type, SearchSourceBuilder source) {
SearchRequestBuilder builder = client().prepareSearch(index) SearchRequestBuilder builder = client().prepareSearch(index)
.internalBuilder(source).setSize(0); .setSource(source).setSize(0);
if (type != null) { if (type != null) {
builder.setTypes(type); builder.setTypes(type);
} }
@ -266,7 +284,7 @@ public abstract class AbstractWatcherIntegrationTestCase extends ESIntegTestCase
} }
protected SearchResponse searchHistory(SearchSourceBuilder builder) { protected SearchResponse searchHistory(SearchSourceBuilder builder) {
return client().prepareSearch(HistoryStore.INDEX_PREFIX + "*").setSource(builder.buildAsBytes()).get(); return client().prepareSearch(HistoryStore.INDEX_PREFIX + "*").setSource(builder).get();
} }
protected <T> T getInstanceFromMaster(Class<T> type) { protected <T> T getInstanceFromMaster(Class<T> type) {

View File

@ -117,7 +117,7 @@ public final class WatcherTestUtils {
public static SearchRequest matchAllRequest(IndicesOptions indicesOptions) { public static SearchRequest matchAllRequest(IndicesOptions indicesOptions) {
SearchRequest request = new SearchRequest(Strings.EMPTY_ARRAY) SearchRequest request = new SearchRequest(Strings.EMPTY_ARRAY)
.source(SearchSourceBuilder.searchSource().query(matchAllQuery()).buildAsBytes(XContentType.JSON)); .source(SearchSourceBuilder.searchSource().query(matchAllQuery()));
if (indicesOptions != null) { if (indicesOptions != null) {
request.indicesOptions(indicesOptions); request.indicesOptions(indicesOptions);
} }

View File

@ -10,11 +10,12 @@ import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.util.Callback; import org.elasticsearch.common.util.Callback;
import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.script.ScriptService.ScriptType;
import org.elasticsearch.script.Template;
import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.test.junit.annotations.TestLogging; import org.elasticsearch.test.junit.annotations.TestLogging;
import org.elasticsearch.watcher.client.WatchSourceBuilder; import org.elasticsearch.watcher.client.WatchSourceBuilder;
@ -22,7 +23,6 @@ import org.elasticsearch.watcher.client.WatcherClient;
import org.elasticsearch.watcher.condition.ConditionBuilders; import org.elasticsearch.watcher.condition.ConditionBuilders;
import org.elasticsearch.watcher.support.WatcherUtils; import org.elasticsearch.watcher.support.WatcherUtils;
import org.elasticsearch.watcher.support.clock.SystemClock; import org.elasticsearch.watcher.support.clock.SystemClock;
import org.elasticsearch.watcher.support.text.TextTemplate;
import org.elasticsearch.watcher.support.xcontent.XContentSource; import org.elasticsearch.watcher.support.xcontent.XContentSource;
import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase;
import org.elasticsearch.watcher.transport.actions.delete.DeleteWatchResponse; import org.elasticsearch.watcher.transport.actions.delete.DeleteWatchResponse;
@ -36,7 +36,11 @@ import org.elasticsearch.watcher.watch.WatchStore;
import org.junit.Test; import org.junit.Test;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.search.builder.SearchSourceBuilder.searchSource; import static org.elasticsearch.search.builder.SearchSourceBuilder.searchSource;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
@ -50,8 +54,14 @@ import static org.elasticsearch.watcher.input.InputBuilders.simpleInput;
import static org.elasticsearch.watcher.test.WatcherTestUtils.newInputSearchRequest; import static org.elasticsearch.watcher.test.WatcherTestUtils.newInputSearchRequest;
import static org.elasticsearch.watcher.test.WatcherTestUtils.xContentSource; import static org.elasticsearch.watcher.test.WatcherTestUtils.xContentSource;
import static org.elasticsearch.watcher.trigger.TriggerBuilders.schedule; import static org.elasticsearch.watcher.trigger.TriggerBuilders.schedule;
import static org.elasticsearch.watcher.trigger.schedule.Schedules.*; import static org.elasticsearch.watcher.trigger.schedule.Schedules.daily;
import static org.hamcrest.Matchers.*; import static org.elasticsearch.watcher.trigger.schedule.Schedules.hourly;
import static org.elasticsearch.watcher.trigger.schedule.Schedules.interval;
import static org.elasticsearch.watcher.trigger.schedule.Schedules.monthly;
import static org.elasticsearch.watcher.trigger.schedule.Schedules.weekly;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
/** /**
*/ */
@ -312,12 +322,10 @@ public class BasicWatcherTests extends AbstractWatcherIntegrationTestCase {
.get(); .get();
refresh(); refresh();
BytesReference templateSource = jsonBuilder() Template template = new Template("my-template", ScriptType.INDEXED, null, null, null);
.value(TextTemplate.indexed("my-template").build())
.bytes();
SearchRequest searchRequest = newInputSearchRequest("events"); SearchRequest searchRequest = newInputSearchRequest("events");
// TODO (2.0 upgrade): move back to BytesReference instead of coverting to a string // TODO (2.0 upgrade): move back to BytesReference instead of coverting to a string
searchRequest.templateSource(templateSource.toUtf8()); searchRequest.template(template);
testConditionSearch(searchRequest); testConditionSearch(searchRequest);
} }

View File

@ -16,8 +16,13 @@ import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.script.ScriptService.ScriptType;
import org.elasticsearch.script.Template;
import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
@ -63,7 +68,6 @@ import static org.elasticsearch.search.builder.SearchSourceBuilder.searchSource;
import static org.elasticsearch.test.ESIntegTestCase.Scope.SUITE; import static org.elasticsearch.test.ESIntegTestCase.Scope.SUITE;
import static org.elasticsearch.watcher.support.WatcherDateTimeUtils.parseDate; import static org.elasticsearch.watcher.support.WatcherDateTimeUtils.parseDate;
import static org.elasticsearch.watcher.test.WatcherTestUtils.EMPTY_PAYLOAD; import static org.elasticsearch.watcher.test.WatcherTestUtils.EMPTY_PAYLOAD;
import static org.elasticsearch.watcher.test.WatcherTestUtils.areJsonEquivalent;
import static org.elasticsearch.watcher.test.WatcherTestUtils.getRandomSupportedSearchType; import static org.elasticsearch.watcher.test.WatcherTestUtils.getRandomSupportedSearchType;
import static org.elasticsearch.watcher.test.WatcherTestUtils.mockExecutionContext; import static org.elasticsearch.watcher.test.WatcherTestUtils.mockExecutionContext;
import static org.elasticsearch.watcher.test.WatcherTestUtils.simplePayload; import static org.elasticsearch.watcher.test.WatcherTestUtils.simplePayload;
@ -72,7 +76,6 @@ import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.startsWith;
import static org.joda.time.DateTimeZone.UTC; import static org.joda.time.DateTimeZone.UTC;
/** /**
@ -131,11 +134,7 @@ public class SearchTransformTests extends ESIntegTestCase {
ensureGreen("idx"); ensureGreen("idx");
refresh(); refresh();
SearchRequest request = Requests.searchRequest("idx").source(jsonBuilder().startObject() SearchRequest request = Requests.searchRequest("idx").source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
.startObject("query")
.startObject("match_all").endObject()
.endObject()
.endObject().bytes());
SearchTransform searchTransform = TransformBuilders.searchTransform(request).build(); SearchTransform searchTransform = TransformBuilders.searchTransform(request).build();
ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, ClientProxy.of(client()), null); ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, ClientProxy.of(client()), null);
@ -168,11 +167,9 @@ public class SearchTransformTests extends ESIntegTestCase {
refresh(); refresh();
// create a bad request // create a bad request
SearchRequest request = Requests.searchRequest("idx").source(jsonBuilder().startObject() SearchRequest request = Requests.searchRequest("idx").source(
.startObject("query") new SearchSourceBuilder().query(QueryBuilders.wrapperQuery(jsonBuilder().startObject().startObject("query")
.startObject("_unknown_query_").endObject() .startObject("_unknown_query_").endObject().endObject().endObject().bytes())));
.endObject()
.endObject().bytes());
SearchTransform searchTransform = TransformBuilders.searchTransform(request).build(); SearchTransform searchTransform = TransformBuilders.searchTransform(request).build();
ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, ClientProxy.of(client()), null); ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, ClientProxy.of(client()), null);
@ -183,7 +180,7 @@ public class SearchTransformTests extends ESIntegTestCase {
assertThat(result.type(), is(SearchTransform.TYPE)); assertThat(result.type(), is(SearchTransform.TYPE));
assertThat(result.status(), is(Transform.Result.Status.FAILURE)); assertThat(result.status(), is(Transform.Result.Status.FAILURE));
assertThat(result.reason(), notNullValue()); assertThat(result.reason(), notNullValue());
assertThat(result.executedRequest().templateSource().toUtf8(), containsString("_unknown_query_")); assertThat(result.executedRequest().template().getScript(), containsString("_unknown_query_"));
} }
@Test @Test
@ -293,7 +290,8 @@ public class SearchTransformTests extends ESIntegTestCase {
XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes()); XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes());
parser.nextToken(); parser.nextToken();
SearchTransformFactory transformFactory = new SearchTransformFactory(Settings.EMPTY, ClientProxy.of(client())); IndicesQueriesRegistry indicesQueryRegistry = internalCluster().getInstance(IndicesQueriesRegistry.class);
SearchTransformFactory transformFactory = new SearchTransformFactory(Settings.EMPTY, ClientProxy.of(client()), indicesQueryRegistry);
ExecutableSearchTransform executable = transformFactory.parseExecutable("_id", parser); ExecutableSearchTransform executable = transformFactory.parseExecutable("_id", parser);
assertThat(executable, notNullValue()); assertThat(executable, notNullValue());
@ -306,9 +304,10 @@ public class SearchTransformTests extends ESIntegTestCase {
assertThat(executable.transform().getRequest().searchType(), is(searchType)); assertThat(executable.transform().getRequest().searchType(), is(searchType));
} }
if (templateName != null) { if (templateName != null) {
assertThat(executable.transform().getRequest().templateSource().toUtf8(), equalTo("{\"file\":\"template1\"}")); assertThat(executable.transform().getRequest().template(),
equalTo(new Template("template1", ScriptType.FILE, null, null, null)));
} }
assertThat(executable.transform().getRequest().source().toBytes(), equalTo(source.toBytes())); assertThat(executable.transform().getRequest().source(), equalTo(source));
assertThat(executable.transform().getTimeout(), equalTo(readTimeout)); assertThat(executable.transform().getTimeout(), equalTo(readTimeout));
} }
@ -321,30 +320,37 @@ public class SearchTransformTests extends ESIntegTestCase {
"{\"from\":\"{{ctx.trigger.scheduled_time}}||-{{seconds_param}}\",\"to\":\"{{ctx.trigger.scheduled_time}}\"," + "{\"from\":\"{{ctx.trigger.scheduled_time}}||-{{seconds_param}}\",\"to\":\"{{ctx.trigger.scheduled_time}}\"," +
"\"include_lower\":true,\"include_upper\":true}}}]}}}"; "\"include_lower\":true,\"include_upper\":true}}}]}}}";
final String expectedQuery = "{\"template\":{\"query\":{\"bool\":{\"must\":[{\"match\":{\"event_type\":{\"query\":\"a\"," + final String expectedTemplateString = "{\"query\":{\"bool\":{\"must\":[{\"match\":{\"event_type\":{\"query\":\"a\","
"\"type\":\"boolean\"}}},{\"range\":{\"_timestamp\":" + + "\"type\":\"boolean\"}}},{\"range\":{\"_timestamp\":"
"{\"from\":\"{{ctx.trigger.scheduled_time}}||-{{seconds_param}}\",\"to\":\"{{ctx.trigger.scheduled_time}}\"," + + "{\"from\":\"{{ctx.trigger.scheduled_time}}||-{{seconds_param}}\",\"to\":\"{{ctx.trigger.scheduled_time}}\","
"\"include_lower\":true,\"include_upper\":true}}}]}}},\"params\":{\"seconds_param\":\"30s\",\"ctx\":{" + + "\"include_lower\":true,\"include_upper\":true}}}]}}}";
"\"id\":\"" + ctx.id().value() + "\",\"metadata\":null,\"vars\":{},\"watch_id\":\"test-watch\",\"payload\":{}," +
"\"trigger\":{\"triggered_time\":\"1970-01-01T00:01:00.000Z\",\"scheduled_time\":\"1970-01-01T00:01:00.000Z\"}," + Map<String, Object> triggerParams = new HashMap<String, Object>();
"\"execution_time\":\"1970-01-01T00:01:00.000Z\"}}}"; triggerParams.put("triggered_time", "1970-01-01T00:01:00.000Z");
triggerParams.put("scheduled_time", "1970-01-01T00:01:00.000Z");
Map<String, Object> ctxParams = new HashMap<String, Object>();
ctxParams.put("id", ctx.id().value());
ctxParams.put("metadata", null);
ctxParams.put("vars", new HashMap<String, Object>());
ctxParams.put("watch_id", "test-watch");
ctxParams.put("payload", new HashMap<String, Object>());
ctxParams.put("trigger", triggerParams);
ctxParams.put("execution_time", "1970-01-01T00:01:00.000Z");
Map<String, Object> expectedParams = new HashMap<String, Object>();
expectedParams.put("seconds_param", "30s");
expectedParams.put("ctx", ctxParams);
Template expectedTemplate = new Template(expectedTemplateString, ScriptType.INLINE, null, XContentType.JSON, expectedParams);
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
params.put("seconds_param", "30s"); params.put("seconds_param", "30s");
BytesReference templateSource = jsonBuilder() Template template = new Template(templateQuery, ScriptType.INLINE, null, XContentType.JSON, params);
.value(TextTemplate.inline(templateQuery).params(params).build()) SearchRequest request = client().prepareSearch().setSearchType(ExecutableSearchTransform.DEFAULT_SEARCH_TYPE)
.bytes(); .setIndices("test-search-index").setTemplate(template).request();
SearchRequest request = client()
.prepareSearch()
.setSearchType(ExecutableSearchTransform.DEFAULT_SEARCH_TYPE)
.setIndices("test-search-index")
.setTemplateSource(templateSource)
.request();
SearchTransform.Result executedResult = executeSearchTransform(request, ctx); SearchTransform.Result executedResult = executeSearchTransform(request, ctx);
assertThat(areJsonEquivalent(executedResult.executedRequest().templateSource().toUtf8(), expectedQuery), is(true)); assertThat(executedResult.executedRequest().template(), equalTo(expectedTemplate));
} }
@Test @Test
@ -365,16 +371,21 @@ public class SearchTransformTests extends ESIntegTestCase {
BytesReference templateSource = jsonBuilder() BytesReference templateSource = jsonBuilder()
.value(TextTemplate.indexed("test-script").params(params).build()) .value(TextTemplate.indexed("test-script").params(params).build())
.bytes(); .bytes();
Template template = new Template("test-script", ScriptType.INDEXED, null, null, null);
SearchRequest request = client() SearchRequest request = client()
.prepareSearch() .prepareSearch()
.setSearchType(ExecutableSearchTransform.DEFAULT_SEARCH_TYPE) .setSearchType(ExecutableSearchTransform.DEFAULT_SEARCH_TYPE)
.setIndices("test-search-index") .setIndices("test-search-index")
.setTemplateSource(templateSource) .setTemplate(template)
.request(); .request();
SearchTransform.Result result = executeSearchTransform(request, ctx); SearchTransform.Result result = executeSearchTransform(request, ctx);
assertNotNull(result.executedRequest()); assertNotNull(result.executedRequest());
assertThat(result.executedRequest().templateSource().toUtf8(), startsWith("{\"template\":{\"id\":\"test-script\"")); Template resultTemplate = result.executedRequest().template();
assertThat(resultTemplate, notNullValue());
assertThat(resultTemplate.getScript(), equalTo("test-script"));
assertThat(resultTemplate.getType(), equalTo(ScriptType.INDEXED));
} }
@Test @Test
@ -384,19 +395,16 @@ public class SearchTransformTests extends ESIntegTestCase {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
params.put("seconds_param", "30s"); params.put("seconds_param", "30s");
BytesReference templateSource = jsonBuilder() Template template = new Template("test_disk_template", ScriptType.FILE, null, null, null);
.value(TextTemplate.file("test_disk_template").params(params).build()) SearchRequest request = client().prepareSearch().setSearchType(ExecutableSearchTransform.DEFAULT_SEARCH_TYPE)
.bytes(); .setIndices("test-search-index").setTemplate(template).request();
SearchRequest request = client()
.prepareSearch()
.setSearchType(ExecutableSearchTransform.DEFAULT_SEARCH_TYPE)
.setIndices("test-search-index")
.setTemplateSource(templateSource)
.request();
SearchTransform.Result result = executeSearchTransform(request, ctx); SearchTransform.Result result = executeSearchTransform(request, ctx);
assertNotNull(result.executedRequest()); assertNotNull(result.executedRequest());
assertThat(result.executedRequest().templateSource().toUtf8(), startsWith("{\"template\":{\"file\":\"test_disk_template\"")); Template resultTemplate = result.executedRequest().template();
assertThat(resultTemplate, notNullValue());
assertThat(resultTemplate.getScript(), equalTo("test_disk_template"));
assertThat(resultTemplate.getType(), equalTo(ScriptType.FILE));
} }

View File

@ -7,12 +7,15 @@ package org.elasticsearch.watcher.watch;
import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.MatchAllQueryParser;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.watcher.actions.ActionFactory; import org.elasticsearch.watcher.actions.ActionFactory;
import org.elasticsearch.watcher.actions.ActionRegistry; import org.elasticsearch.watcher.actions.ActionRegistry;
@ -347,7 +350,8 @@ public class WatchTests extends ESTestCase {
Map<String, InputFactory> parsers = new HashMap<>(); Map<String, InputFactory> parsers = new HashMap<>();
switch (input.type()) { switch (input.type()) {
case SearchInput.TYPE: case SearchInput.TYPE:
parsers.put(SearchInput.TYPE, new SearchInputFactory(settings, client)); IndicesQueriesRegistry queryRegistry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry());
parsers.put(SearchInput.TYPE, new SearchInputFactory(settings, client, queryRegistry));
return new InputRegistry(parsers); return new InputRegistry(parsers);
default: default:
parsers.put(SimpleInput.TYPE, new SimpleInputFactory(settings)); parsers.put(SimpleInput.TYPE, new SimpleInputFactory(settings));
@ -406,11 +410,12 @@ public class WatchTests extends ESTestCase {
} }
private TransformRegistry transformRegistry() { private TransformRegistry transformRegistry() {
IndicesQueriesRegistry queryRegistry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry());
Map<String, TransformFactory> factories = new HashMap<>(); Map<String, TransformFactory> factories = new HashMap<>();
ChainTransformFactory parser = new ChainTransformFactory(); ChainTransformFactory parser = new ChainTransformFactory();
factories.put(ChainTransform.TYPE, parser); factories.put(ChainTransform.TYPE, parser);
factories.put(ScriptTransform.TYPE, new ScriptTransformFactory(settings, scriptService)); factories.put(ScriptTransform.TYPE, new ScriptTransformFactory(settings, scriptService));
factories.put(SearchTransform.TYPE, new SearchTransformFactory(settings, client)); factories.put(SearchTransform.TYPE, new SearchTransformFactory(settings, client, queryRegistry));
TransformRegistry registry = new TransformRegistry(unmodifiableMap(factories)); TransformRegistry registry = new TransformRegistry(unmodifiableMap(factories));
parser.init(registry); parser.init(registry);
return registry; return registry;