現在表示中:

CQ では、標準レポートを複数から選択できます。標準レポートのほとんどが、レポートフレームワークに基づいています。

このフレームワークを使用して、これらの標準レポートを拡張することも、完全に新規のレポートを独自に開発することもできます。このレポートフレームワークは、既存の CQ5 の概念および原理に密接に統合されているので、開発者は現在の CQ5 の知識を出発点として、レポートを開発できます。

CQ で提供される標準レポートを以下に示します。

注意:

独自のレポートの作成 - 例のチュートリアルでも、以下で説明する原理のうち使用できるものを示しています。

標準レポートを参照し、他の実装例を確認することもできます。

注意:

以下で説明する例や定義では、次の表記が使用されます。

  • 各行で、ノードまたはプロパティが次のように定義されます。
    • N:<name> [<nodeType>]
      名前が <name>、ノードタイプが <nodeType> のノードを示します。
    • P:<name> [<propertyType]
      名前が <name>、プロパティタイプが <propertyType> のプロパティを示します。
    • P:<name> = <value>
      <name> のプロパティが <value> の値に設定されることを示します。
  • インデントによって、階層でのノード同士の依存関係を示します。
  • 「|」で区切られたアイテムは、当てはまるアイテムのリスト(タイプや名前など)を示します。
    例えば String|String[] は、プロパティが String または String[] のどちらかになることを示します。
  • [] は配列を示します。例えば、String[] やクエリー定義で指定するノードの配列などがあります。

特に記載のない限り、デフォルトのタイプは次のとおりです。

  • ノード - nt:unstructured 
  • プロパティ - String

レポートフレームワーク

レポートフレームワークは、次のような原理で使用されます。

  • CQ5 QueryBuilder が実行するクエリーによって返される結果セットに、完全に基づいています。
  • 結果セットには、レポートに表示するデータが定義されます。結果セットの各行は、表形式で表示されるレポートの行に対応します。
  • 結果セットに基づいて実行できる操作は、RDBMS 概念と同様で、主にグループ化と集計があります。
  • データの取得と処理は、ほとんどサーバー側で行われます。
  • クライアントの役割は、前処理されたデータの表示のみです。重要でない処理タスク(セル内でのリンクの作成など)のみが、クライアント側で実行されます。

レポートフレームワーク(標準レポートの構造を例に示す)では次のような構築ブロックが使用され、これらは処理キューによって取得されます。

レポートページ

レポートページの特徴は次のとおりです。

レポートベース

reportbase コンポーネントは、次のようにすべてのレポートの基礎となるものです。

  • 基になる結果セットのデータを提供するクエリーの定義を保持します。
  • レポートに追加されたすべての列(columnbase)を含むよう適合された段落システムです。
  • 使用可能なチャートタイプ、および現在アクティブなチャートタイプを定義します。
  • 編集ダイアログを定義します。ユーザーがこのダイアログを使用して、レポートの一部の属性を設定できます。

列ベース

各列は、次のような columnbase コンポーネントのインスタンスです。

  • 各レポートの段落システム(reportbase)で使用される段落です。
  • 基になる結果セットへのリンクを定義します。つまり、この結果セット内で参照される特定のデータと、その処理方法を定義します。
  • その他の定義(使用できる集計やフィルターなど)を保持します。デフォルト値があればそれも保持します。

クエリーとデータの取得

クエリーの概要は次のとおりです。

  • reportbase コンポーネントの一部として定義されます。
  • CQ QueryBuilder に基づいています。
  • レポートの基礎として使用するデータを取得します。結果セット(テーブル)の各行が、ノードに 1 つずつ関連付けられ、クエリーから返されます。このデータセットから、個別の列に関する特定の情報が抽出されます。
  • 通常、次のデータから構成されます。
    • ルートパス。
      これにより、検索対象とするリポジトリのサブツリーが指定されます。
      パフォーマンスの低下を最小限にするため、クエリーの対象をリポジトリの特定のサブツリーになるべく制限することをお勧めします。このルートパスは、レポートテンプレートで事前定義するか、または設定(編集)ダイアログでユーザーが設定することができます。
    • 1 つ以上の条件
      これらは、(最初の)結果セットの生成時に適用されます。ノードタイプの制限や、プロパティの制限などがあります。

重要な点は、クエリーの結果セットに返されるノードを 1 つ使用して、レポートの行が 1 つ生成される(ノードと行は 1 対 1 の関係にある)ことです。

開発者は、レポートに対して定義したクエリーによって、そのレポートに適切なノードセットが返されることを確認する必要があります。ただし、このノード自体が必要な情報をすべて保持する必要はありません。親や子のノードから情報を取得することもできます。例えば、ユーザーレポートで使用されるクエリーでは、ノードタイプ(この場合は rep:user)に基づいてノードが選択されます。ただし、このレポートのほとんどの列では、選択されたノードから直接データを取得することはなく、子ノードの profile から取得します。

処理キュー

クエリーによって返される結果セットのデータが、レポート上で行として表示されます。結果セットの各行は、(サーバー側の)いくつかのフェーズで処理をおこなってから、クライアントに転送され、レポートに表示されます。

次のような操作が可能です。

  • 基になる結果セットからの複数の値の抽出や取得。
    例えば、2 つのプロパティ値の差を計算することで、その 2 つの値を 1 つの値として処理できます。
  • 抽出した値の解決。様々な方法でおこなうことができます。
    例えば、パスをタイトル(対応する jcr:title プロパティの、わかりやすいコンテンツ)にマップできます。
  • 様々なポイントでのフィルターの適用。
  • 複合値の作成(必要に応じて)。
    例えば、ユーザーに表示されるテキストから、値を作成してソートに使用したり、追加の URL を作成して(クライアント側で)リンクの作成に使用したりできます。

処理キューのワークフロー

処理キューのワークフローを以下に示します。

処理キューのフェーズ

