#!/usr/bin/env bash

DATADIR=/mnt/raid-nvme/data-batching
PATH_OLD=$PATH
TS=$(date +%s)
RUNS=20

function time_query
{
	bsql=$1
	sql=$2

	t=$(psql test -t -A -c "select extract(epoch from now())")

	psql test > /dev/null <<EOF
$bsql;
SELECT * FROM ($sql) OFFSET 1000000000;
EOF

	d=$(psql test -t -A -c "select 1000 * (extract(epoch from now()) - $t)")

	echo $d
}

for size in 1000000 10000000 100000000; do

	for aggs in 1 5; do

		if [ "$aggs" == "1" ]; then
			sql1="SELECT avg(a) FROM bar_${size}"
		else
			sql1="SELECT avg(a), avg(b), avg(c), avg(d), avg(e) FROM bar_${size}"
		fi

		for wheres in 0 1 5; do

			if [ "$wheres" == "1" ]; then
				sql="$sql1 WHERE (a > 0)"
			elif [ "$wheres" == "5" ]; then
				sql="$sql1 WHERE (a > 0) AND (b > 0) AND (c > 0) AND (d > 0) AND (e > 0)"
			else
				sql="$sql1"
			fi

			for workers in 0 2; do

				for build in master batching-scan batching-agg; do

					PATH=/home/tomas/builds/$build/bin:$PATH_OLD

					pg_ctl -D $DATADIR -l pg-$build.log start

					psql postgres -c "alter system set max_parallel_workers_per_gather = $workers";
					psql test -c "alter table bar_${size} set (parallel_workers = $workers)"

					pg_ctl -D $DATADIR -l pg-$build.log restart

					for batching in on off; do

						echo "========== size $size aggs $aggs wheres $wheres workers $workers build $build batching $batching =========="

						ps ax | grep postgres

						if [ "$build" == "master" ] && [ "$batching" == "on" ]; then
							continue
						fi

						if [ "$build" != "master" ]; then
							bsql="SET executor_batching = $batching;"
						else
							bsql="--";
						fi

						for r in $(seq 1 $RUNS); do

							d=$(time_query "$bsql" "$sql")

							echo $size $aggs $wheres $workers $build $batching $r $d >> results-$TS.csv

						done

					done

					pg_ctl -D $DATADIR -l pg-$build.log stop

				done

			done

		done

	done

done
