#!/bin/bash
# Inside the build container: phrase and proximity search with the built-in parser, on a release build.
# Usage: bench.sh <build dir> <label>. Prints one line per query and size: label, rows, query, hits, seconds (best of 3).
set -euo pipefail
bld=$1 label=$2 data=/tmp/bench-data-$label sock=/tmp/bench-$label.sock
rm -rf $data; mkdir $data
bash $bld/scripts/mariadb-install-db --no-defaults --srcdir=/work/fts-11.4 --builddir=$bld --datadir=$data --auth-root-authentication-method=normal --skip-test-db --user=root > /tmp/install-$label.log 2>&1
$bld/sql/mariadbd --no-defaults --basedir=$bld --lc-messages-dir=$bld/sql/share --datadir=$data --socket=$sock --skip-networking --user=root --innodb-use-native-aio=0 --innodb-buffer-pool-size=1G --log-error=/tmp/bench-$label.err &
pid=$!
for i in $(seq 1 120); do $bld/client/mariadb-admin --no-defaults -uroot --socket=$sock ping --silent 2>/dev/null && break; sleep 1; done
cli="$bld/client/mariadb --no-defaults -uroot --socket=$sock --batch --skip-column-names"
$cli -e "CREATE DATABASE b; SET GLOBAL innodb_optimize_fulltext_only=ON"
for n in ${SIZES:-10000 20000 40000}; do
  $cli b -e "CREATE TABLE t (id INT PRIMARY KEY, body TEXT, FULLTEXT(body)) ENGINE=InnoDB;
    INSERT INTO t SELECT seq, CONCAT('alpha bravo charlie word', seq MOD 1000) FROM seq_1_to_$n;
    OPTIMIZE TABLE t; OPTIMIZE TABLE t;" > /dev/null
  for q in '"alpha bravo"' '"alpha bravo charlie"' '"alpha charlie" @3'; do
    best=
    for r in 1 2 3; do
      s=$(date +%s.%N)
      hits=$($cli b -e "SELECT COUNT(*) FROM t WHERE MATCH(body) AGAINST('$q' IN BOOLEAN MODE)")
      e=$(date +%s.%N)
      t=$(awk -v a="$s" -v b="$e" 'BEGIN { printf "%.3f", b - a }')
      if [ -z "$best" ] || awk -v t="$t" -v b="$best" 'BEGIN { exit !(t < b) }'; then best=$t; fi
    done
    echo "$label rows=$n query=$q hits=$hits seconds=$best"
  done
  $cli b -e "DROP TABLE t"
done
$bld/client/mariadb-admin --no-defaults -uroot --socket=$sock shutdown; wait $pid || true