具体的な手順と要素は次のとおりです。

  1. 初期クエリー(reportbaseから返された結果を、基になる結果セットに変換します。このとき、値抽出を使用します。
    値抽出は、列のタイプによって自動的に選択されます。値抽出を使用して、基になる JCR クエリーから値を読み取り、その値から結果セットを作成し、その後の処理で適用できるようにします。例えば diff タイプの場合、値抽出によって 2 つのプロパティを読み取り、1 つの値に計算し、その値を結果セットに追加します。値抽出の設定は操作できません。
  2. 生データを含むこの初期結果セットに、初期フィルター(raw フェーズ)が適用されます。
  3. apply フェーズの定義に従い、値が前処理されます。
  4. 前処理された値に対して、フィルタリング(preprocessed フェーズに割り当てられています)が実行されます。
  5. 指定されたリゾルバーによって、値が解決されます。
  6. 解決された値に対して、フィルタリング(resolved フェーズに割り当てられています)が実行されます。
  7. データがグループ化および集計されます。
  8. 配列データが、(文字列ベースの)リストへの変換によって解決されます。
    この手順は、複数の値を持つ結果をリストに変換して表示できるようにする暗黙の手順です。複数の値を持つ JCR プロパティに基づいた(集計されていない)セル値が必要です。
  9. afterApply フェーズの定義に従い、値が再び前処理されます。
  10. データがソートされます。
  11. 処理されたデータが、クライアントに転送されます。

注意:

基になるデータの結果セットを返す初期クエリーは、reportbase コンポーネントで定義されます。

処理キューのその他の要素は、columnbase コンポーネントで定義されます。

レポートの構成と設定

レポートコンポーネントの場所

デフォルトのレポートコンポーネントは、/libs/cq/reporting/components の下に保持されます。

ただし、これらのノードは更新しないことを強くお勧めします。独自のコンポーネントノードは、/apps/cq/reporting/components の下か、より適切であれば /apps/<yourProject>/reports/components の下に作成してください。

定義(例)は次のとおりです。

N:apps 
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:components [sling:Folder]

この下にレポートのルートを作成し、このルート下にレポートベースコンポーネント、および列ベースコンポーネントを作成します。

N:apps 
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:components [sling:Folder]
                N:<reportname> [sling:Folder]
                        N:<reportname> [cq:Component]  // report base component
                        N:<columnname> [cq:Component]  // column base component

ページコンポーネント

レポートページには、/libs/cq/reporting/components/reportpagesling:resourceType を使用する必要があります。

ページコンポーネントのカスタマイズは、(ほとんどの場合)必要ありません。

レポートベースコンポーネント

レポートタイプごとに、/libs/cq/reporting/components/reportbase からコンテナコンポーネントを取得する必要があります。

このコンポーネントは、レポート全体のコンテナとして使用され、次の情報が含まれます。

N:<reportname> [cq:Component]
    P:sling:resourceSuperType = "cq/reporting/components/reportbase"
    N:charting
    N:dialog [cq:Dialog]
    N:queryBuilder

クエリー定義

N:queryBuilder
    N:propertyConstraints
    [
        N:<name> // array of nodes (name irrelevant), each with the following properties:
            P:name
            P:value
    ]
    P:nodeTypes [String|String[]] 
    P:mandatoryProperties [String|String[]]
  • propertyConstraints
    特定のプロパティと値を持つノードのみを結果セットに含める場合に使用できます。複数の制限が指定された場合、含まれるノードはこれらすべての制限を満たす(AND 演算による)必要があります。
    例:
        N:propertyConstraints
        [
            N:0
                P:sling:resourceType
                P:foundation/components/textimage
            N:1
                P:jcr:modifiedBy
                P:admin
         ]

    admin ユーザーが最後に変更したすべての textimage コンポーネントが返されます。
  • nodeTypes
    指定したノードタイプのみを結果セットに含める場合に使用します。複数のノードタイプを指定できます。
  • mandatoryProperties
    指定したプロパティをすべて持つノードのみを結果セットに含める場合に使用できます。プロパティの値は考慮されません。

以上はすべてオプションで、必要に応じて組み合わせて使用できますが、いずれか 1 つは必ず定義してください。

チャート定義

N:charting
    N:settings
        N:active [cq:WidgetCollection]
        [
            N:<name> // array of nodes, each with the following property
                P:id   // must match the id of a child node of definitions 
        ]
    N:definitions [cq:WidgetCollection]
    [
        N:<name> // array of nodes, each with the following properties
            P:id
            P:type
            // additional, chart type specific configurations
    ]
  • settings
    アクティブなチャートについての定義を保持します。
    • active
      複数の設定を定義できるので、これを使用して現在アクティブなノードを定義できます。ノードの配列によって定義されます(これらのノードには強制的な命名規則はありませんが、標準レポートでは通常、01..x が使用されます)。各ノードには次のプロパティを指定します。
      • id
        アクティブなチャートの ID。チャート定義(definitions)のいずれかのチャートの ID に一致する必要があります。
  • definitions
    レポートでの使用が可能なチャートタイプを定義します。definitions のうち使用されるタイプが、active で指定されます。
    この定義にはノードの配列(通常は 01..x と命名)を使用し、各ノードには次のプロパティを指定します。
    • id
      チャートの ID。
    • type
      使用できるチャートのタイプ。次から選択します。
      • pie
        円グラフ。現在のデータからのみ生成されます。
      • lineseries
        線系列(実際のスナップショットを表す点をつないだもの)履歴データからのみ生成されます。
    • チャートタイプによって、次のようなその他のプロパティを使用できます。
      • チャートタイプが pie の場合:
        • maxRadiusDouble/Long
          この円グラフで許容される半径の最大値、つまりこのチャートで許容される最大サイズ(凡例を使用しない場合)。fixedRadius が指定されている場合、この値は無視されます。
        • minRadiusDouble/Long
          この円グラフで許容される半径の最小値。fixedRadius が指定されている場合、この値は無視されます。
        • fixedRadiusDouble/Long
          この円グラフの半径の固定値を指定します。
      • チャートタイプが lineseries の場合
        • totalsBoolean
          合計を示す線を追加表示する場合は、true を指定します。
          デフォルト:false
        • seriesLong
          表示する線(系列)の数。
          デフォルト:9(この値は許容される最大値です)
        • hoverLimitLong
          ユーザーが個別の値、またはチャートの凡例の対応するラベルにマウスオーバーしたときに、ポップアップを表示するスナップショット(各水平線上に表示される、個別の値を示す点)の合計の最大数。
          デフォルト:35(現在のチャート設定で適用される個別の値が 35 個を超える場合は、ポップアップが表示されません)。
          このほかに、同時表示できるポップアップ数(凡例のテキストにマウスオーバーしたときに表示できる複数のポップアップ)を 10 個までに制限できます。

設定ダイアログ

レポートごとに設定ダイアログを使用でき、ユーザーがレポートの様々なパラメーターを指定できます。このダイアログは、レポートページが開いているときに「編集」ボタンからアクセスできます。

このダイアログは標準の CQ ダイアログで、CQ ダイアログとして設定できます(詳しくは CQ.Dialog を参照)。

ダイアログの例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="cq:Dialog"
    height="{Long}424">
    <items jcr:primaryType="cq:WidgetCollection">
        <props jcr:primaryType="cq:Panel">
            <items jcr:primaryType="cq:WidgetCollection">
                <title
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/title.infinity.json"
                    xtype="cqinclude"/>
                <description
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/description.infinity.json"
                    xtype="cqinclude"/>
                <rootPath
                    jcr:primaryType="cq:Widget"
                    fieldLabel="Root path"
                    name="./report/rootPath"
                    rootPath=""
                    rootTitle="Repository root"
                    xtype="pathfield"/>
                <processing
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/processing.infinity.json"
                    xtype="cqinclude"/>
                <scheduling
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/scheduling.infinity.json"
                    xtype="cqinclude"/>
            </items>
        </props>
    </items>
</jcr:root>

いくつかの事前設定されたコンポーネントを使用できます。xtype プロパティに値 cqinclude を指定して、これらのコンポーネントをダイアログで参照できます。

  • title
    /libs/cq/reporting/components/commons/title
    レポートのタイトルを定義するテキストフィールド。
  • description
    /libs/cq/reporting/components/commons/description
    レポートの説明を定義するテキスト領域。
  • processing
    /libs/cq/reporting/components/commons/processing
    レポートの処理モード(データの手動/自動読み込み)のセレクター。
  • scheduling
    /libs/cq/reporting/components/commons/scheduling
    履歴チャートのスケジューリングスナップショットのセレクター。

注意:

.infinity.json を末尾に付加し、参照されるコンポーネントを含める必要があります(前述の例を参照)。

ルートパス

このほか、レポートのルートパスを指定することもできます。

  • rootPath
    レポートの対象を、リポジトリの特定のセクション(ツリーまたはサブツリー)に限定できます。パフォーマンスの最適化のために、限定することをお勧めします。このルートパスは、各レポートページの report ノードの rootPath プロパティで指定します(ページの作成時、テンプレートから取得されます)。
    次の方法で指定できます。
    • レポートテンプレートを使用(設定ダイアログで、固定値またはデフォルト値として指定)。
    • ユーザーが(このパラメーターを使用して)指定。

列ベースコンポーネント

列のタイプごとに、/libs/cq/reporting/components/columnbase からコンポーネントを取得する必要があります。

列コンポーネントで、次の組み合わせが定義されます。

N:<columnname> [cq:Component]
   P:componentGroup
   P:jcr:title
   P:sling:resourceSuperType = "cq/reporting/components/columnbase"
   N:cq:editConfig [cq:EditConfig]               // イベントおよびアクション
   N:defaults                                    // 列のデフォルト値
   N:definitions
      N:queryBuilder                             // 列固有のクエリー
        P:property [String|String[]]             // 列固有のクエリー
        P:subPath                                // 列固有のクエリー
        P:secondaryProperty [String|String[]]    // 列固有のクエリー
        P:secondarySubPath                       // 列固有のクエリー
      N:data
        P:clientFilter [String]                  // クライアントフィルター
        P:resolver                               // リゾルバーと前処理
        N:resolverConfig                         // リゾルバーと前処理
        N:preprocessing                          // リゾルバーと前処理
      P:type                                     // 列固有の定義
      P:groupable [Boolean]                      // 列固有の定義
      N:filters [cq:WidgetCollection]            // 列固有の定義
      N:aggregates [cq:WidgetCollection]         // 列固有の定義

新規レポートの定義も参照してください。

列固有のクエリー

個別の列で使用する特定のデータを(レポートデータの結果セットから)抽出する方法を定義します。

N:definitions 
    N:queryBuilder
        P:property [String|String[]]        
        P:subPath
        P:secondaryProperty [String|String[]]
        P:secondarySubPath
  • property
    セルの実値の計算に使用するプロパティを指定します。
    String[] に指定すると、複数のプロパティを(順に)スキャンして実値を探します。
    例えば、次の場合:
        property = [ "jcr:lastModified", "jcr:created" ]
    対応する値抽出(ここで管理されている)は、
    • 有効な jcr:lastModified プロパティが存在するかどうかを確認し、存在する場合はそのプロパティを使用します。
    • 有効な jcr:lastModified プロパティが存在しない場合は、jcr:created のコンテンツを代わりに使用します。
  • subPath
    クエリーによって返されるノードに結果を配置しない場合、このプロパティを実際に配置する場所を subPath で指定します。
  • secondaryProperty
    セルの実値の計算に必要な、2 つ目のプロパティを定義します。このプロパティは、特定の列のタイプ(diff および sortable)でのみ使用されます。
    例えばワークフローインスタンスレポートの場合、開始時間と終了時間の時間差(ミリ秒単位)の実値を格納するときに使用するプロパティを指定できます。
  • secondarySubPath
    subPath と同様に、secondaryProperty の使用時に使用します。

ほとんどの場合、property のみを使用します。

クライアントフィルター

クライアントフィルターを使用して、サーバーによって返されるデータから、表示する情報を抽出します。

注意:

このフィルターは、サーバー側の処理がすべて適用された後、クライアント側で実行されます。

N:definitions
    N:data
        P:clientFilter [String]

clientFilter は、JavaScript 関数として、次のように定義されます。

  • 入力時、1 つのパラメーターを受信します。受信するデータは、サーバーから返された(完全に前処理された)ものです。
  • 出力時、フィルターを適用した後の(処理後の)値を返します。返すデータは、入力時のデータから抽出または取得したものです。

次の例では、コンポーネントのパスから対応するページパスが抽出されます。

function(v) {
    var sepPos = v.lastIndexOf('/jcr:content');
    if (sepPos < 0) {
        return v;
    }
    return v.substring(sepPos + '/jcr:content'.length, v.length);
}

リゾルバーと前処理

処理キューで様々なリゾルバーを指定し、前処理を設定します。

N:definitions
    N:data
        P:resolver
        N:resolverConfig
        N:preprocessing
            N:apply
            N:applyAfter
  • resolver
    使用するリゾルバーを指定します。次のリゾルバーを使用できます。
    • const
      値を他の値にマップします。例えば en などの定数を、対応する値 English に解決できます。
    • default
      デフォルトのリゾルバー。ダミーのリゾルバーで、実際には解決を実行しません。
    • page
      パスの値を、対応するページのパス(正確には、対応する jcr:content ノード)に解決します。例えば、/content/.../page/jcr:content/par/xyz/content/.../page/jcr:content に解決されます。
    • path
      パスの値にオプションとしてサブパスを付加し、解決されたパスにあるノードのプロパティ(resolverConfig で指定)から実値を取得することで、パスの値を解決します。例えば、/content/.../page/jcr:content のパスを、jcr:title プロパティのコンテンツに解決できます。つまり、ページのパスをページのタイトルに解決できます。
    • pathextension
      パスを先頭に付加し、解決されたパスのノードのプロパティから実値を取得することで、値を解決します。例えば、de という値の先頭に /libs/wcm/core/resources/languages などのパスを付加し、language プロパティから値を取得することで、国コード de を言語 German に解決します。
  • resolverConfig
    リゾルバーの定義をおこないます。以下のうち使用できるオプションは、resolver の選択によって決まります。
    • const
      プロパティを使用して、解決する定数を指定します。プロパティの名前で、解決する定数を指定します。プロパティの値で、解決後の値を指定します。
      例えば Name=1Value=One の場合、1 が One に解決されます。
    • default
      使用できる設定がありません。
    • page
      • propertyName(オプション)
        値の解決に使用するプロパティの名前を指定します。指定がない場合は、jcr:title のデフォルト値(ページタイトル)が使用されます。page リゾルバーの場合は、パスが最初にページのパスに解決され、次にページのタイトルに解決されます。
    • path
      • propertyName(オプション)
        値の解決に使用するプロパティの名前を指定します。指定がない場合は、jcr:title のデフォルト値が使用されます。
      • subPath(オプション)
        このプロパティは、値を解決する前にパスに付加する接尾辞を指定するときに使用します。
    • pathextension
      • path(必須)
        先頭に付加するパスを指定します。
      • propertyName(必須)
        実値を探す対象とする、解決されたパスのプロパティを指定します。
      • i18n(オプション、タイプ Boolean)
        解決された値を国際化するCQ5 の国際化対応サービスを使用)かどうかを決定します。
  • preprocessing
    前処理はオプションで、apply または applyAfter の処理フェーズに(別々に)バインドできます。

