[ 
https://issues.apache.org/jira/browse/IGNITE-18954?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mirza Aliev updated IGNITE-18954:
---------------------------------
    Description: 
{*}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


 

  was:
{*}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:


 


> 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
>
> {*}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