Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement reading from null safe dereferences
Null safe dereferences make handling null or missing values shorter. Compare without: ``` if (ctx._source.missing != null && ctx._source.missing.foo != null) { ctx._source.foo_length = ctx.source.missing.foo.length() } ``` To with: ``` Integer length = ctx._source.missing?.foo?.length(); if (length != null) { ctx._source.foo_length = length } ``` Combining this with the as of yet unimplemented elvis operator allows for very concise defaults for nulls: ``` ctx._source.foo_length = ctx._source.missing?.foo?.length() ?: 0; ``` Since you have to start somewhere, we started with null safe dereferenes. Anyway, this is a feature borrowed from groovy. Groovy allows writing to null values like: ``` def v = null v?.field = 'cat' ``` And the writes are simply ignored. Painless doesn't support this at this point because it'd be complex to implement and maybe not all that useful. There is no runtime cost for this feature if it is not used. When it is used we implement it fairly efficiently, adding a jump rather than a temporary variable. This should also work fairly well with doc values.
- Loading branch information