Skip to content

Label Expressions Guide ​

Overview ​

Label expressions provide a powerful query language for filtering Wanaku entities (tools, resources, namespaces) based on their labels using logical operators and conditions.

Labels are key-value pairs attached to entities for categorization and filtering. Label expressions allow you to write complex queries that combine multiple conditions using logical operators.

Quick Start ​

Basic Filtering ​

List all weather-related tools:

bash
wanaku tools list -l "category=weather"

List weather tools that perform forecasting:

bash
wanaku tools list -l "category=weather & action=forecast"

List tools that are NOT in production:

bash
wanaku tools list -l "environment!=production"

Expression Syntax ​

Comparison Operators ​

OperatorDescriptionExample
=Equalscategory=weather
!=Not equalsstatus!=deprecated

Logical Operators ​

OperatorDescriptionExample
&Logical ANDcategory=weather & version=2.0
|Logical ORcategory=weather | category=news
!Logical NOT!deprecated=true
( )Grouping(a=1 | b=2) & c=3

Operator Precedence ​

Operators are evaluated in this order (highest to lowest):

  1. ! (NOT) - Highest precedence
  2. & (AND) - Medium precedence
  3. | (OR) - Lowest precedence

Tip: Use parentheses ( ) to override default precedence and make expressions clearer.

Expression Examples ​

Simple Equality ​

Match tools where category equals "weather":

category=weather

Inequality ​

Match tools where environment is NOT production:

environment!=production

AND Conditions ​

Match weather tools with version 2.0:

category=weather & version=2.0

Match production tools that are stable:

environment=production & status=stable

OR Conditions ​

Match tools that are either weather or news:

category=weather | category=news

Match tools with beta or stable status:

status=beta | status=stable

NOT Conditions ​

Match weather tools that are NOT forecasts:

category=weather & !action=forecast

Match tools that are NOT deprecated:

!deprecated=true

Complex Expressions ​

Match production-ready weather or news tools:

(category=weather | category=news) & environment=production

Match non-production tools that are not deprecated:

environment!=production & !deprecated=true

Match version 2.0 tools with stable or beta status:

version=2.0 & (status=stable | status=beta)

Match tools that are either in production, or are beta weather tools:

environment=production | (status=beta & category=weather)

Understanding Operator Precedence ​

Example 1: AND before OR ​

Expression:

a=1 | b=2 & c=3

This is evaluated as:

a=1 | (b=2 & c=3)

Matches when:

  • a=1, OR
  • Both b=2 AND c=3

Example 2: NOT before AND ​

Expression:

!a=1 & b=2

This is evaluated as:

(!a=1) & b=2

Matches when:

  • a does NOT equal 1, AND
  • b=2

Example 3: Using Parentheses ​

Expression:

(a=1 | b=2) & c=3

Matches when:

  • Either a=1 OR b=2, AND
  • c=3

Without parentheses, this would mean something different!

Allowed Characters ​

In Keys and Values ​

  • Letters: a-z, A-Z
  • Numbers: 0-9
  • Hyphen: - (e.g., api-version=2.0)
  • Underscore: _ (e.g., my_category=test)
  • Dot: . (e.g., version=1.2.3)
  • Forward slash: / (e.g., path=/api/v1/tools)

Special Characters ​

  • Operators: &, |, !, =, (, )
  • Whitespace: Spaces for readability (automatically trimmed)

Maximum Length ​

  • 1000 characters maximum per expression

Common Use Cases ​

By Environment ​

List development tools:

environment=development

List all non-production tools:

environment!=production

By Status ​

List stable tools:

status=stable

List tools that are stable or beta:

status=stable | status=beta

List tools that are NOT deprecated:

!deprecated=true

By Category ​

List weather and news tools:

category=weather | category=news

List finance tools that are NOT deprecated:

category=finance & !deprecated=true

By Version ​

List version 2.x tools:

version=2.0 | version=2.1 | version=2.2

List tools that are NOT version 1.0:

version!=1.0

Complex Scenarios ​

Production-ready, stable weather tools:

category=weather & environment=production & status=stable

Beta or alpha tools, but not deprecated:

(status=beta | status=alpha) & !deprecated=true

