-
Notifications
You must be signed in to change notification settings - Fork 3
Description
I have been thinking that comparisons using new like and match keywords would be a natural extension.
The comparator rule would be extended like so:
comparator =/ "like" / "match" Are these features that would be of interest?
Like
items[? foo like '**/*.json' ]
The like comparator would match simple SQL-like, wildcard-like or glob-like patterns.
I have investigated adding such contextual keywords to the language and found that it would probably easier with lex/yacc-based implementations, Nevertheless, using the top-down parser approach, one simply has to account for those keywords between the nud() and led() calls in the main parsing loop.
This makes the parsing algorithm less "pure" but I’m pretty sure more knowledgeable people might come up with more elegant designs.
Match
The match comparator would match simple regular expressions.
items[? foo match 'ba[rz]' ]
I know that regular expressions have been a touchy subject in the past but I strongly believe we can make this work for JMESPath with:
- A narrow focus on matching only, unanchored expressions. That is, the expression returns
trueorfalse. - Restricting the syntax to a tiny but useful subset of interoperable syntax.
I have come up with a prototype for a reference implementation of a simple push-down automaton-based checker and the implementation is reasonaly tight and compact.
I believe most languages in which a JMESPath implementation exists do indeed support the interoperable subset.
The idea from the standazdization document referred to above is to:
- First check that the syntax is valid.
- Maps the interoperable regex to one compatible with the target implementation.
- Execute the target implementation expression.
The standardization documents lists mappings for ECMAScript, PCRE, RE2, Go and Ruby dialects.
Once relying on such a compact library, the implementation is in fact really easy.