10 動的問合せの作成
動的問合せを作成するには、Oracle OLAP Java API Template
クラスおよび他の関連クラスを使用します。 次のトピックでは、これらのクラスについて説明し、クラスの実装例を示します。
Templateオブジェクトの概要
Template
クラスは、Oracle OLAP Java APIの強力な機能の基礎となります。 Template
オブジェクトを使用して、変更可能なSource
オブジェクトを作成します。 これらのSource
オブジェクトを使用すると、エンド・ユーザーの選択に応じて変更可能な動的問合せを作成できます。 Template
オブジェクトを使用すると、ユーザー・インタフェース要素をOLAP Java APIの操作およびオブジェクトに簡単に変換できます。
動的Source
を変更したり、変更を保存したり破棄したりするために使用するTransaction
オブジェクトの詳細については、「TransactionProviderの使用」を参照してください。
動的Sourceの作成
Template
の主な機能は、動的Source
を生成する機能です。 この機能は、Template
によって使用される他のオブジェクトのうち、DynamicDefinition
クラスおよびMetadataState
クラスのインスタンスに基づいています。
Source
を作成すると、SourceDefinition
が自動的に関連付けられます。 SourceDefinition
にはSource
に関する情報があります。 Source
は、作成後はSourceDefinition
に永続的に関連付けられます。 SourceDefinition
のgetSource
メソッドを使用すると、関連付けられているSource
が戻されます。
DynamicDefinition
は、SourceDefinition
のサブクラスです。 Template
は、Template
によって生成されたSource
のSourceDefinition
のプロキシとして機能するDynamicDefinition
を作成します。 これは、同じ永続的に関連付けられたSource
を常に取得する代わりに、DynamicDefinition
のgetSource
メソッドは、Template
によって現在生成されているSource
を取得することを意味します。 取得されたSource
が異なる場合でも、DynamicDefinition
のインスタンスは変更されません。
Template
が生成するSource
は、Template
がSource
を作成するために使用する他のSource
オブジェクトを含む値が変更できるため変更できます。 Template
はこれらの値をMetadataState
に格納します。 Template
は、MetadataState
の現在の状態を取得し、値を取得または設定し、状態を設定するメソッドを提供します。 これらのメソッドを使用して、MetadataState
が格納するデータ値を変更します。
DynamicDefinition
を使用して、Template
によって作成されたSource
を取得します。 たとえば、エンドユーザーの選択に応じて、Template
がSource
を作成するために使用する値の状態が変更された場合、新しいSource
が結果を定義しても、アプリケーションは同じDynamicDefinition
を使用してSource
を再度取得します。以前のSource
とは異なる設定になっています。
Template
によって生成されるSource
は、一連の選択、ソート、計算、および結合など、他のSource
オブジェクトを作成する一連のSource
操作の結果である可能性があります。 これらの操作のコードを、Template
用のSourceGenerator
のgenerateSource
メソッドに格納します。 このメソッドは、Template
によって作成されたSource
を戻します。 この操作では、MetadataState
に格納されたデータが使用されます。
様々なTemplate
オブジェクトによって作成された動的Source
オブジェクトが相互に作用する複雑な問合せを作成する場合があります。 この問合せを作成すると、複雑な問合せ全体を定義するSource
が作成されます。 最後のSource
を作成するために使用したTemplate
オブジェクトのいずれかの状態を変更すると、最後のSource
は前のSource
の結果セットとは異なる結果セットを表します。 これによって、問合せを定義するために行ったすべての操作を繰り返さずに、最終の問合せを変更できます。
ユーザー・インタフェース要素のOLAP Java APIオブジェクトへの変換
Template
オブジェクトを設計して、アプリケーションのユーザー・インタフェースの要素を表します。 このTemplate
オブジェクトによって、エンド・ユーザーの選択が、Source
を作成するOLAP Java APIの問合せ作成の操作に変換されます。 次に、Cursor
を作成して、Oracle OLAPからSource
で定義された結果セットをフェッチします。 Cursor
から値を取得し、それらの値をエンド・ユーザーに表示します。 エンド・ユーザーによって選択が変更された場合は、Template
の状態を変更します。 その後、Template
によって作成されたSource
を取得して、新しいCursor
を作成し、取得した新しい値を表示します。
Templateおよび関連クラスの概要
OLAP Java APIでは、いくつかのクラスが連携して動作して、動的Source
を作成します。 Template
の設計では、次のクラスおよびインタフェースを実装または拡張する必要があります。
-
Template
抽象クラス -
MetadataState
インタフェース -
SourceGenerator
インタフェース
これらの3つのクラスのインスタンスと、DataProvider
およびDynamicDefinition
クラスのインスタンスが連携して動作して、Template
によって定義されたSource
を作成します。
動的Sourceを作成するクラス間の関連
動的Source
を作成するクラスは、次のように連携して動作します。
-
Template
には、DynamicDefinition
を作成し、MetadataState
の現在の状態を取得および設定するメソッドが含まれています。Template
抽象クラスの拡張では、MetadataState
のフィールドの値を取得および設定するメソッドを追加します。 -
MetadataState
の実装には、Template
用のSource
の作成に使用されるデータを格納するためのフィールドが存在します。 新しいTemplate
を作成すると、MetadataState
をTemplate
のコンストラクタに渡します。DynamicDefinition
のgetSource
メソッドをコールすると、MetadataState
はSourceGenerator
のgenerateSource
メソッドに渡されます。 -
DataProvider
は、Template
の作成に使用され、SourceGenerator
によって新しいSource
オブジェクトの作成に使用されます。 -
SourceGenerator
の実装には、MetadataState
のデータの現在の状態を使用してTemplate
用のSource
を作成するgenerateSource
メソッドが含まれています。SourceGenerator
をTemplate
のcreateDynamicDefinition
メソッドに渡して、DynamicDefinition
を作成します。 -
DynamicDefinition
には、SourceGenerator
によって作成されたSource
を取得するgetSource
メソッドが含まれています。DynamicDefinition
は、Source
に永続的に関連付けられたSourceDefinition
のプロキシとして機能します。
Templateクラス
変更可能なSource
を作成するには、Template
を使用します。 Template
には、DynamicDefinition
を作成し、Template
の現在の状態を取得および設定するためのメソッドがあります。 Template
クラスを拡張するには、Template
のMetadataState
のフィールドへのアクセスを提供するメソッドを追加します。 Template
は、Template
のSourceGenerator
によって生成されたSource
を取得するために使用するDynamicDefinition
を作成します。
Template
の実装例については、例10-1を参照してください。
MetadataStateインタフェース
MetadataState
インタフェースの実装は、Template
の値の現在の状態を格納します。 MetadataState
には、現在の状態のコピーを作成するclone
メソッドが含まれる必要があります。
新しいTemplate
をインスタンス化するときは、MetadataState
をTemplate
コンストラクタに渡します。 Template
には、MetadataState
によって格納された値を取得および設定するためのメソッドが含まれています。 Template
のSourceGenerator
のgenerateSource
メソッドは、メソッドがTemplate
のSource
を生成するときにMetadataState
を使用します。
MetadataState
の実装例については、例10-2を参照してください。
SourceGeneratorインタフェース
SourceGenerator
の実装には、Template
用のSource
を作成するgenerateSource
メソッドが含まれている必要があります。 SourceGenerator
が作成する必要があるSource
は1種類のみです(BooleanSource
、NumberSource
、StringSource
など)。 generateSource
メソッドは、Source
を作成する際に、Template
用のMetadataState
によって表されるデータの現在の状態を使用します。
generateSource
メソッドによって作成されたSource
を取得するには、Template
のcreateDynamicDefinition
メソッドにSourceGenerator
を渡して、DynamicDefinition
を作成します。 その後、DynamicDefinition
のgetSource
メソッドをコールして、Source
を取得します。
Template
は、それぞれ異なるSourceGenerator
を実装した複数のDynamicDefinition
を作成できます。 異なるSourceGenerator
オブジェクトのgenerateSource
メソッドで、Template
用のMetadataState
の現在の状態によって定義された同じデータが使用され、異なる問合せを定義するSource
オブジェクトが作成されます。
SourceGenerator
の実装例については、例10-3を参照してください。
DynamicDefinitionクラス
DynamicDefinition
は、SourceDefinition
のサブクラスです。 Template
のcreateDynamicDefinition
メソッドをコールして、それにSourceGenerator
を渡すことによって、DynamicDefinition
を作成します。 DynamicDefinition
のgetSource
メソッドをコールして、SourceGenerator
によって作成されたSource
を取得します。
Template
によって作成されたDynamicDefinition
は、SourceGenerator
によって作成されたSource
のSourceDefinition
のプロキシです。 SourceDefinition
は、そのSource
と永続的に関連付けられます。 Template
の状態が変更された場合、SourceGenerator
によって作成されるSource
は異なります。 DynamicDefinition
はプロキシであるため、新しいSource
を取得するために同じDynamicDefinition
を使用しますが、Source
には異なるSourceDefinition
があります。
DynamicDefinition
のgetCurrent
メソッドは、generateSource
メソッドによって現在戻されているSource
に永続的に関連付けられているSourceDefinition
を戻します。 DynamicDefinition
の使用例については、例10-4を参照してください。
Templateの設計および実装
Template
の設計には、アプリケーションのユーザー・インタフェースの問合せ作成要素が反映されます。 たとえば、エンド・ユーザーが値リストから多くの値を要求する問合せを作成可能なアプリケーションを開発すると想定します。 値は、メジャーの1つのディメンションの値です。 そのメジャーの他のディメンションは、単一の値に制限されます。
アプリケーションのユーザー・インタフェースでは、エンド・ユーザーがダイアログ・ボックスを使用して次の操作を実行できます。
-
データ値が特定の範囲内にあるかどうかを指定するラジオ・ボタンの選択。
-
ドロップダウン・リストからのメジャーの選択。
-
フィールドからの数値の選択。 この数値によって、表示するデータ値の数を指定します。
-
表示するデータ値のベースとしての、メジャーのディメンションの選択。 たとえば、ユーザーが製品ディメンションを選択した場合、問合せによって、製品リストからいくつかの製品が指定されます。 リストは、メジャー、および他のディメンションの選択値によって決定されます。
-
ボタンをクリックすると、エンド・ユーザーが選択したメジャーの他のディメンションの単一の値を選択するためのダイアログ・ボックスが表示されます。 ディメンションの値を選択すると、エンド・ユーザーは2番目のダイアログ・ボックスのOKボタンをクリックし、最初のダイアログ・ボックスに戻ります。
-
OKボタンをクリックし、問合せを作成します。 問合せ結果が表示されます。
最初のダイアログ・ボックスでエンド・ユーザーが作成する問合せを表すSource
を作成するには、TopBottomTemplate
という名前のTemplate
を設計します。 また、SingleSelectionTemplate
という名前のTemplate
も設計し、エンド・ユーザーによるベース・ディメンション以外のディメンションに対する単一の値の選択を表すSource
を作成します。 Template
オブジェクトの設計には、ダイアログ・ボックスのユーザー・インタフェース要素が反映されます。
TopBottomTemplate
およびそのMetadataState
とSourceGenerator
を設計するには、次の操作を実行します。
-
Template
を拡張するTopBottomTemplate
クラスの作成。 このクラスには、Template
の現在の状態を取得し、ユーザーが指定した値を設定し、Template
の現在の状態を設定するメソッドを追加します。 -
MetadataState
を実装するTopBottomTemplateState
クラスの作成。 このクラスに、Template
によって作成されたSource
の作成に使用するSourceGenerator
の値を格納するためのフィールドを提供します。 値は、TopBottomTemplate
のメソッドによって設定されます。 -
SourceGenerator
を実装するTopBottomTemplateGenerator
クラスの作成。 このクラスのgenerateSource
メソッドでは、エンド・ユーザーの選択によって指定されるSource
を作成する操作を提供します。
エンド・ユーザーは、このアプリケーションを使用して、最初のダイアログ・ボックスで販売台数をメジャーとして選択し、製品をベース・ディメンションとして選択します。 また、エンド・ユーザーは、残りの各ディメンションの単一の値としてAsia Pacific地域、2001年の第1四半期および直販チャネルも選択します。
エンド・ユーザーが作成した問合せは、2001年にAsia Pacific地域の顧客に対して直販チャネルで販売された製品のうち、販売台数の総数が高い上位10の製品を要求します。
TopBottomTemplate
、TopBottomTemplateState
、およびTopBottomTemplateGenerator
クラスの実装の例と、それらを使用するアプリケーションの例については、「例10-1」、「例10-2」、「例10-3」 ,および「例10-4」を参照してください。 TopBottomTemplateState
およびTopBottomTemplateGenerator
クラスは、外部クラスTopBottomTemplate
の内部クラスとして実装されます。
Templateのクラスの実装
Template
、MetadataState
、およびSourceGenerator
クラスを実装しています。
例10-1 Templateの実装
この例は、TopBottomTemplate
クラスの実装です。
import oracle.olapi.data.source.DataProvider; import oracle.olapi.data.source.DynamicDefinition; import oracle.olapi.data.source.Source; import oracle.olapi.data.source.SourceGenerator; import oracle.olapi.data.source.Template; import oracle.olapi.transaction.metadataStateManager.MetadataState; /** * Creates a TopBottomTemplateState, a TopBottomTemplateGenerator, * and a DynamicDefinition. * Gets the current state of the TopBottomTemplateState and the values * that it stores. * Sets the data values stored by the TopBottomTemplateState and sets the * changed state as the current state. */ public class TopBottomTemplate extends Template { // Constants for specifying the selection of elements from the // beginning or the end of the result set. public static final int TOP_BOTTOM_TYPE_TOP = 0; public static final int TOP_BOTTOM_TYPE_BOTTOM = 1; // Variable to store the DynamicDefinition. private DynamicDefinition dynamicDef; /** * Creates a TopBottomTemplate with a default type and number values * and the specified base dimension. */ public TopBottomTemplate(Source base, DataProvider dataProvider) { super(new TopBottomTemplateState(base, TOP_BOTTOM_TYPE_TOP, 0), dataProvider); // Create the DynamicDefinition for this Template. Create the // TopBottomTemplateGenerator that the DynamicDefinition uses. dynamicDef = createDynamicDefinition(new TopBottomTemplateGenerator(dataProvider)); } /** * Gets the Source produced by the TopBottomTemplateGenerator * from the DynamicDefinition. */ public final Source getSource() { return dynamicDef.getSource(); } /** * Gets the Source that is the base of the elements in the result set. * Returns null if the state has no base. */ public Source getBase() { TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); return state.base; } /** * Sets a Source as the base. */ public void setBase(Source base) { TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); state.base = base; setCurrentState(state); } /** * Gets the Source that specifies the measure and the single * selections from the dimensions other than the base. */ public Source getCriterion() { TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); return state.criterion; } /** * Specifies a Source that defines the measure and the single values * selected from the dimensions other than the base. * The SingleSelectionTemplate produces such a Source. */ public void setCriterion(Source criterion) { TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); state.criterion = criterion; setCurrentState(state); } /** * Gets the type, which is either TOP_BOTTOM_TYPE_TOP or * TOP_BOTTOM_TYPE_BOTTOM. */ public int getTopBottomType() { TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); return state.topBottomType; } /** * Sets the type. */ public void setTopBottomType(int topBottomType) { if ((topBottomType < TOP_BOTTOM_TYPE_TOP) || (topBottomType > TOP_BOTTOM_TYPE_BOTTOM )) throw new IllegalArgumentException("InvalidTopBottomType"); TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); state.topBottomType = topBottomType; setCurrentState(state); } /** * Gets the number of values selected. */ public float getN() { TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); return state.N; } /** * Sets the number of values to select. */ public void setN(float N) { TopBottomTemplateState state = (TopBottomTemplateState) getCurrentState(); state.N = N; setCurrentState(state); } }
例10-2 MetadataStateの実装
この例は、TopBottomTemplateState
内部クラスの実装です。
/** * Stores data that can be changed by a TopBottomTemplate. * The data is used by a TopBottomTemplateGenerator in producing * a Source for the TopBottomTemplate. */ private static final class TopBottomTemplateState implements Cloneable, MetadataState { public int topBottomType; public float N; public Source criterion; public Source base; /** * Creates a TopBottomTemplateState. */ public TopBottomTemplateState(Source base, int topBottomType, float N) { this.base = base; this.topBottomType = topBottomType; this.N = N; } /** * Creates a copy of this TopBottomTemplateState. */ public final Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { return null; } } }
例10-3 SourceGeneratorの実装
この例は、TopBottomTemplateGenerator
内部クラスの実装です。
/** * Produces a Source for a TopBottomTemplate based on the data * values of a TopBottomTemplateState. */ private final class TopBottomTemplateGenerator implements SourceGenerator { // Store the DataProvider. private DataProvider _dataProvider; /** * Creates a TopBottomTemplateGenerator. */ public TopBottomTemplateGenerator(DataProvider dataProvider) { _dataProvider = dataProvider; } /** * Generates a Source for a TopBottomTemplate using the current * state of the data values stored by the TopBottomTemplateState. */ public Source generateSource(MetadataState state) { TopBottomTemplateState castState = (TopBottomTemplateState) state; if (castState.criterion == null) throw new NullPointerException("CriterionParameterMissing"); Source sortedBase = null; // Depending on the topBottomType value, select from the base Source // the elements specified by the criterion Source and sort the // elements in ascending or descending order. // For descending order, specify that null values are last. // For ascending order, specify that null values are first. if (castState.topBottomType == TOP_BOTTOM_TYPE_TOP) sortedBase = castState.base.sortDescending(castState.criterion, false); else sortedBase = castState.base.sortAscending(castState.criterion, true); return sortedBase.interval(1, Math.round(castState.N)); } }
Templateを使用するアプリケーションの実装
エンドユーザーが選択した内容をTemplate
のMetadataState
に保存したら、DynamicDefinition
のgetSource
メソッドを使用して、Template
によって作成された動的Source
を取得します。 このトピックでは、「例10-1」で説明されているTopBottomTemplate
を使用するアプリケーションの例を示します。 便宜上、このコードでは多くの例外処理を省略しています。
BaseExample11g
クラスはContext11g
クラスのインスタンスを作成および格納します。このクラスには次の操作を行うメソッドがあります。
-
コマンドライン引数で、ユーザーとしてOracle Databaseインスタンスに接続します。
-
Cursor
オブジェクトを作成し、その値を表示します。
例10-4では、次の処理を実行します。
-
MdmMetadataProvider
およびMdmRootSchema
の取得。 -
DataProvider
の取得。 -
ユーザーの
MdmDatabaseSchema
の取得。 -
COSTS、UNITS、およびSALESの値を持つ
MdmCube
を取得します。 この例では、キューブから、UNITSおよびSALESメジャーと、キューブに関連付けられたディメンションが取得されます。 -
メジャーのいくつかのディメンションから単一の値を選択するための
SingleSelectionTemplate
の作成。 この例で使用するSingleSelectionTemplate
クラスのコードについては、「SingleSelectionTemplateクラス」を参照してください。 -
TopBottomTemplate
の作成およびエンド・ユーザーが行った選択の格納。 -
TopBottomTemplate
によって作成されたSource
の取得。 -
Context11g
オブジェクトを使用して、そのSource
のCursor
を作成し、Cursor
値を表示します。
「例7-3」の完全なコードには、「例10-4」にある同じコードの一部が含まれています。 この例では、このコードは表示されません。このコードは、「例10-4」の先頭から次の例のコメントまで続きます:
// End of code not shown in //Example 7-3.
例10-4 Templateによって作成されたSourceの取得
import oracle.olapi.data.source.DataProvider; import oracle.olapi.data.source.Source; import oracle.olapi.examples.*; import oracle.olapi.metadata.mdm.MdmAttribute; import oracle.olapi.metadata.mdm.MdmBaseMeasure; import oracle.olapi.metadata.mdm.MdmCube; import oracle.olapi.metadata.mdm.MdmDatabaseSchema; import oracle.olapi.metadata.mdm.MdmDimensionLevel; import oracle.olapi.metadata.mdm.MdmDimensionMemberInfo; import oracle.olapi.metadata.mdm.MdmHierarchyLevel; import oracle.olapi.metadata.mdm.MdmLevelHierarchy; import oracle.olapi.metadata.mdm.MdmMetadataProvider; import oracle.olapi.metadata.mdm.MdmPrimaryDimension; import oracle.olapi.metadata.mdm.MdmRootSchema; /** * Creates a query that specifies a number of elements from the top * or bottom of a selection of dimension members, creates a Cursor * for the query, and displays the values of the Cursor. * The selected dimension members are those that have measure values * that are specified by selected members of the other dimensions of * the measure. */ public class TopBottomTest extends BaseExample11g { /** * Gets the MdmMetadataProvider, the DataProvider, the MdmRootSchema, and the * MdmDatabaseSchema for the current user. * Gets the UNITS_CUBE_AWJ MdmCube. * From the cube, gets the MdmBaseMeasure objects for the UNITS and SALES * measures and the MdmPrimaryDimension objects that dimension them. * Gets a hierarchy of the PRODUCT_AWJ dimension and the leaf level of the * dimension. * Gets the short description attribute of the dimension. * Creates a SingleSelectionTemplate and adds selections to it. * Creates a TopBottomTemplate and sets the properties of it. * Gets the Source produced by the TopBottomTemplate, creates a Cursor * for it, and displays the values of the Cursor. * Changes the state of the SingleSelectionTemplate and the * TopBottomTemplate, creates a new Cursor for the Source produced by the * TopBottomTemplate, and displays the values of that Cursor. */ public void run() throws Exception { // Get the MdmMetadataProvider from the superclass. MdmMetadataProvider metadataProvider = getMdmMetadataProvider(); // Get the DataProvider from the Context11g object of the superclass. DataProvider dp = getContext().getDataProvider(); // Get the MdmRootSchema and the MdmDatabaseSchema for the user. MdmRootSchema mdmRootSchema = (MdmRootSchema)metadataProvider.getRootSchema(); MdmDatabaseSchema mdmDBSchema = mdmRootSchema.getDatabaseSchema(getContext().getUser()); MdmCube unitsCube = (MdmCube)mdmDBSchema.getTopLevelObject("UNITS_CUBE_AWJ"); MdmBaseMeasure mdmUnits = unitsCube.findOrCreateBaseMeasure("UNITS"); MdmBaseMeasure mdmSales = unitsCube.findOrCreateBaseMeasure("SALES"); // Get the Source objects for the measures. Source units = mdmUnits.getSource(); Source sales = mdmSales.getSource(); // Get the MdmPrimaryDimension objects for the dimensions of the cube. List<MdmPrimaryDimension> cubeDims = unitsCube.getDimensions(); MdmPrimaryDimension mdmTimeDim = null; MdmPrimaryDimension mdmProdDim = null; MdmPrimaryDimension mdmCustDim = null; MdmPrimaryDimension mdmChanDim = null; for(MdmPrimaryDimension mdmPrimDim : cubeDims) { if (mdmPrimDim.getName().startsWith("TIME")) mdmTimeDim = mdmPrimDim; else if (mdmPrimDim.getName().startsWith("PROD")) mdmProdDim = mdmPrimDim; else if (mdmPrimDim.getName().startsWith("CUST")) mdmCustDim = mdmPrimDim; else if (mdmPrimDim.getName().startsWith("CHAN")) mdmChanDim = mdmPrimDim; } // Get the hierarchy of the PRODUCT_AWJ dimension. MdmLevelHierarchy mdmProdHier = mdmProdDim.findOrCreateLevelHierarchy("PRODUCT_PRIMARY"); // Get the detail dimenson level of the PRODUCT_AWJ dimension. MdmDimensionLevel mdmItemDimLevel = mdmProdDim.findOrCreateDimensionLevel("ITEM"); // Get the hierarchy level of the dimension level. MdmHierarchyLevel mdmItemHierLevel = mdmProdHier.findOrCreateHierarchyLevel(mdmItemDimLevel); // Get the Source for the hierarchy level. Source itemLevel = mdmItemHierLevel.getSource(); // Get the short description attribute for the PRODUCT_AWJ dimension and // the Source for the attribute. MdmAttribute mdmProdShortDescrAttr = mdmProdDim.getShortValueDescriptionAttribute(); Source prodShortDescrAttr = mdmProdShortDescrAttr.getSource(); // Create a SingleSelectionTemplate to produce a Source that // represents the measure values specified by single members of each of // the dimensions of the measure other than the base dimension. SingleSelectionTemplate singleSelections = new SingleSelectionTemplate(units, dp); // Create MdmDimensionMemberInfo objects for single members of the // other dimensions of the measure. MdmDimensionMemberInfo timeMemInfo = new MdmDimensionMemberInfo(mdmTimeDim, "CALENDAR_YEAR::YEAR::CY2001"); MdmDimensionMemberInfo custMemInfo = new MdmDimensionMemberInfo(mdmCustDim, "SHIPMENTS::REGION::APAC"); MdmDimensionMemberInfo chanMemInfo = new MdmDimensionMemberInfo(mdmChanDim, "CHANNEL_PRIMARY::CHANNEL::DIR"); // Add the dimension member information objects to the // SingleSelectionTemplate. singleSelections.addDimMemberInfo(custMemInfo); singleSelections.addDimMemberInfo(chanMemInfo); singleSelections.addDimMemberInfo(timeMemInfo); // Create a TopBottomTemplate specifying, as the base, the Source for a // a level of a hierarchy. TopBottomTemplate topNBottom = new TopBottomTemplate(itemLevel, dp); // Specify whether to retrieve the elements from the beginning (top) or the // end (bottom) of the selected elements of the base dimension. topNBottom.setTopBottomType(TopBottomTemplate.TOP_BOTTOM_TYPE_TOP); // Set the number of elements of the base dimension to retrieve. topNBottom.setN(10); // Get the Source produced by the SingleSelectionTemplate and specify it as // the criterion object. topNBottom.setCriterion(singleSelections.getSource()); // End of code not shown in // Example 7-3. // Display a description of the result. String resultDescription = " products with the most units sold \nfor"; displayResultDescr(singleSelections, topNBottom, resultDescription); // Get the Source produced by the TopBottomTemplate. Source result = topNBottom.getSource(); // Join the Source produced by the TopBottomTemplate with the short // value descriptions. Use the joinHidden method so that the // dimension member values do not appear in the result. Source result = prodShortDescrAttr.joinHidden(topNBottomResult); // Commit the current transaction. getContext().commit(); // Method of Context11g. // Create a Cursor for the result and display the values of the Cursor. getContext().displayTopBottomResult(result); // Change a dimension member selection of the SingleSelectionTemplate. timeMemInfo.setUniqueValue("CALENDAR_YEAR::YEAR::CY2000"); singleSelections.changeSelection(timeMemInfo); // Change the number of elements selected and the type of selection. topNBottom.setN(5); topNBottom.setTopBottomType(TopBottomTemplate.TOP_BOTTOM_TYPE_BOTTOM); // Join the Source produced by the TopBottomTemplate to the short // description attribute. result = prodShortDescrAttr.joinHidden(topNBottomResult); // Commit the current transaction. getContext().commit(); // Display a description of the result. resultDescription = " products with the fewest units sold \nfor"; displayResultDescr(singleSelections, topNBottom, resultDescription); // Create a new Cursor for the Source produced by the TopBottomTemplate // and display the Cursor values. getContext().displayTopBottomResult(result); // Now change the measure to SALES, and get the top and bottom products by // SALES. singleSelections.setMeasure(sales); // Change the number of elements selected. topNBottom.setN(7); // Change the type of selection back to the top. topNBottom.setTopBottomType(TopBottomTemplate.TOP_BOTTOM_TYPE_TOP); resultDescription = " products with the highest sales amounts \nfor"; displayResultDescr(singleSelections, topNBottom, resultDescription); topNBottomResult = topNBottom.getSource(); result = prodShortDescrAttr.joinHidden(topNBottomResult); // Commit the current transaction. getContext().commit(); getContext().displayTopBottomResult(result); // Change the type of selection back to the bottom. topNBottom.setTopBottomType(TopBottomTemplate.TOP_BOTTOM_TYPE_BOTTOM); resultDescription = " products with the lowest sales amounts \nfor"; displayResultDescr(singleSelections, topNBottom, resultDescription); topNBottomResult = topNBottom.getSource(); result = prodShortDescrAttr.joinHidden(topNBottomResult); // Commit the current transaction. getContext().commit(); getContext().displayTopBottomResult(result); } /** * Displays a description of the results of the query. * * @param singleSelections The SingleSelectionsTemplate used by the query. * * @param topNBottom The TopBottomTemplate used by the query. * * @param resultDescr A String that contains a description of the query. */ private void displayResultDescr(SingleSelectionTemplate singleSelections, TopBottomTemplate topNBottom, String resultDescr) { DataProvider dp = getContext().getDataProvider(); // Get the short descriptions of the dimension members of the // SingleSelectionTemplate. StringBuffer shortDescrsForMemberVals = singleSelections.getMemberShortDescrs(dp); // Display the number of dimension members selected, the result description, // and the short descriptions of the single selection dimension members. println("\nThe " + Math.round(topNBottom.getN()) + resultDescr + shortDescrsForMemberVals +" are:\n"); } /** * Runs the TopBottomTest application. * * @param args An array of String objects that provides the arguments * required to connect to an Oracle Database instance, as * specified in the Context11g class. */ public static void main(String[] args) { new TopBottomTest().execute(args); }
}
TopBottomTest
プログラムの出力は、次のようになります。
The 10 products with the most units sold for Asia Pacific, Direct Sales, 2001 are: 1. Mouse Pad 2. Unix/Windows 1-user pack 3. Deluxe Mouse 4. Laptop carrying case 5. 56Kbps V.90 Type II Modem 6. 56Kbps V.92 Type II Fax/Modem 7. Keyboard Wrist Rest 8. Internal - DVD-RW - 6X 9. O/S Documentation Set - English 10. External - DVD-RW - 8X The 5 products with the fewest units sold for Asia Pacific, Direct Sales, 2000 are: 1. Envoy External Keyboard 2. O/S Documentation Set - Italian 3. External 48X CD-ROM 4. O/S Documentation Set - Spanish 5. Internal 48X CD-ROM USB The 7 products with the highest sales amounts for Asia Pacific, Direct Sales, 2000 are: 1. Sentinel Financial 2. Sentinel Standard 3. Envoy Executive 4. Sentinel Multimedia 5. Envoy Standard 6. Envoy Ambassador 7. 56Kbps V.90 Type II Modem The 7 products with the lowest sales amounts for Asia Pacific, Direct Sales, 2000 are: 1. Envoy External Keyboard 2. Keyboard Wrist Rest 3. Mouse Pad 4. O/S Documentation Set - Italian 5. O/S Documentation Set - Spanish 6. Standard Mouse 7. O/S Documentation Set - French