Universal Filters
This document describes Zeenea's scanner universal filtering system, a powerful tool designed to give you precise control over which assets are imported from your data sources.
With filters, you can create a set of rules to include or exclude specific items based on their names, ids, or other attributes. This is the perfect way to keep your data catalog clean and relevant, for example by:
- Including only production assets.
- Excluding temporary tables or test reports.
- Focusing on assets from specific teams or projects.
- Rooting items to specific catalogs
This feature is available for Scanner version 79 and above.
It is available for the following plugins :
- PowerBI V2
- Tableau V2
- DBT Cloud
Core Concepts
Understanding two core concepts is key to mastering filters:
- Rules are Processed in Order: The filter is a list of rules that you define. When scanning a source, Zeenea checks an item (like a table or a report) against your rules from top to bottom.
- The First Match Wins: As soon as an item matches a rule's conditions, Zeenea applies the corresponding
ACCEPT
orREJECT
action and immediately stops processing. No further rules are checked for that item.
If an item goes through the entire list without matching any rule, it will be accepted by default. For this reason, we strongly recommend that your last rule is a "catch-all" reject rule to prevent unwanted assets from being imported.
A rule is defined by several key properties that work together. You must specify its id
(a unique name), its action
(ACCEPT
or REJECT
), and an optional catalog
to which it is being rooted. If catalog
is not defined, thr default catalog will be used. The conditions themselves are defined within a rules
block, where you list all the criteria an item must meet for the rule to apply.
Example: Include Only a Specific Workspace
The logic is:
- Rule 1: If an item is in the "Zeenea" workspace,
ACCEPT
it and root it to "Zeenea Catalog". - Rule 2: If it is not in the "Zeenea" workspace,
REJECT
it.
This filter will accept items from the "Zeenea" workspace and reject all others.
filters = [
{
id = "accept_zeenea_workspace"
action = ACCEPT
catalog = "Zeenea Catalog"
rules {
workspace_name = "Zeenea"
}
},
{
id = "default_reject"
action = REJECT
}
]
Building Your Rules
Each rule you create is an object with four parts:
id
: A unique name you give the rule for easy identification.action
: The action to perform:ACCEPT
(to keep the item) orREJECT
(to discard it).catalog
: The catalog identifier where items are rooted (optional)rules
: A block where you define the conditions for the match. If this block is empty or missing, it matches everything.
The attributes you can use as keys inside the rules
block (e.g., schema
, table
, workspace_name
) depend entirely on the technology being scanned. A database connector will offer keys like schema
and table
, while a business intelligence tool connector will have keys like report_name
or dashboard_id
. Therefore, it is essential to consult the documentation for the specific connector you are configuring to see the complete list of available filter keys.
Defining Conditions: Matching Values
The rules
block is where you set the conditions based on an item's attributes (like schema
, table
, workspace_name
, etc.). You can match values in three powerful ways.
-
Exact Matching
This is the default. If you provide a value without any special characters, Zeenea will look for an exact match.
Example: This condition only matches if the schema is exactly
production
.rules {
schema = "production"
} -
Pattern Matching with Wildcards (
*
and?
)You can use wildcards for more flexible matching. This is the most common way to match patterns.
*
matches any number of characters.?
matches any single character.
Example: This condition matches any table starting with
FACT_
in theanalytics
schema.rules {
schema = "analytics"
table = "FACT_*"
} -
Advanced Pattern Matching (Regular Expressions)
For maximum power and precision, you can use regular expressions by adding the
regex:
prefix. This is an advanced feature for complex matching needs.-
Example 1: Match one of several prefixes
The pattern
(HR|IT|MARKET)_
matches anything that starts withHR_
,IT_
, orMARKET_
.Example: This condition accepts tables from the HR, IT, or Market departments.
rules {
table = "regex:(HR|IT|MARKET)_.*"
} -
Example 2: Exclude a prefix
The pattern
^(?!TMP_).*
is a very useful one that means "does not start withTMP_
".Example: This condition matches tables that DO NOT start with
TMP_
.rules {
table = "regex:^(?!TMP_).*"
}
-