pdo = $pdo; } /** * Speichert Hygiene-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, dependency_score, hygiene_score, factor_scores, hardcoded_count, issues_count, warnings_count, issues_json ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) '); $factorScores = $qualityData['factor_scores'] ?? []; $stmt->execute([ $analysisId, $factorScores['dependencies'] ?? 0, $qualityData['hygiene_score'] ?? 50, json_encode($factorScores), $qualityData['hardcoded_count'] ?? 0, $qualityData['issues_count'] ?? 0, $qualityData['warnings_count'] ?? 0, $qualityData['issues_json'] ?? '[]', ]); } /** * Holt alle Analysen mit Hygiene-Daten. * * @param array $filters * @return array> */ public function findAllWithQuality(array $filters = [], int $limit = 100, int $offset = 0): array { $sql = ' SELECT ca.*, cq.dependency_score, cq.hygiene_score, cq.factor_scores, cq.hardcoded_count, cq.issues_count, cq.warnings_count, 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['has_issues'])) { $sql .= ' AND cq.issues_count > 0'; } if (!empty($filters['min_score'])) { $sql .= ' AND cq.hygiene_score >= :min_score'; $params['min_score'] = (int) $filters['min_score']; } if (!empty($filters['max_score'])) { $sql .= ' AND cq.hygiene_score <= :max_score'; $params['max_score'] = (int) $filters['max_score']; } $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 Hygiene-Statistiken. * * @return array */ public function getQualityStats(): array { $stmt = $this->pdo->query(' SELECT COUNT(*) as total_files, SUM(CASE WHEN hygiene_status = "Sauber" THEN 1 ELSE 0 END) as status_sauber, SUM(CASE WHEN hygiene_status = "Gepflegt" THEN 1 ELSE 0 END) as status_gepflegt, SUM(CASE WHEN hygiene_status = "Vernachlässigt" THEN 1 ELSE 0 END) as status_vernachlaessigt, SUM(CASE WHEN hygiene_status = "Verschmutzt" THEN 1 ELSE 0 END) as status_verschmutzt, SUM(CASE WHEN hygiene_status = "Kritisch" THEN 1 ELSE 0 END) as status_kritisch, SUM(issues_count) as total_issues, SUM(hardcoded_count) as total_hardcoded, AVG(hygiene_score) as avg_hygiene_score, MIN(hygiene_score) as min_hygiene_score, MAX(hygiene_score) as max_hygiene_score FROM code_quality '); return $stmt->fetch(PDO::FETCH_ASSOC) ?: []; } }