#!/usr/bin/env bash

set -e

PATH_OLD=$PATH
DATADIR=/mnt/raid-nvme/data-fk-batch
BRANCHES="master fk-batch-64 fk-batch-16 fk-batch-256"
BUILDS=/home/tomas/builds
BUILDSHP=/home/tomas/builds-tmpfs
RUNS=3

export MALLOC_TOP_PAD_=$((64*1024*1024))

TS=$(date +%Y%m%d-%H%M%S)
mkdir $TS

killall -9 postgres || true
sleep 1

rm -Rf $DATADIR

# copy all binaries into the huge-page tmpfs mount
rm -Rf $BUILDSHP/*
cp -R $BUILDS/* $BUILDSHP/


PATH=$BUILDSHP/master/bin:$PATH_OLD

pg_ctl -D $DATADIR init
pg_checksums --disable $DATADIR

for rows_1 in 100000 1000000; do
#for rows_1 in 100000 1000000 10000000; do

	for rows_2 in 100000 1000000; do
	#for rows_2 in 10000 100000 1000000; do

		for order_1 in seq rand; do

			for sb in 128MB 8GB; do

				for tt in logged unlogged; do

					if [ "$tt" == "logged" ]; then
						t=""
					else
						t="unlogged"
					fi

					for b in $BRANCHES; do

						cp postgresql.conf $DATADIR

						echo "shared_buffers = '$sb'" >> $DATADIR/postgresql.conf
						echo 'io_workers = 12' >> $DATADIR/postgresql.conf

						PATH=$BUILDSHP/$b/bin:$PATH_OLD

						pg_ctl -D $DATADIR -l $TS/pg.log start

						dropdb --if-exists test
						createdb test

						psql test -c "create $t table t1 (a int primary key, b int)"
						psql test -c "create $t table t2 (a int references t1(a), b int)"
						psql test -c "create $t table t2_seq (a int, b int)"
						psql test -c "create $t table t2_rand (a int, b int)"

						if [ "${order_1}" == "rand" ]; then
							psql test -c "insert into t1 select i, i from generate_series(1, ${rows_1}) s(i) order by random()"
						else
							psql test -c "insert into t1 select i, i from generate_series(1, ${rows_1}) s(i)"
						fi

						psql test -c "insert into t2_seq select 1 + mod(i, ${rows_1}), i from generate_series(1, ${rows_2}) s(i)"
						psql test -c "insert into t2_rand select 1 + mod((${rows_1} * random())::int, ${rows_1}), i from generate_series(1, ${rows_2}) s(i)"

						psql test -c "vacuum analyze"
						psql test -c "checkpoint"

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

							psql test -c "truncate t2"

							psql test > tmp.log  <<EOF
\timing
insert into t2 select * from t2_seq;
EOF

							d=$(grep 'Time: ' tmp.log | awk '{print $2}')

							echo $rows_1 $rows_2 $sb $tt $b $order_1 seq $r $d >> $TS/results.csv

							psql test -c "truncate t2"

							psql test > tmp.log  <<EOF
\timing
insert into t2 select * from t2_rand;
EOF

							d=$(grep 'Time: ' tmp.log | awk '{print $2}')

							echo $rows_1 $rows_2 $sb $tt $b $order_1 rand $r $d >> $TS/results.csv

						done

						pg_ctl -D $DATADIR -l $TS/pg.log stop

					done

				done

			done

		done

	done

done