リゾルバー

リゾルバーは、必要な情報を抽出するために使用します。様々なリゾルバーの例を示します。

Const

次の定義では、VersionCreated の定数値が New version created という文字列に解決されます。

/libs/cq/reporting/components/auditreport/typecol/definitions/data を参照してください。

N:data
    P:resolver=const
    N:resolverConfig
        P:VersionCreated="New version created"

Page

パスの値が、対応するページの jcr:content(子)ノードの jcr:description プロパティに解決されます。

/libs/cq/reporting/components/compreport/pagecol/definitions/data を参照してください。

N:data
    P:resolver=page
    N:resolverConfig
        P:propertyName="jcr:description"

Path

次の定義では、/content/.../page のパスが jcr:title プロパティのコンテンツに解決されます。つまり、ページのパスがページのタイトルに解決されます。

/libs/cq/reporting/components/auditreport/pagecol/definitions/data を参照してください。

N:data
    P:resolver=path
    N:resolverConfig
        P:propertyName="jcr:title"
        P:subPath="/jcr:content"

Path Extension

次の定義では、de という値の先頭に /libs/wcm/core/resources/languages という拡張パスを付加し、language プロパティから値を取得することで、国コード de を言語 German に解決できます。

/libs/cq/reporting/components/userreport/languagecol/definitions/data を参照してください。

