@@ -14,6 +14,7 @@ const (
1414 defaultJoinCapacity = 4
1515 defaultConditionCapacity = 8
1616 defaultCacheCapacity = 64
17+ maxCacheSize = 512
1718)
1819
1920type Analyzer struct {
@@ -99,6 +100,13 @@ func (a *Analyzer) AnalyzeWithCache(stmt parser.Statement, cacheKey string) Quer
99100
100101 if cacheKey != "" {
101102 a .mu .Lock ()
103+ if len (a .cache ) >= maxCacheSize {
104+ // Evict one arbitrary entry to cap memory usage.
105+ for k := range a .cache {
106+ delete (a .cache , k )
107+ break
108+ }
109+ }
102110 a .cache [cacheKey ] = analysis
103111 a .mu .Unlock ()
104112 }
@@ -126,10 +134,14 @@ func (a *Analyzer) analyzeSelectStatement(stmt *parser.SelectStatement) {
126134 Usage : "SELECT" ,
127135 })
128136
137+ condition := ""
138+ if join .Condition != nil {
139+ condition = join .Condition .String ()
140+ }
129141 a .analysis .Joins = append (a .analysis .Joins , JoinInfo {
130142 Type : join .JoinType ,
131143 RightTable : join .Table .Name ,
132- Condition : join . Condition . String () ,
144+ Condition : condition ,
133145 })
134146
135147 a .analyzeExpression (join .Condition , "JOIN" )
@@ -312,29 +324,33 @@ func (a *Analyzer) SuggestOptimizations(stmt *parser.SelectStatement) []Optimiza
312324 return suggestions
313325}
314326
315- // GetEnhancedOptimizations returns comprehensive optimization suggestions using the new engine
327+ // GetEnhancedOptimizations returns comprehensive optimization suggestions using the new engine.
316328func (a * Analyzer ) GetEnhancedOptimizations (stmt parser.Statement ) []EnhancedOptimizationSuggestion {
317- if a .optimizationEngine == nil {
318- // Fallback to basic suggestions if no optimization engine is available
319- basicSuggestions := a .SuggestOptimizations (stmt .(* parser.SelectStatement ))
320- enhanced := make ([]EnhancedOptimizationSuggestion , len (basicSuggestions ))
321- for i , basic := range basicSuggestions {
322- enhanced [i ] = EnhancedOptimizationSuggestion {
323- Type : basic .Type ,
324- Description : basic .Description ,
325- Severity : basic .Severity ,
326- Category : "GENERAL" ,
327- Rule : basic .Type ,
328- Line : basic .Line ,
329- Suggestion : "Review query for optimization opportunities" ,
330- Impact : "MEDIUM" ,
331- AutoFixable : false ,
332- }
333- }
334- return enhanced
329+ if a .optimizationEngine != nil {
330+ return a .optimizationEngine .AnalyzeOptimizations (stmt )
335331 }
336332
337- return a .optimizationEngine .AnalyzeOptimizations (stmt )
333+ // Fallback: only SELECT statements support basic suggestions.
334+ sel , ok := stmt .(* parser.SelectStatement )
335+ if ! ok {
336+ return nil
337+ }
338+ basicSuggestions := a .SuggestOptimizations (sel )
339+ enhanced := make ([]EnhancedOptimizationSuggestion , len (basicSuggestions ))
340+ for i , basic := range basicSuggestions {
341+ enhanced [i ] = EnhancedOptimizationSuggestion {
342+ Type : basic .Type ,
343+ Description : basic .Description ,
344+ Severity : basic .Severity ,
345+ Category : "GENERAL" ,
346+ Rule : basic .Type ,
347+ Line : basic .Line ,
348+ Suggestion : "Review query for optimization opportunities" ,
349+ Impact : "MEDIUM" ,
350+ AutoFixable : false ,
351+ }
352+ }
353+ return enhanced
338354}
339355
340356// SetOptimizationEngine allows setting a custom optimization engine
0 commit comments