カスタムJavaScriptを使用した分析における問合せの検証とブロック

JavaScriptで検証スクリプトを開発し、分析基準や列の計算式を検証し、無効な問合せをブロックできます。

分析での問合せのブロック

分析を担当するユーザーは、カスタムJavaScriptを呼び出して、分析基準や列の計算式を検証できます。検証を使用すると、分析を編集する際に問合せをブロックできます。カスタムJavaScriptにはWebサーバーからアクセスできることが必要です。この機能を有効にするには、管理者はシステム設定でWebサーバーのURLを指定し、Webサーバーを安全ドメインとして登録します。

  1. カスタム検証スクリプトをJavaScriptで開発し、それをWebサーバーに格納し、カスタム・スクリプトを含むJavaScript (*.JS)ファイルを指すURLをメモしておきます。
    たとえば、ブロックするためのスクリプトを開発してmyblocking.jsに格納し、URLがhttp://example.com:8080/mycustomscripts/myblocking.jsになるとします。
  2. システム設定でWebサーバーのURLを指定します:
    1. 「コンソール」をクリックしてから、「詳細システム設定」をクリックします。
    2. 分析で問合せをブロックするためのURLに、ステップ1でメモしたURLを入力します。
  3. Webサーバーを安全ドメインとして登録します:
    1. 「コンソール」をクリックしてから、「安全ドメイン」をクリックします。
    2. ステップ2で指定したURLにドメインのエントリを追加します。
      たとえば、example.com:8080を追加します。
    3. オプションで、「スクリプト」および「接続」を選択します。
  4. 検証スクリプトをテストします:
    1. 分析を開きます。
    2. 有効な基準と無効な基準の両方を使用して分析を実行します。
    3. 問合せが予期したとおりにブロックされることを確認します。

基準に基づいて分析をブロックするJavaScriptの開発

ユーザーが分析を実行しようとするたびに、Oracle Analyticsは関数validateAnalysisCriteriaを呼び出します。独自の基準に基づいて問合せを検証してブロックするように、validateAnalysisCriteriaをカスタマイズできます。関数がtrueを返すと、問合せは実行されます。関数がfalseを返すかメッセージを表示すると、問合せはブロックされます。

たとえば、次に示すのは、myblocking.jsという名前のJavaScriptプログラムのサンプル・コードです。

// This is a blocking function. It ensures that users select what 
// the designer wants them to.
function validateAnalysisCriteria(analysisXml)
{
   // Create the helper object
   var tValidator = new CriteriaValidator(analysisXml);
   // Validation Logic
   if (tValidator.getSubjectArea() != "Sample Sales")
      return "Try Sample Sales?";
   if (!tValidator.dependentColumnExists("Markets","Region","Markets","District"))
   {
      // If validation script notifies user, then return false
      alert("Region and District are well suited, do you think?");
      return false;
   }
   if (!tValidator.dependentColumnExists("Sales Measures","","Periods","Year"))
   return "You selected a measure so pick Year!";
   if (!tValidator.filterExists("Sales Measures","Dollars"))
   return "Maybe filter on Dollars?";
   if (!tValidator.dependentFilterExists("Markets","Market","Markets"))
   return "Since you are showing specific Markets, filter the markets.";
   var n = tValidator.filterCount("Markets","Region");
   if ((n <= 0) || (n > 3))
      return "Select 3 or fewer specific Regions";
   return true;
}

関数がfalse以外を返すと、基準が有効とみなされて、分析が実行されます。この関数を使用して、プレビューや保存の操作の基準を検証することもできます。

計算式に基づいて分析をブロックするJavaScriptの開発

ユーザーが列の計算式を入力または変更しようとするたびに、Oracle Analyticsは関数validateAnalysisFormulaを呼び出して演算を確認します。独自の基準に基づいて計算式を検証してブロックするように、validateAnalysisFormulaをカスタマイズできます。関数がtrueを返すと、計算式は受け入れられます。関数がfalseを返すと、計算式は拒否され、カスタム・メッセージが表示されます。

メッセージを表示して、ユーザーが続行できるようにするには、関数がtrueを返す必要があります。問合せをブロックするには、関数がfalseを返すか、メッセージを表示する必要があります。関数内でJavaScriptの文字列と正規表現の手法を使用して計算式を調査し、検証できます。

ヘルパー関数を使用することによって、問合せブロック関数でフィルタや列などをチェックできます。検証ヘルパー関数を参照してください。

たとえば、次のコードは、ユーザーが入力した計算式を受け入れられない場合に問合せをブロックする方法を示しています。

// This is a formula blocking function. It makes sure the user doesn't enter an unacceptable formula.
function validateAnalysisFormula(sFormula, sAggRule)
{
   // don't allow the use of concat || in our formulas
   var concatRe = /\|\|/gi;
   var nConcat = sFormula.search(concatRe);
   if (nConcat >= 0)
      return "You used concatenation (character position " + nConcat + "). That isn't allowed.";
   // no case statements
   var caseRe = /CASE.+END/gi;
   if (sFormula.search(caseRe) >= 0)
      return "Don't use a case statement.";
   // Check for a function syntax: aggrule(formula) aggrule shouldn't contain a '.'
   var castRe = /^\s*\w+\s*\(.+\)\s*$/gi;
   if (sFormula.search(castRe) >= 0)
      return "Don't use a function syntax such as RANK() or SUM().";
    return true;
}

検証ヘルパー関数

使用できるいくつかの検証ヘルパー関数がJavaScriptファイルにあります。

検証ヘルパー関数 説明

CriteriaValidator.getSubjectArea()

分析で参照されるサブジェクト領域の名前を返します。通常、これは関数内で他の検証を実行する前にswitch文で使用されます。分析がセット・ベースの基準である場合はnullを返します。

CriteriaValidator.tableExists(sTable)

指定されたフォルダ(表)がコンテンツ設計者によって分析に追加された場合はtrueを返します。フォルダが追加されなかった場合はfalseを返します。

CriteriaValidator.columnExists(sTable, sColumn)

指定された列がコンテンツ設計者によって分析に追加された場合はtrueを返します。列が追加されなかった場合はfalseを返します。

CriteriaValidator.dependentColumnExists(sCheckTable, sCheckColumn, sDependentTable, sDependentColumn)

checkColumnがある場合に、dependentColumnが確実に存在することを確認します。checkColumnがない場合、またはcheckColumnと依存列がある場合は、trueを返します。checkColumndependentColumnnullの場合、フォルダは検証されません。checkTableのいずれかの列が存在する場合、dependentTableの列が存在する必要があります。

CriteriaValidator.filterExists(sFilterTable, sFilterColumn)

指定された列に対してフィルタが存在する場合はtrueを返します。フィルタがない場合はfalseを返します。

CriteriaValidator.dependentFilterExists(sCheckTable, sCheckColumn, sFilterTable, sFilterColumn)

checkColumnが射影リストにある場合に、dependentFilterが確実に存在することを確認します。checkColumnがない場合、またはcheckColumnと依存フィルタがある場合は、trueを返します。

CriteriaValidator.filterCount(sFilterTable, sFilterColumn)

特定の論理列に指定されたフィルタ値の数を返します。フィルタ値が、"equals"、"null"、"notNull"、"in"のいずれかの場合、選択された値の数を返します。列がフィルタ内で使用されていない場合は、ゼロを返します。列がデフォルトなしで要求されている場合は-1を返します。他のすべてのフィルタ演算子("greater than"、"begins with"など)については値の数を判別できないため、999を返します。