# Semana 10: índices. Un B+ tree en memoria en Node.js (el laboratorio) y los
# índices de PostgreSQL vistos con EXPLAIN y pageinspect. Se usa dentro del
# contenedor del curso.
#
#   make          crea la base de datos chasqui_w10 con los datos de ejemplo,
#                 instala pageinspect y hace VACUUM (ANALYZE): así el
#                 visibility map y las estadísticas quedan en un estado
#                 conocido y los planes del apunte se repiten
#   make test     la vuelve a crear y corre todas las pruebas (*.test.mjs).
#                 Las de bptree.test.mjs fallan hasta que completen el
#                 laboratorio: search, insert y range todavía lanzan
#                 "por implementar"
#   make lab      solo las pruebas del B+ tree (no necesita la base de datos)
#   make big      crea chasqui_w10_big, una copia de chasqui_big (que tiene
#                 que existir: make big en datasets/chasqui), y corre big.sql
#                 en ella. Tarda menos de un minuto; la copia ocupa unos
#                 275 MB, y más mientras big.sql tiene sus tablas de prueba
#   make clean    borra chasqui_w10 y chasqui_w10_big
#
# indexes.sql se corre sobre chasqui_w10: psql -d chasqui_w10 -f indexes.sql
# Cada ejemplo que crea un índice va dentro de BEGIN ... ROLLBACK, así que el
# archivo no deja nada creado. Pero un UPDATE deshecho igual deja páginas que
# ya no son "todas visibles": para ver los mismos números del apunte, corran
# make antes.

DB = chasqui_w10
BIG = chasqui_w10_big
PSQL = psql -X -q -v ON_ERROR_STOP=1

.PHONY: all test lab big clean

all:
	chasqui-load $(DB)
	$(PSQL) -d $(DB) -c "CREATE EXTENSION IF NOT EXISTS pageinspect" \
	        -c "VACUUM (ANALYZE)"

# Las pruebas crean índices dentro de transacciones: una después de otra.
test: all
	PGDATABASE=$(DB) node --test --test-concurrency=1 --test-reporter=spec

lab:
	node --test --test-reporter=spec bptree.test.mjs

big:
	dropdb --if-exists $(BIG)
	createdb -T chasqui_big $(BIG)
	$(PSQL) -d $(BIG) -c "ALTER DATABASE $(BIG) SET timezone TO 'America/Lima'"
	$(PSQL) -d $(BIG) -c "CREATE EXTENSION IF NOT EXISTS pageinspect" \
	        -c "VACUUM (ANALYZE)"
	psql -X -v ON_ERROR_STOP=1 -d $(BIG) -f big.sql

clean:
	dropdb --if-exists $(DB)
	dropdb --if-exists $(BIG)
