Oracle9i OLAP Services Developer's Guide to the Oracle OLAP API Release 1 (9.0.1) Part Number A88756-01 |
|
Selecting Data, 2 of 5
As mentioned in "What objects represent queries?", even though it helps to think of a Source
object as a tabular or dimensional result set, a Source
actually is not a result set. Instead, a Source
object is a specification for a query that defines a result set. As part of this specification, a Source
object keeps track of the keys for which values have been specified. Looking at keys from this point of view, you can say that a Source
object has two different types of keys:
Source
object has other Source
objects that act as its keys, these Source
objects are always inputs. Thus, the query specification represented by a dimensioned primary Source
or any other Source
that has an input is incomplete. You cannot create a Cursor
for this type of Source
and, consequently, you cannot retrieve the query specified by the Source
.
Source
has only outputs, the primary key to its elements are fully specified. The query that this type of Source
specifies is determinable. You can create a Cursor
for this type of Source
and use the Cursor
to retrieve the data set specified by the Source
.
If you want to create a Cursor
on a Source
object, all of the keys of the Source
must be outputs. Consequently, to display a primary dimensional Source
, you must first specify values for the keys of that Source
. Specifying values for the keys of a Source
is called changing inputs to outputs.
The need to specify values for the keys of a dimensional Source
with inputs is so universal, that the OLAP API has a join
shortcut method to support it. To specify values for the keys of a dimensional Source
, thereby changing an input to an output, use the following join
method where the original Source
is the Source
object that has the input that you want to become an output and the joined Source
is the input you want to change.
join (Source joined)
This is a shortcut for the following join
method.
join (joined, emptySource, Source.COMPARISON_RULE_REMOVE, true);
Note that the comparison Source
is the empty Source
that has no elements. Consequently, even though the COMPARISON_RULE_REMOVE
constant is specified, no elements are removed as a result of the comparison. Also, because the visible
flag is set to true
, the joined Source
becomes an output of the new Source
.
Additionally, since many of the methods of Source
class and its subclasses are actually shortcut and convenience methods that implicitly call the join
method, some of these methods also change inputs to outputs.
The way a dimensional Source
is processed is determined by its structure. When a Source
has both inputs and outputs, its elements (tuples) are identified by the set of its input and output values. In this case, each set of possible input values typically identifies a number of elements (tuples). Within this subset of data, the tuples are arranged by output. When a Source
has inputs, many Source
methods work on this subset of data.
For example, when a Cursor
is opened on a Source
, the OLAP service loops over its outputs in order to produce the data, but it (arbitrarily) qualifies away any of its inputs. Additionally, the OLAP service loops over the outputs of a Source
when it processes any aggregation methods like average
and total
. In this sense, moving a Source
from the list of inputs to the list of outputs is similar to moving a column out of the GROUP BY list in SQL.
For more information on the structure of a Source
with inputs, see "Finding the position of elements"; for more information on fastest-varying and slowest-varying columns, see "What is the effect of input-output order on Source structure?".
The structure of a dimensioned Source
is determined by the order in which you turn the inputs of the Source
into outputs. The fastest-varying column is always the column that contains the elements of the Source
. For a Source
that has outputs, the first output that was created is the fastest-varying key column; the last output that was created is the slowest-varying key column.
When you string two join
methods together in a single statement, the first join
(reading left to right) is processed first. Consequently, when creating a single statement containing several join
methods, make sure that the input that you want to be the fastest-varying of the new Source
is the joined Source
in the first join
in the statement.
You can retrieve the inputs of a Source
using the getInputs
method that the Source
class inherits from the DataDescriptor
class. You can retrieve the outputs of a Source
using the getOutputs
method that the Source
class inherits from the DataDescriptor
class.
Assume that you have a primary Source
named unitCost
that you created from a MdmMeasure
object named mdmUnitCost
. The Source
named unitCost
has inputs of timesDim
and productsDim
, and no outputs.The timesDim
and productsDim
Source
objects do not have any inputs or outputs. The order in which you turn the inputs of unitCost
into outputs determines the structure of a Source
on which you can create a Cursor
.
Assume also that you issue the following code to turn the inputs of the primary Source
named unitCost
into outputs.
Source newSource = unitCost.join(timesDim).join(productsDim);
This code strings two join
methods together. Because unitCost.join(timesDim)
is processed first, the key values for timesDim
are the first key values specified. You can also say that timesDim
is the first output defined for the new Source
. After the first join
is processed, the query specification represented by the resulting unnamed Source
consists of the name of its input (that is, productsDim
) and both the name and the element values of its output (that is, timesDim
). You can think of the new unnamed Source
as having the structure depicted below.
Output2 |
Output1 |
Element |
---|---|---|
|
|
|
Boys |
|
|
... |
|
|
49780 |
|
|
... |
|
|
After the second join
is processed, the query specification represented by newSource
consists of the names and the element values of both of its output (that is, timesDim
and productsDim
). Since timesDim
was the first key for which values were specified, it is the fastest-varying output and the new Source
has the structure depicted below.
Output2 |
Output1 |
Element |
---|---|---|
|
|
|
Boys |
1998 |
4,000 |
Boys |
... |
... |
Boys |
31-DEC-01 |
10 |
... |
... |
... |
49780 |
1998 |
500 |
49780 |
... |
... |
49780 |
31-DEC-01 |
9 |
Assume that you issue the following code to turn the inputs of unitCost into outputs.
Source newSource = unitCost.join(productsDim).join(timesDim);
This code strings two join
methods together. Because unitCost.join(productsDim)
is processed first, productsDim
is the first output defined for the new Source
. Consequently, productsDim
is the fastest-varying output and the new Source
has the structure depicted below.
Output2 |
Output1 |
Element |
---|---|---|
timesDim |
productsDim |
unitCost |
1998 |
Boys |
4,000 |
1998 |
... |
... |
1998 |
49780 |
500 |
... |
... |
... |
31-DEC-01 |
Boys |
10 |
31-DEC-01 |
... |
... |
31-DEC-01 |
48780 |
9 |
|
Copyright © 1996-2001, Oracle Corporation. All Rights Reserved. |
|