Weather or news tools in development or staging:

(category=weather | category=news) & (environment=development | environment=staging)

Parser Safety ​

Input Validation ​

All label expressions are validated for safety:

  • Character whitelist: Only allows safe characters (alphanumeric, operators, safe punctuation)
  • Length limit: Maximum 1000 characters (prevents DoS attacks)
  • Parser safety: Rejects invalid characters that could cause parser errors

Invalid Characters ​

These characters are rejected and will cause an error:

  • Semicolon: ;
  • Quotes: ', "
  • Backtick: `
  • Backslash: \
  • Angle brackets: <, >
  • Dollar sign: $
  • Curly braces: {, }
  • Square brackets: [, ]

Example: Rejected Input ​

bash
# This will fail - contains invalid semicolon
wanaku tools list -l "category=weather; DROP TABLE"

# Error: Query contains invalid characters

How It Works ​

Label filtering uses in-memory evaluation with Java streams:

  1. Parse the expression into a predicate function
  2. Fetch all entities from the cache
  3. Filter using Java streams by applying the predicate to each entity's labels
  4. Return only matching entities

This approach ensures:

  • ✅ Accurate correlation of label keys and values
  • ✅ Support for complex nested expressions
  • ✅ No database query limitations
  • ✅ Safe evaluation (no injection attacks)

Troubleshooting ​

"Query contains invalid characters" ​

Cause: Expression contains characters not in the whitelist.

Solution: Remove special characters. Only use alphanumeric, operators (&, |, !, =), parentheses, hyphens, underscores, dots, and forward slashes.

"Expected ')' after expression" ​

Cause: Unmatched parentheses in expression.

Solution: Ensure every opening ( has a matching closing ).

Example:

bash
# Wrong - missing closing parenthesis
(category=weather & action=forecast

# Correct
(category=weather & action=forecast)

"Expected label value after '='" ​

Cause: Missing value after = or != operator.

Solution: Provide a value after the operator.

Example:

bash
# Wrong - missing value
category=

# Correct
category=weather

"Query string too long" ​

Cause: Expression exceeds 1000 characters.

Solution: Simplify the expression or split into multiple queries.

No Results Returned ​

Possible causes:

  1. Case sensitivity: Label matching is case-sensitive

    • category=Weather ≠ category=weather
  2. Exact matching: Values must match exactly

    • version=2 ≠ version=2.0
  3. Label not present: Entity doesn't have the specified label

    • Use != to match entities without a label

Tips:

  • Verify labels are correctly set on entities
  • Check for typos in label keys and values
  • Test with simpler expressions first

Tips and Best Practices ​

Use Descriptive Labels ​

Good:

environment=production
status=stable
category=weather-forecast
version=2.1.0

Avoid:

env=prod
st=1
cat=wthr
v=2

Use parentheses to make complex expressions clearer:

Good:

(category=weather | category=news) & (status=stable | status=beta)

Less clear:

category=weather | category=news & status=stable | status=beta

Test Incrementally ​

Build complex expressions step by step:

  1. Start simple: category=weather
  2. Add conditions: category=weather & status=stable
  3. Add complexity: (category=weather | category=news) & status=stable

Use Whitespace ​

Add spaces for readability - they're automatically trimmed:

Good:

category=weather & status=stable | environment=production

Works, but harder to read:

category=weather&status=stable|environment=production

Examples ​

bash
# List all tools with label filter
wanaku tools list -l "category=weather"

# List with multiple conditions
wanaku tools list -l "(category=weather | category=news) & environment=production"

# List without filter (show all)
wanaku tools list

Additional Resources ​

  • Label Expression Grammar: See LabelQueryParser.java class documentation
  • CLI Help: Run wanaku tools list --help for command-specific help

Summary ​

Label expressions provide a powerful, safe, and flexible way to filter Wanaku entities:

  • Simple syntax with familiar logical operators
  • Complex queries with AND, OR, NOT, and grouping
  • Safe evaluation with input validation and in-memory filtering
  • Case-sensitive exact matching
  • No injection risks - safe for user input

Start with simple expressions and build up to complex queries as needed. Use parentheses to make expressions clear and test incrementally.