# ER図

## 概要

clojure-lspはリレーショナルデータベースではなく、インメモリのネストされたマップ構造を使用しています。以下のER図は、論理的なデータ構造間の関係を表現しています。

## 全体構造図

```mermaid
erDiagram
    DB_ROOT ||--o{ DOCUMENTS : contains
    DB_ROOT ||--o{ DEP_GRAPH : contains
    DB_ROOT ||--o{ ANALYSIS : contains
    DB_ROOT ||--|| DIAGNOSTICS : contains

    DB_ROOT {
        string project_root_uri
        vector classpath
        map settings
        map client_capabilities
        map kondo_config
        map analysis_checksums
        string project_hash
        string settings_hash
        string kondo_config_hash
        keyword dependency_scheme
    }

    DOCUMENTS {
        string uri PK
        set namespaces
        boolean internal
        set langs
    }

    DEP_GRAPH {
        symbol namespace PK
        multiset dependencies
        multiset dependents
        multiset aliases
        map aliases_breakdown
        set uris
        boolean internal
        boolean dependents_internal
        multiset dependents_langs
    }

    ANALYSIS ||--o{ ANALYSIS_BUCKET : contains
    ANALYSIS {
        string uri PK
    }

    ANALYSIS_BUCKET ||--o{ ELEMENT : contains
    ANALYSIS_BUCKET {
        keyword bucket_name PK
    }

    ELEMENT {
        string uri FK
        keyword bucket
        symbol name
        integer name_row
        integer name_col
        integer name_end_row
        integer name_end_col
        integer row
        integer col
        integer end_row
        integer end_col
        boolean external
        keyword lang
    }

    DIAGNOSTICS ||--o{ DIAGNOSTIC_SOURCE : contains
    DIAGNOSTICS {
        map clj_kondo
        map clj_depend
        map built_in
        map custom
    }

    DIAGNOSTIC_SOURCE ||--o{ FINDING : contains
    DIAGNOSTIC_SOURCE {
        string uri PK
    }

    FINDING {
        keyword type
        string message
        integer row
        integer col
        integer end_row
        integer end_col
        keyword level
    }
```

## 依存関係グラフ詳細図

```mermaid
erDiagram
    NAMESPACE ||--o{ DEPENDENCY : has
    NAMESPACE ||--o{ DEPENDENT : has
    NAMESPACE ||--o{ ALIAS : "referred_by"
    NAMESPACE ||--o{ URI : "defined_in"

    NAMESPACE {
        symbol name PK
        boolean internal
        boolean dependents_internal
    }

    DEPENDENCY {
        symbol target_namespace FK
        integer frequency
    }

    DEPENDENT {
        symbol source_namespace FK
        integer frequency
    }

    ALIAS {
        symbol alias_name
        integer frequency
        keyword source_type "internal or external"
    }

    URI {
        string uri
    }
```

## 解析バケット詳細図

```mermaid
erDiagram
    ANALYSIS_PER_URI ||--o{ NAMESPACE_DEFINITIONS : contains
    ANALYSIS_PER_URI ||--o{ NAMESPACE_USAGES : contains
    ANALYSIS_PER_URI ||--o{ NAMESPACE_ALIAS : contains
    ANALYSIS_PER_URI ||--o{ VAR_DEFINITIONS : contains
    ANALYSIS_PER_URI ||--o{ VAR_USAGES : contains
    ANALYSIS_PER_URI ||--o{ LOCALS : contains
    ANALYSIS_PER_URI ||--o{ LOCAL_USAGES : contains
    ANALYSIS_PER_URI ||--o{ KEYWORD_DEFINITIONS : contains
    ANALYSIS_PER_URI ||--o{ KEYWORD_USAGES : contains
    ANALYSIS_PER_URI ||--o{ JAVA_CLASS_DEFINITIONS : contains
    ANALYSIS_PER_URI ||--o{ JAVA_CLASS_USAGES : contains
    ANALYSIS_PER_URI ||--o{ JAVA_MEMBER_DEFINITIONS : contains
    ANALYSIS_PER_URI ||--o{ PROTOCOL_IMPLS : contains
    ANALYSIS_PER_URI ||--o{ SYMBOLS : contains

    ANALYSIS_PER_URI {
        string uri PK
    }

    NAMESPACE_DEFINITIONS {
        symbol name
        integer name_row
        integer name_col
        integer name_end_row
        integer name_end_col
    }

    NAMESPACE_USAGES {
        symbol name
        symbol alias
        integer name_row
        integer name_col
    }

    NAMESPACE_ALIAS {
        symbol to
        symbol alias
        integer name_row
        integer name_col
    }

    VAR_DEFINITIONS {
        symbol ns
        symbol name
        boolean private
        boolean macro
        symbol defined_by
        map arglists
        integer name_row
        integer name_col
    }

    VAR_USAGES {
        symbol to
        symbol name
        symbol alias
        symbol from
        symbol from_var
        boolean refer
        boolean defmethod
        integer name_row
        integer name_col
    }

    LOCALS {
        integer id
        symbol name
        integer name_row
        integer name_col
    }

    LOCAL_USAGES {
        integer id FK
        symbol name
        integer name_row
        integer name_col
    }

    KEYWORD_DEFINITIONS {
        symbol ns
        symbol name
        symbol reg
        integer name_row
        integer name_col
    }

    KEYWORD_USAGES {
        symbol ns
        symbol name
        boolean auto_resolved
        boolean namespace_from_prefix
        integer name_row
        integer name_col
    }

    JAVA_CLASS_DEFINITIONS {
        string class_name
        integer name_row
        integer name_col
    }

    JAVA_CLASS_USAGES {
        string class_name
        string method_name
        boolean import
        integer name_row
        integer name_col
    }

    JAVA_MEMBER_DEFINITIONS {
        string class_name
        symbol name
        integer name_row
        integer name_col
    }

    PROTOCOL_IMPLS {
        symbol protocol_ns
        symbol method_name
        integer name_row
        integer name_col
    }

    SYMBOLS {
        symbol symbol
        symbol to
        symbol name
        integer name_row
        integer name_col
    }
```

