UNPKG

agentsqripts

Version:

Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems

77 lines (69 loc) 2.62 kB
/** * @file Detect unoptimized query patterns * @description Single responsibility: Identify inefficient database query patterns */ const { iterateLines } = require('../../../utils/patternDetector'); function detectUnoptimizedQueries(lines, filePath) { const issues = []; iterateLines(lines, (line, lineNumber, trimmed, i) => { // SELECT * queries if (/SELECT\s+\*\s+FROM/i.test(trimmed)) { issues.push({ type: 'select_star_query', severity: 'MEDIUM', category: 'Database', location: `${filePath}:${lineNumber}`, line: lineNumber, code: trimmed, description: 'SELECT * fetches unnecessary columns and impacts performance', summary: 'Unoptimized SELECT * query', recommendation: 'Specify only needed columns in SELECT clause', effort: 1, impact: '20-50% query performance improvement', estimatedSavings: '20-50% data transfer reduction' }); } // Queries without WHERE clause in loops if (/for\s*\(|\.forEach\s*\(/.test(trimmed)) { for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) { const innerLine = lines[j].trim(); if (/SELECT.*FROM(?!.*WHERE)/i.test(innerLine)) { issues.push({ type: 'unfiltered_query_in_loop', severity: 'HIGH', category: 'Database', location: `${filePath}:${j + 1}`, line: j + 1, code: innerLine, description: 'Query without WHERE clause in loop fetches all records', summary: 'Unfiltered query in loop', recommendation: 'Add appropriate WHERE clause to filter results', effort: 2, impact: '70-90% query performance improvement', estimatedSavings: '70-90% data reduction' }); break; } } } // Missing pagination if (/\.find\s*\(\s*\)\s*$/.test(trimmed) || /SELECT.*FROM(?!.*LIMIT)/i.test(trimmed)) { issues.push({ type: 'missing_pagination', severity: 'MEDIUM', category: 'Database', location: `${filePath}:${lineNumber}`, line: lineNumber, code: trimmed, description: 'Query without pagination may return large datasets', summary: 'Query missing pagination', recommendation: 'Add LIMIT/OFFSET or use cursor-based pagination', effort: 2, impact: 'Prevents large dataset issues', estimatedSavings: 'controlled memory usage' }); } }); return issues; } module.exports = detectUnoptimizedQueries;