N:data
    P:resolver=pathextension
    N:resolverConfig
        P:path="/libs/wcm/core/resources/languages"
        P:propertyName="language"

前処理

preprocessing の定義は、次のどちらかに適用できます。

  • 元の値:
    元の値に対する前処理の定義は、apply または applyAfter で直接指定されます。
  • 集計された状態の値:
    必要に応じて、集計ごとに個別の定義を指定できます。
    集計後の値の前処理を明示的に指定するには、前処理の定義をそれぞれの子ノード aggregatedapply/aggregatedapplyAfter/aggregated)でおこなう必要があります。個別の集計に対して、前処理を明示的に指定する必要がある場合は、各集計の名前が付いた子ノード(例えば apply/aggregated/min/max などの集計)で前処理の定義をおこなう必要があります。

次のいずれかを指定して、前処理中に適用できます。

  • パターンの検索と置換検索後、指定したパターン(正規表現として指定)を他のパターンに置き換えます。例えば、元の値からサブ文字列を抽出するときに使用できます。

  • データタイプフォーマッター
    数値を対応する文字列に変換します。例えば、1 時間の時間差を表す値を、1:24PM (1 hour ago) などの文字列に解決できます。

次に例を示します。

N:definitions
    N:data
        N:preprocessing
            N:apply|applyAfter
                P:pattern         // regex
                P:replace         // replacement for regex
                // and/or
                P:format          // data type formatter

前処理 - パターンの検索と置換

前処理で、pattern を(正規表現(regex)として)指定して検索し、replace のパターンに置き換えることができます。

  • pattern
    サブ文字列の検索に使用する正規表現。
  • replace
    元の文字列の置き換えに使用する文字列、または文字列の表現。通常、pattern の正規表現によって検索される文字列のサブ文字列を示します。

