# Quick Connect and Add Supplementary Indexes

This script connects to your `jellyfin_testsdata` database and adds the 5 supplementary indexes.

## Prerequisites

1. PostgreSQL is running
2. Database `jellyfin_testsdata` exists
3. `psql` is in your PATH
4. You have the jellyfin user credentials

## Quick Run

### Option 1: Direct SQL (Fastest)
```powershell
# Just add the indexes directly
psql -U jellyfin -d jellyfin_testsdata -f sql\schema_init\10_create_supplementary_indexes.sql
```

### Option 2: With verification and checks
```powershell
# Run the full script with checks and verification
.\scripts\Apply-SupplementaryIndexes.ps1
```

### Option 3: Manual Step-by-Step

1. **Connect to database**:
```powershell
psql -U jellyfin -d jellyfin_testsdata
```

2. **Check current indexes**:
```sql
SELECT indexname
FROM pg_indexes
WHERE schemaname = 'library'
  AND indexname LIKE 'idx_baseitems_%'
ORDER BY indexname;
```

3. **Apply supplementary indexes**:
```sql
\i sql/schema_init/10_create_supplementary_indexes.sql
```

4. **Verify creation**:
```sql
SELECT 
    indexname,
    pg_size_pretty(pg_relation_size(indexrelid)) as size,
    idx_scan as times_used
FROM pg_stat_user_indexes
WHERE indexname IN (
    'idx_baseitems_type_isvirtualitem_topparentid',
    'idx_baseitems_topparentid_isfolder',
    'idx_baseitems_datecreated_filtered',
    'idx_itemvaluesmap_itemvalueid_itemid',
    'idx_activitylogs_userid_datecreated'
);
```

## What Gets Added

5 supplementary indexes:
1. `idx_baseitems_type_isvirtualitem_topparentid` - Filtered library browsing
2. `idx_baseitems_topparentid_isfolder` - Folder hierarchy
3. `idx_baseitems_datecreated_filtered` - Recently added view
4. `idx_itemvaluesmap_itemvalueid_itemid` - Genre/tag reverse lookup
5. `idx_activitylogs_userid_datecreated` - User activity queries

## Troubleshooting

### "CONCURRENTLY cannot be used" error
Remove `CONCURRENTLY` from the SQL if you get this error (less common in newer PostgreSQL versions).

### "Index already exists"
This is safe - the script checks before creating. The index already exists and doesn't need to be created again.

### "Connection refused"
Ensure PostgreSQL is running:
```powershell
# Check if PostgreSQL service is running
Get-Service postgresql*

# Or try to ping the database
psql -U jellyfin -d jellyfin_testsdata -c "SELECT version();"
```

### Wrong password
Update the password in the script or use `.pgpass` file:
```powershell
# Windows: %APPDATA%\postgresql\pgpass.conf
# Linux/Mac: ~/.pgpass
# Format: hostname:port:database:username:password
localhost:5432:jellyfin_testsdata:jellyfin:YOUR_PASSWORD
```

## Monitor Performance

After applying, monitor index usage:
```powershell
# Wait a few days, then check usage
psql -U jellyfin -d jellyfin_testsdata -c "
SELECT 
    indexname,
    idx_scan as times_used,
    idx_tup_read as rows_read,
    pg_size_pretty(pg_relation_size(indexrelid)) as size
FROM pg_stat_user_indexes
WHERE indexname LIKE 'idx_%'
  AND schemaname = 'library'
ORDER BY idx_scan DESC;
"
```

## Rollback

If you need to remove the indexes:
```sql
DROP INDEX CONCURRENTLY IF EXISTS library.idx_baseitems_type_isvirtualitem_topparentid;
DROP INDEX CONCURRENTLY IF EXISTS library.idx_baseitems_topparentid_isfolder;
DROP INDEX CONCURRENTLY IF EXISTS library.idx_baseitems_datecreated_filtered;
DROP INDEX CONCURRENTLY IF EXISTS library.idx_itemvaluesmap_itemvalueid_itemid;
DROP INDEX CONCURRENTLY IF EXISTS activitylog.idx_activitylogs_userid_datecreated;
```
