CouchDB側についてのメモ(Devin生成、未評価) - aegif/NemakiWare GitHub Wiki

NemakiWareのCouchDB構造に関する詳細ドキュメント

1. bjornlokaの役割

bjornlokaはNemakiWareのインストール時にCouchDBを初期化するためだけに使用されるツールです。具体的には:

  • bjornlokaはsetup/couchdb/bjornlokaディレクトリに存在するJavaツールです
  • インストーラー(setup/installer/install.xml)によって呼び出され、初期データをCouchDBにインポートします
  • 主な機能はLoadAction.javaに実装されており、JSONドキュメントとその添付ファイルをCouchDBにロードします
  • 初期データはsetup/couchdb/initial_importディレクトリのダンプファイル(例:bedroom_init.dump)に含まれています
  • インストール後は使用されません

2. CouchDBの構造

2.1 データベース構造

NemakiWareは以下のCouchDBデータベースを使用します:

  • メインリポジトリデータベース(例:bedroom):ドキュメント、フォルダ、ユーザー、グループなどのコンテンツを格納
  • アーカイブデータベース(例:bedroom_closet):削除されたコンテンツのアーカイブを格納
  • 設定データベースnemaki_conf):システム全体の設定を格納

2.2 デザインドキュメント

すべてのデータベースは単一のデザインドキュメント_design/_repoを使用し、多数のビューを定義しています。このデザインドキュメントは初期インポート時に作成され、必要に応じて更新されます。

3. ドキュメントタイプ

CouchDBには以下のドキュメントタイプが格納されています:

cmis:document

  • 属性:versionSeriesId, latestVersion, majorVersion, attachmentNodeId, renditionIds など
  • クラス:CouchDocument.java

cmis:folder

  • 属性:parentId, path など
  • クラス:CouchFolder.java

cmis:relationship

  • 属性:sourceId, targetId など
  • クラス:CouchRelationship.java

cmis:policy

  • 属性:appliedIds など
  • クラス:CouchPolicy.java

cmis:item

  • クラス:CouchItem.java

user:ユーザー情報

  • 属性:userId, name, firstName, lastName, email, passwordHash, admin など
  • クラス:CouchUser.java

group:グループ情報

  • 属性:groupId, users など
  • クラス:CouchGroupItem.java

attachment:添付ファイル(コンテンツ)

  • クラス:CouchAttachmentNode.java

rendition:レンディション(プレビューなど)

  • クラス:CouchRendition.java

versionSeries:バージョン管理情報

  • クラス:CouchVersionSeries.java

typeDefinition:タイプ定義

  • 属性:typeId, displayName, description, baseId, parentId, properties など
  • クラス:CouchTypeDefinition.java

propertyDefinitionCore:プロパティ定義のコア部分

  • 属性:propertyId, queryName, propertyType, cardinality など
  • クラス:CouchPropertyDefinitionCore.java

propertyDefinitionDetail:プロパティ定義の詳細部分

  • 属性:coreNodeId, displayName, description, required, orderable, updatability など
  • クラス:CouchPropertyDefinitionDetail.java

change:変更履歴

  • 属性:objectId, changeType, token など
  • クラス:CouchChange.java

configuration:システム設定

  • クラス:CouchConfiguration.java

4. ビュー定義

_design/_repoデザインドキュメントには以下のビューが定義されています:

attachments:添付ファイルを取得

function(doc) { if (doc.type == 'attachment') emit(doc._id, doc) }

countByObjectType:オブジェクトタイプごとの数を取得

function(doc) { if (['cmis:document', 'cmis:folder', 'cmis:relationship', 'cmis:policy', 'cmis:item','cmis:secondary'].indexOf(doc.type) >= 0) emit(doc.objectType, doc) }

reduce: function(key,values){return values.length}

propertyDefinitionCoresByPropertyId:プロパティIDによるプロパティ定義コアを取得

function(doc) { if (doc.type == 'propertyDefinitionCore') emit(doc.propertyId, doc) }

children:親IDによる子要素を取得

function(doc) { if (doc.type == 'cmis:folder' || doc.type == 'cmis:document' && doc.latestVersion || doc.type == 'cmis:item') emit(doc.parentId, doc) }

relationships:関係を取得

function(doc) { if (doc.type == 'cmis:relationship') emit(doc._id, doc) }

groupsById:グループIDによるグループを取得

function(doc) { if (doc.type == 'group') emit(doc.groupId, doc) }

documents:ドキュメントを取得

function(doc) { if (doc.type == 'cmis:document') emit(doc._id, doc) }

privateWorkingCopies:プライベートワーキングコピーを取得

function(doc) { if (doc.type == 'cmis:document' && doc.privateWorkingCopy) emit(doc.parentId, doc) }

childByName:親IDと名前による子要素を取得

