@simonecoelhosfo/optimizely-mcp-server
Version:
Optimizely MCP Server for AI assistants with integrated CLI tools
242 lines • 7.64 kB
TypeScript
/**
* Query Analysis Engine - Phase 3.2 of Dynamic Analytics Query Engine
*
* This engine analyzes SQL queries to determine:
* 1. Which fields are being accessed and how
* 2. Whether array flattening is required
* 3. Query complexity and optimization opportunities
* 4. Performance characteristics and bottlenecks
*
* The engine integrates with the UnifiedFieldResolver from Phase 3.1 to provide
* intelligent query planning that prevents the "variations.key does not exist" errors
* by understanding data structure requirements before execution.
*/
import { QueryContext, ResolvedField } from './UnifiedFieldResolver.js';
import { EntityType } from './types.js';
/**
* Represents a parsed SQL query with field analysis
*/
export interface ParsedQuery {
/** Original SQL query string */
originalQuery: string;
/** Type of SQL operation (SELECT, INSERT, UPDATE, DELETE) */
operation: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
/** Primary entity being queried */
primaryEntity: EntityType;
/** All fields referenced in the query */
referencedFields: string[];
/** Fields that appear in WHERE clauses */
filterFields: string[];
/** Fields that appear in SELECT clauses */
projectionFields: string[];
/** Fields that appear in GROUP BY clauses */
groupByFields: string[];
/** Fields that appear in ORDER BY clauses */
orderByFields: string[];
/** JOINs detected in the query */
joins: QueryJoin[];
/** Subqueries detected */
subqueries: ParsedQuery[];
}
/**
* Information about JOINs in the query
*/
export interface QueryJoin {
/** Type of join (INNER, LEFT, RIGHT, FULL) */
type: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL';
/** Table/entity being joined */
joinedEntity: EntityType;
/** Join condition fields */
joinFields: string[];
}
/**
* Analysis results for flattening requirements
*/
export interface FlatteningAnalysis {
/** Whether any flattening is required */
requiresFlattening: boolean;
/** Fields that need array flattening */
arrayFields: FlatteningRequirement[];
/** Fields that need object flattening */
objectFields: FlatteningRequirement[];
/** Estimated impact on result set size */
estimatedImpact: 'minimal' | 'moderate' | 'significant' | 'explosive';
/** Recommended approach */
recommendation: FlatteningStrategy;
}
/**
* Specific flattening requirement for a field
*/
export interface FlatteningRequirement {
/** Field name that needs flattening */
fieldName: string;
/** Resolved field information */
resolvedField: ResolvedField;
/** Type of flattening needed */
flatteningType: 'array_to_rows' | 'object_to_columns' | 'nested_array';
/** Depth of nesting */
nestingDepth: number;
/** Estimated cardinality */
estimatedCardinality: number;
}
/**
* Strategy for handling flattening
*/
export interface FlatteningStrategy {
/** Overall approach */
approach: 'no_flattening' | 'selective_flattening' | 'full_flattening' | 'staged_flattening';
/** Specific steps to take */
steps: FlatteningStep[];
/** Performance considerations */
performanceNotes: string[];
/** Alternative approaches */
alternatives: string[];
}
/**
* Individual step in flattening strategy
*/
export interface FlatteningStep {
/** Order of execution */
order: number;
/** Description of the step */
description: string;
/** SQL/JSONata expression to execute */
expression: string;
/** Expected result size impact */
sizeImpact: number;
}
/**
* Query optimization analysis
*/
export interface QueryOptimization {
/** Complexity level of the query */
complexityLevel: 'simple' | 'moderate' | 'complex' | 'very_complex';
/** Performance score (0-100, higher is better) */
performanceScore: number;
/** Identified performance issues */
issues: PerformanceIssue[];
/** Suggested optimizations */
optimizations: QueryOptimizationSuggestion[];
/** Estimated execution time range */
estimatedExecutionTime: {
min: number;
max: number;
confidence: number;
};
}
/**
* Performance issue in query
*/
export interface PerformanceIssue {
/** Severity level */
severity: 'low' | 'medium' | 'high' | 'critical';
/** Issue category */
category: 'cartesian_product' | 'inefficient_join' | 'missing_index' | 'large_result_set' | 'complex_aggregation';
/** Description of the issue */
description: string;
/** Location in query where issue occurs */
location: string;
/** Suggested fix */
suggestion: string;
/** Expected improvement if fixed */
expectedImprovement: string;
}
/**
* Suggested query optimization
*/
export interface QueryOptimizationSuggestion {
/** Type of optimization */
type: 'rewrite' | 'index' | 'restructure' | 'cache' | 'paginate';
/** Description */
description: string;
/** Before/after comparison */
comparison: {
before: string;
after: string;
improvement: string;
};
/** Implementation difficulty */
difficulty: 'easy' | 'moderate' | 'hard';
}
/**
* Complete analysis result for a query
*/
export interface QueryAnalysisResult {
/** Parsed query structure */
parsedQuery: ParsedQuery;
/** Field resolution results */
fieldResolutions: ResolvedField[];
/** Flattening analysis */
flatteningAnalysis: FlatteningAnalysis;
/** Optimization analysis */
optimization: QueryOptimization;
/** Overall recommendation */
recommendation: QueryRecommendation;
/** Analysis metadata */
metadata: {
analysisTime: number;
analyzerVersion: string;
contextUsed: QueryContext;
};
}
/**
* Overall recommendation for query execution
*/
export interface QueryRecommendation {
/** Whether query should be executed as-is */
executeAsIs: boolean;
/** Suggested modifications */
modifications: string[];
/** Alternative approaches */
alternatives: string[];
/** Risk assessment */
riskLevel: 'low' | 'medium' | 'high';
/** Confidence in recommendation */
confidence: number;
}
/**
* Main Query Analysis Engine
*/
export declare class QueryAnalysisEngine {
private fieldResolver;
private readonly version;
constructor();
/**
* Analyze a complete query and provide recommendations
*/
analyzeQuery(query: string, context: QueryContext): Promise<QueryAnalysisResult>;
/**
* Parse SQL query into structured representation
*
* Note: This is a simplified parser. In production, consider using
* a proper SQL parser like node-sql-parser or similar.
*/
private parseQuery;
/**
* Resolve all fields referenced in the query using UnifiedFieldResolver
*/
private resolveQueryFields;
/**
* Analyze which fields require flattening and estimate impact
*/
private analyzeFlatteningRequirements;
/**
* Analyze query performance and optimization opportunities
*/
private analyzeOptimization;
/**
* Generate overall recommendation for query execution
*/
private generateRecommendation;
private extractFieldReferences;
private extractFilterFields;
private extractProjectionFields;
private extractGroupByFields;
private extractOrderByFields;
private extractJoins;
private calculateNestingDepth;
private estimateCardinality;
private estimateImpact;
private recommendFlatteningStrategy;
}
//# sourceMappingURL=QueryAnalysisEngine.d.ts.map