# ER図

## 概要

本ドキュメントは、Nushellプロジェクトにおけるデータベース関連の構造をER図として表現します。Nushellは動的にテーブルを作成するアーキテクチャであるため、固定のテーブルスキーマは存在しませんが、メタデータ構造体とKVストアテーブルの関係を示します。

## メタデータ構造体のER図

```mermaid
erDiagram
    DbTable ||--o{ DbColumn : has
    DbTable ||--o{ DbConstraint : has
    DbTable ||--o{ DbForeignKey : has
    DbTable ||--o{ DbIndex : has

    DbTable {
        string name PK
        datetime create_time
        datetime update_time
        string engine
        string schema
    }

    DbColumn {
        int cid PK
        string name
        string type
        int notnull
        string default
        int pk
    }

    DbConstraint {
        string name PK
        string column_name
        string origin
    }

    DbForeignKey {
        string column_name
        string ref_table FK
        string ref_column
    }

    DbIndex {
        string name PK
        string column_name
        int seqno
    }
```

## KVストア テーブル構造

```mermaid
erDiagram
    std_kv_store {
        string session
        string key PK
        string value
    }
```

## SQLiteDatabase クラス構造

```mermaid
classDiagram
    class SQLiteDatabase {
        +PathBuf path
        +Signals signals
        +new(path, signals) SQLiteDatabase
        +try_from_path(path, span, signals) Result
        +try_from_value(value) Result
        +query(sql, params, call_span) Result
        +open_connection() Result
        +get_tables(conn) Result
        +get_columns(conn, table) Result
        +get_constraints(conn, table) Result
        +get_foreign_keys(conn, table) Result
        +get_indexes(conn, table) Result
        +drop_all_tables(conn) Result
        +export_in_memory_database_to_file(conn, filename) Result
        +backup_database_to_file(conn, filename) Result
        +restore_database_from_file(conn, filename) Result
    }

    class SQLiteQueryBuilder {
        +PathBuf db_path
        +String table_name
        +String sql_select
        +String sql_where
        +Vec~String~ sql_params
        +String sql_order_by
        +i64 sql_limit
        +Signals signals
        +new(db_path, table_name, signals) SQLiteQueryBuilder
        +with_select(select) SQLiteQueryBuilder
        +with_where(where_clause, params) SQLiteQueryBuilder
        +with_order_by(order_by) SQLiteQueryBuilder
        +with_limit(limit) SQLiteQueryBuilder
        +build_sql() String
        +execute(call_span) Result
        +count(call_span) Result
    }

    SQLiteDatabase --> SQLiteQueryBuilder : creates
```

## Stor コマンド群のデータフロー

```mermaid
flowchart TB
    subgraph StorCommands[Stor Commands]
        StorCreate[stor create]
        StorInsert[stor insert]
        StorUpdate[stor update]
        StorDelete[stor delete]
        StorOpen[stor open]
        StorExport[stor export]
        StorImport[stor import]
        StorReset[stor reset]
    end

    subgraph InMemoryDB[In-Memory SQLite DB]
        MemDB[(MEMORY_DB)]
    end

    subgraph ExternalFiles[External Files]
        SQLiteFile[(SQLite File)]
    end

    StorCreate --> MemDB
    StorInsert --> MemDB
    StorUpdate --> MemDB
    StorDelete --> MemDB
    StorOpen --> MemDB
    StorReset --> MemDB

    StorExport --> SQLiteFile
    StorImport --> MemDB
    SQLiteFile --> StorImport
    MemDB --> StorExport
```

## 型変換フロー

```mermaid
flowchart LR
    subgraph NushellTypes[Nushell Types]
        NuInt[Int]
        NuFloat[Float]
        NuString[String]
        NuBool[Bool]
        NuDate[Date]
        NuDuration[Duration]
        NuFilesize[Filesize]
        NuBinary[Binary]
        NuList[List]
        NuRecord[Record]
        NuTable[Table]
        NuNothing[Nothing]
    end

    subgraph SQLiteTypes[SQLite Types]
        SqlInt[INTEGER]
        SqlReal[REAL]
        SqlText[TEXT]
        SqlBool[BOOLEAN]
        SqlDateTime[DATETIME]
        SqlBigInt[BIGINT]
        SqlBlob[BLOB]
        SqlJsonb[JSONB]
    end

    NuInt --> SqlInt
    NuFloat --> SqlReal
    NuString --> SqlText
    NuBool --> SqlBool
    NuDate --> SqlDateTime
    NuDuration --> SqlBigInt
    NuFilesize --> SqlInt
    NuBinary --> SqlBlob
    NuList --> SqlJsonb
    NuRecord --> SqlJsonb
    NuTable --> SqlJsonb
    NuNothing --> SqlText
```

## データベースコマンドの関係

```mermaid
flowchart TB
    subgraph DatabaseCommands[Database Commands]
        IntoSqlite[into sqlite]
        QueryDb[query db]
        Open[open]
        Schema[schema]
    end

    subgraph StorCommands[Stor Commands]
        StorAll[stor *]
    end

    subgraph CoreModules[Core Modules]
        SQLiteDB[SQLiteDatabase]
        QueryBuilder[SQLiteQueryBuilder]
        ValuesToSql[values_to_sql]
        ConvertRow[convert_sqlite_row_to_nu_value]
    end

    subgraph Files[Files/Memory]
        MemoryDB[(In-Memory DB)]
        FileDB[(SQLite File)]
    end

    IntoSqlite --> SQLiteDB
    QueryDb --> SQLiteDB
    Open --> SQLiteDB
    Schema --> SQLiteDB
    StorAll --> SQLiteDB

    SQLiteDB --> QueryBuilder
    SQLiteDB --> ValuesToSql
    SQLiteDB --> ConvertRow

    SQLiteDB --> MemoryDB
    SQLiteDB --> FileDB
```

## 履歴データベース設定

```mermaid
erDiagram
    HistoryConfig {
        int max_size
        bool sync_on_enter
        string file_format
        bool isolation
    }

    HistoryFileFormat {
        string Sqlite
        string Plaintext
    }

    HistoryConfig ||--|| HistoryFileFormat : uses
```

## 備考

- Nushellのデータベース機能は、固定スキーマを持たない動的なテーブル設計を採用
- ユーザーは`stor create`で任意のスキーマを定義可能
- メタデータ構造体（DbTable, DbColumn等）はSQLiteのpragma情報を抽象化
- SQLiteQueryBuilderはSQLプッシュダウン最適化のためのクエリビルダー
