8 CursorクラスおよびCursorの概念
この章では、Oracle OLAP Java APIのCursor
クラスおよび問合せの結果を取得するために使用する関連クラスについて説明します。 また、Cursor
の位置、フェッチ・サイズおよびエクステントの概念についても説明します。 Cursor
とその関連オブジェクトの作成と使用の例については、「問合せ結果の取得」を参照してください。
この章では、次の項目について説明します。
8.1 OLAP Java API Cursorオブジェクトの概要
Cursor
は、Source
で指定された結果セットを取得します。 Cursor
は、CursorManager
のcreateCursor
メソッドをコールして作成します。 CursorManager
は、DataProvider
のcreateCursorManager
メソッドをコールして作成します。
Oracle OLAP SQL GeneratorによってSource
に対して生成されたSQLを取得するには、Cursor
を作成する必要はありません。 Source
のSQLを取得するには、DataProvider
のcreateSQLCursorManager
メソッドを使用して、SQLCursorManager
を作成します。 次に、OLAP Java API外部のクラス、またはその他のメソッドを使用して、生成されたSQLを使用してデータを取得します。
8.1.1 Cursorの作成
DataProvider
のcreateCursorManager
メソッドのいずれか1つをコールして、そのメソッドにSource
を渡すことによって、CursorManager
を作成します。Cursor
の動作を変更する場合、CursorInfoSpecification
を作成し、そのメソッドを使用して動作を指定します。 このCursorInfoSpecification
およびSource
を引数とするメソッドを使用して、CursorManager
を作成します。CursorManager
のcreateCursor
メソッドをコールして、Cursor
を作成します。
8.1.2 Cursorを作成できないSource
一部のSource
オブジェクトは、Cursor
がデータ・ストアから取得できるデータを指定しません。 値を持つCursor
を作成できないSource
オブジェクトは次のとおりです。
-
計算不可能な操作を指定する
Source
。 たとえば、無限再帰を指定するSource
です。 -
無限結果セットを定義する
Source
。 たとえば、すべてのString
オブジェクトのセットを表す基本Source
です。 -
要素を持たないか、要素を持たない別の
Source
を含むSource
。 例は、DataProvider
のgetEmptySource
メソッドによって返されたSource
と、空のSource
から派生した別のSource
です。 もう1つの例は、MdmDimension
から取得したプライマリSource
の値を選択し、選択した値がディメンションに存在しないことに起因する、派生したSource
です。
このようなSource
のCursor
を作成してCursor
の値を取得しようとすると、Exception
が発生します。
8.1.3 CursorオブジェクトおよびTransactionオブジェクト
派生したSource
を作成するか、Template
の状態を変更するときは、現在のTransaction
のコンテキストでSource
を作成します。 Source
は、作成するTransaction
またはそのTransaction
の子Transaction
でアクティブです。 あなたのためにCursor
を作成できるように、現在のTransaction
でSource
がアクティブでなければなりません。
導出Source
の作成は、書込みTransaction
で実行されます。 Cursor
の作成は、読取りTransaction
で実行されます。 派生したSource
を作成し、そのSource
のCursor
を作成する前に、アプリケーションが使用しているTransactionProvider
のcommitCurrentTransaction
メソッドを呼び出すことによって、Transaction
を読み取りTransaction
に変更する必要があります。 Transaction
およびTransactionProvider
オブジェクトの詳細については、「TransactionProviderの使用」を参照してください。
パラメータ化されたSource
を含む問合せ用に作成するCursor
については、Parameter
オブジェクトの値を変更して、Transaction
を再度コミットすることなく、Cursor
の新しい値を取得することができます。 パラメータ化されたSource
オブジェクトの詳細については、「ソース・オブジェクトの理解」を参照してください。
8.2 Cursorクラス
oracle.olapi.data.cursor
パッケージでは、次の表に示すインタフェースがOracle OLAP Java APIによって定義されます。
インタフェース | 説明 |
---|---|
|
現在の位置の概念をカプセル化する抽象スーパークラス。 |
|
現在の位置に1つの値を持つ |
|
子 |
8.2.1 Cursorの構造
Cursor
の構造には、自身に関連付けられたSource
の構造が反映されます。 Source
に出力がない場合、そのSource
のCursor
はValueCursor
です。 Source
に1つ以上の出力がある場合、そのSource
のCursor
はCompoundCursor
です。 CompoundCursor
は、子としてCompoundCursor
のSource
のベースと1つ以上の出力Cursor
オブジェクトの値を持つベースValueCursor
を持ちます。
Source
の出力は別のSource
です。 出力Source
自体も出力を持つことができます。 Source
の出力の子Cursor
は、出力Source
に出力がない場合はValueCursor
であり、出力がある場合はCompoundCursor
です。
「例8-1」は、選択した月間に選択した製品アイテムの価格を指定する問合せを作成します。 この例では、timeHier
は時間値のディメンションの階層のSource
であり、prodHier
は製品値のディメンションの階層のSource
です。
prodSel
またはtimeSel
用のCursor
を作成すると、prodSel
とtimeSel
の両方に出力がないため、Cursor
はValueCursor
です。
unitPrice
オブジェクトは、製品単位の価格の値を表すMdmBaseMeasure
のSource
です。 MdmBaseMeasure
は、入力として製品と時間を表すMdmPrimaryDimension
オブジェクトを持ち、unitPrice
Source
は、それらのディメンションのSource
オブジェクトを入力として持っています。
この例では、ディメンション階層の要素を選択してから、選択のSource
オブジェクトをメジャーのSourceに結合して、querySource
を生成します。これは、出力としてprodSel
およびtimeSel
を持ちます。
例8-1 querySource問合せの作成
Source timeSel = timeHier.selectValues(new String[] {"CALENDAR_YEAR::MONTH::2001.01", "CALENDAR_YEAR::MONTH::2001.04", "CALENDAR_YEAR::MONTH::2001.07", "CALENDAR_YEAR::MONTH::2001.10"}); Source prodSel = prodHier.selectValues(new String[] {"PRODUCT_PRIMARY::ITEM::ENVY ABM", "PRODUCT_PRIMARY::ITEM::ENVY EXE", "PRODUCT_PRIMARY::ITEM::ENVY STD"}); Source querySource = unitPrice.join(timeSel).join(prodSel);
querySource
で定義された結果セットは、選択した月の選択した製品の単価値です。 結果は出力によって整理されます。 timeSel
はunitPrice.join(prodSel)
操作によって生成されたSource
に結合されているため、timeSel
はより遅く変化する出力です。つまり、結果セットは選択された各時間値に対して選択された製品のセットを指定します。 各時間値について、結果セットは3つの製品値を有するので、製品値は時間値よりも速く変化します。 querySource
のベースValueCursor
の値は、毎日の各製品に1つの価格価値があるため、すべての中で最も変化が速いです。
「問合せ結果の取得」の「例9-1」は、querySource
のCursor
、queryCursor
を作成します。 querySource
には出力があるので、queryCursor
はCompoundCursor
です。 queryCursor
のベースValueCursor
には、querySource
を作成した操作のベースSource
であるunitPrice
の値があります。 unitPrice
の値は、出力によって指定された値です。 queryCursor
の出力は、prodSel
の値を持つValueCursor
と、timeSel
の値を持つValueCursor
です。
図8-1 CompoundCursorであるqueryCursorの構造
この図は、queryCursor
の構造を示しています。 ベースValueCursor
と2つの出力ValueCursor
オブジェクトは、親CompoundCursor
であるqueryCursor
の子です。
![図8-1の説明が次にあります 図8-1の説明が次にあります](img/qrycrstr.gif)
図8-1 CompoundCursorであるqueryCursorの構造の説明
次に、queryCursor
の値を表形式で示します。 左の列は時間値、中央の列は製品値、右の列は月の製品の単位価格を表しています。
Month | 製品 | 単位価格 |
---|---|---|
2001.01 |
ENVY ABM |
3042.22 |
2001.01 |
ENVY EXE |
3223.28 |
2001.01 |
ENVY STD |
3042.22 |
2001.04 |
ENVY ABM |
2412.42 |
2001.04 |
ENVY EXE |
3107.65 |
2001.04 |
ENVY STD |
3026.12 |
2001.07 |
ENVY ABM |
2505.57 |
2001.07 |
ENVY EXE |
3155.91 |
2001.07 |
ENVY STD |
2892.18 |
2001.10 |
ENVY ABM |
2337.30 |
2001.10 |
ENVY EXE |
3105.53 |
2001.10 |
ENVY STD |
2856.86 |
ValueCursor
から値を取得する例については、「問合せ結果の取得」を参照してください。
8.2.2 Cursorの動作の指定
CursorSpecification
オブジェクトは、対応するCursor
オブジェクトの動作の一部の側面を指定します。 対応するCursor
オブジェクトを作成する前に、その動作をCursorSpecification
に指定する必要があります。 動作を指定するには、次のCursorSpecification
メソッドを使用します。
-
setDefaultFetchSize
-
setExtentCalculationSpecified
-
setParentEndCalculationSpecified
-
setParentStartCalculationSpecified
-
specifyDefaultFetchSizeOnChildren
(CompoundCursorSpecification
の場合のみ)
CursorSpecification
には、動作が指定されているかどうかを確認するためのメソッドも含まれています。 それらのメソッドを次に示します。
-
isExtentCalculationSpecified
-
isParentEndCalculationSpecified
-
isParentStartCalculationSpecified
CursorSpecification
メソッドを使用して、デフォルトのフェッチ・サイズの設定、エクステントの計算、あるいは親の中での値の開始位置または終了位置の計算を実行した場合、次のCursor
メソッドを正常に実行できます。
-
getExtent
-
getFetchSize
-
getParentEnd
-
getParentStart
-
setFetchSize
Cursor
ビヘイビアの指定の例については、「問合せ結果の取得」を参照してください。 フェッチ・サイズの詳細については、「"フェッチ・サイズについて"」を参照してください。 Cursor
の範囲については、「"カーソルのエクステントとは何ですか?"」を参照してください。 Cursor
の現在の値の親Cursor
の開始位置と終了位置については、「"カーソル内の親の開始および終了位置について"」を参照してください。
8.3 CursorInfoSpecificationクラス
CursorInfoSpecification
インタフェースとそのサブインタフェースのCompoundCursorInfoSpecification
およびValueCursorInfoSpecification
は、抽象クラスCursorSpecification
と具象クラスCompoundCursorSpecification
およびValueCursorSpecification
のメソッドを指定します。 CursorSpecification
では、対応するCursor
の動作の特定の側面を指定できます。 CursorInfoSpecification
インタフェースを直接的または間接的に実装するクラスのインスタンスを作成できます。
Source
のCursorSpecification
を作成するには、DataProvider
のcreateCursorInfoSpecification
メソッドをコールします。 このメソッドは、CompoundCursorSpecification
またはValueCursorSpecification
を戻します。 CursorSpecification
のメソッドを使用すると、Cursor
の動作の側面を指定できます。 また、CursorSpecification
を、cursorInfoSpec
引数としてDataProvider
のcreateCursorManager
メソッドに渡すことにより、CursorManager
を作成できます。
CursorSpecification
メソッドを使用すると、次の操作を実行できます。
-
CursorSpecification
に対応するSource
を取得できます。 -
対応する
Cursor
のデフォルトのフェッチ・サイズを取得または設定できます。 -
Oracle OLAPで
Cursor
のエクステントを計算するように指定できます。 -
エクステントの計算が指定されているかどうかを判断できます。
-
Oracle OLAPが、親
Cursor
内の対応するCursor
の現在の値の開始位置または終了位置を計算するように指定します。 親の中での値の開始位置および終了位置がわかっている場合、親Cursor
がその値に対して持っている、速く変化する要素の数を判断できます。 -
対応する
Cursor
の、親の中での現在の値の開始位置または終了位置の計算が指定されているかどうかを判断できます。 -
CursorSpecificationVisitor
を受け入れることができます。
詳細は、「"カーソルの位置と範囲について"」および「"フェッチ・サイズについて"」を参照してください。
oracle.olapi.data.source
パッケージでは、次の表に示すクラスがOracle OLAP Java APIによって定義されます。
インタフェース | 説明 |
---|---|
|
|
|
|
|
1つ以上の出力を持つ |
|
|
|
値を持ち、出力を持たない |
|
|
Cursor
の構造は、そのCursorSpecification
の構造と同じです。 各ValueCursorSpecification
またはCompoundCursorSpecification
は、対応するValueCursor
またはCompoundCursor
を持ちます。 Cursor
から特定の情報や動作を取得できるようにするには、アプリケーションは、Cursor
を作成する前に、対応するCursorSpecification
のメソッドを呼び出すことによって、情報または動作が必要であることを指定する必要があります。
8.4 CursorManagerクラス
CursorManager
を使用すると、Source
のCursor
を作成できます。 作成されたCursor
オブジェクトのデータのバッファリングは、DataProvider
のいずれかのcreateCursorManager
メソッドによって戻されるクラスによって管理されます。
同じCursorManager
から複数のCursor
を作成することができます。これは、結果セットのデータを表やグラフなどの異なるフォーマットで表示するのに便利です。 CursorManager
によって作成されたすべてのCursor
オブジェクトは、デフォルトのフェッチ・サイズなどの仕様が同じです。 Cursor
オブジェクトは同じ仕様を持つため、CursorManager
で管理されるデータを共有できます。
SQLCursorManager
には、Source
用のOracle OLAP SQL Generatorによって生成されたSQLを戻すメソッドがあります。 1つ以上のSQLCursorManager
オブジェクトを作成するには、DataProvider
のcreateSQLCursorManager
またはcreateSQLCursorManagers
メソッドをコールします。 Cursor
の作成にSQLCursorManager
は使用しません。 代わりに、OLAP Java APIの外部のクラスでSQLCursorManager
によって戻されたSQLを使用するなどの方法で、問合せで指定されたデータを取得します。
8.4.1 CursorManagerのCursorInfoSpecificationの更新
アプリケーションがOLAP Java API Template
オブジェクトを使用していて、Template
によって生成されたSource
の構造を変更するようにTemplate
の状態が変化すると、Source
のCursorInfoSpecification
オブジェクトは無効になります。 変更されたSource
に対して新しいCursorInfoSpecification
オブジェクトを作成する必要があります。
新しいCursorInfoSpecification
を作成した後、そのSource
の新しいCursorManager
を作成できます。 ただし、新しいCursorManager
は、必ずしも作成する必要はありません。 既存のCursorManager
のupdateSpecification
メソッドを呼び出して、前のCursorInfoSpecification
を新しいCursorInfoSpecification
に置き換えることができます。 その後、CursorManager
から新しいCursor
を作成できます。
8.5 Cursorの位置およびエクステント
Cursor
には、1つ以上の位置があります。 Cursor
の「現在位置」は、現在Cursor
でアクティブな位置です。 Cursor
の現在の位置を移動するには、Cursor
のsetPosition
またはnext
メソッドを呼び出します。
Oracle OLAPは、getCurrentValue
メソッドの呼び出しなど、Cursor
の操作を試行するまで、Cursor
で設定した位置を検証しません。 現在の位置を負の値またはCursor
の位置の数より大きい値に設定してからCursor
操作を試行すると、Cursor
はPositionOutOfBoundsException
をスローします。
Cursor
の範囲は、「"カーソルのエクステントとは何ですか?"」で説明されています。
8.5.1 ValueCursorの位置
ValueCursor
の現在の位置には、取得可能な1つの値が指定されています。 たとえば、prodSel
(「"カーソルの構造"」で説明されている派生Source
)は、製品のディメンションとその階層グループを指定するプライマリSource
の3つの製品の選択です。 prodSel
のValueCursor
には、3つの要素が存在します。 次の例では、ValueCursor
の各要素の位置を取得し、その位置の値を表示します。
// prodSelValCursor is the ValueCursor for prodSel println("ValueCursor Position Value "); println("-------------------- ------------------------"); do { println(" " + prodSelValCursor.getPosition() + " " + prodSelValCursor.getCurrentValue()); } while(prodSelValCursor.next());
前述の例によって表示される値は、次のとおりです。
ValueCursor Position Value -------------------- ------------------------------- 1 PRODUCT_PRIMARY::ITEM::ENVY ABM 2 PRODUCT_PRIMARY::ITEM::ENVY EXE 3 PRODUCT_PRIMARY::ITEM::ENVY STD
次の例では、prodSelValCursor
の現在の位置を2に設定し、その位置の値を取得します。
prodSelValCursor.setPosition(2); println(prodSelValCursor.getCurrentString());
前述の例によって表示される値は、次のとおりです。
PRODUCT_PRIMARY::ITEM::ENVY EXE
ValueCursor
の現在の値を取得する他の例については、「問合せ結果の取得」を参照してください。
8.5.2 CompoundCursorの位置
CompoundCursor
には、その子孫ValueCursor
オブジェクトの要素セットごとに1つの位置が存在します。 CompoundCursor
の現在の位置によって、それらのセットのいずれかが指定されます。
たとえば、querySource
(例8-1で作成したSource
)には、メジャーunitPrice
からの値が含まれます。 これらの値は、異なる時点での製品の単位価格です。 querySource
の出力は、時間ディメンションから選択された4つの月の値および製品ディメンションから選択された3つの製品の値を表すSource
オブジェクトです。
querySource
の結果セットは、各タプル(出力値の各セット)に1つのメジャー値を持つため、値の合計数は12になります(4つの各月の3つの各製品に対して1つの値)。 したがって、querySource
用に作成されたCompoundCursor
であるqueryCursor
には12の位置が存在します。
queryCursor
の各位置によって、出力およびベースValueCursor
の1つの位置セットが指定されます。 たとえば、queryCursor
の位置1によって、その出力およびベースValueCursor
の次の位置セットが決まります。
-
出力1の位置1(
timeSel
のValueCursor
) -
出力2の位置1(
prodSel
のValueCursor
) -
queryCursor
のベースValueCursor
の位置1(この位置には、出力の値によって指定されるunitPrice
メジャーの値が存在します。)
図8-2 queryCursor内のCursorの位置
この例は、queryCursor
CompoundCursor
、ベースValueCursor
、および出力の位置を示しています。
![図8-2の説明が続きます 図8-2の説明が続きます](img/qrycrspo.gif)
図8-2 queryCursor内のCursorの位置の説明
任意の1セットの出力値によってunitPrice
の値が1つのみ指定されるため、queryCursor
のValueCursor
には位置が1つのみ存在します。 querySource
のような問合せの場合、そのCursor
のValueCursor
の値と位置は、ルート・レベルのCompoundCursor
の任意の1つの位置に対して、一度にそれぞれ1つのみになります。
図8-3 queryCursorのクロス集計の表示
この図は、queryCursor
からのデータの1つの可能な表示を示しています。 これは、4つの列および5つの行で構成されたクロス集計ビューです。 左の列は日付値です。 一番上の行は製品値です。 クロス集計の交差している各セルは、その月の製品の価格です。
![図8-3の説明は図の下のリンクをクリックしてください。 図8-3の説明は図の下のリンクをクリックしてください。](img/xtabvudp.gif)
図8-3 queryCursorのクロス集計の表示の説明
CompoundCursor
では、ValueCursor
オブジェクトの位置が互いに相対的に調整されます。 CompoundCursor
の現在の位置によって、その子孫ValueCursor
オブジェクトの現在の位置が指定されます。
例8-2 CompoundCursorの位置の設定および現在の値の取得
この例では、queryCursor
の位置を設定し、現在の値と子Cursor
オブジェクトの位置を取得します。
CompoundCursor rootCursor = (CompoundCursor) queryCursor; ValueCursor baseValueCursor = rootCursor.getValueCursor(); List outputs = rootCursor.getOutputs(); ValueCursor output1 = (ValueCursor) outputs.get(0); ValueCursor output2 = (ValueCursor) outputs.get(1); int pos = 5; rootCursor.setPosition(pos); println("CompoundCursor position set to " + pos + "."); println("The current position of the CompoundCursor is = " + rootCursor.getPosition() + "."); println("Output 1 position = " + output1.getPosition() + ", value = " + output1.getCurrentValue()); println("Output 2 position = " + output2.getPosition() + ", value = " + output2.getCurrentValue()); println("VC position = " + baseValueCursor.getPosition() + ", value = " + baseValueCursor.getCurrentValue());
この例では、次の内容が表示されます:
CompoundCursor position set to 5. The current position of the CompoundCursor is 5. Output 1 position = 2, value = CALENDAR_YEAR::MONTH::2001.04 Output 2 position = 2, value = PRODUCT_PRIMARY::ITEM::ENVY EXE VC position = 1, value = 3107.65
queryCursor
の位置は、querySource
の結果セットに常に各時間値に対する3つの製品値が含まれるという点で対称的です。 したがって、prodSel
のValueCursor
には、常にtimeSel
ValueCursor
の各値に対して3つの位置があります。 timeSel
の出力ValueCursor
は、prodSel
ValueCursor
よりも変化が緩やかです。
ただし、非対称の場合、ValueCursor
内の位置の数は、遅く変化する出力に対して常に同じではありません。 たとえば、月2001.10の製品ENVY ABMの単位価格がNULLで(その日にその製品が販売されなかったため)、問合せでNULL値が抑制されている場合、queryCursor
に含まれる位置は11のみです。 prodSel
のValueCursor
は、timeSel
のValueCursor
の位置が4の場合に2つの位置しか持たない。
「例8-3」は、メジャー値の比較に基づいて1つのディメンションの要素を選択することによって生成される非対称の結果セットを示します。 この例では、「例8-1」と同じ製品と時間の選択が使用されています。 製品、時間、販売チャネル、および顧客次元によってディメンション化された、販売された製品単位(units
)の指標としてSource
を使用します。 chanSel
およびcustSel
オブジェクトは、ディメンションの単一の値の選択です。 この例では、Source
、querySource2
が生成され、選択した製品のうち、選択した時間、チャネル、および顧客の値に対して複数のユニットを販売した製品を指定します。 querySource2
は派生したSource
なので、この例は現在のTransaction
をコミットします。
この例では、querySource2
のCursor
を作成し、CompoundCursor
の位置をループし、CompoundCursor
の最初の出力ValueCursor
とValueCursor
の位置と現在の値を取得し、ValueCursor
オブジェクトの位置と値を表示します。 getLocalValue
メソッドは、一意値からローカル値を抽出する、プログラム内のメソッドです。
例8-3 非対称問合せでの位置
// Create the query prodSel.join(chanSel).join(custSel).join(timeSel).select(units.gt(1)); // Commit the current Transaction. try { // The DataProvider is dp. (dp.getTransactionProvider()).commitCurrentTransaction(); } catch(Exception e) { output.println("Cannot commit current Transaction " + e); } // Create the CursorManager and the Cursor. CursorManager cursorManager = dp.createCursorManager(querySource2); Cursor queryCursor2 = cursorManager.createCursor(); CompoundCursor rootCursor = (CompoundCursor) queryCursor2; ValueCursor baseValueCursor = rootCursor.getValueCursor(); List outputs = rootCursor.getOutputs(); ValueCursor output1 = (ValueCursor) outputs.get(0); // Get the positions and values and display them. println("CompoundCursor Output ValueCursor ValueCursor"); println(" position position | value position | value"); do { println(sp6 + rootCursor.getPosition() + // sp6 is 6 spaces sp13 + output1.getPosition() + // sp13 is 13 spaces sp7 + getLocalValue(output1.getCurrentString()) + //sp7 is 7 spaces sp7 + baseValueCursor.getPosition() + sp7 + getLocalValue(baseValueCursor.getCurrentString())); } while(queryCursor2.next());
この例によって、次のように表示されます。
CompoundCursor Output ValueCursor ValueCursor position position | value position | value 1 1 2001.01 1 ENVY ABM 2 1 2001.01 2 ENVY EXE 3 1 2001.01 3 ENVY STD 4 2 2001.04 1 ENVY ABM 5 3 2001.07 1 ENVY ABM 6 3 2001.07 2 ENVY EXE 7 4 2001.10 1 ENVY EXE 8 4 2001.10 2 ENVY STD
prodSel
から派生した値に対するValueCursor
の要素の数は、出力ValueCursor
の各値について同じではありません。 時間値2001.01の場合、3つの製品の販売数はすべて1を超えていますが、時間値2001.04の場合、販売数が1を超えている製品は1つのみです。 残りの2つの時間値2001.07と2001.10の場合、基準を満たす製品は2つです。 したがって、CompoundCursor
のValueCursor
には、時間値2001.01の場合は位置が3つ、時間値2001.04の場合は位置が1つのみ、時間値2001.07と2001.10の場合は位置が2つあります。
8.5.3 Cursor内での親の開始/終了位置
CompoundCursor
から取得するデータの表示を効率的に管理するために、現在の遅く変化する値に対して存在する速く変化する値の数を把握することが必要な場合があります。 たとえば、クロス集計で、キューブの1つのエッジの値を1つの行に表示する場合、その行に対して表示する列の数を把握する必要がある場合があります。
子Cursor
の現在の値に対していくつのより高速な可変値が存在するかを調べるには、親のCursor
にその現在の値の開始位置と終了位置があります。 次に示すとおり、終了位置から開始位置を引き、1を足します。
long span = (cursor.getParentEnd() - cursor.getParentStart()) + 1;
結果は、親Cursor
内の子Cursor
の現在の値のspanです。これは、現在の値に対して最も速く変化する子Cursor
の値がいくつあるかを示します。 開始位置と終了位置の計算には時間と計算リソースが多くかかるため、アプリケーションで情報が必要なときに計算を実行するように指定するだけです。
Oracle OLAP Java APIのCursor
を使用すると、アプリケーションで、現在表示しているデータのみをクライアント・コンピュータに実際に存在させることができます。 Cursor
のデータ量の指定については、「"フェッチ・サイズについて"」を参照してください。
ただし、クライアント・コンピュータのデータからは、Cursor
の現在の値が開始または終了する親Cursor
の位置を特定することはできません。 その情報を取得するには、Cursor
のgetParentStart
およびgetParentEnd
メソッドを使用します。
親Cursor
内の子Cursor
の値の開始および終了位置をOracle OLAPで計算するように指定するには、Cursor
に対応するCursorSpecification
のsetParentStartCalculationSpecified
およびsetParentEndCalculationSpecified
メソッドを呼び出します。 開始位置と終了位置の計算が指定されているかどうかは、そのCursorSpecification
のisParentStartCalculationSpecified
またはisParentEndCalculationSpecified
メソッドをコールすることによって判断できます。 これらの計算を指定する例については、「問合せ結果の取得」を参照してください。
8.5.4 Cursorのエクステントの概要
Cursor
のエクステントは、遅く変化する出力に対してそのCursorが含む要素の合計数です。
エクステントとは、たとえば正しい数の列または正しいサイズのスクロール・バーを表示するために使用できる情報です。 しかし、その程度は計算するのに費用がかかることがあります。 たとえば、キューブを表すSource
には4つの出力があります。 各出力には何百もの値があります。 出力セットのメジャーのすべてのNULL値とゼロ値が結果セットから削除された場合、Source
のCompoundCursor
の範囲を計算するために、Oracle OLAPはCompoundCursor
を作成する前に結果スペース全体を走査する必要があります。 エクステントを計算することを指定していない場合、Oracle OLAPはCursor
のフェッチ・サイズで指定されたキューブの出力で定義された要素のセットをトラバースするだけで、必要に応じてアプリケーションでトラバースする必要があります。
Oracle OLAPでCursor
のエクステントを計算するように指定するには、Cursor
に対応するCursorSpecification
のsetExtentCalculationSpecified
メソッドをコールします。 エクステントの計算が指定されているかどうかは、CursorSpecification
のisExtentCalculationSpecified
メソッドをコールすることによって判断できます。 Cursor
の範囲の計算を指定する例については、「問合せ結果の取得」を参照してください。
8.6 フェッチ・サイズ
OLAP Java APIのCursor
は、Source
の結果セット全体を表します。 ただし、Cursor
はvirtual Cursor
です。これは、Oracle OLAPから一度に結果セットの一部のみを取得するためです。 CursorManager
は、仮想Cursor
を管理し、アプリケーションの必要に応じてOracle OLAPから結果を取得します。 CursorManager
で仮想Cursor
が管理されることによって、アプリケーションの負荷が大幅に軽減されます。
1回のフェッチ操作でCursor
が取り出すデータ量は、Cursor
に指定された「サイズを取得」によって決まります。 フェッチ・サイズを指定すると、アプリケーションがローカル・コンピュータにキャッシュする必要があるデータの量を制限し、データの表示方法の要件を満たすようにキャッシュをカスタマイズすることによってフェッチの効率を最大限に向上させることができます。
問合せの作成時にParameter
およびパラメータ化Source
オブジェクトを使用すると、Oracle OLAPによって戻される要素の数を調整することもできます。 Parameter
オブジェクトの詳細については、「ソース・オブジェクトの理解」を参照してください。 パラメータ化されたSource
オブジェクトの使用例については、「ソース・メソッドを使用した問合せの作成」を参照してください。
Source
のCursorManager
を作成すると、Oracle OLAPによって、ルートのCursorSpecification
にデフォルトのフェッチ・サイズが指定されます。 デフォルトのフェッチ・サイズは、ルート・レベルのCursorSpecification
のsetDefaultFetchSize
メソッドを使用して変更できます。
同じCursorManager
から2つ以上のCursor
オブジェクトを作成し、両方のCursor
オブジェクトを同時に使用することができます。 これらのCursor
オブジェクトは、個別のデータ・キャッシュを持つのではなく、CursorManager
によって管理されるデータを共有できます。
次の例は、問合せの結果を表とグラフの両方で表示するアプリケーションです。 アプリケーションで、Source
のCursorManager
を作成します。 このアプリケーションは、同じCursorManager
から、表ビューとグラフ・ビュー用に、2つの別個のCursor
オブジェクトを作成します。 これらの2つのビューは、同じ問合せを共有し、同じデータを表示しますが、その表示形式は異なります。
図8-4 1つのSourceとその値を異なるビューで表示する2つのCursor
この図は、Source
オブジェクト、Cursor
オブジェクト、およびビューの関係を示しています。
![図8-4の説明が続きます 図8-4の説明が続きます](img/crsvlvus.gif)
図8-4 1つのSourceとその値を異なるビューで表示する2つのCursorの説明