I'm upgrading from groovy to painless and it's not so painless so far. I wanted to post this here as I think this would be a pretty common scenario and I'm having trouble with dates (gotta love dates). Ideas?
PUT /test-stacks-v1
{
"aliases": {
"test-stacks": {}
},
"mappings": {
"stacks": {
"_all": {
"enabled": false
},
"dynamic": false,
"properties": {
"id": {
"type": "keyword"
},
"first_occurrence": {
"type": "date"
},
"last_occurrence": {
"type": "date"
},
"total_occurrences": {
"type": "float"
}
}
}
}
}
PUT /test-stacks/stacks/1ecd0826e447a44e78877ab1
{
"id": "1ecd0826e447a44e78877ab1",
"total_occurrences": 0,
"first_occurrence": "0001-01-01T00:00:00",
"last_occurrence": "0001-01-01T00:00:00"
}
POST /test-stacks/stacks/1ecd0826e447a44e78877ab1/_update?retry_on_conflict=3
{
"script": {
"params": {
"minOccurrenceDateUtc": "2016-10-25T22:04:19.3272056Z",
"maxOccurrenceDateUtc": "2016-10-25T22:04:19.3272056Z",
"count": 1
},
"inline": "if (ctx._source.total_occurrences == 0 || ctx._source.first_occurrence > params.minOccurrenceDateUtc) { ctx._source.first_occurrence = params.minOccurrenceDateUtc; } if (ctx._source.last_occurrence < params.maxOccurrenceDateUtc) { ctx._source.last_occurrence = params.maxOccurrenceDateUtc; } ctx._source.total_occurrences += params.count;"
}
}
The last script update returns
json
{
"error": {
"root_cause": [
{
"type": "remote_transport_exception",
"reason": "[8mJiEA3][local[1]][indices:data/write/update[s]]"
}
],
"type": "illegal_argument_exception",
"reason": "failed to execute script",
"caused_by": {
"type": "script_exception",
"reason": "runtime error",
"caused_by": {
"type": "class_cast_exception",
"reason": "Cannot apply [<] operation to types [java.lang.String] and [java.lang.String]."
},
"script_stack": [
"if (ctx._source.last_occurrence < params.maxOccurrenceDateUtc) { ",
" ^---- HERE"
],
"script": "if (ctx._source.total_occurrences == 0 || ctx._source.first_occurrence > params.minOccurrenceDateUtc) { ctx._source.first_occurrence = params.minOccurrenceDateUtc; } if (ctx._source.last_occurrence < params.maxOccurrenceDateUtc) { ctx._source.last_occurrence = params.maxOccurrenceDateUtc; } ctx._source.total_occurrences += params.count;",
"lang": "painless"
}
},
"status": 400
}
The original groovy script worked flawlessly in 1.7.5 (including linebreaks)
```cs
var request = new UpdateRequest<Stack, Stack>(GetIndexById(stackId), ElasticType.Type, stackId) {
RetryOnConflict = 3,
Script = @"if (ctx._source.total_occurrences == 0 || ctx._source.first_occurrence > minOccurrenceDateUtc) {
ctx._source.first_occurrence = minOccurrenceDateUtc;
}
if (ctx._source.last_occurrence < maxOccurrenceDateUtc) {
ctx._source.last_occurrence = maxOccurrenceDateUtc;
}
ctx._source.total_occurrences += count;",
Params = new Dictionary<string, object>(3) {
{ "minOccurrenceDateUtc", minOccurrenceDateUtc },
{ "maxOccurrenceDateUtc", maxOccurrenceDateUtc },
{ "count", count }
}
};