Filters

A filter (also known as a rule) is a shorthand expression that allows you to select IP addresses from the ipinterface table. The rule builds the WHERE clause of a SQL query. The database-schema.xml file in the /opt/opennms/etc directory informs the filter parser which tables can be used in an expression.

Explanation of database-schema.xml file

Each table the filter code uses appears in a <table> tag. If a table has an attribute of visible=false, then none of the columns in that table can be used in the WHERE clause and thus cannot appear in the rule. You will get a syntax exception if it sees any non-visible columns in the rule. The same applies to a non-visible column in a table.

A <join> tag tells the filter module how to relate this table to the ipinterface table.

Operators

You can use C/Java-style comparison operators with data types they apply to. (You can use == and != on strings, as well as the SQL LIKE keyword.)

For LIKE comparisons, the character "_" matches any single character and "%" matches any series of characters (or none at all). For example, "F_o%"" matches "Foo", "Foom", and "Flowers" but not "Foip".

To handle NULL values (which include cases where you’ve joined across to a table where there is no matching row), use the IS NULL and IS NOT NULL operators. Comparing a null value to anything with any other operator always returns false, so categoryName != 'SomeCategory' will not return anything with a null categoryName. Instead, you would need to use categoryName != 'SomeCategory' | categoryName IS NULL to exclude all nodes that are tagged with SomeCategory.

You can use parentheses to group expressions and can apply boolean operators anywhere in an expression.

In a departure from C/Java convention, boolean operators are single characters rather than double, so they look more like the bitwise arithmetic operators in C:
Operator Bitwise Expression

AND

&

OR

|

NOT

!

Each comparison is joined together with the & or | operators meaning logical AND, logical OR operations. Anything delimited by an & or | character gets translated into a sub-select that selects IP addresses based on the comparison for that clause.

Depending on the format you use in your rules, you might need to escape your AND operator. See Rule_formats.

Here is an example:

Rule:

(nodesysname == 'something') & (snmpifdescr == 'something else')

SQL

SELECT DISTINCT ipInterface.ipAddr
FROM ipinterface
JOIN node ON (ipInterface.nodeID = node.nodeID)
JOIN snmpInterface ON (ipInterface.snmpinterfaceid = snmpInterface.id)
WHERE (node.nodesysname = 'something')
AND (snmpInterface.snmpifdescr = 'something else')
LIMIT 1

The IPLIKE function is shorthand to call a PostgreSQL function that was written in C to compare ipaddresses using *, lists, and ranges. isService is shorthand to build a complicated join to match on a service name. notisService is also available.