置き換えの例を、次に説明します。

  • definitions/data/preprocessing/apply のノードに、次の 2 つのプロパティを指定します。
    • pattern: (.*)(/jcr:content)(/|$)(.*)
    • replace: $1
  • 次のような文字列が検索されます。
    • /content/geometrixx/en/services/jcr:content/par/text
  • この文字列は次の 4 つのセクションのいずれかに分類されます。
    • $1 - (.*) - /content/geometrixx/en/services
    • $2 - (/jcr:content) - /jcr:content
    • $3 - (/|$) - /
    • $4 - (.*) - par/text
  • $1 で示される次の文字列に置き換えられます。
    • /content/geometrixx/en/services

前処理 - データタイプフォーマッター

このフォーマッターは、数値を対応する文字列に変換するものです。

例えば、minavg および max の集計が可能な時間列に使用できます。min/avg/max の集計は時間差10 days ago など)として表示されるので、データフォーマッターが必要です。この場合、datedelta フォーマッターが min/avg/max の集計後の値に適用されます。count 集計も使用できる場合、この集計ではフォーマッターは必要なく、元の値も必要ありません。

現在使用できるデータタイプフォーマッターは、次のとおりです。

  • format
    データタイプフォーマッター:
    • duration
      指定された 2 つの日時の間のタイムスパンです。例えば、ワークフローアクションの開始から終了までの時間を 1 時間とした場合、開始を 2011 年 2 月 13 日 11 時 23 分とすると、終了は 1 時間後の 2011 年 2 月 13 日 12 時 23 分となります。
      数値(ミリ秒として解釈)が期間を表す文字列に変換されます。例えば、3000030s にフォーマットされます。
    • datedelta
      過去の日付から「現在」までのタイムスパンです(したがって、レポートを後の時点で表示すると、結果が異なります)。
      数値(日単位の時間差として解釈)が、対応する日付の文字列に変換されます。例えば、1 という値は 1 日前にフォーマットされます。

次の例では、min および max の集計に対して datedelta フォーマットが指定されています。

N:definitions
    N:data
        N:preprocessing
            N:apply
                N:aggregated
                    N:min
                        P:format = "datedelta"
                    N:max
                        P:format = "datedelta"

列固有の定義

列固有の定義は、その列で使用できるフィルターや集計を指定するものです。

N:definitions
    P:type
    P:groupable [Boolean]
    N:filters [cq:WidgetCollection]  
    [
        N:<name> // array of nodes (names irrelevant) with the following properties:
            P:filterType
            P:id
            P:phase
    ]
    N:aggregates [cq:WidgetCollection]
    [
        N:<name> // array of nodes (names irrelevant) with the following properties:
            P:text
            P:type
    ]
  • type標準オプションとして使用できるものは次のとおりです。

    • string
    • number
    • int
    • date
    • diff
    • timeslot
      日付から、集計に必要な部分を抽出する場合(例えば年でグループ化し、年ごとに集計したデータを取得する場合)に使用します。
    • sortable
      異なる値(異なるプロパティの値)を使用してソートし、表示できる値に適用します。
    以上のいずれも、複数値として指定できます。例えば、string[] によって文字列の配列を指定できます。
    値抽出は、列のタイプによって選択されます。列のタイプで使用できる値抽出がある場合、その値抽出が使用されます。使用できる値抽出がない場合、デフォルトの値抽出が使用されます。
    タイプには、(オプションとして)パラメーターを指定できます。例えば、timeslot:year を使用して日付フィールドから年を抽出できます。タイプとパラメーターを次に示します。
    • timeslot - この値は、java.utils.Calendar の対応する定数に相当します。
      • timeslot:year - Calendar.YEAR
      • timeslot:month-of-year - Calendar.MONTH
      • timeslot:week-of-year - Calendar.WEEK_OF_YEAR
      • timeslot:day-of-month - Calendar.DAY_OF_MONTH
      • timeslot:day-of-week - Calendar.DAY_OF_WEEK
      • timeslot:day-of-year - Calendar.DAY_OF_YEAR
      • timeslot:hour-of-day - Calendar.HOUR_OF_DAY
      • timeslot:minute-of-hour - Calendar.MINUTE
         
  • groupable
    レポートをこの列でグループ化できるかどうかを指定します。
  • filters
    フィルターの定義。
    • filterType
      使用可能なフィルターは次のとおりです。
      • string
        文字列ベースのフィルター。
    • id
      フィルターの識別子。
    • phase
      使用可能なフェーズ。
      • raw
        生データにフィルターが適用されます。
      • preprocessed
        前処理されたデータにフィルターが適用されます。
      • resolved
        解決されたデータにフィルターが適用されます。
  • aggregates
    集計の定義。
    • text
      集計のテキスト形式の名前。text の指定がない場合、集計のデフォルトの説明が使用されます。例えば min 集計の場合、minimum が使用されます。
    • type
      集計のタイプ。使用できる集計は次のとおりです。
      • count
        行数を数えます。
      • count-nonempty
        空でない行の数を数えます。
      • min
        最小値を求めます。
      • max
        最大値を求めます。
      • average
        平均値を求めます。
      • sum
        すべての値の合計を求めます。
      • median
        中間値を求めます。
      • percentile95
        各値の 95 パーセンタイル値を求めます。

列のデフォルト値

列のデフォルト値の定義を次に示します。

N:defaults
    P:aggregate

イベントおよびアクション

編集設定を使用して、リスナーが検出する必要のあるイベント、およびそのイベント発生後に適用するアクションを定義できます。背景情報については、コンポーネント開発の概要を参照してください。

必要なアクションがすべて実行されるようにするには、次の値を指定します。

N:cq:editConfig [cq:EditConfig] 
    P:cq:actions [String[]] = "insert", "delete" 
    P:cq:dialogMode = "floating"
    P:cq:layout = "auto"
    N:cq:listeners [cq:EditListenersConfig]
        P:aftercreate = "REFRESH_INSERTED"
        P:afterdelete = "REFRESH_SELF"
        P:afteredit = "REFRESH_SELF"
        P:afterinsert = "REFRESH_INSERTED"
        P:aftermove = "REFRESH_SELF"
        P:afterremove = "REFRESH_SELF"

一般列

一般列は、(ほとんどの)列の定義が(コンポーネントノードではなく)列ノードのインスタンス上に格納されるように拡張したものです。

