#!/bin/sh

set -e -u

DBNAME="regress"

psql $DBNAME <<__END__
CREATE EXTENSION IF NOT EXISTS hstore;

DROP TABLE IF EXISTS old_prefs, new_preferences;

CREATE TABLE old_prefs (
   user_id integer,
   name character varying,
   value character varying
);

CREATE TABLE new_preferences (
   user_id integer,
   prefs hstore
);

INSERT INTO old_prefs ( user_id, name, value )
SELECT genid, 'dummy', 'random' FROM generate_series(1,100000) AS genid;

-- Produce a crappy random distribution

INSERT INTO old_prefs(user_id, name, value) SELECT user_id, 'random', 'generated'
FROM old_prefs CROSS JOIN generate_series(1,40) AS t WHERE random() < 0.02;

INSERT INTO old_prefs(user_id, name, value) SELECT user_id, 'random', 'generated'
FROM old_prefs CROSS JOIN generate_series(1,40) AS t WHERE random() < 0.01;

INSERT INTO old_prefs(user_id, name, value) SELECT user_id, 'random', 'generated'
FROM old_prefs CROSS JOIN generate_series(1,40) AS t WHERE random() < 0.005;

INSERT INTO old_prefs(user_id, name, value) SELECT user_id, 'random', 'generated'
FROM old_prefs CROSS JOIN generate_series(1,40) AS t WHERE random() < 0.0025;

-- get stats
SELECT avg(nn), max(nn) FROM (SELECT count(name) AS nn FROM old_prefs GROUP BY user_id) AS x
__END__

coproc psql --quiet --no-align --no-readline --tuples-only -P footer=off --no-password "$DBNAME"

trap '
  if test -v COPROC_PID; then
      echo "Killing coprocess ${COPROC_PID}"
      kill $COPROC_PID
  fi
' EXIT

echo 'SELECT pg_backend_pid();' >&${COPROC[1]}
read -u ${COPROC[0]} backend_pid
echo "Backend PID is: ${backend_pid}"

printf "                 "
ps u -p $backend_pid | head -1
printf "Before first     "
ps u -p $backend_pid | tail -1

for iteration in `seq 1 1000000`; do
    echo "INSERT INTO new_preferences SELECT user_id,hstore(array_agg(name), array_agg(value)) FROM old_prefs GROUP BY user_id ; DELETE FROM new_preferences; SELECT 1;" >&${COPROC[1]}
    if test $(( iteration % 20 )) -eq 0 -o $iteration -lt 5; then
        printf "Iteration %-6i " ${iteration}
        ps u -p $backend_pid | tail -1
    fi
    read -u ${COPROC[0]}
done

echo "\q" >&${COPROC[1]}
wait %1
