pdo = $pdo; } /** * Speichert Quality-Daten für eine Analyse. * * @param array $qualityData */ public function saveQuality(int $analysisId, array $qualityData): void { // Delete existing quality data $this->pdo->prepare('DELETE FROM code_quality WHERE analysis_id = ?')->execute([$analysisId]); $stmt = $this->pdo->prepare(' INSERT INTO code_quality ( analysis_id, complexity_score, loc_score, dependency_score, hardcoded_count, issues_count, warnings_count, quality_grade, issues_json ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) '); $stmt->execute([ $analysisId, $qualityData['complexity_score'] ?? 0, $qualityData['loc_score'] ?? 0, $qualityData['dependency_score'] ?? 0, $qualityData['hardcoded_count'] ?? 0, $qualityData['issues_count'] ?? 0, $qualityData['warnings_count'] ?? 0, $qualityData['quality_grade'] ?? 'C', $qualityData['issues_json'] ?? '[]', ]); } /** * Holt alle Analysen mit Quality-Daten. * * @param array $filters * @return array> */ public function findAllWithQuality(array $filters = [], int $limit = 100, int $offset = 0): array { $sql = ' SELECT ca.*, cq.complexity_score, cq.loc_score, cq.dependency_score, cq.hardcoded_count, cq.issues_count, cq.warnings_count, cq.quality_grade, cq.issues_json FROM code_analysis ca LEFT JOIN code_quality cq ON ca.id = cq.analysis_id WHERE 1=1 '; $params = []; if (!empty($filters['extension'])) { $sql .= ' AND ca.extension = :extension'; $params['extension'] = $filters['extension']; } if (!empty($filters['namespace'])) { $sql .= ' AND ca.namespace = :namespace'; $params['namespace'] = $filters['namespace']; } if (!empty($filters['search'])) { $sql .= ' AND (ca.file_name LIKE :search OR ca.namespace LIKE :search)'; $params['search'] = '%' . $filters['search'] . '%'; } if (!empty($filters['quality_grade'])) { $sql .= ' AND cq.quality_grade = :quality_grade'; $params['quality_grade'] = $filters['quality_grade']; } if (!empty($filters['has_issues'])) { $sql .= ' AND cq.issues_count > 0'; } $sql .= ' ORDER BY ca.namespace, ca.file_name LIMIT :limit OFFSET :offset'; $stmt = $this->pdo->prepare($sql); foreach ($params as $key => $value) { $stmt->bindValue(':' . $key, $value); } $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } /** * Holt Quality-Statistiken. * * @return array */ public function getQualityStats(): array { $stmt = $this->pdo->query(' SELECT COUNT(*) as total_files, SUM(CASE WHEN quality_grade = "A" THEN 1 ELSE 0 END) as grade_a, SUM(CASE WHEN quality_grade = "B" THEN 1 ELSE 0 END) as grade_b, SUM(CASE WHEN quality_grade = "C" THEN 1 ELSE 0 END) as grade_c, SUM(CASE WHEN quality_grade = "D" THEN 1 ELSE 0 END) as grade_d, SUM(CASE WHEN quality_grade = "F" THEN 1 ELSE 0 END) as grade_f, SUM(issues_count) as total_issues, SUM(hardcoded_count) as total_hardcoded, AVG(complexity_score) as avg_complexity FROM code_quality '); return $stmt->fetch(PDO::FETCH_ASSOC) ?: []; } }