.. _search_syntax:

.. rst-class:: chapter-with-expand

Search Syntax
-------------

The query input box can be used to construct a search query. This section
describes the syntax of a search query.

Search queries can contain:

* Model type and model name references 
* Model attribute and nested model attribute references
* Key words
* Brackets for grouping
* Query string to search for 

  Valid query string characters are:

  * alphanumeric characters
  * !@#$%^&*-_=+<,.>/?\|[{]}~`
  * to search for single quote in a string, wrap the string in double quotes
  * to search for double quote in a string, wrap the string in single quotes

Since a search query is carried out on models, the specific model type and 
model name can be specified in the query.

The query format is indicated below:

``type/name`` is the syntax for a full reference to a model type (for
example relation, data, or device) and model name (for example Countries).

A number of keywords are available to construct a search query.

Keyword Types
.............

Three types of keywords are available:

* Specification - WITH
* Matching - IS, LIKE
* Grouping - AND, OR

.. tabularcolumns:: |p{2.5cm}|p{13cm}|

+----------+-------------------------------------------------------------+
| Keyword  | Description and Examples                                    |
+==========+=============================================================+
| WITH     | Restricts the search to look for only specific data types.  |
|          | In the example below we have specified the data type        |
|          | Countries and so only countries will be returned.           |
|          |                                                             |
|          | ::                                                          |
|          |                                                             |
|          |    ((data/Countries WITH country_name LIKE Kingdom) AND     |
|          |     (data/Countries WITH country_name LIKE Unite ))         |
|          |                                                             |
+----------+-------------------------------------------------------------+
| IS       | For a result to be returned the data attribute must match   |
|          | exactly the 'input'. In the example below the 'input'       |
|          | is Spain and only a Country with the attribute              |
|          | country_name Spain will be returned. If 'North Spain and    |
|          | South Spain existed they would not be returned. In the      |
|          | example below we have specified the data type Countries     |
|          | and so only countries will be returned. If we had not       |
|          | specified a data type then the search would cover all       |
|          | data types looking for an attribute country_name.           |
|          |                                                             |
|          | ::                                                          |
|          |                                                             |
|          |    country_name IS Spain                                    |
|          |                                                             |
|          |    data/Countries WITH country_name IS Spain                |
|          |                                                             |
|          | Another example with a model tag as reference:              |
|          |                                                             |
|          | ::                                                          |
|          |                                                             |
|          |     tag IS "Feature A member"                               |
|          |                                                             |
+----------+-------------------------------------------------------------+
| CONTAINS | Matching is done by substring and is the default parameter. |
|          | For a result to be returned, the data attribute must        |
|          | contain 'input'. In the example below, the 'input'          |
|          | is 'Sw' and the search would find both 'Sweden' and         |
|          | 'Switzerland'.                                              |
|          |                                                             |
|          | ::                                                          |
|          |                                                             |
|          |    data/Countries WITH country_name CONTAINS Sw             |
|          |                                                             |
+----------+-------------------------------------------------------------+


.. tabularcolumns:: |p{2.5cm}|p{13cm}|

+----------+-------------------------------------------------------------+
| Keyword  | Description and Examples                                    |
+==========+=============================================================+
| LIKE     | Matching is done by fuzzy search.                           |
|          | For a result to be returned, the data attribute must        |
|          | nearly match 'input'. In the example below, the 'input'     |
|          | is 'swe' and the search would find both 'Sweden' and        |
|          | 'Switzerland'.                                              |
|          |                                                             |
|          | ::                                                          |
|          |                                                             |
|          |    data/Countries WITH country_name LIKE swe                |
|          |                                                             |
+----------+-------------------------------------------------------------+
| AND      | This grouping term allows you to combine different          |
|          | searches and only finds a result where both conditions      |
|          | are met. The example below the search would find 'United    |
|          | Kingdom' but not the 'Kingdom of Bhutan' as in this case    |
|          | the second condition (LIKE Unite) is not true.              |
|          |                                                             |
|          | ::                                                          |
|          |                                                             |
|          |    ((data/Countries WITH country_name LIKE Kingdom) AND     |
|          |     (data/Countries WITH country_name LIKE Unite ))         |
|          |                                                             |
+----------+-------------------------------------------------------------+
| OR       | This grouping term allows you to combine different          |
|          | searches and matches a result where any one or both of      |
|          | the conditions are met. The example search below would      |
|          | find 'United Kingdom', 'United States' and 'Kingdom of      |
|          | Bhutan'.                                                    |
|          |                                                             |
|          | ::                                                          |
|          |                                                             |
|          |    ((data/Countries WITH country_name LIKE Kingdom) OR      |
|          |     (data/Countries WITH country_name LIKE Unite))          |
|          |                                                             |
+----------+-------------------------------------------------------------+

Search Syntax Diagrams
......................


|search-syntax|


Search Examples
...............

Where the attribute of a model is nested in an object, the reference
to the attribute in the search query requires a model type
specification. 

For example, for a model ``data/User`` with an attribute in a nested object
called ``account_information``, the query should take the model type 
(``data``) specifier:

::

   data/User WITH data.account_information.credential_policy IS Default

The following query *will not* yield results:

::

   data/User WITH account_information.credential_policy IS Default


Brackets should be used in a query with matching and grouping operators. 
In a query containing no model references, brackets are evaluated first.
The order of bracket evaluation is inner to outer brackets.

Example Queries (line breaks added):

::

  (((data/Countries WITH pstn_access_prefix IS 9) AND 
    (data/Countries WITH emergency__access_prefix IS 112)) 
   OR (data/Countries WITH international_access_prefix IS 00))


Search String Format
....................

The string to search for can be specified with the following properties:

Multi-word and quotes
  Enclose in quotes. Single- and double quotes are supported. Example: ``'United States'``

  When single word or multi-word values contain a single or double quote, the
  string needs to be enclosed in double or single quotes respectively,
  for example: ``"L'Amour"``.

Case sensitivity
  Use the appropriate operator (LIKE)

In a query containing model references, brackets and grouping keywords, the
query is evaluated in the order.

.. tabularcolumns:: |p{1.5cm}|p{2cm}|p{10.5cm}|

+-------+----------+---------------------------------------------+
| Order | Element  | Description                                 |
+=======+==========+=============================================+
| 1     | WITH     | Model reference is evaluated first.         |
+-------+----------+---------------------------------------------+
| 2     | brackets | Brackets evaluate before grouping keywords. |
+-------+----------+---------------------------------------------+
| 3     | AND      | AND grouping evaluates before OR grouping.  |
+-------+----------+---------------------------------------------+
| 4     | OR       | Evaluates last.                             |
+-------+----------+---------------------------------------------+


A number of attributes from the meta data of a model can also be 
searched:

* ``__device_pkid``: if a device pkid is known, then for example:

  ``device/cucm/Line WITH __device_pkid IS 55c32b59a6165451e04f392a``

* ``pkid``: if a pkid is known, then for example:

  ``data/CallManager WITH pkid IS 55c32b59a6165451e04f392a``

* ``tags`` (can also use "tag"): if the tag name is known, then
  for example:

::

   ((data/FieldDisplayPolicy WITH tag IS feature_tag_add_customer) AND
    (data/FieldDisplayPolicy WITH tags IS applicationendtoend))


.. note::

   Only tags that are written in lower case are searchable.


.. |search-syntax| image:: /src/images/search-syntax.png
.. |VOSS-4-UC| replace:: VOSS-4-UC
.. |Unified CM| replace:: Unified CM