Functions

Flycs lets you define BigQuery functions. These functions will be created in BigQuery during the CI/CD pipeline and usable in your transformations.

Note

Javascript functions using external code libraries are not supported.

Example definition of a javascript UDF function called “func_decode_html” in YAML:

QUERY: |
    if (name === null) {
    return null
    }
    name=name.split('&').join('&');
    name=name.split(''').join("'");
    name=name.split('é').join("é");
    name=name.split('ô').join("ô");
    name=name.split('Ë').join("Ë");
    name=name.split('ï').join("ï");
    name=name.split('É').join("É");
    name=name.split('è').join("è");
    name=name.split('â').join("â");
    name=name.split('À').join("À");
    name=name.split('î').join("î");
    name=name.split('ü').join("ü");
    name=name.split('ê').join("ê");
    name=name.split('ë').join("ë");
    name=name.split('Ö').join("Ö");
    name=name.split('ç').join("ç");
    name=name.split('ö').join("ö");
    name=name.split('È').join("È");
    name=name.split('"').join("'");
    name=name.split('Ç').join("Ç");
    name=name.split('Ü').join("Ü");
    name=name.split('à').join("à");
    name=name.split('Ô').join("Ô");
    name=name.split('ä').join("ä");
    return name;

VERSION: 1.0.0
DESCRIPTION: "A function used to decode HTML entities"
KIND: function
LANGUAGE: javascript
ARGUMENT_LIST:
- NAME: name
  TYPE: STRING
RETURN_TYPE: STRING

Example definition of a SQL UDF function called “simple_mult_func” in YAML:

QUERY: |
  arg_IN * 2

VERSION: 1.0.0
DESCRIPTION: "A function used to multiply the input by 2"
KIND: function
ARGUMENT_LIST:
  - NAME: arg_IN
    TYPE: INTEGER
RETURN_TYPE: INTEGER

The functions definition must be created into a folder called functions in contrast with transformation that must be created into a queries folder. Here is an example tree from a flycs repository:

bigquery
└── demo
    ├── queries
       ├── datalake
          ├── history.yaml
          └── simple_copy.yaml
       ├── data_mart
          ├── salary.yaml
          └── simple_copy.yaml
       ├── data_warehouse
          ├── manipulating_pii_fields.yaml
          └── simple_copy.yaml
       └── staging
           ├── simple_copy.yaml
           └── time_test.yaml
    └── functions
       └── staging
            └── simple_mult_func.yaml
       └── data_warehouse
           └── func_decode_html.yaml
    └── views
        └── data_warehouse
            └── view_simple_copy.yaml

Example definition of the previous javascript function using python SDK:

from flycs_sdk.functions import Function, Argument

my_function = Function(
    name="func_decode_html",
    query="""
        if (name === null) {
        return null
        }
        name=name.split('&').join('&');
        name=name.split(''').join("'");
        name=name.split('é').join("é");
        name=name.split('ô').join("ô");
        name=name.split('Ë').join("Ë");
        name=name.split('ï').join("ï");
        name=name.split('É').join("É");
        name=name.split('è').join("è");
        name=name.split('â').join("â");
        name=name.split('À').join("À");
        name=name.split('î').join("î");
        name=name.split('ü').join("ü");
        name=name.split('ê').join("ê");
        name=name.split('ë').join("ë");
        name=name.split('Ö').join("Ö");
        name=name.split('ç').join("ç");
        name=name.split('ö').join("ö");
        name=name.split('È').join("È");
        name=name.split('"').join("'");
        name=name.split('Ç').join("Ç");
        name=name.split('Ü').join("Ü");
        name=name.split('à').join("à");
        name=name.split('Ô').join("Ô");
        name=name.split('ä').join("ä");
        return name;""",
    version="1.0.0",
    description="A function used to decode HTML entities",
    argument_list=[Argument(name="name", type="STRING")],
    return_type="STRING",
    language="javascript",
    destination_data_mart=None, # only required when creating a function in a data_mart project,
)

Example of a transformation that uses the function “simple_mult_func” defined in the staging stage :

QUERY: |
  SELECT val, self.staging.simple_mult_func(val) AS result
  FROM UNNEST([1,2,3,4]) AS val;

VERSION: 1.0.0

STATIC: true