.. _app-schema.vocab-functions:
Vocabulary functions
====================
Scope
-----
This page describes how to serve vocabulary translations using some function expressions in application schema mapping file.
If you're not familiar with application schema mapping file, read :ref:`app-schema.mapping-file`.
Versions supported
``````````````````
This functionality is supported from GeoTools version 2.6-M2 onwards.
Useful functions
----------------
Recode function
```````````````````
This is similar to *if_then_else* function, except that there is no default clause.
You have to specify a translation value for every vocabulary key.
**Syntax**::
Recode(COLUMN_NAME, key1, value1, key2, value2,...)
* **COLUMN_NAME**: column name to get values from
**Example**::
gml:name
Recode(ABBREVIATION, '1GRAV', 'urn:cgi:classifier:CGI:SimpleLithology:2008:gravel',
'1TILL', 'urn:cgi:classifier:CGI:SimpleLithology:2008:diamictite',
'6ALLU', 'urn:cgi:classifier:CGI:SimpleLithology:2008:sediment')
The above example will map **gml:name** value to *urn:cgi:classifier:CGI:SimpleLithology:2008:gravel* if the ABBREVIATION column value is *1GRAV*.
Categorize function
```````````````````
This is more suitable for numeric keys, where the translation value is determined by the key's position within the thresholds.
**Syntax**::
Categorize(COLUMN_NAME, default_value, threshold 1, value 1, threshold 2, value 2, ..., [preceding/succeeding])
* **COLUMN_NAME**: data source column name
* **default_value**: default value to be mapped if COLUMN_NAME value is not within the threshold
* **threshold(n)**: threshold value
* **value(n)**: value to be mapped if the threshold is met
* **preceding/succeeding**:
- optional, succeeding is used by default if not specified.
- not case sensitive.
- preceding: value is within threshold if COLUMN_NAME value > threshold
- succeeding: value is within threshold if COLUMN_NAME value >= threshold
**Example**::
gml:description
Categorize(CGI_LOWER_RANGE, 'missing_value', 1000, 'minor', 5000, 'significant')
The above example means **gml:description** value would be *significant* if CGI_LOWER_RANGE column value is >= *5000*.
Vocab function
``````````````
This is the new function Jody implemented, and more useful for bigger vocabulary pairs.
Instead of writing a long key-to-value pairs in the function, you can keep them in a separate properties file.
The properties file serves as a lookup table to the function. It has no header, and only contains the pairs in ''='' format.
**Syntax**::
Vocab(COLUMN_NAME, properties file URI)
* **COLUMN_NAME**: column name to get values from
* **properties file URI**: absolute path of the properties file or relative to the mapping file location
**Example:**
Properties file::
1GRAV=urn:cgi:classifier:CGI:SimpleLithology:2008:gravel
1TILL=urn:cgi:classifier:CGI:SimpleLithology:2008:diamictite
6ALLU=urn:cgi:classifier:CGI:SimpleLithology:2008:sediment
Mapping file::
gml:name
Vocab(ABBREVIATION, '/test-data/mapping.properties')
The above example will map **gml:name** to *urn:cgi:classifier:CGI:SimpleLithology:2008:gravel* if ABBREVIATION value is *1GRAV*.