この章では、問合せの結果を取得するために使用する、Oracle OLAP Java APIのCursor
クラスおよびその関連クラスについて説明します。また、Cursor
の位置、フェッチ・サイズおよびエクステントの概念についても説明します。Cursor
およびその関連オブジェクトの作成と使用の例については、第9章「問合せ結果の取得」を参照してください。
この章では、次の項目について説明します。
Cursor
を使用すると、Source
によって定義される結果セットを取得できます。Cursor
は、CursorManager
のcreateCursor
メソッドをコールして作成します。CursorManager
は、DataProvider
のcreateCursorManager
メソッドをコールして作成します。
Oracle OLAP SQL GeneratorによってSource
に対して生成されたSQLを取得するには、Cursor
を作成する必要はありません。Source
のSQLを取得するには、DataProvider
のcreateSQLCursorManager
メソッドを使用して、SQLCursorManager
を作成します。次に、OLAP Java API外部のクラス、またはその他のメソッドを使用して、生成されたSQLを使用してデータを取得します。
Source
のCursor
は次の手順で作成します。
DataProvider
のcreateCursorManager
メソッドのいずれか1つをコールして、そのメソッドにSource
を渡すことによって、CursorManager
を作成します。Cursor
の動作を変更する場合、CursorInfoSpecification
を作成し、そのメソッドを使用して動作を指定します。このCursorInfoSpecification
およびSource
を引数とするメソッドを使用して、CursorManager
を作成します。
CursorManager
のcreateCursor
メソッドをコールして、Cursor
を作成します。
一部のSource
オブジェクトは、Cursor
がデータ・ストアから取得できるデータを指定しません。値を持つCursor
を作成できないSource
オブジェクトは次のとおりです。
計算不可能な操作を指定するSource
。たとえば、無限再帰を指定するSource
です。
無限結果セットを定義するSource
。たとえば、すべてのString
オブジェクトのセットを表す基本Source
です。
要素を持たないSource
、または要素を持たない他のSource
を含むSource
。たとえば、DataProvider
のgetEmptySource
メソッドによって戻されたSource
や、空のSource
から導出された別のSource
です。MdmDimension
から取得したプライマリSource
から値を選択することによって作成された導出Source
で、選択された値がディメンションに存在しないSource
も該当します。
このようなSource
にCursor
を作成してそのCursor
の値を取得しようとすると、Exception
が発生します。
導出Source
を作成する、またはTemplate
の状態を変更する場合、Source
は、現行のTransaction
のコンテキスト内で作成します。Source
は、それを作成したTransaction
の中またはそのTransaction
の子Transaction
の中でアクティブです。Source
のCursor
を作成するには、そのSource
が現行のTransaction
でアクティブである必要があります。
導出Source
の作成は、書込みTransaction
で実行されます。Cursor
の作成は、読取りTransaction
で実行されます。導出Source
の作成後かつそのSource
のCursor
の作成前に、アプリケーションで使用中のTransactionProvider
のcommitCurrentTransaction
メソッドをコールして、書込みTransaction
を読取りTransaction
に変更する必要があります。Transaction
オブジェクトおよびTransactionProvider
オブジェクトの詳細は、第7章「TransactionProviderの使用方法」を参照してください。
パラメータ化Source
を含む問合せ用に作成するCursor
の場合、Transaction
を再度コミットしなくても、Parameter
オブジェクトの値を変更して、Cursor
の新しい値を取得できます。パラメータ化Source
オブジェクトの詳細は、第5章「Sourceオブジェクトの理解」を参照してください。
oracle.olapi.data.cursor
パッケージでは、次の表に示すインタフェースがOracle OLAP Java APIによって定義されます。
インタフェース | 説明 |
---|---|
Cursor |
現在の位置の概念をカプセル化する抽象スーパークラス。 |
ValueCursor |
現在の位置に1つの値を持つCursor 。ValueCursor には、子Cursor オブジェクトは存在しません。 |
CompoundCursor |
子Cursor オブジェクトを持つCursor 。含まれるCursor オブジェクトは、関連するSource の値に対する子ValueCursor と、そのSource の各出力用の出力子Cursor です。 |
Cursor
の構造には、自身に関連付けられたSource
の構造が反映されます。Source
が出力を持たない場合、そのSource
のCursor
はValueCursor
です。Source
が1つ以上の出力を持つ場合、そのSource
のCursor
はCompoundCursor
です。CompoundCursor
には、子として、そのCompoundCursor
のSource
のベースの値を持つベースValueCursor
、および1つ以上の出力Cursor
オブジェクトが存在します。
Source
の出力は、別のSource
です。出力Source
自体も出力を持つことができます。Source
の出力用の子Cursor
は、出力Source
が出力を持たない場合はValueCursor
、出力を持つ場合はCompoundCursor
です。
例8-1では、選択された月の選択された製品項目の価格を指定する問合せを作成します。この例では、timeHier
は、時間値のディメンションの階層のSource
です。prodHier
は、製品値のディメンションの階層のSource
です。
prodSel
またはtimeSel
のCursor
を作成する場合、いずれのCursor
もValueCursor
になります。これは、prodSel
とtimeSel
のどちらも出力を持たないためです。
unitPrice
オブジェクトは、製品の単位価格の値を表すMdmMeasure
のSource
です。MdmMeasure
は、製品および時間を表す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
で定義される結果セットは、選択された月の選択された製品の単位価格値です。結果は、出力によって編成されます。unitPrice.join(prodSel)
操作によって生成されたSource
にtimeSel
が結合されているため、timeSel
は遅く変化する出力です。これは、結果セットによって、選択された各時間値に対して選択された一連の製品が指定されることを意味します。各時間値に対して、結果セットは3つの製品値を持つため、製品値は時間値より速く変化します。querySource
のベースValueCursor
の値は、各日付の各製品に対して1つの値があるため、すべての値のうちで最も速く変化します。
第9章の例9-1では、querySource
のCursor
(queryCursor
)を作成しています。querySource
は出力を持つため、queryCursor
はCompoundCursor
です。queryCursor
のベースValueCursor
は、querySource
を作成した操作のベースSource
であるunitPrice
からの値を持ちます。unitPrice
の値は、出力によって指定された値です。queryCursor
の出力は、prodSel
の値を持つValueCursor
であり、timeSel
の値を持つValueCursor
です。
図8-1に、queryCursor
の構造を示します。ベースValueCursor
および2つの出力ValueCursor
オブジェクトは、親CompoundCursor
であるqueryCursor
の子です。
次に、queryCursor
の値を表形式で示します。左の列は時間値、中央の列は製品値、右の列は月の製品の単位価格を表しています。
月 | 製品 | 単位価格 |
---|---|---|
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
から値を取得する例については、第9章を参照してください。
CursorSpecification
オブジェクトは、対応するCursor
オブジェクトの動作の一部の側面を指定します。対応するCursor
オブジェクトを作成する前に、その動作をCursorSpecification
に指定する必要があります。動作を指定するには、次のCursorSpecification
メソッドを使用します。
setDefaultFetchSize
setExtentCalculationSpecified
setParentEndCalculationSpecified
setParentStartCalculationSpecified
specifyDefaultFetchSizeOnChildren
(CompoundCursorSpecification
の場合のみ)
CursorSpecification
には、動作が指定されているかどうかを確認するためのメソッドも含まれています。それらのメソッドを次に示します。
isExtentCalculationSpecified
isParentEndCalculationSpecified
isParentStartCalculationSpecified
CursorSpecification
メソッドを使用して、デフォルトのフェッチ・サイズの設定、エクステントの計算、あるいは親の中での値の開始位置または終了位置の計算を実行した場合、次のCursor
メソッドを正常に実行できます。
getExtent
getFetchSize
getParentEnd
getParentStart
setFetchSize
Cursor
の動作を指定する例については、第9章を参照してください。フェッチ・サイズの詳細は、「フェッチ・サイズ」を参照してください。Cursor
のエクステントの詳細は、「Cursorのエクステントの概要」を参照してください。親Cursor
の中での、Cursor
の現在の値の開始位置および終了位置の詳細は、「Cursor内での親の開始/終了位置」を参照してください。
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
のエクステントを計算するように指定できます。
エクステントの計算が指定されているかどうかを判断できます。
対応するCursor
の、親Cursor
の中での現在の値の開始位置または終了位置を、Oracle OLAPで計算するように指定できます。親の中での値の開始位置および終了位置がわかっている場合、親Cursor
がその値に対して持っている、速く変化する要素の数を判断できます。
対応するCursor
の、親の中での現在の値の開始位置または終了位置の計算が指定されているかどうかを判断できます。
CursorSpecificationVisitor
を受け入れることができます。
詳細は、「Cursorの位置およびエクステント」および「フェッチ・サイズ」を参照してください。
oracle.olapi.data.source
パッケージでは、次の表に示すクラスがOracle OLAP Java APIによって定義されます。
インタフェース | 説明 |
---|---|
CursorInfoSpecification |
CursorSpecification オブジェクトのメソッドを指定するインタフェース。 |
CursorSpecification |
CursorInfoSpecification インタフェースの一部のメソッドを実装する抽象クラス。 |
CompoundCursorSpecification |
1つ以上の出力を持つSource のCursorSpecification 。CompoundCursorSpecification には、子コンポーネントであるCursorSpecification オブジェクトが存在する。 |
CompoundInfoCursorSpecification |
CompoundCursorSpecification オブジェクトのメソッドを指定するインタフェース。 |
ValueCursorSpecification |
値を持ち、出力を持たないSource のCursorSpecification 。 |
ValueCursorInfoSpecification |
ValueCursorSpecification オブジェクトのインタフェース。 |
Cursor
の構造は、そのCursorSpecification
の構造と同じです。各ValueCursorSpecification
またはCompoundCursorSpecification
は、対応するValueCursor
またはCompoundCursor
を持ちます。Cursor
から特定の情報または動作を取得できるようにするには、アプリケーションによってCursor
が作成される前に、対応するCursorSpecification
のメソッドをコールすることによって、そのアプリケーションでその情報または動作が必要であることを指定する必要があります。
CursorManager
を使用すると、Source
のCursor
を作成できます。作成されたCursor
オブジェクトのデータのバッファリングは、DataProvider
のいずれかのcreateCursorManager
メソッドによって戻されるクラスによって管理されます。
同じCursorManager
から複数のCursor
を作成できます。これは、1つの結果セットのデータを、表やグラフなどの異なる形式で表示する場合に有効です。1つのCursorManager
によって作成されたすべてのCursor
オブジェクトの仕様(デフォルトのフェッチ・サイズなど)は同じです。仕様が同じであるCursor
オブジェクト間では、CursorManager
によって管理されるデータを共有できます。
SQLCursorManager
には、Source
用のOracle OLAP SQL Generatorによって生成されたSQLを戻すメソッドがあります。1つ以上のSQLCursorManager
オブジェクトを作成するには、DataProvider
のcreateSQLCursorManager
またはcreateSQLCursorManagers
メソッドをコールします。Cursor
の作成にSQLCursorManager
は使用しません。代わりに、OLAP Java APIの外部のクラスでSQLCursorManager
によって戻されたSQLを使用するなどの方法で、問合せで指定されたデータを取得します。
アプリケーションでOLAP Java API Template
オブジェクトが使用されており、Template
の状態の変更に従ってそのTemplate
によって生成されたSource
の構造が変更された場合、そのSource
用のすべてのCursorInfoSpecification
オブジェクトが無効になります。変更されたSource
に対して新しいCursorInfoSpecification
オブジェクトを作成する必要があります。
新しいCursorInfoSpecification
を作成した後、そのSource
の新しいCursorManager
を作成できます。ただし、新しいCursorManager
は、必ずしも作成する必要はありません。既存のCursorManager
のupdateSpecification
メソッドをコールすると、以前のCursorInfoSpecification
を新しいCursorInfoSpecification
に置換できます。その後、CursorManager
から新しいCursor
を作成できます。
Cursor
には、1つ以上の位置があります。Cursor
の現在の位置は、Cursor
内で現在アクティブな位置です。Cursor
の現在の位置を移動するには、そのCursor
のsetPosition
またはnext
メソッドをコールします。
Oracle OLAPでは、Cursor
に操作(getCurrentValue
メソッドのコールなど)を試行しないかぎり、Cursor
に設定した位置が検証されません。現在の位置を、負の値か、またはCursor
内の位置の数より大きい値に設定してCursor
操作を試行すると、Cursor
によってPositionOutOfBoundsException
が発生します。
Cursor
のエクステントの詳細は、「Cursorのエクステントの概要」を参照してください。
ValueCursor
の現在の位置には、取得可能な1つの値が指定されています。たとえば、prodSel
(「Cursorの構造」に示す導出Source
)は、製品のディメンションおよび階層的なグループを示すプライマリSource
から3つの製品を選択したものです。prodSel
のValueCursor
には、3つの要素が存在します。次の例では、ValueCursor
の各要素の位置を取得し、その位置の値を表示します。context
オブジェクトには、テキストを表示するメソッドがあります。
// 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
から現在の値を取得するその他の例については、第9章を参照してください。
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に、CompoundCursor
であるqueryCursor
の位置、ベースValueCursor
および出力を示します。
任意の1セットの出力値によってunitPrice
の値が1つのみ指定されるため、queryCursor
のValueCursor
には位置が1つのみ存在します。querySource
のような問合せの場合、そのCursor
のValueCursor
の値と位置は、ルート・レベルのCompoundCursor
の任意の1つの位置に対して、一度にそれぞれ1つのみになります。
図8-3に、queryCursor
からのデータ表示の一例を示します。これは、4つの列および5つの行で構成されたクロス集計ビューです。左の列は日付値です。一番上の行は製品値です。クロス集計の交差している各セルは、その月の製品の価格です。
CompoundCursor
では、ValueCursor
オブジェクトの位置が互いに相対的に調整されます。CompoundCursor
の現在の位置によって、その子孫ValueCursor
オブジェクトの現在の位置が指定されます。例8-2では、queryCursor
の位置を設定し、子Cursor
オブジェクトの現在の値と位置を取得します。
例8-2 CompoundCursorの位置の設定および現在の値の取得
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());
例8-2の出力は、次のようになります。
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のみです。timeSel
のValueCursor
の位置が4の場合、prodSel
のValueCursor
に含まれる位置は2つのみです。
例8-3では、メジャー値の比較に基づいて1つのディメンションの要素を選択して作成される、非対称の結果セットを示します。この例では、例8-1と同じ製品および時間の選択を使用します。製品の販売台数のメジャーのSource
としてunits
を使用します。これは、製品、時間、売上、チャネルおよび顧客ディメンションによってディメンション化されています。chanSel
およびcustSel
オブジェクトは、ディメンションの単一の値の選択です。この例では、選択された時間、チャネルおよび顧客の値について、選択された製品のうち、販売台数が1を超える製品を指定するSource
(querySource2
)を生成します。querySource2
は導出Source
であるため、この例では現行のTransaction
をコミットします。
この例では、querySource2
のCursor
を作成し、CompoundCursor
の位置を通してループし、最初の出力ValueCursor
およびCompoundCursor
の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());
例8-3の出力は、次のようになります。
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
指定されたチャネルおよび顧客の選択について、製品および時間の選択のすべての組合せで販売台数が1を超えているとは限らないため、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つあります。
CompoundCursor
から取得するデータの表示を効率的に管理するために、現在の遅く変化する値に対して存在する速く変化する値の数を把握することが必要な場合があります。たとえば、クロス集計で、キューブの1つのエッジの値を1つの行に表示する場合、その行に対して表示する列の数を把握する必要がある場合があります。
子Cursor
の現在の値に対して存在する速く変化する値の数を判断するには、その現在の値の、親Cursor
の中での開始位置および終了位置を検出します。次に示すとおり、終了位置から開始位置を引き、1を足します。
long span = (cursor.getParentEnd() - cursor.getParentStart()) + 1;
これによって、親Cursor
の中での、子Cursor
の現在の値のスパンが計算されます。このスパンから、現在の値に対して存在する子Cursor
の最も速く変化する値の数を判断できます。開始位置と終了位置の計算は、多くの時間およびコンピューティング資源が必要であるため、アプリケーションでその情報が必要な場合にのみこれらの計算を実行するように指定します。
Oracle OLAP Java APIのCursor
を使用すると、アプリケーションで、現在表示しているデータのみをクライアント・コンピュータに実際に存在させることができます。Cursor
のデータ量を指定する方法の詳細は、「フェッチ・サイズ」を参照してください。
ただし、クライアント・コンピュータ上のデータからは、親Cursor
の中での、子Cursor
の現在の値が開始または終了する位置を判断することはできません。その情報を取得するには、Cursor
のgetParentStart
およびgetParentEnd
メソッドを使用します。
親Cursor
の中での子Cursor
の値の開始位置および終了位置を計算するようにOracle OLAPに指定するには、そのCursor
に対応するCursorSpecification
のsetParentStartCalculationSpecified
およびsetParentEndCalculationSpecified
メソッドをコールします。開始位置と終了位置の計算が指定されているかどうかは、そのCursorSpecification
のisParentStartCalculationSpecified
またはisParentEndCalculationSpecified
メソッドをコールすることによって判断できます。これらの計算を指定する例については、第9章を参照してください。
Cursor
のエクステントは、遅く変化する出力に対してそのCursorが含む要素の合計数です。
エクステントの情報は、正確な列数や正確なサイズのスクロールバーを表示する場合などに使用できます。ただし、エクステントの計算は、コストが高くなる場合があります。たとえば、キューブを表すSource
が4つの出力を持ち、各出力には数百の値が含まれる場合があります。出力セットのメジャーのすべてのNULL値と0(ゼロ)値が結果セットから排除される場合、Source
のCompoundCursor
のエクステントを計算するには、CompoundCursor
を作成する前に結果領域全体を横断する必要があります。エクステントの計算を指定しない場合は、アプリケーションの必要に応じて、Cursor
のフェッチ・サイズで指定されたキューブの出力によって定義される要素のセットを横断するのみで済みます。
Oracle OLAPでCursor
のエクステントを計算するように指定するには、そのCursor
に対応したCursorSpecification
のsetExtentCalculationSpecified
メソッドをコールします。エクステントの計算が指定されているかどうかは、CursorSpecification
のisExtentCalculationSpecified
メソッドをコールすることによって判断できます。Cursor
のエクステントの計算を指定する例については、第9章を参照してください。
OLAP Java APIのCursor
は、Source
の結果セット全体を表します。ただし、そのCursor
がOracle OLAPから一度に取得するのは結果セットの一部のみであるため、それは仮想的なCursor
です。CursorManager
は、仮想Cursor
を管理し、アプリケーションの必要に応じてOracle OLAPから結果を取得します。CursorManager
で仮想Cursor
が管理されることによって、アプリケーションの負荷が大幅に軽減されます。
1回のフェッチ操作でCursor
が取得するデータの量は、そのCursor
に指定されたフェッチ・サイズによって決定されます。フェッチ・サイズを指定すると、アプリケーションがローカル・コンピュータにキャッシュする必要があるデータの量を制限し、データの表示方法の要件を満たすようにキャッシュをカスタマイズすることによってフェッチの効率を最大限に向上させることができます。
問合せの作成時にParameter
およびパラメータ化Source
オブジェクトを使用すると、Oracle OLAPによって戻される要素の数を調整することもできます。Parameter
オブジェクトの詳細は、第5章「Sourceオブジェクトの理解」を参照してください。パラメータ化Source
オブジェクトの使用例は、第6章「Sourceメソッドを使用した問合せの作成」を参照してください。
Source
のCursorManager
を作成すると、Oracle OLAPによって、ルートのCursorSpecification
にデフォルトのフェッチ・サイズが指定されます。デフォルトのフェッチ・サイズは、ルート・レベルのCursorSpecification
のsetDefaultFetchSize
メソッドを使用して変更できます。
同じCursorManager
から複数のCursor
オブジェクトを作成し、それらのCursor
オブジェクトを同時に使用できます。これらのCursor
オブジェクトは、個別のデータ・キャッシュを持つのではなく、CursorManager
によって管理されるデータを共有できます。
次の例は、問合せの結果を表とグラフの両方で表示するアプリケーションです。アプリケーションで、Source
のCursorManager
を作成します。このアプリケーションは、同じCursorManager
から、表ビューとグラフ・ビュー用に、2つの別個のCursor
オブジェクトを作成します。これらの2つのビューは、同じ問合せを共有し、同じデータを表示しますが、その表示形式は異なります。図8-4に、Source
、Cursor
オブジェクトおよびビューの関係を示します。