batch-operations.json•6.71 kB
{
  "schema": "memory_document_v1",
  "metadata": {
    "title": "batch-operations.json",
    "documentType": "generic",
    "path": "usecases/batch-operations.json",
    "tags": [],
    "lastModified": "2025-03-24T12:42:04.042Z"
  },
  "content": {
    "text": "{\n  \"schema\": \"memory_document_v2\",\n  \"metadata\": {\n    \"id\": \"diff-edit-usecases-batch\",\n    \"title\": \"JSONパッチ - バッチ操作ユースケース\",\n    \"documentType\": \"usecases\",\n    \"path\": \"usecases/batch-operations.json\",\n    \"tags\": [\n      \"json-patch\",\n      \"usecases\",\n      \"rfc6902\",\n      \"document-editing\",\n      \"batch-operations\",\n      \"atomicity\"\n    ],\n    \"lastModified\": \"2025-03-24T22:00:00.000Z\",\n    \"createdAt\": \"2025-03-24T22:00:00.000Z\",\n    \"version\": 1\n  },\n  \"content\": {\n    \"usecases\": [\n      {\n        \"id\": \"UC-5\",\n        \"title\": \"複数のパッチ操作をアトミックに適用\",\n        \"description\": \"複数のJSON Patch操作をひとつのトランザクションとして実行し、すべての操作が成功するか、何も変更されないかのいずれかを保証します。\",\n        \"actors\": [\"開発者\", \"APIクライアント\"],\n        \"preconditions\": [\n          \"対象のJSONドキュメントが存在していること\",\n          \"ユーザーが対象ドキュメントへの書き込み権限を持っていること\"\n        ],\n        \"mainFlow\": [\n          \"1. ユーザーが対象ドキュメントのIDと複数のパッチ操作を指定\",\n          \"2. システムが対象ドキュメントを取得\",\n          \"3. すべてのパッチ操作の構文検証\",\n          \"4. すべてのパッチ操作のセマンティック検証(試験的適用)\",\n          \"5. 実際のドキュメントへのパッチ適用\",\n          \"6. 更新されたドキュメントの保存\",\n          \"7. 結果の返却\"\n        ],\n        \"alternativeFlows\": [\n          {\n            \"id\": \"UC-5-A1\",\n            \"title\": \"操作の一部または全部が無効な場合\",\n            \"steps\": [\n              \"3a/4a. いずれかの操作が無効であることを検出\",\n              \"3b/4b. バッチ全体を中止し、エラー情報を返却\",\n              \"3c/4c. ドキュメントは変更されない\"\n            ]\n          }\n        ],\n        \"postconditions\": [\n          \"すべてのパッチ操作が正常に適用されているか、または何も変更されていない\",\n          \"ドキュメントの整合性が保たれている\",\n          \"バッチ操作に関する監査ログが記録されている\"\n        ],\n        \"examples\": [\n          {\n            \"description\": \"複数のフィールドを一度に更新するケース\",\n            \"request\": {\n              \"documentId\": \"active-context-123\",\n              \"operations\": [\n                {\"op\": \"replace\", \"path\": \"/metadata/title\", \"value\": \"更新されたタイトル\"},\n                {\"op\": \"replace\", \"path\": \"/metadata/version\", \"value\": 4},\n                {\"op\": \"add\", \"path\": \"/content/recentChanges/0\", \"value\": {\n                  \"date\": \"2025-03-24T21:30:00.000Z\",\n                  \"description\": \"タイトルとバージョンを更新\"\n                }},\n                {\"op\": \"remove\", \"path\": \"/content/recentChanges/3\"}\n              ]\n            },\n            \"response\": {\n              \"success\": true,\n              \"document\": {\n                \"metadata\": {\n                  \"title\": \"更新されたタイトル\",\n                  \"version\": 4\n                },\n                \"content\": {\n                  \"recentChanges\": [\n                    {\n                      \"date\": \"2025-03-24T21:30:00.000Z\",\n                      \"description\": \"タイトルとバージョンを更新\"\n                    },\n                    \"...\": \"その他の要素(最後の要素が削除されている)\"\n                  ]\n                }\n              }\n            }\n          }\n        ]\n      }\n    ],\n    \"implementationNotes\": {\n      \"keyPoints\": [\n        \"バッチ操作ではアトミック性を保証するために、検証と適用を慎重に分離する\",\n        \"すべての操作のバリデーションは、実際の適用前に完全に終了させる\",\n        \"クローン作成されたドキュメントに対してテスト適用することで、副作用なしで検証が可能\"\n      ],\n      \"atomicityImplementation\": {\n        \"description\": \"バッチ操作のアトミック性は以下の手順で実装します:\",\n        \"steps\": [\n          \"1. ドキュメントのディープコピーを作成\",\n          \"2. コピーに対してすべての操作をシミュレーション\",\n          \"3. エラーが発生した場合は即座に中止してエラーを返却\",\n          \"4. シミュレーションが成功した場合のみ、元のドキュメントに対して操作を適用\",\n          \"5. 複合操作全体を一つのトランザクションとして扱う(書き込みロック機構を検討)\"\n        ]\n      },\n      \"errorHandling\": {\n        \"description\": \"バッチ操作のエラーハンドリングでは、どの操作が失敗したかを正確に特定できることが重要です。\",\n        \"strategies\": [\n          \"すべての操作に対して順番にインデックスを付与\",\n          \"エラー時にはインデックス、操作タイプ、パス、エラーの種類を含む詳細情報を返却\",\n          \"たとえ最初の操作でエラーが発生してもすべての操作を検証し、可能な限り多くのエラーを一度に報告\"\n        ]\n      },\n      \"performanceConsiderations\": [\n        \"大量の操作(数百以上)を含むバッチの場合、処理時間が増大する可能性がある\",\n        \"非同期処理や進捗状況の報告機能を検討\",\n        \"クライアント側での適切なバッチサイズ(50〜100操作程度)の推奨\"\n      ],\n      \"usecases\": [\n        \"複数のフィールドを一度に更新する\",\n        \"ドキュメントの構造的な変更(複数の移動や再編成)\",\n        \"インポート・エクスポート時の差分適用\",\n        \"計算された変更セットの一括適用\"\n      ]\n    }\n  }\n}"
  }
}