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
フラグで最新バージョンを識別