4 EDQケース管理の構成
この章の内容は次のとおりです。
ケース管理では、データ品質処理の結果の手動での調査をサポートしています。ケース管理を使用すると、特権ユーザーは高度に構成可能なワークフローを使用した一致する結果の管理およびレビューが可能になります。
EDQサーバーで使用されるケース管理の拡張属性の完全なセットは、oedq_local_home/casemanagement
ディレクトリのflags.xml
ファイルに構成されます。このファイルは新しい拡張属性を追加し、それらの属性の移入方法のルールを定義するように変更される必要があります。
追加のプロパティ・ファイルflags.properties
はベースflags.xml
ファイルを伴い、グラフィカル・ユーザー・インタフェース(GUI)に表示される、拡張属性用のラベルを指定します。このファイルの設定は、ISO 639-1言語コードで追加のプロパティ・ファイルを作成することにより、flags_en.properties
(英語)やflags_de.properties
(ドイツ語)などの、特定のクライアント言語に対し上書きすることができます。この言語コードについては、ISO Webサイト(http://www.iso.org/iso/home/standards/language_codes.htm
)で説明されています。
Oracle Watchlist Screeningがインストールされている場合、これらのファイルはすでに存在する可能性があります。
ケース管理の公開を正しく動作させるには、ケース管理の管理アプリケーションを使用してケース・ソースをインポートするときに、必ずflags.xml
ファイルを上書きします。これは、ケース・ソースではflags.xml
ファイルの形式に依存があり、ケース・ソースが定義されたサーバーで行われるのと同じ方法で、フラグが索引付けされ、指定される必要があるからです。インポートの完了後に再度追加される必要のあるサーバー上のflags.xml
ファイルに既存の拡張属性がある場合には、ケース・ソースのインポート前にファイルをバックアップすることをお薦めします。
4.1 拡張属性の理解と追加
この項では、様々なタイプの拡張属性と、ケース管理で使用するためにそれらを追加する方法について説明します。
4.1.1 デフォルトの拡張属性
最初のEDQインストールでは、flags.xml
ファイルに次の2つの拡張属性(flag
)の定義例が含まれています。
<f:flag index="1" label="%escalation" type="boolean" default="false" notnull="true"/>
<f:flag index="2" label="%priority.score" type="number" readonly="true"/>
ノート:
これらのプロパティが各行に表示される順序は、この例とは一致しない場合があります。プロパティの順序は重要ではありません。また、Oracle Watchlist Screeningがインストールされている場合、flags.xml
ファイルの内容は異なります。
4.1.2 新規拡張属性の追加
新しい拡張属性を追加するには、flags.xml
ファイルで、既存の属性定義の直後に行を追加し、既存の行と同じ構文に従い、各プロパティに次のノートを使用します。
プロパティ | 許可される値 | ノート |
---|---|---|
|
整数 |
ファイルの各エントリに対して一意である必要があります |
|
任意 |
%文字は、UIのラベルがクライアント・ロケールに対する |
|
|
列のデータ型を制御します。 |
|
|
ケースまたはアラートの編集時に特権ユーザーが拡張属性の値を編集できるかどうかを制御します |
|
|
Null値が拡張属性で許可されるかどうかを制御します。これが定義されない場合、Null値は許可されます('false'設定と同じ)。 |
|
任意の許容される値 |
特定の値に設定されていない場合、拡張属性のデフォルト値を設定します。 |
'string'のタイプの拡張属性には80文字の文字制限があります。これよりも長い値は、値として挿入できません。
4.2 データ入力の検証の構成
拡張属性に対しユーザー指定のデータ形式を制限できます。この制限は、ユーザーがケース管理GUIで拡張属性を編集するとき、およびケース管理の管理のワークフロー・エディタで拡張属性に指定可能な値を定義するときにチェックされます。
この制限はケースおよびアラートがプロセスからケース管理に書き込まれるときにはチェックされないので、拡張属性に無効な値を書き込むことができます。無効な値は適切なエラー・メッセージとともにエラーで表示されます。この計画された動作は、不要なジョブの失敗からシステムを保護します。
制限はflags.xml
ファイルの一部として定義されます。指定可能な制限には2つのタイプがあります。
-
事前定義リストは、書き込まれるデータが、指定可能な値を事前定義したリストでチェックされることを意味します。
-
正規表現は、書き込まれるデータが、正規表現でチェックされることを意味します。
4.2.1 事前定義リストの制限のチェック
拡張属性に入力される値が、指定可能な値の事前定義リストと一致することをチェックするには、XML要素を次の形式で拡張属性(flag
)の定義の後に追加します。
<f:restrictions> <f:predefined> <f:value>first value</f:value> <f:value>second value</f:value> <f:value>third value</f:value> </f:predefined> </f:restrictions> </f:flag>
たとえば、次のXMLフラグメントは、'active'および'inactive'の値のみが可能な、カスタムの'Status'拡張属性を定義します。
<f:flag index="6" label="Status" type="string" readonly="false"> <f:restrictions> <f:predefined> <f:value>active</f:value> <f:value>inactive</f:value> </f:predefined> </f:restrictions> </f:flag>
拡張属性は、「ケース管理」の「ケースの編集」(または「アラートの編集」)ダイアログに有効な値のリストとともに表示されます。
ヒント:
この場合、ユーザーはStatus
フィールドにNull値を指定できます('notnull'条件は設定できなかったため)。
4.2.2 正規表現の制限のチェック
拡張属性に入力される値が、正規表現と一致することをチェックするには、XML要素を次の形式で拡張属性(flag
)の定義の後に追加します。
<f:restrictions> <f:regex ignorecase="false" matchby="w"> <f:value
></f:value
> </f:regex> </f:restrictions>
ここで、value
プロパティは正規表現を定義し、ignorecase
およびmatchby
プロパティは一致方法を定義します。matchby
条件の指定可能な値は次のとおりです。
値 | 説明 |
---|---|
|
WHOLE - すべての値が正規表現と一致する必要があります。 |
|
STARTS - 値の最初が正規表現と一致する必要があります。 |
|
ENDS - 値の最後が正規表現と一致する必要があります。 |
|
CONTAINS - 値に正規表現と一致する文字列が含まれる必要があります。 |
たとえば、次のXMLフラグメントは、NN-NN-NNN
(2桁、ハイフン、2桁、ハイフン、3桁)形式の値のみが可能な、カスタムの'National ID'拡張属性を定義します。
<f:flag index="7" label="National ID" type="string" readonly="false" notnull="true"> <f:restrictions> <f:regex ignorecase="false" matchby="w"> <f:value>\d{2}-\d{2}-\d{3}</f:value> </f:regex> </f:restrictions> </f:flag>
次に、ユーザーが正規表現と一致しない値を追加しようとしたときに表示されるエラー・メッセージを示します。
errormessage
属性を使用してこのエラー・メッセージをカスタマイズすることもできます。エラー・メッセージとして表示する単純なテキスト文字列を入力することも、パーセント(%)記号で文字列を開始して、アプリケーションによりflags.properties
ファイルでローカライズされた値を探すこともできます。
たとえば、次のXMLフラグメントは、エラーが発生したときに、e1.message
エラー・メッセージをflags.properties
ファイルから取得します。
<f:restrictions><f:regex ignorecase="false" matchby="w" errormessage="%e1.message"><f:value>\d{3}-\d{2}-\d{4}</f:value></f:regex></f:restrictions>
4.3 ケース管理の構成プロパティの理解
この項では、ケース管理の構成に使用されるdirector.properties
の主要なパラメータを示します。
パラメータ | Description0 |
---|---|
|
このプロパティは、80文字を超えるフラグ値が生成された場合のケース管理の動作を制御します。このプロパティに |
|
このプロパティは、索引キュー制限の最大サイズを制御します。 |
|
このプロパティでは、Lucene索引ディレクトリの絶対パスを構成できます。デフォルトでは、索引ディレクトリは必ず |
4.4 ケース管理フィルタの実行のレポート
この付録では、Oracle Enterprise Data Qualityでのケース管理フィルタの実行に関する情報を抽出する方法について説明します。
EDQには、各フィルタ実行の開始および終了時にコールされるトリガー・ポイントが含まれます。フィルタ実行に関する情報はトリガーに渡され、トリガーはJava Message Service (JMS)、Oracle Cloud Infrastructure Streaming Service、Amazon Kinesis Data Streamsなどのストリーミング・サービスに送信できます。
トリガー・パスは次のとおりです:
/casemanagement/filter/start
/casemanagement/filter/end
これらのパスを受け入れるトリガーの実行関数は、次のように定義されます:
function run(path, id, env, json) {
...
}
json引数は、次の属性を含む文字列化されたJSONオブジェクトです:
属性 | 説明 |
---|---|
id |
内部フィルタ実行ID |
filter |
フィルタの文字列表現 |
type |
指定可能な値は、 |
xaxis |
レポートX軸の文字列表現(レポートの場合のみ存在) |
yaxis |
レポートY軸の文字列表現(レポートの場合のみ存在) |
server |
フィルタが実行されたサーバーの名前 |
userid |
フィルタを実行しているユーザーの内部数値ID |
user |
フィルタを実行しているユーザーの名前 |
userdisplay |
フィルタを実行しているユーザーの表示名 |
start |
フィルタ開始のタイムスタンプ |
duration |
フィルタ実行時間(ミリ秒) (終了コールの場合のみ存在) |
status |
フィルタが正常に完了しなかった場合にその理由を示します |
sql |
フィルタに使用されたSQL文(SQL実行モードのみ) |
args |
SQLバインド引数の配列 |
SQL実行のレポート内のargs属性には、SQLテキスト内の'?'プレースホルダを置換するバインド値が含まれます。配列の各エントリには、次が含まれます:
type |
文字列、数値または日付 |
value |
引数の値 |
例
トリガーがフィルタ実行終了レポートをJMS、OCI通知サービス・トピック、OCIストリームおよびKafkaトピックに送信するとします。
addLibrary("oci");
addLibrary("jms");
addLibrary("kafka");
var oci = OCI.create("OCI 1")
var topic = oci.topic("ocid1.onstopic.oc1.phx.aaaaaaaa....")
var stream = oci.stream("ocid1.stream.oc1.phx.aaaaaaaa....")
var props = config.loadTriggerProperties("jms", "jms\\.properties");
var jms = JMS.open(Object.assign({}, props, config.loadCredentials("", props)))
var kprops = config.loadTriggerProperties("kafka", "kafka\\.properties");
var kprod = KAFKA.producer(kprops.topic, kprops)
function getPath() {
return "/casemanagement/filter/(start|end)";
}
function run(path, id, env, json) {
if (path.endsWith("end")) {
topic.publish("filter done", json)
stream.publish(null, json)
jms.send(json)
kprod.publish(null, json)
}
}
スクリプト・トリガー・フレームワークは、一般的な問合せに1つのインスタンスを使用し、実行には別のインスタンスを使用します。最初のインスタンスはトリガーされないため、JMS接続などのリソースは必要ありません。このフレームワークは、組込み変数runnableを作成します。この変数は、単一の構成インスタンスではfalseです。リソースを最適化するために、これを次のように使用できます:
var jms = runnable && JMS.open(Object.assign({}, props, config.loadCredentials("", props)))
...
function run(path, id, env, json) {
...
jms && jms.send(json)
}
4.5 ケース管理添付の外部ストレージの構成
EDQ 14.1.2では、ケース管理添付データをファイル・システムまたはクラウド・ストレージに格納する新しいオプションがあります。新しい添付は外部に保存されますが、既存の添付データはデータベース表に残ります。REST APIを使用して、データを外部ストレージに移行したり、外部データをデータベースに戻したりすることもできます。
4.5.1 ファイル・システムでのストレージの構成
ファイル・システムでケース管理ストレージを構成するには、director.propertiesに次を追加します:
case.management.attachment.storage.directory = pathtodirectory
ディレクトリ・パスが絶対パスでない場合、そのディレクトリはローカル・ホーム構成ディレクトリが基準になります。EDQは、格納されるファイルの名前として添付レコードの内部IDを使用します。内部IDは、dn_caseattachmentsレコードのattachment_id列にあります。別の名前を使用してファイルを格納する場合は、次を設定します:
case.management.attachment.storage.entryname = filename
filename
値には、次の置換を含めることができます:
置換 | 値 |
---|---|
${id} |
添付の内部ID。これは常に必須です。 |
${source} |
ソース名。ソース名にファイル名として無効な文字を含めることはできません。 |
${caseid} |
関連付けられたdn_caseレコードの内部ID。 |
例:
case.management.attachment.storage.directory = cmatts
case.management.attachment.storage.entryname = ${source}/${id}
この場合、添付データはローカル・ホーム構成ディレクトリ内のcmattsというディレクトリに格納され、ファイル名はソース名と内部IDから構成されます。
4.5.2 クラウド・ストレージ・プロバイダでのストレージの構成
ファイル・システムでケース管理ストレージを構成するには、director.propertiesに次を追加します:
case.management.attachment.storage.url = baseurl
EDQは、エントリ名をベースURLに追加して完全な添付URLを作成します。エントリ名は、case.management.attachment.storage.entryname値から構成されます。
次のいずれかを使用して、クラウドとの間でアップロードおよびダウンロードするための資格証明を設定できます:
case.management.attachment.storage.credentials = stored credentials name
case.management.attachment.storage.platform.credentials = true
case.management.attachment.storage.platform.credentialsがtrueに設定されている場合、EDQは、コンピュート・インスタンスに関連付けられた資格証明を使用します。EDQは、AWS、OCIおよびGCPのプラットフォーム資格証明をサポートしています。
OCIオブジェクト・ストレージの例
case.management.attachment.storage.url = https://mytenancy.objectstorage.us-phoenix-1.oci.customer-oci.com/n/mytenancy/b/cmbucket/o/
case.management.attachment.storage.credentials = OCI 1
case.management.attachment.storage.entryname = cm/${source}/${id}
Amazon S3の例
case.management.attachment.storage.url = https://cmbucket.s3.eu-west-1.amazonaws.com/cm/
case.management.attachment.storage.credentials = aws1
GCPストレージには、ダウンロードURLとアップロードURLに関する異なるルールがあります。GCPで外部ストレージを構成するには:
case.management.attachment.storage.url = https://storage.googleapis.com/storage/v1/b/bucketname/o/
case.management.attachment.storage.cloud = gcp
4.5.3 外部添付ストレージ用のREST API
外部添付ストレージを有効にした場合、既存の添付データはデータベース表に残ります。ケース管理の管理エンドポイントの一部として提供されるREST APIを使用して、既存のレコードを外部ストレージに移行したり、外部データをデータベースに戻したりできます。
外部ストレージとの間での移行
POST http://server:port/edq/cmadmin/migrateattachments
POST http://server:port/edq/cmadmin/unmigrateattachments
ペイロードは、次の属性を含むJSONオブジェクトです:
属性 | 説明 | デフォルト値 |
---|---|---|
start |
処理する最初の添付の内部ID。 |
0 |
count |
処理するレコードの数。 |
unlimited |
batch |
1つのデータベース問合せで処理するレコードの数。 |
10000 |
移行は非同期で実行されます。コールの結果は、実行に対応するキーを含むJSONオブジェクトです。キーは、実行完了のポーリングに使用できます:
{ "executionkey":"a279513d1ea44b0198094ac31ae68258" }
変換ステータスの取得
GET http://server:port/edq/cmadmin/conversionstatus/EXECUTIONKEY
このコールは、非同期変換のステータスを取得します。URLのEXECUTIONKEYコンポーネントは、前の移行コールから返されるキーです。
属性 | タイプ | 説明 |
---|---|---|
complete |
ブール |
変換が完了した場合はtrue。 |
failed |
ブール |
変換中にエラーが発生した場合はtrue。 |
start |
文字列 |
変換が開始したときのタイムスタンプ。 |
end |
文字列 |
変換が完了したときのタイムスタンプ。 |
error |
文字列 |
エラー・メッセージ。または、変換が成功した場合はnull。 |
lastid |
整数 |
変換中に処理された最後の添付のID。 |
processed |
整数 |
処理されたレコードの数。これがゼロの場合、すべてのレコードが処理されたことを意味します。 |
converted |
整数 |
変換されたレコードの数。 |
startおよびcount属性を使用すると、複数のアイドル期間にわたって大規模システムの増分移行を実行できます。最初のコールにはstart = 0を、後続のコールにはlastid+1を設定し、適切な時間内にプロセスで実行できるcountを選択します。
4.5.4 一括削除時のパフォーマンスの考慮事項
外部ストレージの使用は、添付のあるユーザー・アクションには影響しません。ただし、ケースおよびアラートを一括削除する場合は、関連付けられている外部アイテムを、それらがファイルであるかクラウド・ストレージ・オブジェクトであるかに関係なく、個別に削除する必要があります。これは、削除の全体的な実行時間に影響する可能性があります。
クラウド・ストレージ・オブジェクトは、複数のコールを同時に実行することで削除されます。1つのバッチで実行される削除の最大数は、10です。これを変更するには、次を設定します:
case.management.attachment.storage.deletebatch = batchsize