UNPKG

@simonecoelhosfo/optimizely-mcp-server

Version:

Optimizely MCP Server for AI assistants with integrated CLI tools

70 lines 2.62 kB
import { QueryExecutionStrategy } from './QueryExecutionStrategy'; export class LocalCountStrategy extends QueryExecutionStrategy { getName() { return 'LocalCountStrategy'; } canHandle(query, intent) { return intent?.type === 'count' && !this.requiresComplexJoins(query); } buildSQL(query, intent) { // CRITICAL: This is where we avoid the JOIN explosion // Example: Count flags by environment // OLD WAY: SELECT COUNT(*) FROM flags JOIN environments... // NEW WAY: SELECT COUNT(*) FROM flag_environments GROUP BY environment_key let sql = 'SELECT '; // Add GROUP BY fields first if (query.groupBy && query.groupBy.length > 0) { sql += query.groupBy.join(', ') + ', '; } // Add COUNT sql += 'COUNT(*)'; // Determine the optimal table const table = this.selectOptimalTable(query); sql += ` FROM ${table}`; // Add WHERE clauses if (query.where && query.where.length > 0) { const conditions = query.where.map(w => `${w.field} ${w.operator} ${this.formatValue(w.value)}`).join(' AND '); sql += ` WHERE ${conditions}`; } // Add GROUP BY if (query.groupBy && query.groupBy.length > 0) { sql += ` GROUP BY ${query.groupBy.join(', ')}`; } // Add ORDER BY if (query.orderBy && query.orderBy.length > 0) { const orderClauses = query.orderBy.map(o => `${o.field} ${o.direction}`).join(', '); sql += ` ORDER BY ${orderClauses}`; } // Add LIMIT if (query.limit) { sql += ` LIMIT ${query.limit}`; } return sql; } estimateCost() { return 1; // Very low cost - single table query } requiresComplexJoins(query) { return (query.joins?.length || 0) > 1; } selectOptimalTable(query) { // For flags grouped by environment, use flag_environments if (query.find === 'flags' && query.groupBy?.some(f => f.includes('environment'))) { return 'flag_environments'; } // Default to primary entity table return query.find + 's'; // Simple pluralization } formatValue(value) { if (typeof value === 'string') return `'${value}'`; if (value === null) return 'NULL'; if (Array.isArray(value)) return `(${value.map(v => this.formatValue(v)).join(', ')})`; return String(value); } } //# sourceMappingURL=LocalCountStrategy.js.map