function(doc) { if (doc.type == 'cmis:folder' || doc.type == 'cmis:document' && doc.latestVersion) emit({parentId: doc.parentId, name:doc.name}, doc) }

usersById:ユーザーIDによるユーザーを取得

function(doc) { if (doc.type == 'user') emit(doc.userId, doc) }

propertyDefinitionCores:プロパティ定義コアを取得

function(doc) { if (doc.type == 'propertyDefinitionCore') emit(doc._id, doc) }

folders:フォルダを取得

function(doc) { if (doc.type == 'cmis:folder') emit(doc._id, doc) }

users:ユーザーを取得

function(doc) { if (doc.type == 'user') emit(doc._id, doc) }

propertyDefinitionDetailsByCoreNodeId:コアノードIDによるプロパティ定義詳細を取得

function(doc) { if (doc.type == 'propertyDefinitionDetail') emit(doc.coreNodeId, doc) }

contentsById:IDによるコンテンツを取得

function(doc) { if (['cmis:document', 'cmis:folder', 'cmis:relationship', 'cmis:policy', 'cmis:item','cmis:secondary'].indexOf(doc.type) >= 0) emit(doc._id, doc) }

relationshipsByTarget:ターゲットIDによる関係を取得

function(doc) { if (doc.type == 'cmis:relationship') emit(doc.targetId, doc) }

policiesByAppliedObject:適用オブジェクトによるポリシーを取得

function(doc) { if (doc.type == 'cmis:policy') for(i in doc.appliedIds){emit(i, doc)} }

groups:グループを取得

function(doc) { if (doc.type == 'group') emit(doc._id, doc) }

documentsByVersionSeriesId:バージョンシリーズIDによるドキュメントを取得

function(doc) { if (doc.type == 'cmis:document') emit(doc.versionSeriesId, doc) }

foldersByPath:パスによるフォルダを取得

function(doc) { if (doc.type == 'cmis:folder') emit(doc.path, doc) }

versionSeries:バージョンシリーズを取得

function(doc) { if (doc.type == 'versionSeries') emit(doc._id, doc) }

relationshipsBySource:ソースIDによる関係を取得

function(doc) { if (doc.type == 'cmis:relationship') emit(doc.sourceId, doc) }

propertyDefinitionDetails:プロパティ定義詳細を取得

function(doc) { if (doc.type == 'propertyDefinitionDetail') emit(doc._id, doc) }

admin:管理者ユーザーを取得

function(doc) { if (doc.type == 'user' && doc.admin) emit(doc._id, doc) }

items:アイテムを取得

function(doc) { if (doc.type == 'cmis:item') emit(doc._id, doc) }

latestMajorVersions:最新のメジャーバージョンを取得

function(doc) { if (doc.type == 'cmis:document' && doc.latestMajorVersion) emit(doc.versionSeriesId, doc) }

typeDefinitions:タイプ定義を取得

function(doc) { if (doc.type == 'typeDefinition') emit(doc.typeId, doc) }

policies:ポリシーを取得

function(doc) { if (doc.type == 'cmis:policy') emit(doc._id, doc) }

renditions:レンディションを取得

function(doc) { if (doc.type == 'rendition') emit(doc._id, doc) }

latestVersions:最新バージョンを取得

function(doc) { if (doc.type == 'cmis:document' && doc.latestVersion) emit(doc.versionSeriesId, doc) }

changesByToken:トークンによる変更を取得

function(doc) { if (doc.type == 'change') emit(doc.token, doc) }

changes:変更を取得

function(doc) { if (doc.type == 'change') emit(doc._id, doc) }

childrenNames:親IDによる子要素の名前を取得

function(doc) {var result={}; result[doc.name]=doc._id; if (doc.type == 'cmis:document' && doc.latestVersion || doc.type == 'cmis:folder') emit(doc.parentId, doc.name);}

5. その他の設定と情報

接続設定

  • URL: nemakiware.propertiesファイルのdb.couchdb.urlで設定
  • 認証情報: db.couchdb.auth.enabled, db.couchdb.auth.username, db.couchdb.auth.passwordで設定

データベース構造

  • メインリポジトリデータベース(例:bedroom
  • アーカイブデータベース(例:bedroom_closet
  • 設定データベース(nemaki_conf

ドキュメントアクセス

  • すべてのドキュメントは_id_rev(リビジョン)を持つ
  • typeフィールドでドキュメントタイプを識別
  • 上記のビューを使用してドキュメントにアクセス

添付ファイル

  • ドキュメントの実際のコンテンツは添付ファイルとして保存
  • 添付ファイル名は常にcontent
  • CouchAttachmentNodeオブジェクトを通じてアクセス

バージョン管理

  • versionSeriesオブジェクトがバージョン管理情報を保持
  • ドキュメントはversionSeriesIdで関連付け
  • latestVersionとlatestMajorVersionフラグで最新バージョンを識別