個別の一般コンポーネントごとに、(標準)ダイアログをカスタマイズして使用します。このダイアログを使用して、レポートのユーザーがレポートページ上の一般列のプロパティを指定できます(「列のプロパティ...」のメニューオプションを使用)。

ユーザーレポートの「一般」列は、その一例です。libs/cq/reporting/components/userreport/genericcol を参照してください。

列を一般列にするには、次の手順を実行します。

  • 列の definition ノードの type プロパティに、generic を設定します。
    /libs/cq/reporting/components/userreport/genericcol/definitions を参照してください。
  • 列の definition ノードで、(標準)ダイアログの定義をおこないます。
    /libs/cq/reporting/components/userreport/genericcol/definitions/dialog を参照してください。
    • ダイアログのフィールドが、対応するコンポーネントプロパティと同じ名前(パスを含む)を参照する必要があります。
      例えば、一般列のタイプをダイアログで設定できるようにする場合、/definitions/type の名前を持つフィールドを使用します。
    • UI(ダイアログ)を使用して指定されるプロパティは、columnbase コンポーネントで指定されるプロパティより優先されます。
  • 編集設定を定義します。
    /libs/cq/reporting/components/userreport/genericcol/cq:editConfig を参照してください。
  • 標準の CQ の手法を使用して、(その他の)列のプロパティを指定します。
    プロパティがコンポーネントインスタンスと列インスタンスの両方で指定されている場合、列インスタンスの値が優先されることに注意してください。
    一般列で使用できるプロパティは次のとおりです。
    • jcr:title - 列の名前
    • definitions/aggregates - 集計
    • definitions/filters - フィルター
    • definitions/type - 列のタイプ(ダイアログでは、セレクター/コンボボックス、または非表示フィールドのどちらかを使用して指定する必要があります)。
    • definitions/data/resolver および definitions/data/resolverConfigdefinitions/data/preprocessing.../clientFilter でない) - リゾルバーと設定
    • definitions/queryBuilder - Query Builder の設定
    • defaults/aggregate - デフォルトの集計
    ユーザーレポート」の一般列に新しいインスタンスを作成した場合、ダイアログで指定されるプロパティは次の場所に保持されます。
        /etc/reports/userreport/jcr:content/report/columns/genericcol/settings/generic

レポートデザイン

デザインによって、レポートの作成に使用できる列のタイプが定義されます。列を追加する段落システムも定義されます。

レポートごとに、個別のデザインを作成することを強くお勧めします。個別のデザインを作成すると、十分な柔軟性が得られます。新規レポートの定義も参照してください。

デフォルトのレポートコンポーネントは、/etc/designs/reports の下に保持されます。

レポートの格納場所は、独自のコンポーネントを配置した場所によって次のいずれかになります。

  • レポートの場所が /apps/cq/reporting の場合は、/etc/designs/reports/<yourReport> が適しています。
  • /apps/<yourProject>/reports のパターンを使用したレポートの場合は、/etc/designs/<yourProject>/reports/<yourReport> が適しています。

次の必要なデザインプロパティは、jcr:content/reportpage/report/columns(例えば、/etc/designs/reports/<reportName>/jcr:content/reportpage/report/columns)に登録されます。

  • components
    レポートで使用できるコンポーネントやコンポーネントグループ。
  • sling:resourceType
    cq/reporting/components/repparsys の値が指定されたプロパティ。

デザインスニペットの例(コンポーネントレポートのデザインから抜粋)を次に示します。

<!-- ... -->
    <jcr:content
        jcr:primaryType="nt:unstructured"
        jcr:title="Component Report"
        sling:resourceType="wcm/core/components/designer">
        <reportpage jcr:primaryType="nt:unstructured">
            <report jcr:primaryType="nt:unstructured">
                <columns
                    jcr:primaryType="nt:unstructured"
                    sling:resourceType="cq/reporting/components/repparsys"
                    components="group:Component Report"/>
            </report>
        </reportpage>
    </jcr:content>
<!-- ... -->

個別の列に対してデザインを指定する必要はありません。デザインモードで、使用できる列を定義できます。

注意:

標準レポートのデザインを変更しないことをお勧めします。アップグレード時や hotfix のインストール時に変更を失わないようにするためです。

標準レポートをカスタマイズする場合は、レポートとそのデザインをコピーしてください。

注意:

レポートを作成すると、デフォルトの列が自動的に作成されます。デフォルトの列はテンプレートで指定されます。

レポートテンプレート

レポートタイプごとに、テンプレートが必要です。標準の CQ テンプレートを使用したり、CQ テンプレートを設定したりできます。

このテンプレートは、次のように設定する必要があります。

  • sling:resourceTypecq/reporting/components/reportpage に設定します。
  • 使用するデザインを示します。
  • 子ノード report を作成し、sling:resourceType を使用してコンテナ(reportbase)コンポーネントを参照するようにします。

テンプレートの例(コンポーネントレポートテンプレートから抜粋)を次に示します。

<!-- ... -->
    <jcr:content
        cq:designPath="/etc/designs/reports/compreport"
        jcr:primaryType="cq:PageContent"
        sling:resourceType="cq/reporting/components/reportpage">
        <report
            jcr:primaryType="nt:unstructured"
            sling:resourceType="cq/reporting/components/compreport/compreport"/>
    </jcr:content>
<!-- .. -->

ルートパスを指定したテンプレートの例(ユーザーレポートテンプレートから抜粋)を次に示します。

<!-- ... -->
    <jcr:content
        cq:designPath="/etc/designs/reports/userreport"
        jcr:primaryType="cq:PageContent"
        sling:resourceType="cq/reporting/components/reportpage">
        <report
            jcr:primaryType="nt:unstructured"
            rootPath="/home/users"
            sling:resourceType="cq/reporting/components/compreport/compreport"/>
    </jcr:content>
<!-- .. -->

デフォルトのレポートテンプレートは、/libs/cq/reporting/templates の下に保持されます。

ただし、これらのノードは更新しないことを強くお勧めします。独自のコンポーネントノードは、/apps/cq/reporting/templates の下か、より適切であれば /apps/<yourProject>/reports/templates の下に作成してください。

定義例は次のとおりです(レポートコンポーネントの場所も参照)。

N:apps 
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:templates [sling:Folder]

