Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin
Panel

Please see the Pentaho InfoCenter for the latest version of this document: http://infocenter.pentaho.com/help/topic/pme_user_guide/concept_pme_metadata_formulas.html

Formula Overview

Formulas have two multiple uses in Pentaho Metadata. 

...

The second use is in the definition of Physical Table Columns.  In addition to Physical table columns mapping directly to a database table column, physical table columns defined in Pentaho Metadata may also be defined as a formula. This allows for combining of multiple columns into a single column, and also for doing more advanced aggregate calculations within aggregate table definitions.

The third use is in the definition of complex joins within business model relationships.  This allows for multiple key joins as well as other logic when joining tables.

The fourth use is row level security.

Under the covers, Pentaho Metadata uses JFreeReport's libFormula package for interpreting formulas.  The goal is to support OpenFormula syntax within the Metadata environment.  Formulas are first interpreted by libFormula, and then within the Metadata system are converted to native SQL depending on the type of database used.

...

The references here specifically refer to the database column, not derived physical column definitions.  All operators and functions may be used in the definition of the physical table column.  One special note, in order for this formula to be recognized, the "isExact" property of the physical table column must be set to true. Also note, the referenced physical column must be explicitly defined in the metadata model.

Recent Changes to Physical Table Column Formulas

...

In earlier versions of Pentaho Metadata Editor, (prior to the CITRUS release), aggregation functions had to be specified explicitly and the aggregation rule had to be selected. This is no longer required, necessary; the query that is generated will use the selected aggregation rule when executing. This means you are longer required to designate just one aggregation rule in the model. You can designate multiple aggregation rules from which users can choose when they are working in the Chart Designer or other tool.

Note: This feature will not be supported for users of Ad Hoc Reporting.

In the example below, the model designer has designated three aggregation rules for Priceeach: Sum, Average, and Count. In the Chart Designer, (or other tool), users can decide whether they want to see the total price, average price, or the number of prices available.

during execution. See Defining the Physical Column Aggregations for more information.

Multi-table expressions: Formulas can use any business column in the model

...

For example suppose we have 2 two business tables:

  • Orders (fact table), ID=BT_ORDER_FACT
  • Product (dimension), ID=BT_PRODUCT

...

Code Block
[<PHYSICAL_COLUMN_NAME>]

MQL Parameter References:

Code Block

[param:PARAM_NAME]

Supported Functions

Function Name

Parameters

Description

Example

OR

2 two or more boolean expression parameters

Returns true if one or more parameters are true

OR(
[BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME] = "EuroCars";
[BT_CUSTOMERS.BC_CUSTOMERS_CREDITLIMIT] > 1000
)

AND

2 two or more boolean expression parameters

Returns true if all parameters are true

AND(
[BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME] = "EuroCars";
[BT_CUSTOMERS.BC_CUSTOMERS_CREDITLIMIT] > 1000
)

LIKE

2 two parameters

Compares a column to a regular expression, using "%" as wild cards

LIKE([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME]; "%SMITH%")

CONTAINS

two parameters

Determines if a column contains a string.

CONTAINS([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME]; "SMITH")

BEGINSWITH

two parameters

Determines if a column begins with a string.

BEGINSWITH([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME]; "JOE")

ENDSWITH

two parameters

Determines if a column ends with a string.

ENDSWITH([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME]; "SMITH")

IN

2 two or more parameters

Checks to see if the first parameter is in the following list of parameters

IN([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME]; "Adam Smith"; "Brian Jones")

NOW

none

The current date

NOW()

DATE

3 three numeric parameters, year, month, and day

A specified date

DATE(2008;4;15)

DATEVALUE

1 one text parameter "year-month-day"

A specified date

DATEVALUE("2008-04-15")

CASE

2 two or more parameters

Evaluates the first, third, etc parameter, and returns the second, fourth, etc parameter value
if there are an odd number of parameters, the last parameter is returned if no other parameter evaluates to true.
Note that when using this function, the formula needs to be set on a new column, not on the BT_CUSTOMER.BC_CUSTOMER_CUSTOMERNAME (using the example to the right)

CASE(
[BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME] = "EuroCars";
"European Cars";
[BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME] = "AsiaCars";
"Asian Cars";
"Unknown Cars"
)

COALESCE

1 one or more parameters

returns the first non null parameter

COALESCE(
[BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERNAME];
[BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERID];
"Customer is Null"
)

DATEMATH

1 one expression parameter

returns a date based on an expression. Important note - this does NOT return a timestamp irrespective of the implementation details mentioned in the description to the right.DateMath Javadoc for full syntax

DATEMATH("0:ME -1:DS") - 00:00:00.000 of the day before the last day of the current month
DATEMATH("0:MS  0:WE") - 23:59:59.999 the last day of the first week of the month
DATEMATH("0:ME") - 23:59:59.999 of the last day of the current month
DATEMATH("5:Y") -  the current month, day and time 5 years in the future
DATEMATH("5:YS") - 00:00:00.000 of the first day of the years 5 years in the future

ISNA

one parameter

returns true if the value is null

ISNA([BT_CUSTOMERS.BC_CUSTOMERS_CUSTOMERID])

NULL

none

returns the null value

NULL()

TRUE

none

returns true

TRUE()

FALSE

none

returns false

FALSE()

  • see below for aggregate functions

...