# 機能設計書 143-Get-DbaRandomizedType

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける`Get-DbaRandomizedType`コマンドレットの機能設計を定義する。本機能は、データマスキングやテストデータ生成で使用可能なランダマイザータイプとサブタイプの一覧を提供する。

### 本機能の処理概要

`Get-DbaRandomizedType`は、Get-DbaRandomizedValueで使用可能な全てのランダマイザータイプ（メインカテゴリ）とサブタイプ（詳細パターン）の組み合わせを一覧表示するコマンドレットである。Person、Address、Finance、Internetなど多数のカテゴリとそれに属するFirstName、LastName、ZipCode、CreditCardNumberなどのサブタイプを確認できる。

**業務上の目的・背景**：データマスキングルールやテストデータ生成設定を作成する際、どのような種類のフェイクデータが利用可能かを把握する必要がある。本機能はBogusライブラリが提供するデータタイプを一覧化し、適切なデータマスキング戦略の策定を支援する。例えば、顧客名をマスキングする場合にPerson.FirstNameやName.LastNameが利用可能であることを確認できる。

**機能の利用シーン**：
- データマスキングルール作成前の利用可能タイプ確認
- テストデータテンプレート作成時のタイプ選択
- 特定カテゴリ（Person、Address等）のサブタイプ一覧取得
- パターン検索による関連タイプの発見
- マスキング設定ドキュメント作成のための参照情報取得

**主要な処理内容**：
1. CSVファイル（en.randomizertypes.csv）からランダマイザータイプ定義を読み込み
2. Patternパラメータ指定時にType/SubTypeで正規表現マッチング
3. RandomizedTypeパラメータでメインカテゴリフィルタリング
4. RandomizedSubTypeパラメータでサブタイプフィルタリング
5. 重複除去とソート後に結果を出力

**関連システム・外部連携**：
- Get-DbaRandomizedValue（値生成時のタイプ指定に使用）
- Invoke-DbaDbDataMasking（データマスキング機能）
- en.randomizertypes.csv（タイプ定義ファイル）

**権限による制御**：本機能はローカルファイルの読み取りのみを行い、SQL Server接続や特別な権限は不要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | CLIコマンド | 主機能 | ランダマイザータイプ一覧取得 |

## 機能種別

データ取得処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| RandomizedType | string[] | No | フィルタリングするメインタイプ（Address, Person等） | - |
| RandomizedSubType | string[] | No | フィルタリングするサブタイプ（FirstName, ZipCode等） | - |
| Pattern | string | No | Type/SubType両方を検索する正規表現パターン | 有効な正規表現 |
| EnableException | switch | No | 例外を有効化 | - |

### 入力データソース

- ランダマイザータイプ定義ファイル: `$script:PSModuleRoot\bin\randomizer\en.randomizertypes.csv`

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Type | string | メインカテゴリ（Address, Commerce, Company, Finance, Internet, Lorem, Name, Person, Phone, Random等） |
| SubType | string | 詳細パターン（FirstName, LastName, ZipCode, City, Email, PhoneNumber等） |

### 出力先

パイプライン（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. 初期化（begin）
   └─ en.randomizertypes.csvをImport-Csvで読み込み
2. パターン検索（Pattern指定時）
   ├─ Typeフィールドでパターンマッチング
   └─ SubTypeフィールドでパターンマッチング（両方の結果を結合）
3. タイプフィルタリング（RandomizedType指定時）
   └─ Where-Object Type -in $RandomizedType
4. サブタイプフィルタリング（RandomizedSubType指定時）
   └─ Where-Object SubType -in $RandomizedSubType
5. 重複除去・ソート
   └─ Select-Object Type, SubType -Unique | Sort-Object Type, SubType