この場所に、テンプレートのルートを作成します。

N:apps 
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:templates [sling:Folder]
                N:<reportname> [sling:Folder]

独自のレポートの作成 - 例

新しいレポートの定義

新しいレポートを定義するには、以下を作成して設定する必要があります。

  1. レポートコンポーネントのルート
  2. レポートベースコンポーネント
  3. 1 つ以上の列ベースコンポーネント
  4. レポートデザイン
  5. レポートテンプレートのルート
  6. レポートテンプレート

これらの手順を説明する以下の例では、リポジトリ内のすべての OSGi 設定、つまり sling:OsgiConfig ノードのすべてのインスタンスを表示するレポートを定義します。

注意:

既存のレポートをコピーして新しいバージョンにカスタマイズすることもできます。

  1. 新しいレポートのルートノードを作成します。

    例えば、/apps/cq/reporting/components/osgireport の下に作成します。

    N:cq [nt:folder]
        N:reporting [sling:Folder]
            N:components [sling:Folder]
                N:osgireport [sling:Folder]
  2. レポートベースを定義します。例えば、/apps/cq/reporting/components/osgireport の下に osgireport[cq:Component] を定義します。

    N:osgireport [sling:Folder]
        N:osgireport [cq:Component]
            P:sling:resourceSuperType [String] = "cq/reporting/components/reportbase"
            N:charting [nt:unstructured]
                N:settings [nt:unstructured]
                    N:active [cq:WidgetCollection]
                        N:0 [nt:unstructured]
                            P:id [String] = "pie"
                        N:1 [nt:unstructured]
                            P:id [String] = "lineseries"
                N:definitions [cq:WidgetCollections]
                    N:0 [nt:unstructured]
                        P:id [String] = "pie"
                        P:maxRadius [Long] = 180
                        P:type [String] = "pie"
                    N:1 [nt:unstructured]
                        P:id [String] = "lineseries"
                        P:type [String] = "lineseries"
            N:dialog [cq:Dialog]
                P:height [Long] = 424
                N:items [cq:WidgetCollection]
                    N:props [cq:Panel]
                        N:items [cq:WidgetCollection]
                            N:title [cq:Widget]
                                P:path [String] = "/libs/cq/reporting/components/commons/title.infinity.json"
                                P:xtype [String] = "cqinclude"
                            N:description [cq:Widget]
                                P:path [String] = "/libs/cq/reporting/components/commons/description.infinity.json"
                                P:xtype [String] = "cqinclude"
                            N:rootPath [cq:Widget]
                                P:fieldLabel [String] = "Root path"
                                P:name [String] = "./report/rootPath"
                                P:xtype [String] = "pathfield"
                            N:processing [cq:Widget]
                                P:path [String] = "/libs/cq/reporting/components/commons/processing.infinity.json"
                                P:xtype [String] = "cqinclude"
                            N:scheduling [cq:Widget]
                                P:path [String] = "/libs/cq/reporting/components/commons/scheduling.infinity.json"
                                P:xtype [String] = "cqinclude"
            N:queryBuilder [nt:unstructured]
                P:nodeTypes [String[]] = "sling:OsgiConfig"

    この例では、次のようなレポートベースコンポーネントが定義されています。

    • タイプがsling:OsgiConfig のすべてのノードを検索する
    • pie および lineseries のどちらのチャートも表示する
    • ユーザーがレポート設定できるダイアログを提供する
  3. 最初の列(columnbase)コンポーネントを定義します。例えば、/apps/cq/reporting/components/osgireport の下に bundlecol[cq:Component] を定義します。

    N:osgireport [sling:Folder]
        N:bundlecol [cq:Component]
            P:componentGroup [String] = "OSGi Report"
            P:jcr:title = "Bundle"
            P:sling:resourceSuperType [String] = "cq/reporting/components/columnbase"
            N:cq:editConfig [cq:EditConfig]
                P:cq:actions [String[]] = "insert", "delete"
                P:cq:dialogMode [String] = "floating"
                P:cq:layout [String] = "auto"
                N:cq:listeners [cq:EditListenersConfig]
                    P:aftercreate [String] "REFRESH_INSERTED"
                    P:afterdelete [String] "REFRESH_SELF"
                    P:afteredit [String] "REFRESH_SELF"
                    P:afterinsert [String] "REFRESH_INSERTED"
                    P:aftermove [String] "REFRESH_SELF"
                    P:afterremove [String] "REFRESH_SELF"
            N:defaults [nt:unstructured]
                P:aggregate [String] = "count"
            N:definitions [nt:unstructured]
                P:groupable [Boolean] = false
                P:type [String] = "string"
                N:queryBuilder [nt:unstructured]
                    P:property [String] = "jcr:path"

    この例では、次のような列ベースコンポーネントが定義されています。

    • サーバーから受信する値(この場合、sling:OsgiConfig の各ノードの jcr:path プロパティ)を検索し、その値を返す
    • count 集計を実行する
    • グループ化はできない
    • タイトル(テーブル内の列タイトル)は Bundle
    • サイドキックの OSGi Report グループに含まれる
    • 指定のイベントで更新される

    注意:

    この例では、N:data および P:clientFilter の定義はありません。サーバーから受信した値は、デフォルトで 1 対 1 で返されるので、これらの定義はありません。

    これは、次の定義と同じです。
        N:data [nt:unstructured]
            P:clientFilter [String] = "function(v) { return v; }"
    関数は、受け取った値を返すだけです。

  4. レポートデザインを定義します。例えば、/etc/designs/reports の下に osgireport[cq:Page] を定義します。

    N:osgireport [cq:Page]
        N:jcr:content [nt:unstructured]
            P:jcr:title [String] = "OSGi report"
            P:sling:resourceType [String] = "wcm/core/components/designer"
            N:reportpage [nt:unstructured]
                N:report [nt:unstructured]
                    N:columns [nt:unstructured]
                        P:components [String] = "group:OSGi Report"
                        P:sling:resourceType [String] = "cq/reporting/components/repparsys"
  5. 新しいレポートテンプレートのルートノードを作成します。

    例えば、/apps/cq/reporting/templates/osgireport の下に作成します。

    N:cq [nt:folder]
        N:reporting [sling:Folder]
            N:templates [sling:Folder]
                N:osgireport [cq:Template]
  6. レポートテンプレートを定義します。例えば、/apps/cq/reporting/templates の下に osgireport[cq:Template] を定義します。

    N:osgireport [cq:Template]
        P:allowedPaths [String[]] = "/etc/reports(/.*)?"
        P:jcr:description [String] = "Use this report generator to create a new OSGi report."
        P:jcr:title [String] = "OSGi Report Template"
        P:ranking [Long] = 100
        P:shortTitle [String] = "OSGi Report"
        N:jcr:content [cq:PageContent]
            P:cq:designPath [String] = "/etc/designs/reports/osgireport"
            P:sling:resourceType [String] = "cq/reporting/components/reportpage"
            N:report [nt:unstructured]
                P:rootPath [String] = "/"
                P:sling:resourceType [String] = "cq/reporting/components/osgireport/osgireport"
        N:thumbnail.png [nt:file]

    この例では、次のようにテンプレートが定義されています。

    • 結果のレポートを配置する場所を、allowedPaths で指定する。以上の例では、/etc/reports の任意の場所となります。
    • テンプレートのタイトルと説明を指定する
    • テンプレートリストで使用するサムネール画像を指定する(このノードの詳細な定義は表示していません。既存のレポートから thumbnail.png のインスタンスをコピーするのが最も簡単な方法です)。

