[ 
https://issues.apache.org/jira/browse/IGNITE-18954?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17711712#comment-17711712
 ] 

Sergey Uttsel commented on IGNITE-18954:
----------------------------------------

LGTM

> Design a language for parsing of a filter expression
> ----------------------------------------------------
>
>                 Key: IGNITE-18954
>                 URL: https://issues.apache.org/jira/browse/IGNITE-18954
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Mirza Aliev
>            Assignee: Mirza Aliev
>            Priority: Major
>              Labels: ignite-3
>          Time Spent: 40m
>  Remaining Estimate: 0h
>
> {*}Motivation{*}:
> We need to parse and be able to use filters, that user set for the 
> distribution zone
> *Definition of done:*
>  
> * Filters are parsed and it is possible to filter arbitrary set of attributes
> * Validator is implemented, so we can validate a string representation of a 
> filter expression
> *Implementation details:*
>  Language must allow to perform simple operations, like 
> * “ “ – default empty filter, means that all nodes match
> * () expressions with parentheses 
> * key1 = “A” && key2 = “B”, () && ()
> * key1 = “A” || key2 = “B”, () || ()
> * key1 != "A"
> Attributes representation must look like key -> value pairs, like 
> {noformat}
> (region = EU || region = US) && (storage != HDD || storage = SSD)
> {noformat}
> After some investigation, I propose to not implement our own language for the 
> filters and attributes, but reuse JSON functionality.
> For nodes, user just pass JSON representation of attributes through the 
> {{ignite-config.json}}:
> {code:java}
> {
>     "network": {
>         "port": 3344
>     },
>     "rest": {
>         "port": 10300
>     },
>    "nodeAttributes":{
>       "nodeAttributes":{
>          "region":{
>             "attribute":"US"
>          },
>          "storage":{
>             "attribute":"SSD"
>          }
>       }
>    }
> }
> {code}
> For parsing, we can use https://github.com/json-path/JsonPath, which is 
> already used in ignite {{sql-engine}} module, so we don't need to bring a new 
> dependancy.
> {{JsonPath}} has a wide functionality to work with JSON, we are interested in 
> filtering queries. See all list of available functionality here 
> https://github.com/json-path/JsonPath#functions. Example of usages you can 
> find here https://rows.com/docs/filtering-with-jsonpath
> In general, it will allow us to make all operations, that we have listed 
> before.
> Lets provide some examples with our node attributes:
> {{[?(@.region == 'EU')]}} -- will give all nodes, that have region equals to 
> 'EU'
> {{[?(@.dataRegion > 10 && @storage != 'HDD')]}} -- will give all nodes, that 
> has dataRegion > 10 and storage not equal to HDD
> UPD:
> Validator form the definition of done was made in the separate ticket, so we 
> just needed to provide the method that can say
> if the provided attributes of the node are satisfy a provided filter
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to