@simonecoelhosfo/optimizely-mcp-server
Version:
Optimizely MCP Server for AI assistants with integrated CLI tools
70 lines • 2.62 kB
JavaScript
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