over method

Expr over(
  1. Iterable<Expr> partitionBy, {
  2. Iterable<Expr> orderBy = const [],
  3. WindowOptions options = const WindowOptions(),
})

Implementation

Expr over(
  Iterable<Expr> partitionBy, {
  Iterable<Expr> orderBy = const [],
  WindowOptions options = const WindowOptions(),
}) {
  final partitions = List<Expr>.unmodifiable(partitionBy);
  final order = List<Expr>.unmodifiable(orderBy);
  if (partitions.isEmpty && order.isEmpty) {
    throw ArgumentError.value(
      partitionBy,
      'partitionBy',
      'partitionBy and orderBy must not both be empty',
    );
  }
  for (final value in [...partitions, ...order]) {
    _runtime._requireExpr(value);
  }
  final leases = _leaseAll([
    _owner,
    ...partitions.map((value) => value._owner),
    ...order.map((value) => value._owner),
  ]);
  try {
    final orderStart = 1 + partitions.length;
    return _runtime._adoptExpr(
      _runtime._client.invokeSync('exprOver', {
        'input': leases.first.handle.toString(),
        'partitionBy': leases
            .sublist(1, orderStart)
            .map((x) => x.handle.toString())
            .toList(),
        'orderBy': leases
            .skip(orderStart)
            .map((x) => x.handle.toString())
            .toList(),
        ...options._toJson(),
      }),
    );
  } finally {
    _releaseAll(leases);
  }
}