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
JavaScript
/**
* @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;