#!/bin/bash

DURATION_WARMUP=120
DURATION_TEST=60
RUNS=5

for n in 100 1000 10000 100000 1000000; do

	dropdb --if-exists test
	createdb test

	echo 'BEGIN;' > create.$n.sql

	for i in `seq 1 $n`; do
		echo "CREATE TABLE t_$i (a INT);" >> create.$n.sql
		echo "INSERT INTO t_$i VALUES (1);" >> create.$n.sql

		x=$((i % 10000))
		if [ "$x" == "0" ]; then
			echo "COMMIT;" >> create.$n.sql
			echo "BEGIN;" >> create.$n.sql
		fi
	done

	echo 'COMMIT;' >> create.$n.sql

	psql test < create.$n.sql > create.$n.log 2>&1

	if [ "$?" != "0" ]; then
		echo "failed $n"
		continue
	fi

	psql test -c "vacuum analyze" > vacuum.$n.log 2>&1
	psql test -c "checkpoint" > checkpoint.$n.log 2>&1

	echo "\set x random(1,$n)" > select.$n.sql
	echo "SELECT 1 FROM t_:x" >> select.$n.sql

	# WARMUP

	pgbench -n -T $DURATION_WARMUP -f select.$n.sql test > pgbench.$n.warmup.log 2>&1

	if [ "$?" != "0" ]; then
		echo "failed $n/warmup"
		continue
	fi

	# UNIFORM ACCESS

	for r in `seq 1 $RUNS`; do
		pgbench -n -T $DURATION_TEST -f select.$n.sql test > pgbench.uniform.$n.$r.log 2>&1

		if [ "$?" != "0" ]; then
			echo "failed $n/$r"
			continue
		fi

		t=`grep excluding pgbench.uniform.$n.$r.log | awk '{print $3}'`
		echo uniform $n $r $t
	done

        echo "\set x random_exponential(1,$n,10.0)" > select.exp.$n.sql
        echo "SELECT 1 FROM t_:x" >> select.exp.$n.sql

	# EXPONENTIAL ACCESS

        for r in `seq 1 $RUNS`; do
                pgbench -n -T $DURATION_TEST -f select.exp.$n.sql test > pgbench.exp.$n.$r.log 2>&1

                if [ "$?" != "0" ]; then
                        echo "failed $n/$r"
                        continue
                fi

                t=`grep excluding pgbench.exp.$n.$r.log | awk '{print $3}'`
                echo exponential $n $r $t
        done

done
