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@78c1a2498d
This commit is contained in:
Brian Murphy 2015-05-13 20:02:20 -04:00
parent 926e39d21e
commit 5796a771c0
2 changed files with 6 additions and 5 deletions

View File

@ -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));
}
}
}

View File

@ -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);
}
}
}
}