query method

Future<QueryResult> query(
  1. String statement, [
  2. QueryOptions? options
])

Executes a SQL++ query against the cluster.

Implementation

Future<QueryResult> query(String statement, [QueryOptions? options]) async {
  options ??= const QueryOptions();

  final positionalParameters = <String>[];
  final namedParameters = <String, String>{};
  final parameters = options.parameters;
  if (parameters is List<Object?>) {
    parameters.map(jsonEncode).forEach(positionalParameters.add);
  } else if (parameters is Map<String, Object?>) {
    parameters
        .forEach((key, value) => namedParameters[key] = jsonEncode(value));
  } else if (parameters != null) {
    throw ArgumentError.value(
      parameters,
      'parameters',
      'must be a Map<String, Object?> or List<Object?>',
    );
  }

  final raw = <String, String>{};
  if (options.raw != null) {
    for (final entry in options.raw!.entries) {
      final key = entry.key;
      final value = entry.value;
      if (value != null) {
        raw[key] = jsonEncode(value);
      }
    }
  }

  final response = await _connection.query(
    QueryRequest(
      statement: statement,
      positionalParameters: positionalParameters,
      namedParameters: namedParameters,
      scanConsistency: options.scanConsistency?.toMessage(),
      mutationState: options.consistentWith?.tokens ?? const [],
      adhoc: options.adhoc,
      flexIndex: options.flexIndex,
      preserveExpiry: options.preserveExpiry,
      clientContextId: options.clientContextId,
      maxParallelism: options.maxParallelism,
      pipelineBatch: options.pipelineBatch,
      pipelineCap: options.pipelineCap,
      scanWait: options.scanWait,
      scanCap: options.scanCap,
      readonly: options.readOnly,
      profile: options.profile.toMessage(),
      metrics: options.metrics,
      queryContext: options.queryContext,
      raw: raw,
      timeout: options.timeout ?? _options.timeouts.queryTimeout,
      sendToNode: null,
      bodyStr: '',
    ),
  );

  return QueryResult(
    rows: response.rows.map(jsonDecode).cast<Map<String, Object?>>().toList(),
    meta: response.meta.toApi(),
  );
}