## キャッシュ構造図

```mermaid
erDiagram
    LOCAL_CACHE {
        integer version
        string project_root
        string project_hash
        string settings_hash
        string kondo_config_hash
        keyword dependency_scheme
        keyword project_analysis_type
        vector classpath
        map analysis
        map analysis_checksums
        set stubs_generation_namespaces
    }

    GLOBAL_CACHE {
        integer version
        map data
    }

    CACHE_FILE ||--|| LOCAL_CACHE : "project/.lsp/.cache/db.transit.json"
    CACHE_FILE ||--|| GLOBAL_CACHE : "~/.cache/clojure-lsp/db.transit.json"

    CACHE_FILE {
        string path
        string format "Transit JSON"
    }
```

## データフロー図

```mermaid
flowchart TB
    subgraph Input
        SOURCE_FILES[Source Files]
        CLJ_KONDO[clj-kondo Analysis]
        CLJ_DEPEND[clj-depend Analysis]
        CUSTOM_LINTERS[Custom Linters]
    end

    subgraph Processing
        NORMALIZE[Normalize Analysis]
        REFRESH_DEP_GRAPH[Refresh Dep Graph]
    end

    subgraph Storage["In-Memory Storage (db*)"]
        ANALYSIS_STORE[(analysis)]
        DEP_GRAPH_STORE[(dep-graph)]
        DOCUMENTS_STORE[(documents)]
        DIAGNOSTICS_STORE[(diagnostics)]
    end

    subgraph Persistence
        TRANSIT_CACHE[(Transit JSON Cache)]
    end

    SOURCE_FILES --> CLJ_KONDO
    SOURCE_FILES --> CLJ_DEPEND
    SOURCE_FILES --> CUSTOM_LINTERS

    CLJ_KONDO --> NORMALIZE
    CLJ_DEPEND --> DIAGNOSTICS_STORE
    CUSTOM_LINTERS --> DIAGNOSTICS_STORE

    NORMALIZE --> ANALYSIS_STORE
    NORMALIZE --> REFRESH_DEP_GRAPH

    REFRESH_DEP_GRAPH --> DEP_GRAPH_STORE
    REFRESH_DEP_GRAPH --> DOCUMENTS_STORE

    ANALYSIS_STORE --> TRANSIT_CACHE
    DEP_GRAPH_STORE --> TRANSIT_CACHE
```

## 補足事項

### 凡例

- **PK**: プライマリキー（論理的な識別子）
- **FK**: 外部キー（参照関係）
- **multiset**: 頻度カウント付きのセット（内部的には`{要素 頻度}`のマップ）

### マルチセットの表現

依存関係グラフ内のmultisetは、同一の依存関係が複数のファイルやエイリアスで発生する場合の頻度をカウントするために使用されています。

```clojure
;; 例: 名前空間'clojure.string'が7回'str'エイリアスで、1回エイリアスなしで参照
{:aliases {str 7, nil 1}}
```

### ドキュメント-名前空間-依存関係の関係

1. **documents**: URIごとにファイル情報と定義された名前空間を保持
2. **dep-graph**: 名前空間ごとに依存関係と逆依存関係を保持
3. **analysis**: URIごとに詳細なコード要素情報を保持

これらは相互に参照し合い、効率的なコードナビゲーションと解析を可能にしています。
