{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Docs\/ChunkRepository.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\Docs;\n\n\/\/ @responsibility: Datenbank-Operationen für dokumentation_chunks\n\nuse PDO;\n\nfinal class ChunkRepository\n{\n public function __construct(\n private PDO $pdo\n ) {\n }\n\n \/**\n * Gets a chunk by ID.\n *\n * @return array<string, mixed>|null\n *\/\n public function findById(int $id): ?array\n {\n $stmt = $this->pdo->prepare('SELECT * FROM dokumentation_chunks WHERE id = :id');\n $stmt->execute(['id' => $id]);\n $result = $stmt->fetch(PDO::FETCH_ASSOC);\n\n return $result !== false ? $result : null;\n }\n\n \/**\n * Gets pending chunks for analysis.\n *\n * @return array<array<string, mixed>>\n *\/\n public function findPending(int $limit): array\n {\n $stmt = $this->pdo->prepare(\"\n SELECT * FROM dokumentation_chunks\n WHERE analysis_status = 'pending'\n ORDER BY dokumentation_id, chunk_index\n LIMIT :limit\n \");\n $stmt->bindValue('limit', $limit, PDO::PARAM_INT);\n $stmt->execute();\n\n return $stmt->fetchAll(PDO::FETCH_ASSOC);\n }\n\n \/**\n * Gets document context by ID.\n *\n * @return array{title: string, path: string}\n *\/\n public function getDocumentContext(int $docId): array\n {\n $stmt = $this->pdo->prepare('SELECT title, path FROM dokumentation WHERE id = :id');\n $stmt->execute(['id' => $docId]);\n $result = $stmt->fetch(PDO::FETCH_ASSOC);\n\n return [\n 'title' => $result['title'] ?? 'Unbekannt',\n 'path' => $result['path'] ?? '\/',\n ];\n }\n\n \/**\n * Updates chunk analysis status.\n *\/\n public function updateStatus(int $chunkId, string $status, ?string $error = null): void\n {\n $sql = 'UPDATE dokumentation_chunks\n SET analysis_status = :status, analysis_error = :error\n WHERE id = :id';\n $stmt = $this->pdo->prepare($sql);\n $stmt->execute(['id' => $chunkId, 'status' => $status, 'error' => $error]);\n }\n\n \/**\n * Stores analysis results.\n *\n * @param array{taxonomy: array<string>, entities: array<array{name: string, type: string}>, keywords: array<string>} $analysis\n *\/\n public function storeAnalysisResults(int $chunkId, array $analysis, string $model): void\n {\n $taxonomyPath = $analysis['taxonomy'];\n $taxonomyCategory = !empty($taxonomyPath) ? $taxonomyPath[0] : null;\n\n $sql = \"UPDATE dokumentation_chunks SET\n taxonomy_category = :category,\n taxonomy_path = :taxonomy,\n entities = :entities,\n keywords = :keywords,\n analysis_model = :model,\n analysis_status = 'completed',\n analysis_error = NULL,\n analyzed_at = NOW()\n WHERE id = :id\";\n\n $stmt = $this->pdo->prepare($sql);\n $stmt->execute([\n 'id' => $chunkId,\n 'category' => $taxonomyCategory,\n 'taxonomy' => json_encode($taxonomyPath),\n 'entities' => json_encode($analysis['entities']),\n 'keywords' => json_encode($analysis['keywords']),\n 'model' => $model,\n ]);\n }\n\n \/**\n * Gets analysis statistics.\n *\n * @return array{pending: int, processing: int, completed: int, failed: int, by_category: array<array{category: string, count: int}>}\n *\/\n public function getStats(): array\n {\n $stmt = $this->pdo->query(\"\n SELECT\n SUM(CASE WHEN analysis_status = 'pending' THEN 1 ELSE 0 END) as pending,\n SUM(CASE WHEN analysis_status = 'processing' THEN 1 ELSE 0 END) as processing,\n SUM(CASE WHEN analysis_status = 'completed' THEN 1 ELSE 0 END) as completed,\n SUM(CASE WHEN analysis_status = 'failed' THEN 1 ELSE 0 END) as failed\n FROM dokumentation_chunks\n \");\n $counts = $stmt->fetch(PDO::FETCH_ASSOC);\n\n $stmt = $this->pdo->query('\n SELECT taxonomy_category as category, COUNT(*) as count\n FROM dokumentation_chunks\n WHERE taxonomy_category IS NOT NULL\n GROUP BY taxonomy_category\n ORDER BY count DESC\n ');\n $byCategory = $stmt->fetchAll(PDO::FETCH_ASSOC);\n\n return [\n 'pending' => (int) ($counts['pending'] ?? 0),\n 'processing' => (int) ($counts['processing'] ?? 0),\n 'completed' => (int) ($counts['completed'] ?? 0),\n 'failed' => (int) ($counts['failed'] ?? 0),\n 'by_category' => $byCategory,\n ];\n }\n}\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Docs\/ChunkRepository.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\Docs;\n\n\/\/ @responsibility: Datenbank-Operationen für dokumentation_chunks\n\nuse PDO;\n\nfinal class ChunkRepository\n{\n public function __construct(\n private PDO $pdo\n ) {\n }\n\n \/**\n * Gets a chunk by ID.\n *\n * @return array<string, mixed>|null\n *\/\n public function findById(int $id): ?array\n {\n $stmt = $this->pdo->prepare('SELECT * FROM dokumentation_chunks WHERE id = :id');\n $stmt->execute(['id' => $id]);\n $result = $stmt->fetch(PDO::FETCH_ASSOC);\n\n return $result !== false ? $result : null;\n }\n\n \/**\n * Gets pending chunks for analysis.\n *\n * @return array<array<string, mixed>>\n *\/\n public function findPending(int $limit): array\n {\n $stmt = $this->pdo->prepare(\"\n SELECT * FROM dokumentation_chunks\n WHERE analysis_status = 'pending'\n ORDER BY dokumentation_id, chunk_index\n LIMIT :limit\n \");\n $stmt->bindValue('limit', $limit, PDO::PARAM_INT);\n $stmt->execute();\n\n return $stmt->fetchAll(PDO::FETCH_ASSOC);\n }\n\n \/**\n * Gets document context by ID.\n *\n * @return array{title: string, path: string}\n *\/\n public function getDocumentContext(int $docId): array\n {\n $stmt = $this->pdo->prepare('SELECT title, path FROM dokumentation WHERE id = :id');\n $stmt->execute(['id' => $docId]);\n $result = $stmt->fetch(PDO::FETCH_ASSOC);\n\n return [\n 'title' => $result['title'] ?? 'Unbekannt',\n 'path' => $result['path'] ?? '\/',\n ];\n }\n\n \/**\n * Updates chunk analysis status.\n *\/\n public function updateStatus(int $chunkId, string $status, ?string $error = null): void\n {\n $sql = 'UPDATE dokumentation_chunks\n SET analysis_status = :status, analysis_error = :error\n WHERE id = :id';\n $stmt = $this->pdo->prepare($sql);\n $stmt->execute(['id' => $chunkId, 'status' => $status, 'error' => $error]);\n }\n\n \/**\n * Stores analysis results.\n *\n * @param array{taxonomy: array<string>, entities: array<array{name: string, type: string}>, keywords: array<string>} $analysis\n *\/\n public function storeAnalysisResults(int $chunkId, array $analysis, string $model): void\n {\n $taxonomyPath = $analysis['taxonomy'];\n $taxonomyCategory = !empty($taxonomyPath) ? $taxonomyPath[0] : null;\n\n $sql = \"UPDATE dokumentation_chunks SET\n taxonomy_category = :category,\n taxonomy_path = :taxonomy,\n entities = :entities,\n keywords = :keywords,\n analysis_model = :model,\n analysis_status = 'completed',\n analysis_error = NULL,\n analyzed_at = NOW()\n WHERE id = :id\";\n\n $stmt = $this->pdo->prepare($sql);\n $stmt->execute([\n 'id' => $chunkId,\n 'category' => $taxonomyCategory,\n 'taxonomy' => json_encode($taxonomyPath),\n 'entities' => json_encode($analysis['entities']),\n 'keywords' => json_encode($analysis['keywords']),\n 'model' => $model,\n ]);\n }\n\n \/**\n * Gets analysis statistics.\n *\n * @return array{pending: int, processing: int, completed: int, failed: int, by_category: array<array{category: string, count: int}>}\n *\/\n public function getStats(): array\n {\n $stmt = $this->pdo->query(\"\n SELECT\n SUM(CASE WHEN analysis_status = 'pending' THEN 1 ELSE 0 END) as pending,\n SUM(CASE WHEN analysis_status = 'processing' THEN 1 ELSE 0 END) as processing,\n SUM(CASE WHEN analysis_status = 'completed' THEN 1 ELSE 0 END) as completed,\n SUM(CASE WHEN analysis_status = 'failed' THEN 1 ELSE 0 END) as failed\n FROM dokumentation_chunks\n \");\n $counts = $stmt->fetch(PDO::FETCH_ASSOC);\n\n $stmt = $this->pdo->query('\n SELECT taxonomy_category as category, COUNT(*) as count\n FROM dokumentation_chunks\n WHERE taxonomy_category IS NOT NULL\n GROUP BY taxonomy_category\n ORDER BY count DESC\n ');\n $byCategory = $stmt->fetchAll(PDO::FETCH_ASSOC);\n\n return [\n 'pending' => (int) ($counts['pending'] ?? 0),\n 'processing' => (int) ($counts['processing'] ?? 0),\n 'completed' => (int) ($counts['completed'] ?? 0),\n 'failed' => (int) ($counts['failed'] ?? 0),\n 'by_category' => $byCategory,\n ];\n }\n}\n",
"structuredPatch": [],
"originalFile": null
}
}