///|
fn sorted_query_metric_pairs(
  report : BenchmarkReport,
  metric : String,
) -> Array[(String, Double)] {
  let pairs : Array[(String, Double)] = []
  for query in report.queries {
    pairs.push((query.query_id, query.metrics.get_or_default(metric, 0.0)))
  }
  pairs.sort_by(fn(a, b) {
    let by_value = b.1.compare(a.1)
    if by_value == 0 {
      a.0.compare(b.0)
    } else {
      by_value
    }
  })
  pairs
}

///|
pub fn top_query_ids(
  report : BenchmarkReport,
  metric : String,
  limit : Int,
) -> Array[String] {
  let pairs = sorted_query_metric_pairs(report, metric)
  let result : Array[String] = []
  for index in 0.. Array[String] {
  let pairs = sorted_query_metric_pairs(report, metric)
  pairs.sort_by(fn(a, b) {
    let by_value = a.1.compare(b.1)
    if by_value == 0 {
      a.0.compare(b.0)
    } else {
      by_value
    }
  })
  let result : Array[String] = []
  for index in 0.. BenchmarkReport {
  let allowed : Map[String, Unit] = Map([])
  for query_id in query_ids {
    allowed[query_id] = ()
  }
  let queries = report.queries.filter(fn(query) {
    allowed.contains(query.query_id)
  })
  {
    cutoffs: report.cutoffs.copy(),
    relevant_threshold: report.relevant_threshold,
    query_count: queries.length(),
    queries,
    summary: summarize_queries(queries),
  }
}

///|
pub fn select_queries_by_score(
  report : BenchmarkReport,
  metric : String,
  minimum : Double,
) -> Array[String] {
  sorted_query_metric_pairs(report, metric)
  .filter(fn(pair) { pair.1 >= minimum })
  .map(fn(pair) { pair.0 })
}

///|
pub fn query_metric_rows(
  report : BenchmarkReport,
  metric_names : Array[String],
) -> String {
  let rows : Array[String] = []
  let header = ["query_id", ..metric_names].join(",")
  rows.push(header)
  for query in report.queries {
    let values : Array[String] = [query.query_id]
    for name in metric_names {
      values.push(query.metrics.get_or_default(name, 0.0).to_string())
    }
    rows.push(values.join(","))
  }
  rows.join("\n")
}