Fix N+1 query, add database indexes, and implement award progress caching: - Fix N+1 query in getUserQSOs by using SQL COUNT instead of loading all records - Add 7 performance indexes for filter queries, sync operations, and award calculations - Implement in-memory caching service for award progress (5-minute TTL) - Auto-invalidate cache after LoTW/DCL syncs Expected impact: - 90% memory reduction for QSO listing - 80% faster filter queries - 95% reduction in award calculation time for cached requests Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
59 lines
1.8 KiB
JavaScript
59 lines
1.8 KiB
JavaScript
/**
|
|
* Rollback: Remove performance indexes
|
|
*
|
|
* This script removes the performance indexes created by add-performance-indexes.js
|
|
* Use this if you need to drop the indexes for any reason.
|
|
*/
|
|
|
|
import Database from 'bun:sqlite';
|
|
import { join } from 'path';
|
|
|
|
async function rollback() {
|
|
console.log('Starting rollback: Remove performance indexes...');
|
|
|
|
// Get the directory containing this migration file
|
|
const __dirname = new URL('.', import.meta.url).pathname;
|
|
const dbPath = join(__dirname, '../award.db');
|
|
|
|
const sqlite = new Database(dbPath);
|
|
|
|
try {
|
|
console.log('Dropping index: idx_qsos_user_band');
|
|
sqlite.exec(`DROP INDEX IF EXISTS idx_qsos_user_band`);
|
|
|
|
console.log('Dropping index: idx_qsos_user_mode');
|
|
sqlite.exec(`DROP INDEX IF EXISTS idx_qsos_user_mode`);
|
|
|
|
console.log('Dropping index: idx_qsos_user_confirmation');
|
|
sqlite.exec(`DROP INDEX IF EXISTS idx_qsos_user_confirmation`);
|
|
|
|
console.log('Dropping index: idx_qsos_duplicate_check');
|
|
sqlite.exec(`DROP INDEX IF EXISTS idx_qsos_duplicate_check`);
|
|
|
|
console.log('Dropping index: idx_qsos_lotw_confirmed');
|
|
sqlite.exec(`DROP INDEX IF EXISTS idx_qsos_lotw_confirmed`);
|
|
|
|
console.log('Dropping index: idx_qsos_dcl_confirmed');
|
|
sqlite.exec(`DROP INDEX IF EXISTS idx_qsos_dcl_confirmed`);
|
|
|
|
console.log('Dropping index: idx_qsos_qso_date');
|
|
sqlite.exec(`DROP INDEX IF EXISTS idx_qsos_qso_date`);
|
|
|
|
sqlite.close();
|
|
|
|
console.log('\nRollback complete! Removed 7 performance indexes.');
|
|
console.log('\nTo verify indexes were dropped, run:');
|
|
console.log(' sqlite3 award.db ".indexes qsos"');
|
|
|
|
} catch (error) {
|
|
console.error('Rollback failed:', error);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// Run rollback
|
|
rollback().then(() => {
|
|
console.log('\nRollback script completed successfully');
|
|
process.exit(0);
|
|
});
|