From 5796a771c0a36df46fec1e7fd2149a78fac5e1e2 Mon Sep 17 00:00:00 2001 From: Brian Murphy Date: Wed, 13 May 2015 20:02:20 -0400 Subject: [PATCH] Chain transform was incorrectly assuming that all transforms had to be objects. The chain transform : ``` "transform" : { "chain" : [ { "search" : { "search_type" : "count", "indices" : [ "logstash-*" ], "body" : { "query" : { "match" : { "priority" : "error"} } } } }, { "script" : "return [ error_count : ctx.payload.hits.total ]" } ] }, ``` Was failing because the chain transform (wrongly) refused to parse the script string as a transform. This change will allow the transforms to determine what should parse or not. Fixes: elastic/elasticsearch#475 Updates after review Original commit: elastic/x-pack-elasticsearch@78c1a2498d8d0ef258d12a995049eedd60f3a6c2 --- .../watcher/transform/chain/ChainTransform.java | 4 +--- .../watcher/transform/chain/ChainTransformTests.java | 7 +++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/elasticsearch/watcher/transform/chain/ChainTransform.java b/src/main/java/org/elasticsearch/watcher/transform/chain/ChainTransform.java index 472d6237c13..68ae2157bf8 100644 --- a/src/main/java/org/elasticsearch/watcher/transform/chain/ChainTransform.java +++ b/src/main/java/org/elasticsearch/watcher/transform/chain/ChainTransform.java @@ -79,10 +79,8 @@ public class ChainTransform implements Transform { while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); - } else if (token == XContentParser.Token.START_OBJECT) { - builder.add(transformRegistry.parseTransform(watchId, currentFieldName, parser)); } else { - throw new ChainTransformException("could not parse [{}] transform for watch [{}]. expected a transform object, but found [{}] instead", TYPE, watchId, token); + builder.add(transformRegistry.parseTransform(watchId, currentFieldName, parser)); } } } diff --git a/src/test/java/org/elasticsearch/watcher/transform/chain/ChainTransformTests.java b/src/test/java/org/elasticsearch/watcher/transform/chain/ChainTransformTests.java index 5584c241e99..6d7a04e5486 100644 --- a/src/test/java/org/elasticsearch/watcher/transform/chain/ChainTransformTests.java +++ b/src/test/java/org/elasticsearch/watcher/transform/chain/ChainTransformTests.java @@ -75,6 +75,7 @@ public class ChainTransformTests extends ElasticsearchTestCase { .startObject().startObject("named").field("name", "name1").endObject().endObject() .startObject().startObject("named").field("name", "name2").endObject().endObject() .startObject().startObject("named").field("name", "name3").endObject().endObject() + .startObject().field("named", "name4").endObject() .endArray(); XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes()); @@ -82,7 +83,7 @@ public class ChainTransformTests extends ElasticsearchTestCase { ExecutableChainTransform executable = transformParser.parseExecutable("_id", parser); assertThat(executable, notNullValue()); assertThat(executable.transform().getTransforms(), notNullValue()); - assertThat(executable.transform().getTransforms(), hasSize(3)); + assertThat(executable.transform().getTransforms(), hasSize(4)); for (int i = 0; i < executable.transform().getTransforms().size(); i++) { assertThat(executable.executableTransforms().get(i), instanceOf(NamedExecutableTransform.class)); assertThat(((NamedExecutableTransform) executable.executableTransforms().get(i)).transform().name, is("name" + (i + 1))); @@ -157,6 +158,9 @@ public class ChainTransformTests extends ElasticsearchTestCase { @Override public Transform parseTransform(String watchId, XContentParser parser) throws IOException { + if (parser.currentToken() == XContentParser.Token.VALUE_STRING) { + return new Transform(parser.text()); + } assert parser.currentToken() == XContentParser.Token.START_OBJECT; XContentParser.Token token = parser.nextToken(); assert token == XContentParser.Token.FIELD_NAME; // the "name" field @@ -186,6 +190,5 @@ public class ChainTransformTests extends ElasticsearchTestCase { return new NamedExecutableTransform(transform); } } - } }