6. 出力
   └─ PSCustomObjectをパイプラインに出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[begin: CSV読み込み<br/>en.randomizertypes.csv]
    B --> C{CSV読み込み<br/>成功?}
    C -->|No| D[Stop-Function:<br/>インポートエラー]
    C -->|Yes| E[process開始]
    E --> F{Pattern<br/>指定あり?}
    F -->|Yes| G[Typeでパターン検索]
    G --> H[SubTypeでパターン検索]
    H --> I[結果を結合]
    F -->|No| J[全タイプを対象]
    I --> K{RandomizedType<br/>指定あり?}
    J --> K
    K -->|Yes| L[Typeフィルタリング]
    K -->|No| M[フィルタなし]
    L --> N{RandomizedSubType<br/>指定あり?}
    M --> N
    N -->|Yes| O[SubTypeフィルタリング]
    N -->|No| P[フィルタなし]
    O --> Q[Select-Object -Unique]
    P --> Q
    Q --> R[Sort-Object Type, SubType]
    R --> S[パイプライン出力]
    S --> T[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | パターン検索の対象 | PatternパラメータはTypeとSubType両方を検索対象とする | Pattern指定時 |
| BR-002 | 複合フィルタリング | Pattern、RandomizedType、RandomizedSubTypeは組み合わせ可能 | 複数パラメータ指定時 |
| BR-003 | 重複除去 | 同一のType-SubType組み合わせは1件のみ出力 | 常時 |
| BR-004 | ソート順 | Type昇順、SubType昇順でソート | 常時 |

### 計算ロジック

特になし

## データベース操作仕様

### 操作別データベース影響一覧

本機能はデータベースへのアクセスを行わない。

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | データベースアクセスなし |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル読み込みエラー | en.randomizertypes.csvが見つからないまたは読み込み不可 | モジュール再インストール |

### リトライ仕様

リトライは実装されていない。

## トランザクション仕様

データベーストランザクションは使用しない。

## パフォーマンス要件

- CSVファイル読み込みは初回のみ（begin ブロック）
- メモリ上でのフィルタリング処理のため高速

## セキュリティ考慮事項

- ローカルファイルの読み取りアクセスのみ
- 機密情報は含まれない

## 備考

- 利用可能なメインタイプ: Address, Commerce, Company, Database, Date, Finance, Hacker, Image, Internet, Lorem, Name, Person, Phone, Random, Rant, System など
- CSVファイルはBogusライブラリの機能に対応

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

ランダマイザータイプ定義の構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | en.randomizertypes.csv | `bin/randomizer/en.randomizertypes.csv` | Type, SubType列の構造 |

**読解のコツ**: CSVファイルはType列とSubType列を持ち、各行がひとつのランダマイザーパターンを定義する。例えば、Type="Address", SubType="City"のように定義される。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaRandomizedType.ps1 | `public/Get-DbaRandomizedType.ps1` | 全体処理フロー |

**主要処理フロー**:
1. **87-95行目**: begin ブロック - CSVファイル読み込み
2. **91行目**: Import-Csvでランダマイザータイプ定義を読み込み
3. **104-109行目**: Patternパラメータによる検索処理
4. **111-113行目**: RandomizedTypeパラメータによるフィルタリング
5. **115-117行目**: RandomizedSubTypeパラメータによるフィルタリング
6. **119行目**: 重複除去とソートを行い出力

#### Step 3: 関連機能との連携を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaRandomizedValue.ps1 | `public/Get-DbaRandomizedValue.ps1` | タイプ情報の使用箇所 |

**主要処理フロー**:
- **192-206行目**: 同じCSVファイルからタイプ情報を読み込み
- **226-230行目**: RandomizerTypeのバリデーション
- **233-241行目**: RandomizerSubTypeのバリデーション

### プログラム呼び出し階層図

```
Get-DbaRandomizedType
    │
    ├─ Import-Csv（タイプ定義読み込み）
    │      └─ bin/randomizer/en.randomizertypes.csv
    │
    ├─ Where-Object（Pattern検索）
    │      ├─ Type -match $Pattern
    │      └─ SubType -match $Pattern
    │
    ├─ Where-Object（Typeフィルタ）
    │      └─ Type -in $RandomizedType
    │
    ├─ Where-Object（SubTypeフィルタ）
    │      └─ SubType -in $RandomizedSubType
    │
    └─ Select-Object -Unique | Sort-Object
```

### データフロー図

```
[入力]               [処理]                    [出力]

                    Import-Csv
                    (en.randomizertypes.csv)
                          │
                          ▼
                    全タイプ定義配列
                          │
Pattern ────────▶  Where-Object
                    (-match Type/SubType)
                          │
                          ▼
RandomizedType ──▶  Where-Object
                    (-in Type)
                          │
                          ▼
RandomizedSubType ▶  Where-Object
                    (-in SubType)
                          │
                          ▼
                    Select-Object -Unique
                          │
                          ▼
                    Sort-Object Type, SubType
                          │
                          ▼
                    [PSCustomObject]
                    - Type
                    - SubType
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaRandomizedType.ps1 | `public/Get-DbaRandomizedType.ps1` | ソース | メイン機能 |
| Get-DbaRandomizedValue.ps1 | `public/Get-DbaRandomizedValue.ps1` | ソース | タイプ情報を使用する機能 |
| en.randomizertypes.csv | `bin/randomizer/en.randomizertypes.csv` | データ | ランダマイザータイプ定義 |
