- [Store].[USA].[CA] |
- Member<dimension=[Store], hierarchy=[Store], level=[Store].[State],
+
+
+
+ Expression |
+ Type |
+
+
+ 1 + 2 |
+ Integer |
+
+
+ [Store] |
+ Dimension |
+
+
+ [Store].[State] |
+ Level<dimension=[Store], hierarchy=[Store]> |
+
+
+ [Store].[USA].[CA] |
+ Member<dimension=[Store], hierarchy=[Store], level=[Store].[State],
member=[Store].[USA].[CA]> |
-
-
- [Store].[USA].Children(2) |
- Member<dimension=[Store], hierarchy=[Store], level=[Store].[State]> |
-
+
+
+ [Store].[USA].Children(2) |
+ Member<dimension=[Store], hierarchy=[Store], level=[Store].[State]> |
+
@@ -1142,42 +1284,45 @@
evaluated at runtime.
Type is the base class for all types.
Scalar types:
+
- - ScalarType represents the type of an expression which has a
- simple value such as a number or a string.
- -
- BooleanType (extends ScalarType) represents an expression which can have values
- TRUE and FALSE.
- -
- NumericType represents the type of a numeric expression.
- -
- DecimalType (extends
NumericType ) represents a fixed-point numeric expression. It
- is a subclass of NumericType , and has precision and scale. An
- integer expression would have scale 0.
- - StringType
+
- ScalarType represents the type of an expression which has a
+ simple value such as a number or a string.
+ -
+ BooleanType (extends ScalarType) represents an expression which can have values
+ TRUE and FALSE.
+ -
+ NumericType represents the type of a numeric expression.
+ -
+ DecimalType (extends
NumericType ) represents a fixed-point numeric expression. It
+ is a subclass of NumericType , and has precision and scale. An
+ integer expression would have scale 0.
+ - StringType
(extends ScalarType)
represents the type of an expression which has a string value.
- - SymbolType
+
- SymbolType
(extends ScalarType)
represents the type of a symbol, or flag, argument to a built-in function.
For example, the
ASC
- keyword in the expression Order(Gender.MEMBERS, Measures.[Unit Sales],
- ASC) is a symbol. Symbol types are rarely used except if you are
- manipulating a parse tree.
+ keyword in the expression Order(Gender.MEMBERS, Measures.[Unit Sales],
+ ASC) is a symbol. Symbol types are rarely used except if you are
+ manipulating a parse tree.
+
Metadata types:
+
- - CubeType
+
- CubeType
represents the type of an expression whose value is a cube.
- -
- DimensionType represents the type of an expression whose
- value is a dimension.
- -
- HierarchyType represents the type of an expression whose
- value is a hierarchy.
- - LevelType
+
-
+ DimensionType represents the type of an expression whose
+ value is a dimension.
+ -
+ HierarchyType represents the type of an expression whose
+ value is a hierarchy.
+ - LevelType
represents the type of an expression whose value is a level.
- - MemberType
+
- MemberType
represents the type of an expression whose value is a member.
A metadata type may be constrained to a particular part of the schema. For
@@ -1185,54 +1330,60 @@
must evaluate to one of the levels of the [Time] hierarchy, that
is, one of the values [Time].[Year] , [Time].[Quarter] ,
or [Time].[Month] .
+
Composite types:
+
- - SetType represents the type of an expression which is a
- set. It has a component type, for example, the type of the expression
- {[Store].[USA].Children} is Set(Member(level=[Store].[Store
- State]) .
- - TupleType represents the type of an expression which
- consists of an n-tuple of members. It has a set of component types, each of
- which is a member type. For example, the type of the expression
- CrossJoin({[Gender].[F], [Gender].[M]}, [Store].Members) is
- Set(Tuple(Member(level=[Gender].[Gender]), Member(hierarchy=[Store])) .
+ - SetType represents the type of an expression which is a
+ set. It has a component type, for example, the type of the expression
+ {[Store].[USA].Children} is Set(Member(level=[Store].[Store
+ State]) .
+ - TupleType represents the type of an expression which
+ consists of an n-tuple of members. It has a set of component types, each of
+ which is a member type. For example, the type of the expression
+ CrossJoin({[Gender].[F], [Gender].[M]}, [Store].Members) is
+ Set(Tuple(Member(level=[Gender].[Gender]), Member(hierarchy=[Store])) .
+
Package name: org.olap4j.metadata
Metadata are the objects which describe the structure of an OLAP schema:
cubes, dimensions, members, properties and so forth.
+
olap4j exposes metadata in two very different ways:
+
+
-A user's view of metadata may be subject to access control. The precise rules
-for access control depend on the provider, and this specification does not say
-what those rules should be. But this specification requires that the API methods
+ A user's view of metadata may be subject to access control. The precise rules
+for access control depend on the provider, and this specification does not say
+what those rules should be. But this specification requires that the API methods
must behave consistently with the server's access control policy.
For example, in mondrian, users belong to roles, and roles may be granted or
-denied access to cubes, hierarchies, or members within hierarchies. Suppose that
+denied access to cubes, hierarchies, or members within hierarchies. Suppose that
user Fred belongs to the "Sales Manager" role, which does not have access to the
[Nation]
- level of the [Store] hierarchy, and the current connection has
-been opened in the "Sales Manager" role. Then the Member.getParentMember() method will return null if applied to
-[Store].[USA].[CA] , because the 'real' parent member [Store].[USA]
+ level of the [Store] hierarchy, and the current connection has
+been opened in the "Sales Manager" role. Then the Member.getParentMember() method will return null if applied to
+[Store].[USA].[CA] , because the 'real' parent member [Store].[USA]
is invisible to him; also, the Hierarchy.getLevels() and
-OlapDatabaseMetaData.getLevels() methods will omit the Nation level from
+OlapDatabaseMetaData.getLevels() methods will omit the Nation level from
the list of levels they return.
In olap4j, you can set a connection's role at connect time using the
@@ -1246,2186 +1397,2163 @@
The following diagram shows the metadata objects in an olap4j schema.
+In the diagram, each arrow represents a collection of objects in a
+parent object; for example, a database is a collection of catalogs,
+each catalog is a collection of schemas, each schema is a collection of
+cubes, and so forth. Each object has a
+corresponding class in the org.olap4j.metadata
+package.
-In the diagram, each arrow represents a collection of objects in a parent
-object; for example, a database is a collection of catalogs, each catalog is a
-collection of schemas, each schema is a collection of cubes, and so forth. With
-the exception of Database, each object has a corresponding class in the org.olap4j.metadata
-package; Database is represented by a combination of the
-OlapConnection
-class (specifically the
-
-getCatalogs() method) and by
-
-OlapDatabaseMetaData (which describes the general capabilities of an OLAP
-server).
Most metadata objects extend the
MetadataElement interface, which gives them name and
uniqueName attributes, and localized caption and
description .
-When the API returns a list of metadata elements whose names must be unique
+ When the API returns a list of metadata elements whose names must be unique
(for example, the list of dimensions in a cube), the return type is the
-NamedList
+NamedList
extension to
-
+
java.util.List.
-Providers are at liberty to implement metadata objects using a cache, and
-therefore over the course of time, different java objects may represent the same
+ Providers are at liberty to implement metadata objects using a cache, and
+therefore over the course of time, different java objects may represent the same
underlying metadata object. Always use
-
-equals(), not the == operator, when comparing metadata objects,
+
+equals(), not the == operator, when comparing metadata objects,
and do not use
-
+
IdentityHashMap.
+
+
A
-MetadataElement is an element which describes the structure of an OLAP
+MetadataElement is an element which describes the structure of an OLAP
schema.
-Subtypes are Cube, Dimension, Hierarchy, Level, Member, Property.
+
+ Subtypes are Cube, Dimension, Hierarchy, Level, Member, Property.
MetadataElement provides
name and unique-name properties (not localized), and localized caption and
-description (see
- Internationalization).
+description (see Internationalization).
+
+
+ String getName() // name of this metadata element
+ String getUniqueName() // unique name of this metadata element
+ String getCaption() // localized caption of this metadata element
+ String getDescription() // localized description of this metadata element
+
+
+
+
+A Database
+is the highest level element in the hierarchy of metadata objects. A
+database contains one or more catalogs.
+
+Some OLAP servers may only have one database. Mondrian is one such
+OLAP server.
+
+To obtain the collection of databases in the current server, call the
+OlapConnection.getDatabases() method.
+
+Methods:
+
- String getName()
- String getUniqueName()
- String getCaption(Locale locale)
- String getDescription(Locale locale)
+ OlapConnection() // returns the current connection
+ String getName() // returns the name of this database
+ NamedList<Catalog> getCatalogs() // returns a list of catalogs in this database
+ String getURL() // returns the redirection URL, if this database is a proxy to another server
+ String getDataSourceInfo() // returns provider-specific information
+ String getProviderName() // returns the name of the underlying OLAP provider
+ List<ProviderType> getProviderTypes() // returns the types of data that are supported by this provider
-
-A Catalog
-is the highest level element in the hierarchy of metadata objects. A catalog
-contains one or more schemas.
+
+
+
+A Catalog
+is the highest level element in the hierarchy of metadata objects. A
+catalog contains one or more schemas.
Some OLAP servers may only have one catalog. Mondrian is one such OLAP
-server; its sole catalog is always called "LOCALDB".
+server; its sole catalog is always called "LOCALDB".
-To obtain the collection of catalogs in the current server, call the
-OlapConnection.getCatalogs() method.
+To obtain the collection of catalogs in the current server, call the
+OlapConnection.getCatalogs() method.
Methods:
- String getName()
- NamedList<Schema> getSchemas()
- OlapDatabaseMetaData getMetaData()
+ String getName() // returns the name of this catalog
+ NamedList<Schema> getSchemas() // returns a list of schemas in this catalog
+ OlapDatabaseMetaData getMetaData() // returns the metadata describing the OLAP server that this catalog belongs to
+ Database getDatabase() // returns this catalog's parent database
-
+
A Schema is
-a collection of database objects that contain structural information, or
+a collection of database objects that contain structural information, or
metadata, about a database.
It belongs to a catalog and contains a number of cubes and shared dimensions.
+
-
+
A Cube is the
central metadata object for representing multidimensional data.
It belongs to a schema, and is described by a list of dimensions and a list
-of measures. It may also have a collection of named sets, each defined by a
+of measures. It may also have a collection of named sets, each defined by a
formula.
- NamedList<Dimension> getDimensions()
- NamedList<Hierarchy> getHierarchies()
- List<Measure> getMeasures()
- NamedList<NamedSet> getSets()
- Schema getSchema()
- String getName()
+ NamedList<Dimension> getDimensions()
+ NamedList<Hierarchy> getHierarchies()
+ List<Measure> getMeasures()
+ NamedList<NamedSet> getSets()
+ Schema getSchema()
+ String getName()
List<Locale> getSupportedLocales() (see
Internationalization)
- Member lookupMember(String... nameParts)
- List<Member> lookupMembers(Set<TreeOp> treeOps, String... nameParts)
+ Member lookupMember(List<IdentifierSegment> nameParts)
+ List<Member> lookupMembers(Set<TreeOp> treeOps, List<IdentifierSegment> nameParts)
-
+
A Dimension
(extends
-MetadataElement) is an organized hierarchy of categories, known as levels,
+MetadataElement) is an organized hierarchy of categories, known as levels,
that describes data in a cube.
-Dimensions typically describe a similar set of members upon which the user
+ Dimensions typically describe a similar set of members upon which the user
wants to base an analysis.
-A dimension must have at least one hierarchy, and may have more than once,
+ A dimension must have at least one hierarchy, and may have more than once,
but most have exactly one hierarchy.
- String getName()
- NamedList<Hierarchy> getHierarchies()
- Dimension.Type getDimensionType()
+ String getName()
+ NamedList<Hierarchy> getHierarchies()
+ Dimension.Type getDimensionType()
-
-A Hierarchy
+
+
+
+A Hierarchy
(extends
-MetadataElement) is an organization of the set of members in a dimension and
+MetadataElement) is an organization of the set of members in a dimension and
their positions relative to one another.
-A hierarchy is a collection of levels, each of which is a category of similar
+ A hierarchy is a collection of levels, each of which is a category of similar
members.
- Dimension getDimension()
- String getName()
- NamedList<Level> getLevels()
- boolean hasAll()
+ Dimension getDimension()
+ String getName()
+ NamedList<Level> getLevels()
+ boolean hasAll()
Member getDefaultMember()
- NamedList<Member> getRootMembers()
+ NamedList<Member> getRootMembers()
-
-A Level
+
+
+
+A Level
(extends
-MetadataElement) is a group of members in a hierarchy, all with the same
+MetadataElement) is a group of members in a hierarchy, all with the same
attributes and at the same depth in the hierarchy.
- int getDepth()
- Hierarchy getHierarchy()
- Level.Type getLevelType()
- NamedList<Property> getProperties()
- List<Member> getMembers()
- int getCardinality()
+ int getDepth()
+ Hierarchy getHierarchy()
+ Level.Type getLevelType()
+ NamedList<Property> getProperties()
+ List<Member> getMembers()
+ int getCardinality()
-
-A Member
+
+
+
+A Member
(extends
MetadataElement) is a data value in an OLAP dimension.
+
- String getName()
- NamedList<Member> getChildMembers()
- Member getParentMember()
- Level getLevel()
- Hierarchy getHierarchy()
- boolean isAll()
- boolean isChildOrEqualTo(Member member)
- boolean isCalculated()
- boolean isCalculatedInQuery()
- int solveOrder()
- List<Member> getAncestorMembers()
- Object getPropertyValue(Property property)
- String getPropertyFormattedValue(Property property)
- void setProperty(Property property, Object value)
- NamedList<Property> getProperties()
- int getOrdinal()
- boolean isHidden()
- Member getDataMember()
- int getChildMemberCount()
+ String getName()
+ NamedList<Member> getChildMembers()
+ Member getParentMember()
+ Level getLevel()
+ Hierarchy getHierarchy()
+ boolean isAll()
+ boolean isChildOrEqualTo(Member member)
+ boolean isCalculated()
+ boolean isCalculatedInQuery()
+ int solveOrder()
+ List<Member> getAncestorMembers()
+ Object getPropertyValue(Property property)
+ String getPropertyFormattedValue(Property property)
+ void setProperty(Property property, Object value)
+ NamedList<Property> getProperties()
+ int getOrdinal()
+ boolean isHidden()
+ Member getDataMember()
+ int getChildMemberCount()
-
+
A Measure (extends
-Member) is a
-data value of primary interest to the user browsing the cube. It provides the
+Member) is a
+data value of primary interest to the user browsing the cube. It provides the
value of each cell, and is usually numeric.
-Every measure is a member of a special dimension called "Measures".
+Every measure is a member of a special dimension called "Measures".
- boolean isVisible()
- Aggregator getAggregator()
- Datatype getDataType()
+ boolean isVisible()
+ Aggregator getAggregator()
+ Datatype getDataType()
-
-Property
+
+
+Property
(extends
MetadataElement) is the definition of a property of a member or a cell.
Property contains two enumerated types
StandardMemberProperty and
-StandardCellProperty whose values are the built-in properties of members and
-cells. Because these types implement the Property interface, you can use them as
+StandardCellProperty whose values are the built-in properties of members and
+cells. Because these types implement the Property interface, you can use them as
properties; for example:
- Member member;
- Object o =
- member.getPropertyValue(
+ Member member;
+ Object o =
+ member.getPropertyValue(
Property.StandardMemberProperty.CATALOG_NAME);
+
Members:
+
- Datatype getDatatype()
- Set<TypeFlag> getType()
- ContentType getContentType()
- enum TypeFlag { MEMBER, CELL, SYSTEM, BLOB }
- enum StandardMemberProperty implements Property { CATALOG_NAME, SCHEMA_NAME, CUBE_NAME, ...
- }
- enum StandardCellProperty implements Property { BACK_COLOR, CELL_EVALUATION_LIST, ... }
- enum ContentType { REGULAR, ID, RELATION_TO_PARENT, ... }
+ Datatype getDatatype()
+ Set<TypeFlag> getType()
+ ContentType getContentType()
+ enum TypeFlag { MEMBER, CELL, SYSTEM, BLOB }
+ enum StandardMemberProperty implements Property { CATALOG_NAME, SCHEMA_NAME, CUBE_NAME, ...
+ }
+ enum StandardCellProperty implements Property { BACK_COLOR, CELL_EVALUATION_LIST, ... }
+ enum ContentType { REGULAR, ID, RELATION_TO_PARENT, ... }
-
-A NamedSet
+
+
+
+A NamedSet
(extends
-MetadataElement) describes a set whose value is determined by an MDX
+MetadataElement) describes a set whose value is determined by an MDX
expression. It belongs to a cube.
- Cube getCube()
- Expression getExpression()
+ Cube getCube()
+ Expression getExpression()
-
+
The
-Datatype enum describes the type of property and measure values. Because
-olap4j drivers need to interoperate with OLE DB for OLAP and XMLA systems,
-Datatype values have the same ordinals as in the OLE DB specification, and we
-show here the
-name and description of the corresponding type in the OLE DB specification. The table shows
+Datatype enum describes the type of property and measure values. Because
+olap4j drivers need to interoperate with OLE DB for OLAP and XMLA systems,
+Datatype values have the same ordinals as in the OLE DB specification, and we
+show here the
+name and description of the corresponding type in the OLE DB specification. The table shows
the analogous Java type, if there is one.
-
-
-
- Datatype |
- Java type |
- OLE DB type |
- Description |
-
-
- INTEGER |
- int |
- DBTYPE_I4 |
- A four-byte, signed integer: INTEGER |
-
-
- DOUBLE |
- double |
- DBTYPE_R8 |
- A double-precision floating-point value: Double |
-
-
- CURRENCY |
- |
- DBTYPE_CY |
- A currency value: LARGE_INTEGER, Currency is a fixed-point number with four digits to the right of the decimal point. It is stored in an eight-byte signed integer, scaled by 10,000. |
-
-
- BOOLEAN |
- boolean |
- DBTYPE_BOOL |
- A Boolean value stored in the same way as in Automation: VARIANT_BOOL; 0 means false and ~0 (bitwise, the value is not 0; that is, all bits are set to 1) means true. |
-
-
- VARIANT |
- Object |
- DBTYPE_VARIANT |
- An Automation VARIANT |
-
-
- UNSIGNED_SHORT |
- - |
- DBTYPE_UI2 |
- A two-byte, unsigned integer |
-
-
- UNSIGNED_INTEGER |
- - |
- DBTYPE_UI4 |
- A four-byte, unsigned integer |
-
-
- LARGE_INTEGER |
- long |
- DBTYPE_I8 |
- An eight-byte, signed integer: LARGE_INTEGER |
-
-
- STRING |
- String |
- DBTYPE_WSTR |
- A null-terminated Unicode character string: wchar_t[length]; If DBTYPE_WSTR is used by itself, the number of bytes allocated for the string, including the null-termination character, is specified by cbMaxLen in the DBBINDING structure. If DBTYPE_WSTR is combined with DBTYPE_BYREF, the number of bytes allocated for the string, including the null-termination character, is at least the length of the string plus two. In either case, the actual length of the string is determined from the bound length value. The maximum length of the string is the number of allocated bytes divided by sizeof(wchar_t) and truncated to the nearest integer. |
-
+
+
+
+ Datatype |
+ Java type |
+ OLE DB type |
+ Description |
+
+
+ INTEGER |
+ int |
+ DBTYPE_I4 |
+ A four-byte, signed integer: INTEGER |
+
+
+ DOUBLE |
+ double |
+ DBTYPE_R8 |
+ A double-precision floating-point value: Double |
+
+
+ CURRENCY |
+ |
+ DBTYPE_CY |
+ A currency value: LARGE_INTEGER, Currency is a fixed-point number with four digits to the right of the decimal point. It is stored in an eight-byte signed integer, scaled by 10,000. |
+
+
+ BOOLEAN |
+ boolean |
+ DBTYPE_BOOL |
+ A Boolean value stored in the same way as in Automation: VARIANT_BOOL; 0 means false and ~0 (bitwise, the value is not 0; that is, all bits are set to 1) means true. |
+
+
+ VARIANT |
+ Object |
+ DBTYPE_VARIANT |
+ An Automation VARIANT |
+
+
+ UNSIGNED_SHORT |
+ - |
+ DBTYPE_UI2 |
+ A two-byte, unsigned integer |
+
+
+ UNSIGNED_INTEGER |
+ - |
+ DBTYPE_UI4 |
+ A four-byte, unsigned integer |
+
+
+ LARGE_INTEGER |
+ long |
+ DBTYPE_I8 |
+ An eight-byte, signed integer: LARGE_INTEGER |
+
+
+ STRING |
+ String |
+ DBTYPE_WSTR |
+ A null-terminated Unicode character string: wchar_t[length]; If DBTYPE_WSTR is used by itself, the number of bytes allocated for the string, including the null-termination character, is specified by cbMaxLen in the DBBINDING structure. If DBTYPE_WSTR is combined with DBTYPE_BYREF, the number of bytes allocated for the string, including the null-termination character, is at least the length of the string plus two. In either case, the actual length of the string is determined from the bound length value. The maximum length of the string is the number of allocated bytes divided by sizeof(wchar_t) and truncated to the nearest integer. |
+
-
+
+
OlapDatabaseMetaData (extends
-
-java.sql.DatabaseMetaData) contains methods which return schema result sets.
-Schema result sets are specified as in [XML for Analysis
-specification]. Here is a table of the XML/A methods and the corresponding
-olap4j method and element type.
-
-
-
-The rows returned in the result set returned from the metadata
-methods are structured according to the result set column layouts detailed in this
-section.
-
-All columns noted in the following result sets are required, and
-they must be returned in the order shown. However, additional columns (which
-should be ignored by clients not expecting them) can be added at the end, and
-some columns can contain null data for info that does not apply.
-
-The following sections describe the columns in each rowset. Each
-section includes a table that provides the following information for each
-column.
-
-
-
- Column heading |
- Contents |
-
-
- Column name |
- The name of the column in the output rowset. |
-
-
- Type |
- A description of the data type for the column, and whether the
- column may be NULL. |
-
-
- Description |
- A brief description of the purpose of the column. |
-
-
-
-Specified by the DISCOVER_DATASOURCES XML for Analysis method.
-The returned result set contains the following columns.
-
-
-
- Column name |
- Type |
- Description |
-
-
- DATA_SOURCE_NAME |
- String |
- The name of the data source, such as
- FoodMart 2000. Never null. |
-
-
-
- DATA_SOURCE_DESCRIPTION |
-
- String |
-
- A description of the data source, as entered by the
- publisher. |
-
-
-
-
- URL |
-
- String |
-
- The unique path that shows where to invoke the XML for
- Analysis methods for that data source. |
-
-
-
-
- DATA_SOURCE_INFO |
- String |
-
- A string containing any additional information required
- to connect to the data source. This can include the Initial Catalog
- property or other information for the provider.
- Example: "Provider=MSOLAP;Data Source=Local;"
- |
-
-
- PROVIDER_NAME |
- String |
-
- The name of the provider behind the data source.
- Example: "MSDASQL"
- |
-
-
-
- PROVIDER_TYPE |
-
- String |
-
-
- Comma-separated list of the types of data supported by the
- provider. May include one or more of the following types. Example
- follows this table.
-
- - TDP: tabular data provider.
- - MDP: multidimensional data provider.
- - DMP: data mining provider. A DMP provider
- implements the OLE DB for Data Mining specification.
-
- |
-
-
-
- AUTHENTICATION_MODE |
-
- String |
-
-
- Specification of what type of
- security mode the data source uses. Values can be one of the following,
- never null:
-
- - Unauthenticated: no user ID or password needs to be sent.
- - Authenticated: User ID and
- Password must be included in the information required for the
- connection.
- - Integrated: the data source uses the
- underlying security to determine authorization, such as Integrated
- Security provided by Microsoft Internet Information Services (IIS).
-
- |
-
-
-
-
-
-
-Returns
-information about the standard and provider-specific properties supported by an
-olap4j provider. Properties that are not supported by a provider are
-not listed in the return result set.
-Specified by the DISCOVER_PROPERTIES XML for Analysis method,
-except that we rename the VALUE property to PROPERTY_VALUE because "VALUE" is a
-SQL:2003 reserved word.
-The returned result set contains the following columns.
-
-
-
- Column name |
- Type |
- Description |
-
-
- PROPERTY_NAME |
- String |
- The name of the property. Never null. |
-
-
- PROPERTY_DESCRIPTION |
-
- String |
-
- A localizable text description of the property. |
-
-
-
-
- PROPERTY_TYPE |
-
- String |
-
- The XML data type of the property. |
-
-
-
-
- PROPERTY_ACCESS_TYPE |
-
- String |
-
- Access for the property. The value can be Read, Write,
- or ReadWrite. Never null. |
-
-
-
-
- IS_REQUIRED |
-
- boolean |
+java.sql.DatabaseMetaData)
+contains methods which return schema result sets.
- True if a property is required,
- false if it is not required. |
-
-
-
-
- PROPERTY_VALUE |
-
- String |
-
- The current value of the property. This property is named VALUE in
- XMLA. |
-
-
-
-
-
-Retrieves a list of information on supported literals, including data types
-and values.
-Specified by the DISCOVER_LITERALS XML for Analysis method.
-The returned result set contains the following columns.
-
-
-
- Column name |
- Type |
- Description |
-
-
- LITERAL_NAME |
- String |
- The name of the literal described in the row. Never null.
- Example: DBLITERAL_LIKE_PERCENT. |
-
-
- LITERAL_VALUE |
- String |
-
- Contains the actual literal value.
- Example, if LITERAL_NAME is
- DBLITERAL_LIKE_PERCENT and the percent character (%) is used to match
- zero or more characters in a LIKE clause, this column’s value would be
- "%".
- |
-
-
-
-
- LITERAL_INVALID_CHARS |
-
- String |
-
- The characters, in the literal, that are not valid.
- For example, if table names can contain anything other
- than a numeric character, this string would be "0123456789". |
-
-
-
-
- LITERAL_INVALID_
- STARTING_CHARS |
-
- String |
-
- The characters that are not valid as the first character
- of the literal. If the literal can start with any valid character, this
- is null. |
-
-
-
-
- LITERAL_MAX_LENGTH |
-
- int |
-
- The maximum number of characters in the literal. If
- there is no maximum or the maximum is unknown, the value is –1. |
-
-
-
-
-
-
- Describes the structure of cubes within a database.
-Specified by the MDSCHEMA_CUBES XML for Analysis method.
-The returned result set contains the following columns.
-
-
-
- Column name |
- Type |
- Description |
-
-
- CATALOG_NAME |
- String |
- The name of the database. |
-
-
- SCHEMA_NAME |
- String |
- Not supported. |
-
-
- CUBE_NAME |
- String |
- The name of the cube or dimension. Dimension
- names are prefaced by a dollar sign ($) symbol. |
-
-
- CUBE_TYPE |
- String |
- The type of the cube. Valid values are:
- |
-
-
- CUBE_GUID |
- String |
- Not supported. |
-
-
- CREATED_ON |
- Timestamp |
- Not supported. |
-
-
- LAST_SCHEMA_UPDATE |
- Timestamp |
- The time that the cube was last processed. |
-
-
- SCHEMA_UPDATED_BY |
- String |
- Not supported. |
-
-
- LAST_DATA_UPDATE |
- Timestamp |
- The time that the cube was last processed. |
-
-
- DATA_UPDATED_BY |
- String |
- Not supported. |
-
-
- DESCRIPTION |
- String |
- A user-friendly description of the cube. |
-
-
- IS_DRILLTHROUGH_ENABLED |
- boolean |
- A Boolean that always returns true. |
-
-
- IS_LINKABLE |
- boolean |
- A Boolean that indicates whether a cube can be
- used in a linked cube. |
-
-
- IS_WRITE_ENABLED |
- boolean |
- A Boolean that indicates whether a cube is
- write-enabled. |
-
-
- IS_SQL_ENABLED |
- boolean |
- A Boolean that indicates whether SQL can be used
- on the cube. |
-
-
- CUBE_CAPTION |
- String |
- The caption of the cube. |
-
-
- BASE_CUBE_NAME |
- String |
- The name of the source cube if this cube is a
- perspective cube. |
-
-
- ANNOTATIONS |
- String |
- (Optional) A set of notes, in XML format. |
-
-
-
-The rowset is sorted on CATALOG_NAME, SCHEMA_NAME, CUBE_NAME.
-
-
-
-Retrieves a result set describing the shared and private dimensions within a database.
-Specified by the MDSCHEMA_DIMENSIONS XML for Analysis method.
-The returned result set contains the following columns.
-
-
-
- Column name |
- Type |
- Description |
-
-
- CATALOG_NAME |
- String |
- The name of the database. |
-
-
- SCHEMA_NAME |
- String |
- Not supported. |
-
-
- CUBE_NAME |
- String |
- The name of the cube. |
-
-
- DIMENSION_NAME |
- String |
- The name of the dimension. If a dimension is
- part of more than one cube or measure group, then
- there is one row for each unique combination of
- dimension, measure group, and cube. |
-
-
- DIMENSION_UNIQUE_NAME |
- String |
- The unique name of the dimension. |
-
-
- DIMENSION_GUID |
- String |
- Not supported. |
-
-
- DIMENSION_CAPTION |
- String |
- The caption of the dimension. This should be
- used when displaying the name of the dimension to
- the user, such as in the user interface or reports. |
-
-
- DIMENSION_ORDINAL |
- int |
- The position of the dimension within the cube. |
-
-
- DIMENSION_TYPE |
- int |
- The type of the dimension. Valid values include the values of the
- xmlaOrdinal attribute of the
- org.olap4j.Dimension.Type
- enum. |
-
-
- DIMENSION_CARDINALITY |
- int |
- The number of members in the key attribute. |
-
-
- DEFAULT_HIERARCHY |
- String |
- A hierarchy from the dimension. Preserved for
- backwards compatibility. |
-
-
- DESCRIPTION |
- String |
- A user-friendly description of the dimension. |
-
-
- IS_VIRTUAL |
- boolean |
- Always false . |
-
-
- IS_READWRITE |
- boolean |
- A Boolean that indicates whether the dimension
- is write-enabled.
-
- true if the dimension is
- write-enabled.
|
-
-
- DIMENSION_UNIQUE_SETTINGS |
- int |
- A bitmap that specifies which columns contain
- unique values if the dimension contains only members
- with unique names. The following bit value constants
- are defined for this bitmap:
-
- - MDDIMENSIONS_MEMBER_KEY_UNIQUE (1)
-
- |
-
-
- DIMENSION_MASTER_
- UNIQUE_NAME |
- String |
- Always null . |
-
-
- DIMENSION_IS_VISIBLE |
- boolean |
- Always true . |
-
-
-
-The result set is sorted on CATALOG_NAME,
- SCHEMA_NAME, CUBE_NAME, DIMENSION_NAME.
-
-
+Schema result sets are specified as in [XML for Analysis
+specification]. Here is a table of the XML/A methods and the
+corresponding olap4j method and element type.
-Retrieves a result set describing the functions available to client
- applications connected to the database.
-Specified by the MDSCHEMA_FUNCTIONS XML for Analysis method.
-The returned result set contains the following columns.
+
-
-
- Column name |
- Type |
- Description |
+
+
+ XML for Analysis schema rowset |
+ Schema result set method |
+ Metadata element |
- FUNCTION_NAME |
- String |
- The name of the function. |
+ DBSCHEMA_CATALOGS |
+ DatabaseMetaData.getCatalogs |
+ Catalog |
- DESCRIPTION |
- String |
- A description of the function. |
+ not supported |
+ DatabaseMetaData.getSchemas |
+ Schema |
- PARAMETER_LIST |
- String |
- A comma delimited list of parameters formatted
- as in Microsoft Visual Basic. For example, a
- parameter might be Name as String. |
+ DBSCHEMA_COLUMNS |
+ not supported |
+ not supported |
- RETURN_TYPE |
- int |
- The VARTYPE of the return data type of
- the function. |
+ DBSCHEMA_PROVIDER_TYPES |
+ not supported |
+ not supported |
- ORIGIN |
- int |
- The origin of the function:
- - 1 for MDX functions.
- - 2 for user-defined functions.
-
- |
+ DBSCHEMA_TABLES |
+ not supported |
+ not supported |
- INTERFACE_NAME |
- String |
- The name of the interface for user-defined
- functions The group name for Multidimensional
- Expressions (MDX) functions. |
+ DBSCHEMA_TABLES_INFO |
+ not supported |
+ not supported |
- LIBRARY_NAME |
- String |
- The name of the type library for user-defined
- functions. null for MDX functions. |
+ DISCOVER_DATASOURCES |
+ OlapDatabaseMetaData.getDatabases |
+ Database |
- DLL_NAME |
- String |
- (Optional) The name of the assembly that
- implements the user-defined function. Returns null for MDX functions. |
+ DISCOVER_ENUMERATORS |
+ not supported |
+ not supported |
- HELP_FILE |
- String |
- (Optional) The name of the file that contains
- the help documentation for the user-defined
- function. Returns null for MDX
- functions. |
+ DISCOVER_KEYWORDS |
+ OlapDatabaseMetaData.getMdxKeywords |
+ not supported |
- HELP_CONTEXT |
- int |
- (Optional) Returns the Help context ID for this
- function. |
+ DISCOVER_LITERALS |
+ OlapDatabaseMetaData.getLiterals |
+ not supported |
- OBJECT |
- String |
- (Optional) The generic name of the object class
- to which a property applies. For example, the rowset
- corresponding to the <level_name>.Members function
- returns "Level". Returns null for
- user-defined functions, or non-property MDX
- functions. |
+ DISCOVER_PROPERTIES |
+ OlapDatabaseMetaData.getDatabaseProperties |
+ not supported |
- CAPTION |
- String |
- The display caption for the function. |
+ DISCOVER_SCHEMA_ROWSETS |
+ not supported |
+ not supported |
-
-
-The rowset is sorted on ORIGIN, INTERFACE_NAME,
- FUNCTION_NAME.
-
-
-Retrieves a result set describing each hierarchy within a particular
-dimension.
-Specified by the MDSCHEMA_HIERARCHIES XML for Analysis method.
-The returned result set contains the following columns.
-
-
-
- Column name |
- Type |
- Description |
-
-
- CATALOG_NAME |
- String |
- The name of the catalog to which this hierarchy
- belongs. null if the provider does not
- support catalogs. |
-
-
- SCHEMA_NAME |
- String |
- Not supported |
-
-
- CUBE_NAME |
- String |
- (Required) The name of the cube to which this
- hierarchy belongs. |
-
-
- DIMENSION_UNIQUE_NAME |
- String |
- The unique name of the dimension to which this
- hierarchy belongs. For providers that generate
- unique names by qualification, each component of
- this name is delimited. |
-
-
- HIERARCHY_NAME |
- String |
- The name of the hierarchy. Blank if there is
- only a single hierarchy in the dimension. This will
- always have a value in Microsoft SQL Server 2005
- Analysis Services (SSAS). |
-
-
- HIERARCHY_UNIQUE_NAME |
- String |
- The unique name of the hierarchy. |
-
-
- HIERARCHY_GUID |
- String |
- Not supported |
-
-
- HIERARCHY_CAPTION |
- String |
- A label or a caption associated with the
- hierarchy. Used primarily for display purposes. If a
- caption does not exist, HIERARCHY_NAME is
- returned. If the dimension either does not contain a
- hierarchy or has just one hierarchy, this column
- will contain the name of the dimension. |
-
-
- DIMENSION_TYPE |
- int |
- The type of the dimension. Valid values include the values of the
- xmlaOrdinal attribute of . |
-
-
- HIERARCHY_CARDINALITY |
- int |
- The number of members in the hierarchy. |
-
-
- DEFAULT_MEMBER |
- String |
- The default member for this hierarchy. This is a
- unique name. Every hierarchy must have a default
- member. |
-
-
- ALL_MEMBER |
- String |
- The member at the highest level of the rollup. |
-
-
- DESCRIPTION |
- String |
- A human-readable description of the hierarchy.
- null if no description exists. |
-
-
- STRUCTURE |
- int |
- The structure of the hierarchy. Valid values
- include the following values: |
+
+
+The rows returned in the result set returned from the metadata
+methods are structured according to the result set column layouts
+detailed in this
+section.
+
+All columns noted in the following result sets are required, and
+they must be returned in the order shown. However, additional columns
+(which
+should be ignored by clients not expecting them) can be added at the
+end, and
+some columns can contain null data for info that does not apply.
+
+The following sections describe the columns in each rowset. Each
+section includes a table that provides the following information for
+each
+column.
+
+
+
+
+
+ Column heading |
+ Contents |
+
+
+ Column name |
+ The name of the column in the output rowset. |
+
+
+ Type |
+ A description of the data type for the column, and whether
+the column may be NULL. |
+
+
+ Description |
+ A brief description of the purpose of the column. |
+
+
+
+
+
+
+Specified by the DISCOVER_DATASOURCES XML for Analysis
+method.
+
+Note that we use the name 'database' rather than 'data source'
+because 'data source' has a well-established and entirely different
+meaning (see interface
+javax.sql.DataSource) in the JDBC specification.
+
+The returned result set contains the following columns.
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ DATA_SOURCE_NAME |
+ String |
+ The name of the data source, such as FoodMart 2000.
+Never null. |
+
+
+ DATA_SOURCE_DESCRIPTION |
+ String |
+ A description of the data source, as entered by the publisher. |
+
+
+ URL |
+ String |
+ The unique path that shows where to invoke the XML for
+Analysis methods for that data source. |
+
+
+ DATA_SOURCE_INFO |
+ String |
+
+ A string containing any additional information required to
+connect to the data source. This can include the Initial Catalog
+property or other information for the provider.
+ Example: "Provider=MSOLAP;Data Source=Local;"
+ |
+
+
+ PROVIDER_NAME |
+ String |
+
+ The name of the provider behind the data source.
+ Example: "MSDASQL"
+ |
+
+
+ PROVIDER_TYPE |
+ String |
+
+ Comma-separated list of the types of data supported by the
+provider. May include one or more of the following types. Example
+follows this table.
+
+ - TDP: tabular data provider.
+ - MDP: multidimensional data provider.
+ - DMP: data mining provider. A DMP provider implements
+the OLE DB for Data Mining specification.
+
+ |
+
+
+ AUTHENTICATION_MODE |
+ String |
+ Specification of what type of security mode the data source
+uses. Values can be one of the following, never null:
+
+ - Unauthenticated: no user ID or password needs to be
+sent.
+ - Authenticated: User ID and Password must be included
+in the information required for the connection.
+ - Integrated: the data source uses the underlying
+security to determine authorization, such as Integrated Security
+provided by Microsoft Internet Information Services (IIS).
+
+ |
+
+
+
+
+
+
+Returns
+information about the standard and provider-specific properties
+supported by an
+olap4j provider. Properties that are not supported by a provider are
+not listed in the return result set.
+
+Specified by the DISCOVER_PROPERTIES XML for Analysis
+method, except that we rename the VALUE property to PROPERTY_VALUE
+because "VALUE" is a SQL:2003 reserved word.
+
+The returned result set contains the following columns.
+
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ PROPERTY_NAME |
+ String |
+ The name of the property. Never null. |
+
+
+ PROPERTY_DESCRIPTION |
+ String |
+ A localizable text description of the property. |
+
+
+ PROPERTY_TYPE |
+ String |
+ The XML data type of the property. |
+
+
+ PROPERTY_ACCESS_TYPE |
+ String |
+ Access for the property. The value can be Read, Write, or
+ReadWrite. Never null. |
+
+
+ IS_REQUIRED |
+ boolean |
+ True if a property is required, false if it is not required. |
+
+
+ PROPERTY_VALUE |
+ String |
+ The current value of the property.
+ This property is named VALUE in XMLA.
+ |
+
+
+
+
+
+
+Retrieves a list of information on supported literals, including
+data types
+and values.
+
+Specified by the DISCOVER_LITERALS XML for Analysis
+method.
+
+The returned result set contains the following columns.
+
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ LITERAL_NAME |
+ String |
+
+ The name of the literal described in the row. Never null.
+ Example: DBLITERAL_LIKE_PERCENT.
+ |
+
+
+ LITERAL_VALUE |
+ String |
+
+ Contains the actual literal value.
+ Example, if LITERAL_NAME is
+DBLITERAL_LIKE_PERCENT and the percent character (%) is used to match
+zero or more characters in a LIKE clause, this column's value would be
+"%".
+ |
+
+
+ LITERAL_INVALID_CHARS |
+ String |
+
+ The characters, in the literal, that are not valid.
+ For example, if table names can contain anything other than a
+numeric character, this string would be "0123456789".
+ |
+
+
+ LITERAL_INVALID_
+STARTING_CHARS |
+ String |
+ The characters that are not valid as the first character of
+the literal. If the literal can start with any valid character, this is
+null. |
+
+
+ LITERAL_MAX_LENGTH |
+ int |
+ The maximum number of characters in the literal. If there is
+no maximum or the maximum is unknown, the value is -1. |
+
+
+
+
+
+
+Describes the structure of cubes within a database.
+
+Specified by the MDSCHEMA_CUBES XML for Analysis
+method.
+
+The returned result set contains the following columns.
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ CATALOG_NAME |
+ String |
+ The name of the database. |
+
+
+ SCHEMA_NAME |
+ String |
+ Not supported. |
+
+
+ CUBE_NAME |
+ String |
+ The name of the cube or dimension. Dimension names are
+prefaced by a dollar sign ($) symbol. |
+
+
+ CUBE_TYPE |
+ String |
+ The type of the cube. Valid values are:
+
+ |
+
+
+ CUBE_GUID |
+ String |
+ Not supported. |
+
+
+ CREATED_ON |
+ Timestamp |
+ Not supported. |
+
+
+ LAST_SCHEMA_UPDATE |
+ Timestamp |
+ The time that the cube was last processed. |
+
+
+ SCHEMA_UPDATED_BY |
+ String |
+ Not supported. |
+
+
+ LAST_DATA_UPDATE |
+ Timestamp |
+ The time that the cube was last processed. |
+
+
+ DATA_UPDATED_BY |
+ String |
+ Not supported. |
+
+
+ DESCRIPTION |
+ String |
+ A user-friendly description of the cube. |
+
+
+ IS_DRILLTHROUGH_ENABLED |
+ boolean |
+ A Boolean that always returns true. |
+
+
+ IS_LINKABLE |
+ boolean |
+ A Boolean that indicates whether a cube can be used in a
+linked cube. |
+
+
+ IS_WRITE_ENABLED |
+ boolean |
+ A Boolean that indicates whether a cube is write-enabled. |
+
+
+ IS_SQL_ENABLED |
+ boolean |
+ A Boolean that indicates whether SQL can be used on the cube. |
+
+
+ CUBE_CAPTION |
+ String |
+ The caption of the cube. |
+
+
+ BASE_CUBE_NAME |
+ String |
+ The name of the source cube if this cube is a perspective
+cube. |
+
+
+ ANNOTATIONS |
+ String |
+ (Optional) A set of notes, in XML format. |
+
+
+
+
+The rowset is sorted on CATALOG_NAME, SCHEMA_NAME, CUBE_NAME.
+
+
+
+Retrieves a result set describing the shared and private dimensions
+within a database.
+
+Specified by the MDSCHEMA_DIMENSIONS XML for Analysis
+method.
+
+The returned result set contains the following columns.
+
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ CATALOG_NAME |
+ String |
+ The name of the database. |
+
+
+ SCHEMA_NAME |
+ String |
+ Not supported. |
+
+
+ CUBE_NAME |
+ String |
+ The name of the cube. |
+
+
+ DIMENSION_NAME |
+ String |
+ The name of the dimension. If a dimension is part of more
+than one cube or measure group, then there is one row for each unique
+combination of dimension, measure group, and cube. |
+
+
+ DIMENSION_UNIQUE_NAME |
+ String |
+ The unique name of the dimension. |
+
+
+ DIMENSION_GUID |
+ String |
+ Not supported. |
+
+
+ DIMENSION_CAPTION |
+ String |
+ The caption of the dimension. This should be used when
+displaying the name of the dimension to the user, such as in the user
+interface or reports. |
+
+
+ DIMENSION_ORDINAL |
+ int |
+ The position of the dimension within the cube. |
+
+
+ DIMENSION_TYPE |
+ int |
+ The type of the dimension. Valid values include the values of
+the xmlaOrdinal attribute of the org.olap4j.Dimension.Type
+enum. |
+
+
+ DIMENSION_CARDINALITY |
+ int |
+ The number of members in the key attribute. |
+
+
+ DEFAULT_HIERARCHY |
+ String |
+ A hierarchy from the dimension. Preserved for backwards
+compatibility. |
+
+
+ DESCRIPTION |
+ String |
+ A user-friendly description of the dimension. |
+
+
+ IS_VIRTUAL |
+ boolean |
+ Always false . |
+
+
+ IS_READWRITE |
+ boolean |
+ A Boolean that indicates whether the dimension is
+write-enabled.
+ true if the dimension is write-enabled.
+ |
+
+
+ DIMENSION_UNIQUE_SETTINGS |
+ int |
+ A bitmap that specifies which columns contain unique values
+if the dimension contains only members with unique names. The following
+bit value constants are defined for this bitmap:
+
+ - MDDIMENSIONS_MEMBER_KEY_UNIQUE (1)
+
+ |
+
+
+ DIMENSION_MASTER_
+UNIQUE_NAME |
+ String |
+ Always null . |
+
+
+ DIMENSION_IS_VISIBLE |
+ boolean |
+ Always true . |
+
+
+
+
+The result set is sorted on CATALOG_NAME, SCHEMA_NAME,
+CUBE_NAME, DIMENSION_NAME.
+
+
+
+Retrieves a result set describing the functions available to client
+applications connected to the database.
+
+Specified by the MDSCHEMA_FUNCTIONS XML for Analysis
+method.
+
+The returned result set contains the following columns.
+
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ FUNCTION_NAME |
+ String |
+ The name of the function. |
+
+
+ DESCRIPTION |
+ String |
+ A description of the function. |
+
+
+ PARAMETER_LIST |
+ String |
+ A comma delimited list of parameters formatted as in
+Microsoft Visual Basic. For example, a parameter might be Name as
+String. |
+
+
+ RETURN_TYPE |
+ int |
+ The VARTYPE of the return data type of the function. |
+
+
+ ORIGIN |
+ int |
+ The origin of the function:
+
+ - 1 for MDX functions.
+ - 2 for user-defined functions.
+
+ |
+
+
+ INTERFACE_NAME |
+ String |
+ The name of the interface for user-defined functions
+ The group name for Multidimensional Expressions (MDX)
+functions.
+ |
+
+
+ LIBRARY_NAME |
+ String |
+ The name of the type library for user-defined functions. null
+for MDX functions. |
+
+
+ DLL_NAME |
+ String |
+ (Optional) The name of the assembly that implements the
+user-defined function.
+ Returns null for MDX functions.
+ |
+
+
+ HELP_FILE |
+ String |
+ (Optional) The name of the file that contains the help
+documentation for the user-defined function.
+ Returns null for MDX functions.
+ |
+
+
+ HELP_CONTEXT |
+ int |
+ (Optional) Returns the Help context ID for this function. |
+
+
+ OBJECT |
+ String |
+ (Optional) The generic name of the object class to which a
+property applies. For example, the rowset corresponding to the
+<level_name>.Members function returns "Level".
+ Returns null for user-defined functions, or
+non-property MDX functions.
+ |
+
+
+ CAPTION |
+ String |
+ The display caption for the function. |
+
+
+
+
+The rowset is sorted on ORIGIN, INTERFACE_NAME, FUNCTION_NAME.
+
+
+
+Retrieves a result set describing each hierarchy within a particular
+dimension.
+
+Specified by the MDSCHEMA_HIERARCHIES XML for Analysis
+method.
+
+The returned result set contains the following columns.
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ CATALOG_NAME |
+ String |
+ The name of the catalog to which this hierarchy belongs. null
+if the provider does not support catalogs. |
+
+
+ SCHEMA_NAME |
+ String |
+ Not supported |
+
+
+ CUBE_NAME |
+ String |
+ (Required) The name of the cube to which this hierarchy
+belongs. |
+
+
+ DIMENSION_UNIQUE_NAME |
+ String |
+ The unique name of the dimension to which this hierarchy
+belongs. For providers that generate unique names by qualification,
+each component of this name is delimited. |
+
+
+ HIERARCHY_NAME |
+ String |
+ The name of the hierarchy. Blank if there is only a single
+hierarchy in the dimension. This will always have a value in Microsoft
+SQL Server 2005 Analysis Services (SSAS). |
+
+
+ HIERARCHY_UNIQUE_NAME |
+ String |
+ The unique name of the hierarchy. |
+
+
+ HIERARCHY_GUID |
+ String |
+ Not supported |
+
+
+ HIERARCHY_CAPTION |
+ String |
+ A label or a caption associated with the hierarchy. Used
+primarily for display purposes. If a caption does not exist, HIERARCHY_NAME
+is returned. If the dimension either does not contain a hierarchy or
+has just one hierarchy, this column will contain the name of the
+dimension. |
+
+
+ DIMENSION_TYPE |
+ int |
+ The type of the dimension. Valid values include the values of
+the xmlaOrdinal attribute of . |
+
+
+ HIERARCHY_CARDINALITY |
+ int |
+ The number of members in the hierarchy. |
+
+
+ DEFAULT_MEMBER |
+ String |
+ The default member for this hierarchy. This is a unique name.
+Every hierarchy must have a default member. |
+
+
+ ALL_MEMBER |
+ String |
+ The member at the highest level of the rollup. |
+
+
+ DESCRIPTION |
+ String |
+ A human-readable description of the hierarchy. null
+if no description exists. |
+
+
+ STRUCTURE |
+ int |
+ The structure of the hierarchy. Valid values include the
+following values:
+
+ - MD_STRUCTURE_FULLYBALANCED (0)
- MD_STRUCTURE_RAGGEDBALANCED (1)
- MD_STRUCTURE_UNBALANCED (2)
- MD_STRUCTURE_NETWORK (3)
-
- |
-
-
- IS_VIRTUAL |
- boolean |
- Always returns false . |
-
-
- IS_READWRITE |
- boolean |
- A Boolean that indicates whether the Write Back
- to dimension column is enabled. Returns true
- if the Write Back to dimension column that
- represents this hierarchy is enabled. |
-
-
- DIMENSION_UNIQUE_SETTINGS |
- int |
- Always returns MDDIMENSIONS_MEMBER_KEY_UNIQUE
- (1). |
-
-
- DIMENSION_MASTER_
- UNIQUE_NAME |
- String |
- Always returns null . |
-
-
- DIMENSION_IS_VISIBLE |
- boolean |
- Always returns true . If the dimension is
- not visible, it will not appear in the schema
- rowset. |
-
-
- HIERARCHY_ORDINAL |
- int |
- The ordinal number of the hierarchy across all
- hierarchies of the cube. |
-
-
- DIMENSION_IS_SHARED |
- boolean |
- Always returns true . |
-
-
- HIERARCHY_IS_VISIBLE |
- boolean |
- A Boolean that indicates whether the hieararchy
- is visible. Returns true if the hierarchy
- is visible; otherwise, false . |
-
-
- HIERARCHY_ORIGIN |
- int |
- A bit mask that determines the source of the
- hierarchy:
- - MD_USER_DEFINED identifies user
- defined hierarchies, and has a value of
- 0x0000001.
- - MD_SYSTEM_ENABLED identifies
- attribute hierarchies, and has a value of
- 0x0000002.
- - MD_SYSTEM_INTERNAL identifies
- attributes with no attribute hierarchies, and
- has a value of 0x0000004.
-
- A parent/child attribute hierarchy is both
- MD_USER_DEFINED and MD_SYSTEM_ENABLED. |
-
-
- HIERARCHY_DISPLAY_FOLDER |
- String |
- The path to be used when displaying the
- hierarchy in the user interface. Folder names will
- be separated by a semicolon (;). Nested folders are
- indicated by a backslash (\). |
-
-
- INSTANCE_SELECTION |
- int |
- A hint to the client application on how to show
- the hierarchy. Valid values include the following
- values:
+ |
+
+
+ IS_VIRTUAL |
+ boolean |
+ Always returns false . |
+
+
+ IS_READWRITE |
+ boolean |
+ A Boolean that indicates whether the Write Back to dimension
+column is enabled.
+ Returns true if the Write Back to dimension
+column that represents this hierarchy is enabled.
+ |
+
+
+ DIMENSION_UNIQUE_SETTINGS |
+ int |
+ Always returns MDDIMENSIONS_MEMBER_KEY_UNIQUE (1). |
+
+
+ DIMENSION_MASTER_
+UNIQUE_NAME |
+ String |
+ Always returns null . |
+
+
+ DIMENSION_IS_VISIBLE |
+ boolean |
+ Always returns true . If the dimension is not
+visible, it will not appear in the schema rowset. |
+
+
+ HIERARCHY_ORDINAL |
+ int |
+ The ordinal number of the hierarchy across all hierarchies of
+the cube. |
+
+
+ DIMENSION_IS_SHARED |
+ boolean |
+ Always returns true . |
+
+
+ HIERARCHY_IS_VISIBLE |
+ boolean |
+ A Boolean that indicates whether the hieararchy is visible.
+ Returns true if the hierarchy is visible;
+otherwise, false .
+ |
+
+
+ HIERARCHY_ORIGIN |
+ int |
+ A bit mask that determines the source of the hierarchy:
+
+ - MD_USER_DEFINED identifies user defined hierarchies,
+and has a value of 0x0000001.
+ - MD_SYSTEM_ENABLED identifies attribute hierarchies,
+and has a value of 0x0000002.
+ - MD_SYSTEM_INTERNAL identifies attributes with no
+attribute hierarchies, and has a value of 0x0000004.
+
+ A parent/child attribute hierarchy is both MD_USER_DEFINED
+and MD_SYSTEM_ENABLED.
+ |
+
+
+ HIERARCHY_DISPLAY_FOLDER |
+ String |
+ The path to be used when displaying the hierarchy in the user
+interface. Folder names will be separated by a semicolon (;). Nested
+folders are indicated by a backslash (\). |
+
+
+ INSTANCE_SELECTION |
+ int |
+ A hint to the client application on how to show the
+hierarchy. Valid values include the following values:
+
- MD_INSTANCE_SELECTION_NONE
- MD_INSTANCE_SELECTION_DROPDOWN
- MD_INSTANCE_SELECTION_LIST
- MD_INSTANCE_SELECTION_FILTEREDLIST
- MD_INSTANCE_SELECTION_MANDATORYFILTER
-
- |
-
+
+
+
+
+
-The rowset is sorted on CATALOG_NAME,
- SCHEMA_NAME, CUBE_NAME, DIMENSION_UNIQUE_NAME,
- HIERARCHY_NAME.
+The rowset is sorted on CATALOG_NAME, SCHEMA_NAME, CUBE_NAME,
+DIMENSION_UNIQUE_NAME, HIERARCHY_NAME.
-Retrieves a result set describing each level within a particular hierarchy.
-Specified by the MDSCHEMA_LEVELS XML for Analysis method.
+
+Retrieves a result set describing each level within a particular
+hierarchy.
+
+Specified by the MDSCHEMA_LEVELS XML for Analysis
+method.
+
The returned result set contains the following columns.
-
-
- Column name |
- Type |
- Description |
-
-
- CATALOG_NAME |
- String |
- The name of the catalog to which this level
- belongs. null if the provider does not
- support catalogs. |
-
-
- SCHEMA_NAME |
- String |
- The name of the schema to which this level
- belongs. null if the provider does not
- support schemas. |
-
-
- CUBE_NAME |
- String |
- The name of the cube to which this level
- belongs. |
-
-
- DIMENSION_UNIQUE_NAME |
- String |
- The unique name of the dimension to which this
- level belongs. For providers that generate unique
- names by qualification, each component of this name
- is delimited. |
-
-
- HIERARCHY_UNIQUE_NAME |
- String |
- The unique name of the hierarchy. If the level
- belongs to more than one hierarchy, there is one row
- for each hierarchy to which it belongs. For
- providers that generate unique names by
- qualification, each component of this name is
- delimited. |
-
-
- LEVEL_NAME |
- String |
- The name of the level. |
-
-
- LEVEL_UNIQUE_NAME |
- String |
- The properly escaped unique name of the level. |
-
-
- LEVEL_GUID |
- String |
- Not supported. |
-
-
- LEVEL_CAPTION |
- String |
- A label or caption associated with the
- hierarchy. Used primarily for display purposes. If a
- caption does not exist, LEVEL_NAME is
- returned. |
-
-
- LEVEL_NUMBER |
- int |
- The distance of the level from the root of the
- hierarchy. Root level is zero (0). |
-
-
- LEVEL_CARDINALITY |
- int |
- The number of members in the level. |
-
-
- LEVEL_TYPE |
- int |
- Type of the level. Values are as allowed by the xmlaOrdinal field of the
- org.olap4j.Level.Type
- enum. |
-
-
- DESCRIPTION |
- String |
- A human-readable description of the level. null
- if no description exists. |
-
-
- CUSTOM_ROLLUP_SETTINGS |
- int |
- A bitmap that specifies the custom rollup
- options:
+
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ CATALOG_NAME |
+ String |
+ The name of the catalog to which this level belongs. null
+if the provider does not support catalogs. |
+
+
+ SCHEMA_NAME |
+ String |
+ The name of the schema to which this level belongs. null
+if the provider does not support schemas. |
+
+
+ CUBE_NAME |
+ String |
+ The name of the cube to which this level belongs. |
+
+
+ DIMENSION_UNIQUE_NAME |
+ String |
+ The unique name of the dimension to which this level belongs.
+For providers that generate unique names by qualification, each
+component of this name is delimited. |
+
+
+ HIERARCHY_UNIQUE_NAME |
+ String |
+ The unique name of the hierarchy. If the level belongs to
+more than one hierarchy, there is one row for each hierarchy to which
+it belongs. For providers that generate unique names by qualification,
+each component of this name is delimited. |
+
+
+ LEVEL_NAME |
+ String |
+ The name of the level. |
+
+
+ LEVEL_UNIQUE_NAME |
+ String |
+ The properly escaped unique name of the level. |
+
+
+ LEVEL_GUID |
+ String |
+ Not supported. |
+
+
+ LEVEL_CAPTION |
+ String |
+ A label or caption associated with the hierarchy. Used
+primarily for display purposes. If a caption does not exist, LEVEL_NAME
+is returned. |
+
+
+ LEVEL_NUMBER |
+ int |
+ The distance of the level from the root of the hierarchy.
+Root level is zero (0). |
+
+
+ LEVEL_CARDINALITY |
+ int |
+ The number of members in the level. |
+
+
+ LEVEL_TYPE |
+ int |
+ Type of the level. Values are as allowed by the xmlaOrdinal
+field of the org.olap4j.Level.Type
+enum. |
+
+
+ DESCRIPTION |
+ String |
+ A human-readable description of the level. null if no
+description exists. |
+
+
+ CUSTOM_ROLLUP_SETTINGS |
+ int |
+ A bitmap that specifies the custom rollup options:
+
- MDLEVELS_CUSTOM_ROLLUP_EXPRESSION (0x01)
- indicates an expression exists for this level.
- (Deprecated)
+indicates an expression exists for this level. (Deprecated)
- MDLEVELS_CUSTOM_ROLLUP_COLUMN (0x02)
- indicates that there is a custom rollup column
- for this level.
- - MDLEVELS_SKIPPED_LEVELS (0x04)
- indicates that there is a skipped level
- associated with members of this level.
+indicates that there is a custom rollup column for this level.
+ - MDLEVELS_SKIPPED_LEVELS (0x04) indicates that
+there is a skipped level associated with members of this level.
- MDLEVELS_CUSTOM_MEMBER_PROPERTIES (0x08)
- indicates that members of the level have custom
- member properties.
- - MDLEVELS_UNARY_OPERATOR (0x10)
- indicates that members on the level have unary
- operators.
-
- |
-
-
- LEVEL_UNIQUE_SETTINGS |
- int |
- A bitmap that specifies which columns contain
- unique values, if the level only has members with
- unique names or keys. The Msmd.h file defines the
- following bit value constants for this bitmap:
-
- - MDDIMENSIONS_MEMBER_KEY_UNIQUE (1)
- - MDDIMENSIONS_MEMBER_NAME_UNIQUE (2)
-
- The key is always unique in Microsoft SQL Server
- 2005 Analysis Services (SSAS). The name will be
- unique if the setting on the attribute is
- UniqueInDimension or UniqueInAttribute |
-
-
- LEVEL_IS_VISIBLE |
- boolean |
- A Boolean that indicates whether the level is
- visible. Always returns True. If the level is not
- visible, it will not be included in the schema
- rowset. |
-
-
- LEVEL_ORDERING_PROPERTY |
- String |
- The ID of the attribute that the level is sorted
- on. |
-
-
- LEVEL_DBTYPE |
- int |
- The DBTYPE enumeration of the member key
- column that is used for the level attribute. Null
- if concatenated keys are used as the member key
- column. |
-
-
- LEVEL_MASTER_
- UNIQUE_NAME |
- String |
- Always returns null. |
-
-
- LEVEL_NAME_
- SQL_COLUMN_NAME |
- String |
- The SQL representation of the level member
- names. |
-
-
- LEVEL_KEY_
- SQL_COLUMN_NAME |
- String |
- The SQL representation of the level member key
- values. |
-
-
- LEVEL_UNIQUE_NAME_
- SQL_COLUMN_NAME |
- String |
- The SQL representation of the member unique
- names. |
-
-
- LEVEL_ATTRIBUTE_
- HIERARCHY_NAME |
- String |
- The name of the attribute hierarchy providing
- the source of the level. |
-
-
- LEVEL_KEY_CARDINALITY |
- int |
- The number of columns in the level key. |
-
-
- LEVEL_ORIGIN |
- int |
- A bit map that defines how the level was
- sourced:
- - MD_ORIGIN_USER_DEFINED identifies
- levels in a user defined hierarchy.
- - MD_ORIGIN_ATTRIBUTE identifies levels
- in an attribute hierarchy.
- - MD_ORIGIN_KEY_ATTRIBUTE identifies
- levels in a key attribute hierarchy.
- - MD_ORIGIN_INTERNAL identifies levels
- in attribute hierarchies that are not enabled.
-
- |
-
-
-
-The rowset is sorted on CATALOG_NAME,
- SCHEMA_NAME, CUBE_NAME, DIMENSION_UNIQUE_NAME,
- HIERARCHY_UNIQUE_NAME, LEVEL_NUMBER.
+indicates that members of the level have custom member properties.
+ - MDLEVELS_UNARY_OPERATOR (0x10) indicates that
+members on the level have unary operators.
+
+ |
+
+
+ LEVEL_UNIQUE_SETTINGS |
+ int |
+ A bitmap that specifies which columns contain unique values,
+if the level only has members with unique names or keys. The Msmd.h
+file defines the following bit value constants for this bitmap:
+
+ - MDDIMENSIONS_MEMBER_KEY_UNIQUE (1)
+ - MDDIMENSIONS_MEMBER_NAME_UNIQUE (2)
+
+ The key is always unique in Microsoft SQL Server 2005 Analysis
+Services (SSAS). The name will be unique if the setting on the
+attribute is UniqueInDimension or UniqueInAttribute
+ |
+
+
+ LEVEL_IS_VISIBLE |
+ boolean |
+ A Boolean that indicates whether the level is visible.
+ Always returns True. If the level is not visible, it will not
+be included in the schema rowset.
+ |
+
+
+ LEVEL_ORDERING_PROPERTY |
+ String |
+ The ID of the attribute that the level is sorted on. |
+
+
+ LEVEL_DBTYPE |
+ int |
+ The DBTYPE enumeration of the member key column that
+is used for the level attribute.
+ Null if concatenated keys are used as the member key column.
+ |
+
+
+ LEVEL_MASTER_
+UNIQUE_NAME |
+ String |
+ Always returns null. |
+
+
+ LEVEL_NAME_
+SQL_COLUMN_NAME |
+ String |
+ The SQL representation of the level member names. |
+
+
+ LEVEL_KEY_
+SQL_COLUMN_NAME |
+ String |
+ The SQL representation of the level member key values. |
+
+
+ LEVEL_UNIQUE_NAME_
+SQL_COLUMN_NAME |
+ String |
+ The SQL representation of the member unique names. |
+
+
+ LEVEL_ATTRIBUTE_
+HIERARCHY_NAME |
+ String |
+ The name of the attribute hierarchy providing the source of
+the level. |
+
+
+ LEVEL_KEY_CARDINALITY |
+ int |
+ The number of columns in the level key. |
+
+
+ LEVEL_ORIGIN |
+ int |
+ A bit map that defines how the level was sourced:
+
+ - MD_ORIGIN_USER_DEFINED identifies levels in a user
+defined hierarchy.
+ - MD_ORIGIN_ATTRIBUTE identifies levels in an
+attribute hierarchy.
+ - MD_ORIGIN_KEY_ATTRIBUTE identifies levels in a key
+attribute hierarchy.
+ - MD_ORIGIN_INTERNAL identifies levels in attribute
+hierarchies that are not enabled.
+
+ |
+
+
+
+
+The rowset is sorted on CATALOG_NAME, SCHEMA_NAME, CUBE_NAME,
+DIMENSION_UNIQUE_NAME, HIERARCHY_UNIQUE_NAME, LEVEL_NUMBER.
+
+
+
+Retrieves a result set describing each measure within a cube.
+
+Specified by the MDSCHEMA_MEASURES XML for Analysis
+method.
+
+The returned result set contains the following columns.
+
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ CATALOG_NAME |
+ String |
+ The name of the catalog to which this measure belongs. null
+if the provider does not support catalogs. |
+
+
+ SCHEMA_NAME |
+ String |
+ The name of the schema to which this measure belongs. null
+if the provider does not support schemas. |
+
+
+ CUBE_NAME |
+ String |
+ The name of the cube to which this measure belongs. |
+
+
+ MEASURE_NAME |
+ String |
+ The name of the measure. |
+
+
+ MEASURE_UNIQUE_NAME |
+ String |
+ The Unique name of the measure. For providers that generate
+unique names by qualification, each component of this name is delimited. |
+
+
+ MEASURE_CAPTION |
+ String |
+ A label or caption associated with the measure. Used
+primarily for display purposes. If a caption does not exist, MEASURE_NAME
+is returned. |
+
+
+ MEASURE_GUID |
+ String |
+ Not supported. |
+
+
+ MEASURE_AGGREGATOR |
+ int |
+ An enumeration that identifies how a measure was derived. Can
+be one of the values allowed by the xmlaOrdinal field of
+the org.olap4j.Measure.Aggregator
+enum. |
+
+
+ DATA_TYPE |
+ int |
+ The data type of the measure. |
+
+
+ NUMERIC_PRECISION |
+ int |
+ The maximum precision of the property if the measure object's
+data type is exact numeric. null for all other property
+types. |
+
+
+ NUMERIC_SCALE |
+ int |
+ The number of digits to the right of the decimal point if the
+measure object's type indicator is DBTYPE_NUMERIC or DBTYPE_DECIMAL.
+Otherwise, this value is null . |
+
+
+ MEASURE_UNITS |
+ String |
+ Not supported |
+
+
+ DESCRIPTION |
+ String |
+ A human-readable description of the measure. null if
+no description exists. |
+
+
+ EXPRESSION |
+ String |
+ An expression for the member. |
+
+
+ MEASURE_IS_VISIBLE |
+ boolean |
+ A Boolean that always returns True. If the measure is not
+visible, it will not be included in the schema rowset. |
+
+
+ LEVELS_LIST |
+ String |
+ A string that always returns null . |
+
+
+ MEASURE_NAME_
+SQL_COLUMN_NAME |
+ String |
+ The name of the column in the SQL query that corresponds to
+the measure's name. |
+
+
+ MEASURE_UNQUALIFIED_
+CAPTION |
+ String |
+ The name of the measure, not qualified with the measure group
+name. |
+
+
+ MEASUREGROUP_NAME |
+ String |
+ The name of the measure group to which the measure belongs. |
+
+
+ MEASURE_DISPLAY_FOLDER |
+ String |
+ The path to be used when displaying the measure in the user
+interface. Folder names will be separated by a semicolon. Nested
+folders are indicated by a backslash (\). |
+
+
+ DEFAULT_FORMAT_STRING |
+ String |
+ The default format string for the measure. |
+
+
+
-
-Retrieves a result set describing each measure within a cube.
-Specified by the MDSCHEMA_MEASURES XML for Analysis method.
-The returned result set contains the following columns.
-
-
- Column name |
- Type |
- Description |
-
-
- CATALOG_NAME |
- String |
- The name of the catalog to which this measure
- belongs. null if the provider does not
- support catalogs. |
-
-
- SCHEMA_NAME |
- String |
- The name of the schema to which this measure
- belongs. null if the provider does not
- support schemas. |
-
-
- CUBE_NAME |
- String |
- The name of the cube to which this measure
- belongs. |
-
-
- MEASURE_NAME |
- String |
- The name of the measure. |
-
-
- MEASURE_UNIQUE_NAME |
- String |
- The Unique name of the measure. For providers
- that generate unique names by qualification, each
- component of this name is delimited. |
-
-
- MEASURE_CAPTION |
- String |
- A label or caption associated with the measure.
- Used primarily for display purposes. If a caption
- does not exist, MEASURE_NAME is returned. |
-
-
- MEASURE_GUID |
- String |
- Not supported. |
-
-
- MEASURE_AGGREGATOR |
- int |
- An enumeration that identifies how a measure was
- derived. Can be one of the values allowed by the xmlaOrdinal field of the
- org.olap4j.Measure.Aggregator
- enum. |
-
-
- DATA_TYPE |
- int |
- The data type of the measure. |
-
-
- NUMERIC_PRECISION |
- int |
- The maximum precision of the property if the
- measure object's data type is exact numeric. null
- for all other property types. |
-
-
- NUMERIC_SCALE |
- int |
- The number of digits to the right of the decimal
- point if the measure object's type indicator is
- DBTYPE_NUMERIC or DBTYPE_DECIMAL.
- Otherwise, this value is null . |
-
-
- MEASURE_UNITS |
- String |
- Not supported |
-
-
- DESCRIPTION |
- String |
- A human-readable description of the measure.
- null if no description exists. |
-
-
- EXPRESSION |
- String |
- An expression for the member. |
-
-
- MEASURE_IS_VISIBLE |
- boolean |
- A Boolean that always returns True. If the
- measure is not visible, it will not be included in
- the schema rowset. |
-
-
- LEVELS_LIST |
- String |
- A string that always returns null . |
-
-
- MEASURE_NAME_
- SQL_COLUMN_NAME |
- String |
- The name of the column in the SQL query that
- corresponds to the measure's name. |
-
-
- MEASURE_UNQUALIFIED_
- CAPTION |
- String |
- The name of the measure, not qualified with the
- measure group name. |
-
-
- MEASUREGROUP_NAME |
- String |
- The name of the measure group to which the
- measure belongs. |
-
-
- MEASURE_DISPLAY_FOLDER |
- String |
- The path to be used when displaying the measure
- in the user interface. Folder names will be
- separated by a semicolon. Nested folders are
- indicated by a backslash (\). |
-
-
- DEFAULT_FORMAT_STRING |
- String |
- The default format string for the measure. |
-
-
-
-The rowset is sorted on CATALOG_NAME,
- SCHEMA_NAME, CUBE_NAME, MEASURE_NAME.
+The rowset is sorted on CATALOG_NAME, SCHEMA_NAME, CUBE_NAME,
+MEASURE_NAME.
+
Retrieves a result set describing the members within a database.
-Specified by the MDSCHEMA_MEMBERS XML for Analysis method.
+
+Specified by the MDSCHEMA_MEMBERS XML for Analysis
+method.
+
The returned result set contains the following columns.
-
-
- Column name |
- Type |
- Description |
-
-
- CATALOG_NAME |
- String |
- The name of the database to which this member
- belongs. |
-
-
- SCHEMA_NAME |
- String |
- The name of the schema to which this member
- belongs. |
-
-
- CUBE_NAME |
- String |
- The name of the cube to which this member
- belongs. |
-
-
- DIMENSION_UNIQUE_NAME |
- String |
- The unique name of the dimension to which this
- member belongs. |
-
-
- HIERARCHY_UNIQUE_NAME |
- String |
- The unique name of the hierarchy to which this
- member belongs. |
-
-
- LEVEL_UNIQUE_NAME |
- String |
- The unique name of the level to which this
- member belongs. |
-
-
- LEVEL_NUMBER |
- int |
- The distance of the member from the root of the
- hierarchy. The root level is zero (0). |
-
-
- MEMBER_ORDINAL |
- int |
- (Deprecated) Always returns 0. |
-
-
- MEMBER_NAME |
- String |
- The name of the member. |
-
-
- MEMBER_UNIQUE_NAME |
- String |
- The unique name of the member. |
-
-
- MEMBER_TYPE |
- int |
- The type of the member, one of the values of the ordinal field of the
- org.olap4j.Member.Type
- enum.FORMULA takes
- precedence over MEASURE.
- For example, if there is a formula (calculated)
- member on the Measures dimension, it is listed
- as FORMULA.
- |
-
-
- MEMBER_GUID |
- String |
- The GUID of the member. null if no GUID
- exists. |
-
-
- MEMBER_CAPTION |
- String |
- A label or caption associated with the member.
- Used primarily for display purposes. If a caption
- does not exist, MEMBER_NAME is returned. |
-
-
- CHILDREN_CARDINALITY |
- int |
- The number of children that the member has. This
- can be an estimate, so consumers should not rely on
- this to be the exact count. Providers should return
- the best estimate possible. |
-
-
- PARENT_LEVEL |
- int |
- The distance of the member's parent from the
- root level of the hierarchy. The root level is zero
- (0). |
-
-
- PARENT_UNIQUE_NAME |
- String |
- The unique name of the member's parent. null
- is returned for any members at the root level. |
-
-
- PARENT_COUNT |
- int |
- The number of parents that this member has. |
-
-
- DESCRIPTION |
- String |
- Always returns null . |
-
-
- EXPRESSION |
- String |
- The expression for calculations, if the member
- is of type MDMEMBER_TYPE_FORMULA. |
-
-
- MEMBER_KEY |
- String |
- The value of the member's key column. Returns
- null if the member has a composite key. |
-
-
- IS_PLACEHOLDERMEMBER |
- boolean |
- A Boolean that indicates whether a member is a
- placeholder member for an empty position in a
- dimension hierarchy. It is valid only if the
- MDX Compatibility property has been set to 1.
- |
-
-
- IS_DATAMEMBER |
- boolean |
- A Boolean that indicates whether the member is a
- data member.
-
- Returns True if the member is a data
- member. |
-
-
- Zero or more additional columns |
- int |
- No properties are returned if the members could
- be returned from multiple levels. For example, if
- the Tree operator is PARENT and SELF
- for a non-parent child hierarchy, no member
- properties are returned.
-
- This applies to ragged
- hierarchies where tree operators could return
- members from different levels (for example, if the
- prior level contains holes and parent on members is
- requested). |
-
-
-
-The rowset is sorted on CATALOG_NAME,
- SCHEMA_NAME, CUBE_NAME, DIMENSION_UNIQUE_NAME,
- HIERARCHY_UNIQUE_NAME, LEVEL_UNIQUE_NAME,
- LEVEL_NUMBER, MEMBER_ORDINAL.
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ CATALOG_NAME |
+ String |
+ The name of the database to which this member belongs. |
+
+
+ SCHEMA_NAME |
+ String |
+ The name of the schema to which this member belongs. |
+
+
+ CUBE_NAME |
+ String |
+ The name of the cube to which this member belongs. |
+
+
+ DIMENSION_UNIQUE_NAME |
+ String |
+ The unique name of the dimension to which this member belongs. |
+
+
+ HIERARCHY_UNIQUE_NAME |
+ String |
+ The unique name of the hierarchy to which this member belongs. |
+
+
+ LEVEL_UNIQUE_NAME |
+ String |
+ The unique name of the level to which this member belongs. |
+
+
+ LEVEL_NUMBER |
+ int |
+ The distance of the member from the root of the hierarchy.
+The root level is zero (0). |
+
+
+ MEMBER_ORDINAL |
+ int |
+ (Deprecated) Always returns 0. |
+
+
+ MEMBER_NAME |
+ String |
+ The name of the member. |
+
+
+ MEMBER_UNIQUE_NAME |
+ String |
+ The unique name of the member. |
+
+
+ MEMBER_TYPE |
+ int |
+ The type of the member, one of the values of the ordinal
+field of the org.olap4j.Member.Type
+enum.
+ FORMULA takes precedence over MEASURE. For
+example, if there is a formula (calculated) member on the Measures
+dimension, it is listed as FORMULA.
+ |
+
+
+ MEMBER_GUID |
+ String |
+ The GUID of the member. null if no GUID exists. |
+
+
+ MEMBER_CAPTION |
+ String |
+ A label or caption associated with the member. Used primarily
+for display purposes. If a caption does not exist, MEMBER_NAME
+is returned. |
+
+
+ CHILDREN_CARDINALITY |
+ int |
+ The number of children that the member has. This can be an
+estimate, so consumers should not rely on this to be the exact count.
+Providers should return the best estimate possible. |
+
+
+ PARENT_LEVEL |
+ int |
+ The distance of the member's parent from the root level of
+the hierarchy. The root level is zero (0). |
+
+
+ PARENT_UNIQUE_NAME |
+ String |
+ The unique name of the member's parent. null is
+returned for any members at the root level. |
+
+
+ PARENT_COUNT |
+ int |
+ The number of parents that this member has. |
+
+
+ DESCRIPTION |
+ String |
+ Always returns null . |
+
+
+ EXPRESSION |
+ String |
+ The expression for calculations, if the member is of type MDMEMBER_TYPE_FORMULA. |
+
+
+ MEMBER_KEY |
+ String |
+ The value of the member's key column. Returns null
+if the member has a composite key. |
+
+
+ IS_PLACEHOLDERMEMBER |
+ boolean |
+ A Boolean that indicates whether a member is a placeholder
+member for an empty position in a dimension hierarchy.
+ It is valid only if the MDX Compatibility property
+has been set to 1.
+ |
+
+
+ IS_DATAMEMBER |
+ boolean |
+ A Boolean that indicates whether the member is a data member.
+ Returns True if the member is a data member.
+ |
+
+
+ Zero or more additional columns |
+ int |
+ No properties are returned if the members could be returned
+from multiple levels. For example, if the Tree operator is PARENT
+and SELF for a non-parent child hierarchy, no member properties
+are returned.
+ This applies to ragged hierarchies where tree operators could
+return members from different levels (for example, if the prior level
+contains holes and parent on members is requested).
+ |
+
+
+
+
+The rowset is sorted on CATALOG_NAME, SCHEMA_NAME, CUBE_NAME,
+DIMENSION_UNIQUE_NAME, HIERARCHY_UNIQUE_NAME, LEVEL_UNIQUE_NAME,
+ LEVEL_NUMBER, MEMBER_ORDINAL.
Retrieves a list of descriptions of member and cell Properties.
-Specified by the MDSCHEMA_PROPERTIES XML for Analysis method.
+
+Specified by the MDSCHEMA_PROPERTIES XML for Analysis
+method.
+
The returned result set contains the following columns.
-
-
- Column name |
- Type |
- Description |
-
-
- CATALOG_NAME |
- String |
- The name of the database. |
-
-
- SCHEMA_NAME |
- String |
- The name of the schema to which this property
- belongs. null if the provider does not
- support schemas. |
-
-
- CUBE_NAME |
- String |
- The name of the cube. |
-
-
- DIMENSION_UNIQUE_NAME |
- String |
- The unique name of the dimension. For providers
- that generate unique names by qualification, each
- component of this name is delimited. |
-
-
- HIERARCHY_UNIQUE_NAME |
- String |
- The unique name of the hierarchy. For providers
- that generate unique names by qualification, each
- component of this name is delimited. |
-
-
- LEVEL_UNIQUE_NAME |
- String |
- The unique name of the level to which this
- property belongs. If the provider does not support
- named levels, it should return the
- DIMENSION_UNIQUE_NAME value for this field. For
- providers that generate unique names by
- qualification, each component of this name is
- delimited. |
-
-
- MEMBER_UNIQUE_NAME |
- String |
- The unique name of the member to which the
- property belongs. Used for data stores that do not
- support named levels or have properties on a
- member-by-member basis. If the property applies to
- all members in a level, this column is null .
- For providers that generate unique names by
- qualification, each component of this name is
- delimited. |
-
-
- PROPERTY_TYPE |
- int |
- A bitmap that specifies the type of the
- property:
- - MDPROP_MEMBER (1) identifies a
- property of a member. This property can be used
- in the DIMENSION PROPERTIES clause of the SELECT
- statement.
- - MDPROP_CELL (2) identifies a
- property of a cell. This property can be used in
- the CELL PROPERTIES clause that occurs at the
- end of the SELECT statement.
- - MDPROP_SYSTEM (4) identifies
- an internal property.
- - MDPROP_BLOB (8) identifies a
- property which contains a binary large object
- (blob).
-
- |
-
-
- PROPERTY_NAME |
- String |
- The name of the property. If the key for the
- property is the same as the name for the property,
- PROPERTY_NAME will be blank. |
-
-
- PROPERTY_CAPTION |
- String |
- A label or caption associated with the property,
- used primarily for display purposes. Returns
- PROPERTY_NAME if a caption does not exist. |
-
-
- DATA_TYPE |
- int |
- The data type of the property. |
-
-
- CHARACTER_
- MAXIMUM_LENGTH |
- int |
- The maximum possible length of the property, if
- it is a character, binary, or bit type.
-
- Zero indicates there is no defined maximum length.
-
- Returns null for all other data types. |
-
-
- CHARACTER_OCTET_LENGTH |
- int |
- The maximum possible length (in bytes) of the
- property, if it is a character or binary type.
-
- Zero indicates there is no defined maximum length.
-
- Returns null for all other data types. |
-
-
- NUMERIC_PRECISION |
- int |
- The maximum precision of the property, if it is
- a numeric data type.
-
- Returns null for all
- other data types. |
-
-
- NUMERIC_SCALE |
- int |
- The number of digits to the right of the decimal
- point, if it is a DBTYPE_NUMERIC or
- DBTYPE_DECIMAL type.
-
- Returns null for all other data types. |
-
-
- DESCRIPTION |
- String |
- A human readable description of the property. null if no description exists. |
-
-
- PROPERTY_CONTENT_TYPE |
- int |
- The type of the property. Can be one of the values of the xmlaOrdinal field of the
- org.olap4j.Property.ContentType
- enum. |
-
-
- SQL_COLUMN_NAME |
- String |
- The name of the property used in SQL queries
- from the cube dimension or database dimension. |
-
-
- LANGUAGE |
- int |
- The translation expressed as an LCID.
- Only valid for property translations. |
-
-
- PROPERTY_ORIGIN |
- int |
- Identifies the type of hierarchy that the
- property applies to:
- - MD_USER_DEFINED (1) indicates
- the property is on a user defined hierarchy
- - MD_SYSTEM_ENABLED (2)
- indicates the property is on an attribute
- hierarchy
- - MD_SYSTEM_DISABLED (4)
- indicates the property is on an attribute
- hierarchy that is not enabled.
-
- |
-
-
- PROPERTY_ATTRIBUTE_
- HIERARCHY_NAME |
- String |
- The name of the attribute hierarchy sourcing
- this property. |
-
-
- PROPERTY_CARDINALITY |
- String |
- The cardinality of the property. Possible values
- include the following strings:
+
+
+
+
+ Column name |
+ Type |
+ Description |
+
+
+ CATALOG_NAME |
+ String |
+ The name of the database. |
+
+
+ SCHEMA_NAME |
+ String |
+ The name of the schema to which this property belongs. null
+if the provider does not support schemas. |
+
+
+ CUBE_NAME |
+ String |
+ The name of the cube. |
+
+
+ DIMENSION_UNIQUE_NAME |
+ String |
+ The unique name of the dimension. For providers that generate
+unique names by qualification, each component of this name is
+delimited. |
+
+
+ HIERARCHY_UNIQUE_NAME |
+ String |
+ The unique name of the hierarchy. For providers that generate
+unique names by qualification, each component of this name is
+delimited. |
+
+
+ LEVEL_UNIQUE_NAME |
+ String |
+ The unique name of the level to which this property belongs.
+If the provider does not support named levels, it should return the
+DIMENSION_UNIQUE_NAME value for this field. For providers that
+generate unique names by qualification, each component of this name is
+delimited. |
+
+
+ MEMBER_UNIQUE_NAME |
+ String |
+ The unique name of the member to which the property belongs.
+Used for data stores that do not support named levels or have
+properties on a member-by-member basis. If the property applies to all
+members in a level, this column is null . For providers
+that generate unique names by qualification, each component of this
+name is delimited. |
+
+
+ PROPERTY_TYPE |
+ int |
+ A bitmap that specifies the type of the property:
+
+ - MDPROP_MEMBER (1) identifies a property of a
+member. This property can be used in the DIMENSION PROPERTIES clause of
+the SELECT statement.
+ - MDPROP_CELL (2) identifies a property of a
+cell. This property can be used in the CELL PROPERTIES clause that
+occurs at the end of the SELECT statement.
+ - MDPROP_SYSTEM (4) identifies an internal
+property.
+ - MDPROP_BLOB (8) identifies a property which
+contains a binary large object (blob).
+
+ |
+
+
+ PROPERTY_NAME |
+ String |
+ The name of the property. If the key for the property is the
+same as the name for the property, PROPERTY_NAME will be blank. |
+
+
+ PROPERTY_CAPTION |
+ String |
+ A label or caption associated with the property, used
+primarily for display purposes. Returns PROPERTY_NAME if a
+caption does not exist. |
+
+
+ DATA_TYPE |
+ int |
+ The data type of the property. |
+
+
+ CHARACTER_
+MAXIMUM_LENGTH |
+ int |
+ The maximum possible length of the property, if it is a
+character, binary, or bit type.
+ Zero indicates there is no defined maximum length.
+ Returns null for all other data types.
+ |
+
+
+ CHARACTER_OCTET_LENGTH |
+ int |
+ The maximum possible length (in bytes) of the property, if it
+is a character or binary type.
+ Zero indicates there is no defined maximum length.
+ Returns null for all other data types.
+ |
+
+
+ NUMERIC_PRECISION |
+ int |
+ The maximum precision of the property, if it is a numeric
+data type.
+ Returns null for all other data types.
+ |
+
+
+ NUMERIC_SCALE |
+ int |
+ The number of digits to the right of the decimal point, if it
+is a DBTYPE_NUMERIC or DBTYPE_DECIMAL type.
+ Returns null for all other data types.
+ |
+
+
+ DESCRIPTION |
+ String |
+ A human readable description of the property. null
+if no description exists. |
+
+
+ PROPERTY_CONTENT_TYPE |
+ int |
+ The type of the property. Can be one of the values of the xmlaOrdinal
+field of the org.olap4j.Property.ContentType
+enum. |
+
+
+ SQL_COLUMN_NAME |
+ String |
+ The name of the property used in SQL queries from the cube
+dimension or database dimension. |
+
+
+ LANGUAGE |
+ int |
+ The translation expressed as an LCID. Only valid for
+property translations. |
+
+
+ PROPERTY_ORIGIN |
+ int |
+ Identifies the type of hierarchy that the property applies
+to:
+
+ - MD_USER_DEFINED (1) indicates the property is
+on a user defined hierarchy
+ - MD_SYSTEM_ENABLED (2) indicates the property
+is on an attribute hierarchy
+ - MD_SYSTEM_DISABLED (4) indicates the property
+is on an attribute hierarchy that is not enabled.
+
+ |
+
+
+ PROPERTY_ATTRIBUTE_
+HIERARCHY_NAME |
+ String |
+ The name of the attribute hierarchy sourcing this property. |
+
+
+ PROPERTY_CARDINALITY |
+ String |
+ The cardinality of the property. Possible values include the
+following strings:
+
- |
-
-
- MIME_TYPE |
- String |
- The mime type for binary large objects (BLOBs). |
-
-
- PROPERTY_IS_VISIBLE |
- boolean |
- A Boolean that indicates whether the property is
- visible.
-
- true if the property is visible;
- otherwise, false .
|
-
-
+
+ |
+
+
+ MIME_TYPE |
+ String |
+ The mime type for binary large objects (BLOBs). |
+
+
+ PROPERTY_IS_VISIBLE |
+ boolean |
+ A Boolean that indicates whether the property is visible.
+ true if the property is visible; otherwise, false .
+ |
+
+
+
This schema rowset is not sorted.
-Retrieves a result set describing any sets that are currently defined in a
+
+ Retrieves a result set describing any sets that are currently
+defined in a
database, including session-scoped sets.
+
Specified by the MDSCHEMA_SETS XML for Analysis method.
+
The returned result set contains the following columns.
-
-
- Column name |
- Type |
- Description |
+
+
+
+
+ Column name |
+ Type |
+ Description |
- CATALOG_NAME |
- String |
- The name of the database. |
+ CATALOG_NAME |
+ String |
+ The name of the database. |
- SCHEMA_NAME |
- String |
- Not supported. |
+ SCHEMA_NAME |
+ String |
+ Not supported. |
- CUBE_NAME |
- String |
- The name of the cube. |
+ CUBE_NAME |
+ String |
+ The name of the cube. |
- SET_NAME |
- String |
- The name of the set, as specified in the
- CREATE SET statement. |
+ SET_NAME |
+ String |
+ The name of the set, as specified in the CREATE SET
+statement. |
- SCOPE |
- int |
- The scope of the set:
- - MDSET_SCOPE_GLOBAL (1)
- - MDSET_SCOPE_SESSION (2)
-
- |
+ SCOPE |
+ int |
+ The scope of the set:
+
+ - MDSET_SCOPE_GLOBAL (1)
+ - MDSET_SCOPE_SESSION (2)
+
+ |
- DESCRIPTION |
- String |
- Not supported. |
+ DESCRIPTION |
+ String |
+ Not supported. |
- EXPRESSION |
- String |
- The expression for the set. |
+ EXPRESSION |
+ String |
+ The expression for the set. |
- DIMENSIONS |
- String |
- A comma delimited list of hierarchies included
- in the set. |
+ DIMENSIONS |
+ String |
+ A comma delimited list of hierarchies included in the set. |
- SET_CAPTION |
- String |
- A label or caption associated with the set. The
- label or caption is used primarily for display
- purposes. |
+ SET_CAPTION |
+ String |
+ A label or caption associated with the set. The label or
+caption is used primarily for display purposes. |
- SET_DISPLAY_FOLDER |
- String |
- The path to be used by the user interface when
- displaying the set. Folder names are separated by a
- backslash (\), folders are separated by a
- semicolon (;). |
+ SET_DISPLAY_FOLDER |
+ String |
+ The path to be used by the user interface when displaying the
+set. Folder names are separated by a backslash (\), folders are
+separated by a semicolon (;). |
-
+
+
-The rowset is sorted on CATALOG_NAME,
- SCHEMA_NAME, CUBE_NAME.
+The rowset is sorted on CATALOG_NAME, SCHEMA_NAME, CUBE_NAME.
-
-
- Method |
- Description |
-
-
-
- getDatabase() |
- Returns the one and only Database. |
-
-
-
- getMdxKeywords() |
- Returns the keywords of this dialect of MDX, as a comma-separated
- string. |
-
-
+
-A transform is an operation which maps a query model to a new query model. It
-is usually triggered by a gesture within the user-interface. For example,
-clicking on the Unit Sales column transforms the query
+NOTE: As of olap4j 1.0, this package is experimental and is subject to change in future releases.
-
+ A transform is an operation which maps a query model to a new query
+model. It
+is usually triggered by a gesture within the user-interface. For
+example,
+clicking on the Unit Sales column transforms the query
- SELECT {[Measures].[Store Sales], [Measures].[Unit Sales]} ON
- COLUMNS,
- {[Product].Members} ON ROWS
- FROM [Sales]
+ SELECT {[Measures].[Store Sales], [Measures].[Unit
+Sales]} ON COLUMNS,
+ {[Product].Members} ON ROWS
+FROM [Sales]
into one with sorting:
-
- SELECT {[Measures].[Store Sales], [Measures].[Unit Sales]} ON
- COLUMNS,
- Order({[Product].Members}, [Measures].[Unit Sales], ASC) ON ROWS
- FROM [Sales]
+ SELECT {[Measures].[Store Sales], [Measures].[Unit
+Sales]} ON COLUMNS,
+ Order({[Product].Members}, [Measures].[Unit Sales], ASC) ON ROWS
+FROM [Sales]
- Transformations can only modify a query within a cube - it cannot be used to
-change the cube that the query is against or to join two cubes. Similarly, the
-transform package only supports modifying a MDX query model. For example, a
-"drill" transform can not be used to produce a SQL query that returns data
+ Transformations can only modify a query within a cube - it cannot be
+used to
+change the cube that the query is against or to join two cubes.
+Similarly, the
+transform package only supports modifying a MDX query model. For
+example, a
+"drill" transform can not be used to produce a SQL query that returns
+data
outside of the cube.
Package name: org.olap4j.transform
Classes: (incomplete)
+
- Tuple
- Set
@@ -3436,6 +3564,7 @@
+
This section should probably be moved into Section 2.4.
The MDX query language uses a data model based on cubes, dimensions, tuples
@@ -3447,6 +3576,7 @@
dimension. A set is an ordered collection of tuples. An MDX query selects
zero or more axes using a data slicer. (The axes loosely correspond to the "SELECT"
clause in a SQL query, and the slicer to the "WHERE".)
+
@@ -3454,6 +3584,7 @@
Restructuring, Drilling, Scoping.
+
- setSlicer
- Secifies the slicer to use, replacing any current one.
- getSlicer
- Retrieve the current slicer.
@@ -3482,27 +3613,30 @@
+
Navigations that allow a user to move through the levels in a hierarchy. All
drill navigations operate on a single Axis.
-
+
+
- drill
- Moves the specified member up/down one level in the
hierarchy. All members of the hierarchy are replaced by this action.
-
+
Navigations that allow a user to expand/collapse sections of a result set.
All scoping navigations operate on single Axis.
-
+
+
- expand
- Expand the given measure to include both the current
level and all the members one level down
the hierarchy. Optionally expands a single measure or all measures at the
level.
- collapse
- Removes members at a given level of a hierarchy.
Optionally collapses a single measure or all measures at the level.
-
-
+
+
Axis Operations
- getSet
@@ -3541,56 +3675,262 @@
based analysis is so common, and so frequently done wrong. ie if the Axis
is using a time based dimension you can use "setCompareToPreviousTimePeriod()"
instead of having to add the previous time period as a member and calculate
- the change.
+ the change.
- The layout package provides data models for graphical OLAP applications. In
+ NOTE: As of olap4j 1.0, this package
+is experimental and is subject to change in future releases.
+
+ The layout package provides data models for graphical OLAP
+applications. In
particular, the GridModel class provides, for OLAP data, what Swing's
-
-TableModel provides for SQL data.
+ TableModel
+provides for SQL data.
Package name: org.olap4j.layout
Classes: TBD
+
+ 2.10. Scenarios
+
+ NOTE: As of olap4j 1.0, this
+functionality is experimental and is subject to change in future releases.
+
+ Scenarios allow an application to change values of cells. When the
+value of a cell changes, values of related cells also change (parent
+cells, child and descendant cells, and calculated cells).
+
+ Scenarios can therefore be used to perform 'what-if' analysis,
+useful in budgeting or forecasting applications. This functionality is
+commonly called 'write-back' (or sometimes 'writeback' or
+'writethrough'; see for instance
+the wikipedia
+article "Comparison of OLAP Servers"), but we avoid that term because this
+specification does not stipulate that a provider implements scenarios by writing
+the changed values to disk.
+
+ Each scenario has a different set of modifications. There is a base
+scenario where the values are unchanged from the star schema; in this
+scenario, cells cannot be modified.
+
+ A provider may provide
+a [Scenario] dimension for each cube for which scenarios are
+enabled. This dimension contains a member for each scenario that is visible in
+the current access-control context; the name of each member is the value
+returned by the getId() method. The default member of the Scenario
+dimension is the current scenario for the current connection (as set by
+the OlapConnection.setScenario() method).
+
+ The Scenario dimension behaves in the way you would expect. For example, if a
+query contains a slicer WHERE [Scenario].[1] then the cell values
+returned by that query will reflect their values under that scenario. Also, you
+can define cross-dimensional calculations, such as WITH MEMBER [Gain] AS
+([Time].[2011], [Scenario].[1] - [Scenario].[Default Scenario]) , to
+compare values under two or more scenarios.
+
+ A particular provider may provide a
+means to save a scenario. (Say, to modify the fact table, or save the scenario
+to disk in some other format.)
+
+ A particular provider may
+support access control to scenarios. (For example, a particular
+scenario is invisible to role A, visible but read-only to role B, and
+read-write to role C.)
+
+ Methods of the Scenario class:
+
+ String getId() // returns the unique identifier of this scenario
+
+ Other methods relating to scenarios:
+
+ Scenario OlapConnection.createScenario() // creates a scenario
+ void OlapConnection.setScenario(Scenario) // sets the current scenario for this connection
+ Scenario OlapConnection.getScenario() // returns this connection's current scenario
+ void Cell.setValue(Object value, AllocationPolicy allocationPolicy, Object... allocationArgs) // sets the value of a cell
+
+
+ 2.11. Notifications
+
+ NOTE: As of olap4j 1.0,
+this functionality is experimental and is subject to change in future
+releases.
+
+ The CellSetListener interface allows an application to
+receive events when the contents of a CellSet have changed.
+
+ The client can ask the server to provide the listener with a
+specific granularity of events, but the server can decline to provide
+that granularity.
+
+ Fine granularity deals with changes such as cell values changing
+(and reports the before and after value, before and after formatted
+value), positions being deleted, positions being changed.
+
+ When an atomic change happens on the server (say a cache flush, if
+the server is mondrian) then an event will arrive on the client
+containing all of those changes. Although
+CellSetListener.CellSetChange.getCellChanges() and
+CellSetListener.CellSetChange.getAxisChanges() return lists, the
+client should assume that all of the events in these lists occur
+simultaneously.
+
+ At any point, the server is free to throw up its hands and say
+'there are too many changes' by sending null values
+for getCellChanges or getAxisChanges . This
+prevents situations where there are huge numbers of changes that might
+overwhelm the server, the network link, or the client, such as might
+happen if a large axis is re-sorted.
+
+ The client should always be ready for that to happen (even for
+providers that claim to provide fine granularity events), and should
+re-execute the query to get the cell set. In fact, we recommend that
+clients re-execute the query to get a new cellset whenever they get an
+event. Then the client can use the details in the event to highlight
+cells that have changed.
+
+ Methods on interface CellSetListener:
+
+cellSetChanged(CellSetChange) // invoked when a cell set has changed
+cellSetClosed(CellSet) // invoked when a cell set is closed
+cellSetOpened(CellSet) // invoked when a cell set is opened
+
+
+ Methods on interface CellSetChange:
+
+CellSet getCellSet() // returns the cell set affected by this change
+List<CellChange> getCellChanges() // returns a list of cells that have changed, or null if the server cannot provide detailed changes
+List<AxisChange> getAxisChanges() // returns a list of axis changes, or null if the server cannot provide detailed changes
+
+
+ Methods on interface AxisChange:
+
+CellSetAxis getAxis() // returns the axis affected by this change
+Position getBeforePosition() // returns the position before the change; null if the change created a new position
+Position getAfterPosition() // returns the position after the change; null if the change deleted a new position
+
+
+ Methods on interface CellChange:
+
+Cell getBeforeCell() // returns the cell before the change
+Cell getAfterCell() // returns the cell after the change
+
+
+ Other methods:
+
+OlapDatabaseMetaData.getSupportedCellSetListenerGranularities() // returns the granularity of changes to cell sets that the database is capable of providing
+OlapStatement.addListener(Granularity, CellSetListener) // adds a listener to be notified of events to CellSets created by this statement
+
+
+ Notes for implementors
+
+ The purpose of registering a listener before creating a cell set is
+to ensure that no events "leak out" between creating a cell set and
+registering a listener, or while a statement is being re-executed to
+produce a new cell set.
+
+ The cellSetOpened(CellSet)
+and cellSetClosed(CellSet) methods are provided so that
+the listener knows what is going on when a statement is
+re-executed. In particular, suppose a statement receives an change
+event decides to re-execute. The listener is attached to the
+statement, so receives notifications about both old and new cell
+sets. The driver implicitls closes the previous cell set and calls
+cellSetClosed, then calls cellSetOpened with the new cell set.
+
+ If changes are occurring regularly on the server, there will soon
+be a call to
+cellSetChanged(CellSetChange) . It
+is important to note that this event contains only changes that have
+occurred since the new cell set was opened.
+
+ The granularity parameter is provided to
+OlapStatement.addListener(Granularity, CellSetListener)
+for the server's benefit. If granularity is
+only Granularity.COARSE , the server may be able to store
+less information in order to track the cell set.
+
+ 2.12. Drill through
+
+ olap4j provides two ways of drilling through to get the collection of
+atomic rows underlying a given cell.
+
+
+
+- The
Cell.drillThrough() method drills through a given
+cell in the cell set returned by a previously executed statement.
+
+- Execute the
DRILLTHROUGH MDX statement using
+the OlapStatement.executeStatement(String sql)
+method.
+
+
+
+ The DRILLTHROUGH statement is a more powerful
+approach, because it offers options MAXROWS to limit the
+number of rows returned, and RETURN to choose which
+attributes and measures are projected, but not all OLAP servers
+implement it.
+
+ Note that we call the ResultSet
+Statement.executeStatement(String sql) method,
+not CellSet OlapStatement.executeOlapStatement(String
+mdx) , because the result of drillthrough is relational (rows
+and columns), not a dimensional (axes and cells). A statement can be
+created by calling OlapConnection.createStatement() ; even
+though this returns an OlapStatement , the OlapStatement
+is required to implement applicable methods of
+its Statement base class.
+
- In this section we discuss aspects of the design and usage of olap4j which
+
+ In this section we discuss aspects of the design and usage of olap4j which
pervade all of the components.
+
- Metadata elements in olap4j can be localized. Unlike the tables and columns
-model of relational databases and JDBC, elements of an OLAP data model appear on
-the screen of the end-user, and the user expects these elements to appear in his
-or her own language.
- A connection has a locale. For most drivers, this can be initialized using a
-connection parameter called Locale . The locale can be overridden by
-calling OlapConnection.setLocale(Locale) .
- Metadata elements Cube, Dimension, Hierarchy, Level, Member and so forth have
-methods getCaption and getDescription (inherited from
-
-MetadataElement) which take a locale as a parameter. If the parameter locale
-is null, the connection's locale is used.
- Suppose one cube is available in English and French, and in French and
-Spanish, and both are shown in same portal. Clients typically say that seeing
-reports in a mixture of languages is confusing; the portal would figure out the
-best common language, in this case French. The
-Cube and
-Schema objects have
-getSupportedLocales() methods for this purpose.
-
- The JDBC 4.0 specification describes the thread-safety requirements for
-drivers, and what modes of concurrency JDBC applications can assume that their
-drivers will support. Since the olap4j specification is an extension to the JDBC
-specification, an olap4j driver must comply with the JDBC specification in this
-regard.
+
+ Metadata elements in olap4j can be localized. Unlike the tables and
+columns model of relational databases and JDBC, elements of an OLAP
+data model appear on the screen of the end-user, and the user expects
+these elements to appear in his or her own language.
+
+ A connection has a locale. For most drivers, this can be initialized
+using a connection parameter called Locale . The locale
+can be overridden by calling OlapConnection.setLocale(Locale) .
+
+ Metadata elements Cube, Dimension, Hierarchy, Level, Member and so
+forth have methods getCaption and getDescription
+(inherited from
+MetadataElement).
+The values returned from these methods depend on the locale of the connection.
+
+ Suppose one cube is available in English and French, and in French
+and Spanish, and both are shown in same portal. Clients typically say
+that seeing reports in a mixture of languages is confusing; the portal
+would figure out the best common language, in this case French. The
+Cube
+and Schema
+objects have getSupportedLocales() methods for this purpose.
+
+
+
+ The JDBC 4.0 specification describes the thread-safety requirements
+for drivers, and what modes of concurrency JDBC applications can assume
+that their drivers will support. Since the olap4j specification is an
+extension to the JDBC specification, an olap4j driver must comply with
+the JDBC specification in this regard.
+
+
The JDBC specification provides the
-
-Statement.cancel() method, so that a statement which is executing in one thread may be safely terminated by another
-thread; and
-
-Statement.setQueryTimeout(int seconds), to request that a statement aborts
-itself after executing for a certain period of time.
+ Statement.cancel()
+method, so that a statement which is executing in one thread may be
+safely terminated by another thread; and
+ Statement.setQueryTimeout(int
+seconds), to request that a statement aborts itself after executing
+for a certain period of time.
@@ -3604,7 +3944,7 @@
of tests which can be used to verify the compliance of an implementation of the
API.
-
+
The XML/A provider is an implementation of the olap4j API which talks to a
generic XML/A provider.
@@ -3612,14 +3952,16 @@
Since there are many XML/A providers, and some of them require requests in a
particular format and/or produce idiosyncratic responses, the XML/A provider
will come in several flavors.
- The XML/A provider is being developed in the same source-code repository as
-olap4j, in a Java package org.olap4j.driver.xmla , but is not part
+
+ The XML/A provider is being developed in the same source-code repository as
+olap4j, in a Java package org.olap4j.driver.xmla , but is not part
of the olap4j specification or release.
Here are some of the areas of functionality which will not be part of
olap4j:
+
- Schema reader parses an XML file to create a schema
- Cache management functions
@@ -3633,32 +3975,36 @@
+The Mondrian project contains an implementation of the olap4j
+API based on
+the Mondrian OLAP engine, namely the mondrian.olap4j.MondrianOlap4jDriver driver. It is the reference implementation of olap4j.
+
+
-The Mondrian project will contain an implementation of the olap4j API based on
-the Mondrian OLAP engine.
-This code is currently being developed the same source-code repository as
-olap4j, and is the reference implementation of olap4j. The code will be
-contributed to the mondrian project in the mondrian-3.0 release, when olap4j
-will become mondrian's primary API, and the mondrian team will take over the development
-of the mondrian provider.
-
-
-We intend to create an a driver which implements the olap4j API on top of any
-XML/A data source.
-This code is currently being developed in the same source-code repository as
-olap4j, but will never be part of any olap4j release, and will be spun off as a
-separate project before olap4j 1.0.
+We intend to create an a driver which implements the olap4j API on
+top of any XML/A data source.
+
+This code is currently being developed in the same source-code
+repository as olap4j, but will be spun off as a separate project at some point.
-In principle, providers could be created to other OLAP data sources. This
-would be particularly straightforward for servers which already have a native
-Java API.
+In principle, providers could be created to other OLAP data
+sources. This would be particularly straightforward for servers which
+already have a native Java API.
+
+6.4 xmla4js
-
+xmla4js is a JavaScript front-end to XML/A.
-The following are features which have been suggested for inclusion in the
-olap4j specification, but which are not part of the current version. They may be
+
+
+
+The following are features which have been suggested for inclusion
+in the
+olap4j specification, but which are not part of the current version.
+They may be
included in future revisions of the specification.
A.1. Date and Time types
@@ -3675,14 +4021,6 @@ A.2. Schema notification
those changes are.
(Richard Emberson, 2006/8/15)
-A.3. Writethrough/Writeback
-Specify how clients can write cell values back to the database. Useful for
-budgeting applications and 'what if?' analysis.
-(PALO, 2006/10/14)
-A.4. Drillthrough
-Mondrian exposes the SQL statement used to form the result set, and exposes
-the mapping from columns to members/levels, whereas olap4j currently only
-returns a result set.
@@ -3703,76 +4041,76 @@
-D.1. To be specified
-
-[Method for richer query of members, analogous to OlapDatabaseMetaData.getMembers(). Maybe extend Cube.lookupMember. Something with a treeop.]
-[Discuss thread safety of connections, statements, result sets.]
-[API for canceling statements.]
-[2006/10/20#1. Specification should include compliance levels, like the SQL
-specification does. In particular, we will allow providers to comply with a
-limited subset of MDX.]
-[2006/10/20#3. Need to allow clients to access the members on a ResultAxis
-via a list (for convenience) and via an iterator. Iterators need to be
-restartable, but not bidirectional. Need to know the size of the axes, even if
-using the iterator interface.]
-[2006/10/20#6. We discussed session support. It is necessary for write-back.
-JDBC's 'stateful session' is difficult to implement over a stateless protocol
-like HTTP. Michael suggested adding 'session name' as a parameter to 'execute'
-methods. Julian disagreed. No conclusion reached.]
-[2006/10/20#7. We discussed the goals and intended audience of olap4j. The
-audience spans from a beginner's audience (only 2 hours experience with the API)
-who don't want to write a lot of code, to writers of clients (2 yrs experience
-with the API) who want performance and don't care how much code they need to
-write. Distributed clients (e.g. olap4j provider for XMLA) have bandwidth
-constraints. Mobile clients also have memory constraints.
-ADOMD addressed beginners audience well, but used a lot of memory. Challenge
-is to support an object model (hence easy programming model) without increasing
-memory. No specific change to the specification, but decided to add memory
-efficiency as a design goal.]
+D.1. To be specified[2006/10/20#3. Need to allow clients to access the members on a
+ResultAxis via a list (for convenience) and via an iterator. Iterators
+need to be restartable, but not bidirectional. Need to know the size of
+the axes, even if using the iterator interface.]
+
+[2006/10/20#6. We discussed session support. It is necessary for
+write-back. JDBC's 'stateful session' is difficult to implement over a
+stateless protocol like HTTP. Michael suggested adding 'session name'
+as a parameter to 'execute' methods. Julian disagreed. No conclusion
+reached.]
+
+[2006/10/20#7. We discussed the goals and intended audience of
+olap4j. The audience spans from a beginner's audience (only 2 hours
+experience with the API) who don't want to write a lot of code, to
+writers of clients (2 yrs experience with the API) who want performance
+and don't care how much code they need to write. Distributed clients
+(e.g. olap4j provider for XMLA) have bandwidth constraints. Mobile
+clients also have memory constraints.
+
+ADOMD addressed beginners audience well, but used a lot of memory.
+Challenge is to support an object model (hence easy programming model)
+without increasing memory. No specific change to the specification, but
+decided to add memory efficiency as a design goal.]
+
D.2. Design notes
-JDK.
+
+
We are targeting JDK 1.5, and running retroweaver for
backward compatibility for JDK 1.4. See forum thread:
olap4j, JDK 1.5 and generics.
We also support JDK 1.6, and with it JDBC 4.0.
+
Result sets, random access, and memory usage
-Should result sets return their axes as cursors or collections? Cursors
+
+ Should result sets return their axes as cursors or collections? Cursors
require less memory, but collections provide an easier programming model.
-Also on the subject of memory, how to represent the metadata? Schema result
-sets require less memory, are more flexible, and have better defined semantics
-in the presence of transactions and offline working; but an object model (Cube,
+
+ Also on the subject of memory, how to represent the metadata? Schema result
+sets require less memory, are more flexible, and have better defined semantics
+in the presence of transactions and offline working; but an object model (Cube,
Dimension, Level) provides an easier programming model.
+
Accessing cells
-It would be possible to access cells in a result set (a) by ordinal; (b) by
-coordinates; (c) by the 'etchasketch' model determined by the position of the
-iterator along each axis, as used by JOLAP. We decided to support (a) and (b)
-but not (c). There are methods on CellSet to convert from ordinal to
+
+ It would be possible to access cells in a result set (a) by ordinal; (b) by
+coordinates; (c) by the 'etchasketch' model determined by the position of the
+iterator along each axis, as used by JOLAP. We decided to support (a) and (b)
+but not (c). There are methods on CellSet to convert from ordinal to
coordinates and vice versa.
-If there is a huge number of cells, the client has limited memory, and
-bandwidth to the server is limited, random access to cells is costly. Michael
-suggested that we add a method List<Cell> getCells(int startOrdinal, int
-endOrdinal) , which matches XML/A behavior, but we declined to add it to the spec
-for now. John drew the analogy of a modern file system, implementing a serial
-access interface (streams) on top of random-access primitives. For now, we
-support only random access, but suggest that the provider looks for patterns of
+
+ If there is a huge number of cells, the client has limited memory, and
+bandwidth to the server is limited, random access to cells is costly. Michael
+suggested that we add a method List<Cell> getCells(int startOrdinal, int
+endOrdinal) , which matches XML/A behavior, but we declined to add it to the spec
+for now. John drew the analogy of a modern file system, implementing a serial
+access interface (streams) on top of random-access primitives. For now, we
+support only random access, but suggest that the provider looks for patterns of
access.
1. XMLA: XML for
Analysis Specification, version 1.1.
+
+
- - Rename OlapResultSet to CellSet, OlapResultSetMetaData to
- CellSetMetaData, OlapResultAxis to CellSetAxis, ResultCell to Cell,
- ResultSetPosition to Position.
- - Removed class org.olap4j.metadata.Database; it was not adding much value
- over OlapDatabaseMetaData, and was confusing because Database is a synonym
- for Catalog in some servers.
- - Removed class Olap4j; unwrapping of Connections etc. is now provided
- using java.sql.Wrapper.unwrap.
+- Version 1.0.
diff --git a/doc/olap4j_fs.pdf b/doc/olap4j_fs.pdf
index 223b8bc198396e4b514962ed0a33a30512ffc755..f89d9e35b42c8d62d49e18b260fc22b8e7a8b6c5 100644
GIT binary patch
literal 654846
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 |