Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Requirement

we would like to bring support for contains operator in cps-path. 

contains() is a method in XPath expression. It is used when the value of any attribute changes dynamically, below are the examples,

Reference

CPS-1272


Issues & decisions


english

#

Json Data

CPS-PATH Syntax

Decisionoutput

1
Below is the sample data , Here  are ways  to use contains keyword :

{
   "test:bookstore":{
      "bookstore-name": "Chapters",
      "categories": [
         {
            "code": "01",
            "name": "SciFi",
            "books": [
               {
                  "authors": [
                     "Iain M. Banks"
                  ],
                  "lang": "english",
                  "price": "895",
                  "pub_year": "1994",
                  "title": "Feersum Endjinn"
               }
            ]
         },
         {
            "name": "kids",
            "code": "02",
            "books": [
               {
                  "authors": [
                     "Philip Pullman"
                  ],
                  "lang": "Science",
                  "price": "699",
                  "pub_year": "1995",
                  "title": "The Golden Compass"
               }
            ]
         }
   
 
 ]
   }
}
1.
 <cps-path> ( contains '[@leafname,' <string-value> ']' )

Examples
  • //books[contains(@lang,'
  • en')
  • //books[contains(@pub_year,'99')

Query format for contains keyword 

155 | /bookstore/categories[@code='01']/books[@title='Feersum Endjinn']    | {"lang": "en", "price": 895, "title": "Feersum Endjinn", "authors": ["Iain M. Banks"], | 4 | 154 |    5 |
 156 | /bookstore/categories[@code='01']/books[@title='Far Horizons']       | {

#

Query

Output

1cpsdb=# SELECT * FROM FRAGMENT WHERE anchor_id = 4 and attributes->>'lang' like '%en%';
                                                                                                        
{
 "lang": "en", 
 "price": 895, 
 "title": "Feersum Endjinn", 
 "authors": [
            "Iain M. Banks"
 ], 
"pub_year":1994
}  
{
 "lang": "en", 
 "price": 699, 
 "title": "The Golden Compass", 
 "authors": [
           "Philip Pullman"
 ], 
"pub_year":1995
}                                                                              
        
      
        
   

Native Query for contains keyword

1.Using LIKE Keyword :

Like operator is used to match specified matching pattern. It has two signs :

% : Matches any sequence of character, the character size may be 0 or more.

_ : Matches any single character.

#

Query

Output

1cpsdb=# SELECT * FROM FRAGMENT WHERE anchor_id = 4 and attributes->>'lang' like '%en%';

{
 "lang": "en", 
 "price":

1099

699, 
 "title": "

Far Horizons

The Golden Compass", 
 "authors": [

"Rober Silverberg", "Joe Haldeman", "Orson Scott Card", "Ursula K. Le Guin", "Dan Simmons", "david Brin", "Greg Bear"],


           "Philip Pullman"
 ], 
"pub_year":1995
}                                                                                                
{
 "lang": "english", 
 "price": 895, 
 "title": "Feersum Endjinn", 
 "authors": [
            "Iain M. Banks"
 ], 
"pub_year":

1999} |         4 |  

1994
}    

154 |

         

 5 |

2cpsdb=# SELECT * FROM FRAGMENT WHERE anchor_id = 4 and attributes->>'
pub_year
lang'
like
ilike '
%99%
%En%';
153 | /bookstore/categories[@code='02']/books[@title='The Golden Compass'] | {

{
 "lang": "en", 
 "price": 699, 
 "title": "The Golden Compass", 
 "authors": [
           "Philip Pullman"
 ], 
"pub_year":1995
}                                                                                                
{
 "lang": "English", 
 "price": 895, 
 "title": "Feersum Endjinn", 
 "authors": [
     

|

     

  4 |       152 |

"Iain M. Banks"
 ], 
"pub_year":1994
}              

 5 |
 155 | /bookstore/categories[@code='01']/books[@title='Feersum Endjinn']    | {

3cpsdb=# SELECT * FROM FRAGMENT WHERE anchor_id = 4 and attributes->>'lang' like 'en';{
 "lang": "en", 
 "price":
895
699, 
 "title": "
Feersum Endjinn
The Golden Compass", 
 "authors": [
"Iain M. Banks"],

           "Philip Pullman"
 ], 
"pub_year":
1994
1995
}                                                                                           

2.Using SIMILAR TO Regular Expression Keyword :

The only difference between like and similar to is to pattern matches the given string. It is similar to LIKE, except that it interprets the pattern using the SQL standard's definition of a regular expression

SIMILAR TO supports these pattern-matching metacharacters borrowed from POSIX regular expressions:

  • | denotes alternation (either of two alternatives).

  • * denotes repetition of the previous item zero or more times.

  • + denotes repetition of the previous item one or more times.

  • ? denotes repetition of the previous item zero or one time.

  • {m} denotes repetition of the previous item exactly m times.

  • {m,} denotes repetition of the previous item m or more times.

  • {m,n} denotes repetition of the previous item at least m and not more than n times.

  • Parentheses () can be used to group items into a single logical item.

  • A bracket expression [...] specifies a character class, just as in POSIX regular expressions.

#

Query

Output

1cpsdb=# SELECT * FROM FRAGMENT WHERE anchor_id = 3 and attributes->>'pub_year'similar to '%(94|95)%';

{
 

  |         4 |       154 |            5 |
 156 | /bookstore/categories[@code='01']/books[@title='Far Horizons']       | {

"lang": "en", 
 "price":

1099

699, 
 "title": "

Far Horizons

The Golden Compass", 
 "authors": [

"Rober Silverberg", "Joe Haldeman", "Orson Scott Card", "Ursula K. Le Guin", "Dan Simmons", "david Brin", "Greg Bear"],


           "Philip Pullman"
 ], 
"pub_year":1995
}                                                                                               
{
 "lang": "english", 
 "price": 895, 
 "title": "Feersum Endjinn", 
 "authors": [
            "Iain M. Banks"
 ], 
"pub_year":

1999} |         4 |

1994
}    

  154 |

         

 5 |