Class: QueryGuard::Analysis::SubqueryRiskDetector
- Inherits:
-
RiskDetector
- Object
- RiskDetector
- QueryGuard::Analysis::SubqueryRiskDetector
- Defined in:
- lib/query_guard/analysis/risk_detectors.rb
Overview
Detects subquery patterns
Constant Summary collapse
- SUBQUERY_PATTERN =
/\(SELECT\b/i.freeze
Instance Attribute Summary
Attributes inherited from RiskDetector
Instance Method Summary collapse
- #detect(query, config) ⇒ Object
-
#initialize ⇒ SubqueryRiskDetector
constructor
A new instance of SubqueryRiskDetector.
Constructor Details
#initialize ⇒ SubqueryRiskDetector
Returns a new instance of SubqueryRiskDetector.
158 159 160 |
# File 'lib/query_guard/analysis/risk_detectors.rb', line 158 def initialize super(:subquery_risk) end |
Instance Method Details
#detect(query, config) ⇒ Object
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/query_guard/analysis/risk_detectors.rb', line 162 def detect(query, config) risks = [] return risks unless matches_pattern?(query.sql, SUBQUERY_PATTERN) # Count subqueries subquery_count = query.sql.scan(/\(SELECT\b/i).length return risks if subquery_count.zero? # Nested subqueries are more risky risk_level = subquery_count > 2 ? :high : :medium risks << { pattern: :nested_subqueries, risk_level: risk_level, message: "Query contains #{subquery_count} subquery(ies); consider using JOINs or CTE for better performance", metadata: { subquery_count: subquery_count, recommendation: "Replace with JOIN or WITH clause", impact: "Multiple table scans" } } risks end |