#!/bin/bash

set -e

PSQL="psql -Xc"
BASE_LINES=1000
SCALES=(1 10 100 1000)
MIN_WORKERS=0
MAX_WORKERS=8

cleanup() {
    ${PSQL} "VACUUM;"
    ${PSQL} "CHECKPOINT;"
    ${PSQL} "SELECT pg_switch_wal();"
}

${PSQL} "ALTER SYSTEM SET max_parallel_maintenance_workers = ${MAX_WORKERS};"
${PSQL} "SELECT pg_reload_conf();"
ret=$(psql -AXtc "SELECT current_setting('max_parallel_maintenance_workers')::int <= current_setting('max_worker_processes')::int;")

if [[ ${ret} != "t" ]]; then
    echo "Unexpected: ${ret}"
    exit 1
fi

${PSQL} "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;"
${PSQL} "SELECT pg_stat_statements_reset();"

for SCALE in ${SCALES[@]}; do
    NB=$((${BASE_LINES} * ${SCALE}))
    echo "Setup with scale ${SCALE} (${NB} lines)"
    ${PSQL} "DROP TABLE IF EXISTS t1;"
    ${PSQL} "CREATE TABLE t1 (id integer);"
    ${PSQL} "INSERT INTO t1 SELECT generate_series(1, ${NB});"

    for PASS in "a" "b"; do
        for WORKER in $(seq ${MIN_WORKERS} ${MAX_WORKERS}); do
            echo "Test with ${WORKER} workers, pass ${PASS}"
            IDXNAME=$(printf "t1_idx_s%03d_p${PASS}_w${WORKER}" ${SCALE})
            ${PSQL} "ALTER TABLE t1 SET (parallel_workers = ${WORKER});"
            cleanup
            ${PSQL} "CREATE INDEX ${IDXNAME} ON t1 (id);"
        done
    done
done

echo "Summarry of indexes size:"
${PSQL} "SELECT pg_relation_size(oid), string_agg(relname, ', ') FROM pg_class WHERE relname LIKE 't1_idx%' GROUP BY 1"

echo "CREATE INDEX WAL stats:"
${PSQL} "SELECT query, wal_bytes, wal_records, wal_num_fpw FROM pg_stat_statements WHERE query ILIKE '%create index%' ORDER BY query;"

echo "INSERT WAL testing"
${PSQL} "SELECT pg_stat_statements_reset();"

for SCALE in ${SCALES[@]}; do
    NB=$((${BASE_LINES} * ${SCALE}))
    echo "INSERT test with scale ${SCALE} (${NB} lines)"
    for PASS in "a" "b"; do
        TBLNAME=$(printf "t_%03d_${PASS}" ${SCALE})
        ${PSQL} "DROP TABLE IF EXISTS ${TBLNAME};"
        ${PSQL} "CREATE TABLE ${TBLNAME} (id integer);"
        cleanup
        ${PSQL} "INSERT INTO ${TBLNAME} SELECT generate_series(1, ${NB});"
    done
done

echo "INSERT WAL stats:"
${PSQL} "SELECT query, wal_bytes, wal_records, wal_num_fpw FROM pg_stat_statements WHERE query ILIKE '%INSERT INTO%' ORDER BY query;"
