Functions & Expressions

JAO provides a comprehensive set of database functions and expressions for complex queries.

F Expressions

Use F to reference field values in expressions:

dart
// Compare fields to each other
Authors.objects.filter(Authors.$.age.gtF(F('minAge')));

// Arithmetic with fields
await Posts.objects
  .filter(Posts.$.id.eq(1))
  .update({'viewCount': F('viewCount') + 1});

// Field arithmetic in annotations
Authors.objects.annotate({
  'age_in_months': F('age') * 12,
});

Arithmetic Operators

dart
F('field') + value   // Addition
F('field') - value   // Subtraction
F('field') * value   // Multiplication
F('field') / value   // Division
F('field') % value   // Modulo

Field-to-Field Comparisons

dart
// Where updated_at is after created_at
Authors.objects.filter(
  Authors.$.updatedAt.gtField(Authors.$.createdAt)
);

Aggregate Functions

Use in aggregate() or annotate():

dart
final stats = await Authors.objects.aggregate({
  'total': Count.all(),
  'avg_age': Avg(Authors.$.age.col),
  'max_age': Max(Authors.$.age.col),
  'min_age': Min(Authors.$.age.col),
  'sum_age': Sum(Authors.$.age.col),
});

Count

dart
Count.all()                    // COUNT(*)
Count(Authors.$.id)            // COUNT(id)
Count(Authors.$.id, distinct: true)  // COUNT(DISTINCT id)

Sum, Avg, Min, Max

dart
Sum(Authors.$.age.col)
Avg(Authors.$.age.col)
Min(Authors.$.createdAt.col)
Max(Authors.$.createdAt.col)

Statistical Functions

dart
StdDev(Authors.$.age.col)     // Standard deviation
Variance(Authors.$.age.col)   // Variance

String Aggregation

dart
// Concatenate all names with comma separator
StringAgg(Authors.$.name.col, ', ')

Array Aggregation (PostgreSQL)

dart
ArrayAgg(Authors.$.name.col)
ArrayAgg(Authors.$.name.col, distinct: true)

JSON Aggregation

dart
JsonAgg(Authors.$.name.col)

Conditional Functions

Coalesce

Return first non-null value:

dart
Coalesce([Authors.$.nickname.col, Authors.$.name.col])

// With default value
Coalesce.withDefault(Authors.$.nickname.col, 'Anonymous')

NullIf

Return null if values are equal:

dart
NullIf(Authors.$.status.col, Value('inactive'))

Greatest / Least

dart
Greatest([Authors.$.score1.col, Authors.$.score2.col, Authors.$.score3.col])
Least([Authors.$.price1.col, Authors.$.price2.col])

Case / When

Conditional expressions:

dart
Case(
  [
    When(Authors.$.age.lt(18), then: Value('minor')),
    When(Authors.$.age.lt(65), then: Value('adult')),
  ],
  orElse: Value('senior'),
)

Usage in annotation:

dart
final results = await Authors.objects
  .annotate({
    'age_group': Case(
      [
        When(Authors.$.age.lt(18), then: Value('minor')),
        When(Authors.$.age.lt(65), then: Value('adult')),
      ],
      orElse: Value('senior'),
    ),
  })
  .toList();

String Functions

Length

dart
Length(Authors.$.name.col)

Case Conversion

dart
Lower(Authors.$.name.col)
Upper(Authors.$.name.col)

Trim

dart
Trim(Authors.$.name.col)

Substring

dart
Substr(Authors.$.name.col, 1, 10)  // Start at 1, length 10

Concatenation

dart
Concat([
  Authors.$.firstName.col,
  Value(' '),
  Authors.$.lastName.col,
])

Replace

dart
Replace(Authors.$.bio.col, 'old', 'new')

Date/Time Functions

Current Date/Time

dart
CurrentDate()   // Current date only
Now()           // Current timestamp

Extract Parts

dart
Extract.year(Authors.$.createdAt.col)
Extract.month(Authors.$.createdAt.col)
Extract.day(Authors.$.createdAt.col)
Extract.hour(Authors.$.createdAt.col)
Extract.minute(Authors.$.createdAt.col)
Extract.second(Authors.$.createdAt.col)

// Generic extract
Extract('dow', Authors.$.createdAt.col)  // Day of week

Date Truncation

dart
DateTrunc('month', Authors.$.createdAt.col)
DateTrunc('year', Authors.$.createdAt.col)
DateTrunc('day', Authors.$.createdAt.col)

Usage Example

dart
// Group by month
final monthlyStats = await Authors.objects
  .annotate({
    'month': DateTrunc('month', Authors.$.createdAt.col),
    'count': Count.all(),
  })
  .values(['month', 'count'])
  .toList();

Math Functions

Absolute Value

dart
Abs(Authors.$.balance.col)

Rounding

dart
Round(Authors.$.price.col)        // Round to integer
Round(Authors.$.price.col, 2)     // Round to 2 decimal places
Floor(Authors.$.price.col)        // Round down
Ceil(Authors.$.price.col)         // Round up

Power and Roots

dart
Power(Authors.$.base.col, 2)      // Square
Sqrt(Authors.$.value.col)         // Square root

Logarithms

dart
Ln(Authors.$.value.col)           // Natural logarithm
Log(Authors.$.value.col)          // Base-10 logarithm

Using Functions in Queries

In Filters

dart
Authors.objects.filter(
  Length(Authors.$.name.col).gt(10)
);

Authors.objects.filter(
  Extract.year(Authors.$.createdAt.col).eq(2024)
);

In Annotations

dart
final results = await Authors.objects
  .annotate({
    'name_length': Length(Authors.$.name.col),
    'created_year': Extract.year(Authors.$.createdAt.col),
    'full_name': Concat([Authors.$.firstName.col, Value(' '), Authors.$.lastName.col]),
  })
  .toList();

In Order By

dart
Authors.objects.orderBy(
  Length(Authors.$.name.col).desc()
);

In Updates

dart
await Authors.objects
  .filter(Authors.$.id.eq(1))
  .update({
    'name': Upper(Authors.$.name.col),
    'viewCount': F('viewCount') + 1,
  });

Function Reference

Aggregate Functions

Function Description
Count(expr) Count rows
Count.all() COUNT(*)
Sum(expr) Sum of values
Avg(expr) Average value
Min(expr) Minimum value
Max(expr) Maximum value
StdDev(expr) Standard deviation
Variance(expr) Variance
StringAgg(expr, sep) Concatenate strings
ArrayAgg(expr) Aggregate into array
JsonAgg(expr) Aggregate into JSON

Conditional Functions

Function Description
Coalesce(exprs) First non-null
NullIf(a, b) Null if equal
Greatest(exprs) Maximum value
Least(exprs) Minimum value
Case/When Conditional logic

String Functions

Function Description
Length(expr) String length
Lower(expr) Lowercase
Upper(expr) Uppercase
Trim(expr) Remove whitespace
Substr(expr, start, len) Substring
Concat(exprs) Concatenate
Replace(expr, from, to) Replace text

Date/Time Functions

Function Description
CurrentDate() Current date
Now() Current timestamp
Extract(part, expr) Extract date part
DateTrunc(prec, expr) Truncate date

Math Functions

Function Description
Abs(expr) Absolute value
Round(expr, places) Round
Floor(expr) Round down
Ceil(expr) Round up
Power(base, exp) Exponentiation
Sqrt(expr) Square root
Ln(expr) Natural log
Log(expr) Base-10 log