新規レポートのインスタンスの作成

新しいレポートのインスタンスを、次のように作成できます。

  1. ツールコンソールを開きます。

  2. 左側のウィンドウで、「レポート」を選択します。

  3. その後、ツールバーから「新規...」を選択します。「タイトル」と「名前」を指定し、テンプレートのリストから新規作成するレポートタイプ(「OSGi Report Template」)を選択して、「作成」をクリックします。

  4. 新しいレポートインスタンスがリストに表示されます。このインスタンスをクリックして開きます。

  5. サイドキックからコンポーネント(この例では、「OSGi Report」グループの「バンドル」)をドラッグして最初の列を作成し、レポートの定義を開始します。

    注意:

    この例にはグループ化できる列がないので、チャートは使用できません。チャートを表示するには、次のように groupabletrue に設定します。

        N:osgireport [sling:Folder]
            N:bundlecol [cq:Component]
                N:definitions [nt:unstructured]
                    P:groupable [Boolean] = true

レポートフレームワークサービスの設定

この節では、レポートフレームワークの実装に使用する OSGi サービスの高度な設定オプションについて説明します。

これらの設定オプションは、Web コンソール(http://localhost:4502/system/console/configMgr などで入手可能)の設定メニューから表示できます。AEM を操作しているときは、このようなサービスの設定を管理する方法がいくつかあります。詳細および推奨事項については、OSGi の設定を参照してください。

基本サービス(Day CQ レポート設定)

  • Timezone」で、履歴データを作成する際のタイムゾーンを指定します。これにより、世界の各ユーザーに対して同じ内容の履歴チャートが表示されるようにします。
  • Locale」で、履歴データで「Timezone」と組み合わせて使用する地域を指定します。この地域を使用して、地域に合わせたカレンダー設定(週の始まりを日曜日にするか、月曜日にするかなど)をいくつか指定できます。
  • Snapshot path」で、履歴チャートのスナップショットを格納するルートパスを指定します。
  • Path to reports」で、レポートを配置するパスを指定します。スナップショットサービスで、スナップショットを取得する対象のレポートが、このパスによって指定されます。
  • Daily snapshots」で、日単位のスナップショットを毎日何時に取得するかを指定します。指定した時間は、サーバーのローカルタイムゾーンに従います。
  • Hourly snapshots」で、時間単位のスナップショットを毎時間何分に取得するかを指定します。
  • Rows (max)」で、スナップショットごとに格納できる行の最大数を指定します。適切な値を選択する必要があります。この値が大きすぎると、リポジトリのサイズに影響します。小さすぎると、履歴データの処理方法に影響が出るので、データが正確にならない場合があります。
  • Fake data」を有効にすると、fakedata セレクターを使用してフェイクの履歴データを作成できます。無効にすると、fakedata セレクターを使用した場合に例外がスローされます。
    フェイクデータは、必ずテストおよびデバッグの用途でのみ使用してください。
    fakedata セレクターを使用すると、レポートが暗黙的に終了するので、既存のデータがすべて失われます。データは手動で復元できますが、非常に時間のかかる作業となります。
  • Snapshot user」で、スナップショットの取得に使用できるオプションのユーザーを指定します。
    通常、レポートを終了したユーザーに対してスナップショットが取得されます。例えばパブリッシュシステムで、ユーザーアカウントが複製されていないのでこのユーザーが存在しない場合など、このユーザーの代わりに使用する代替ユーザーの指定が必要な場合があります。
    ただし、ユーザーを指定するとセキュリティリスクが高まる可能性もあります。
  • Enforce snapshot user」を有効にすると、すべてのスナップショットが、「Snapshot user」で指定したユーザーを使用して取得されます。この機能は適切に使用しないと、セキュリティに重大な影響を与える可能性があります。

キャッシュ設定(Day CQ レポートキャッシュ)

  • Enable」で、レポートデータのキャッシュを有効にしたり無効にしたりできます。レポートのキャッシュを有効にすると、複数の要求が行われる間、レポートデータがメモリに保持されます。これにより、パフォーマンスを向上させることができますが、メモリの消費量が大きくなり、極端な場合はメモリ不足になることがあります。
  • TTL」で、レポートをキャッシュしておく期間(秒単位)を指定します。期間が長いほどパフォーマンスが向上しますが、その期間内でデータの変更があった場合、返されるデータが正確でない場合があります。
  • Max entries」で、一度にキャッシュするレポートの最大数を指定します。

注意:

ユーザーおよび言語によって、レポートデータの内容が異なる場合があります。したがって、レポートデータはレポート、ユーザーおよび言語ごとにキャッシュされます。つまり、「Max entries」の値が 2 の場合、実際のデータのキャッシュは次のいずれかになります。

  • 言語設定が異なる 2 人のユーザーに対し、1 つのレポート
  • 1 人のユーザーに対し、2 つのレポート

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー