search.py

Code Hygiene Score: 99

Issues 1

Zeile Typ Beschreibung
41 magic_number Magic Number gefunden: 100

Dependencies 2

Funktionen 1

Code

"""code_search - Sucht Klassen/Interfaces/Traits nach Name."""

import json

from db import execute_query


def register_search_tool(mcp):
    """Registriert code_search Tool."""

    @mcp.tool()
    def code_search(
        query: str,
        namespace: str = None,
        class_type: str = None,
    ) -> dict:
        """
        Sucht Klassen/Interfaces/Traits nach Name.

        Args:
            query: Suchbegriff (Name oder Teil davon)
            namespace: Filter nach Namespace (optional)
            class_type: Filter nach Typ: class, interface, trait (optional)

        Returns:
            Dict mit results: [{fqcn, type, file_id, file_name}]
        """
        # SQL aus PHP CodeAnalysisRepository::findAll() (Zeile 50-54)
        sql = """
            SELECT id, file_name, namespace, classes
            FROM code_analysis
            WHERE (file_name LIKE %s OR namespace LIKE %s)
              AND classes IS NOT NULL AND classes != '[]'
        """
        params = [f"%{query}%", f"%{query}%"]

        if namespace:
            sql += " AND namespace = %s"
            params.append(namespace)

        sql += " ORDER BY namespace, file_name LIMIT 100"

        rows = execute_query(sql, tuple(params))

        results = []
        for row in rows:
            classes = json.loads(row["classes"] or "[]")
            for cls in classes:
                # Filter by type if specified
                if class_type and cls.get("type") != class_type:
                    continue

                fqcn = f"{row['namespace']}\\{cls['name']}" if row["namespace"] else cls["name"]

                # Filter by query in class name
                if query.lower() not in cls["name"].lower() and query.lower() not in (row["namespace"] or "").lower():
                    continue

                results.append({
                    "fqcn": fqcn,
                    "type": cls.get("type", "class"),
                    "file_id": row["id"],
                    "file_name": row["file_name"],
                })

        return {"results": results, "count": len(results)}
← Übersicht