This tag renders an org.olap4j.CellSet instance. It mimics someway the behavior of <h:dataTable>: provides the main structure for displaying the CellSet and allows
the page designer to specify the contents for each part of the table.
The tag’s structure is as follows:
<olap:cellSet value=”…” var=”cell”>
<olap:columnAxis>
<f:facet
name=”header”>
<!—
This content
is rendered in the headers
of the column axis dimensions
-->
</f:facet>
<!—
This content is rendered in the members
of the column axis dimensions
-->
</olap:columnAxis>
<olap:rowAxis>
<f:facet
name=”header”>
<!—
This content
is rendered in the headers
of the row axis dimensions
-->
</f:facet>
<!—
This content is rendered in the members
of the row axis dimensions
-->
</olap:columnAxis>
<olap:dataCell>
<!—
This content is rendered in the cells
of the CellSet
-->
</olap:dataCell>
</olap:cellSet>
This markup would produce the following
HTML table, where the background color of the cell identifies the markup piece
used to generate its content
Region
|
|||||
USA
|
Canada
|
||||
Measures
|
|||||
Gender
|
Promotions
|
Unit Sales
|
Store Cost
|
Unit Sales
|
StoreCost
|
Male
|
TV Spot
|
0
|
0
|
0
|
0
|
Newspaper Ad
|
0
|
0
|
0
|
0
|
|
Female
|
TV Spot
|
0
|
0
|
0
|
0
|
Newspaper Ad
|
0
|
0
|
0
|
0
|
The var attribute in the cellSetTable tag
allows the page to use its value as a variable in EL expressions used within
the children of the cellSetTable. This variable will refer to an instance of the CellSetItemInfo interface
defined as follows:
interface CellSetItemInfo {
public
Hierarchy getHierarchy();
public
Member getMember();
public
List<Member> getPosition();
public Cell getData()
public Axis getAxis();
}
The following table shows, for each
property of this instance, he areas of the table where such a property is
non-null
axis
|
hierarchy
|
position
|
member
|
cell
|
The code below shows a simple example for a
<olap:cellSetTable>
<olap:cellSetTable value=”#{olapSample.cellSet}”
var=”cell”>
<olap:columnAxis>
<f:facet name=”header>
<h:outputText value=”#{cell.hierarchy.caption}”/>
</f:facet>
<h:outputText value=”#{cell.member.caption}”/>
</olap:columnAxis>
<olap:rowAxis>
<f:facet name=”header>
<h:outputText value=”#{cell.hierarchy.caption}”/>
</f:facet>
<h:outputText value=”#{cell.member.caption}”/>
</olap:rowAxis>
<olap:dataCell>
<h:outputText value=”#{cell.data.formattedValue}”/>
</olap:dataCell>
</olap:cellSetTable>
The managed bean providing the CellSet would
have the following structure.
@ManagedBean
@RequestScoped
public OlapSample {
private OlapConnection cn;
@PostConstruct
public void init() {
Connection jdbcCn = DriverManager.getConnection(“The olap4j
connection string goes here”);
cn = jdbcCn.unwrap(OlapConnection.class);
}
@PreDestroy
public void tearDown() {
if ( cn != null )
cn.close();
}
public CellSet getCellSet() {
return cn.createStatement().executeOlapQuery(“The MDX query goes here”);
}
}
I use a RequestScoped in combination with @PostConstruct
and @PreDestroy
methods to open a connection to the olap4j server before any use of the bean,
and close that connection once the request process lifecycle has ended.
In a real-world example the connection can
be retrieved lazily, and we can store the resulting CellSet in a field to avoid
executing the same query several times within the same request.
No comments :
Post a Comment