There are several ways. If you have a fixed set of queries which you'd like to display as HTML tables, use the tab library. webapp/taglib.jsp is an example of this.
The JPivot project (http://jpivot.sourceforge.net) is a JSP-based pivot table, and will allow you to dynamically explore a dataset over the web. It replaces the prototype pivot table webapp/morph.jsp.
Pentaho Analysis Tool is an AJAX-based client.
You could also build a pivot table in a client technology such as Swing.
Mondrian's main API is olap4j., an extension to JDBC for OLAP applications.
Mondrian also has a provider for XML for Analysis.
Historically, Mondrian had its own API, consisting of classes in the mondrian.olap package. That API has been deprecated since mondrian-3.0, and may change or be removed without warning in future versions. JPivot still uses it.
See MDX language specification.
Not very much.
StrToSet()
and StrToTuple()
functions take
an extra parameter.Param()
and ParamRef()
allow
you to create parameterized MDX statements.todo: User-defined functions
todo: Cell readers
todo: Member readers
Yes, if your RDBMS can. We delegate the aggregation to the RDBMS, and if your RDBMS happens to have materialized group by views created, your query will fly. And the next time you run the same or a similar query, that will really fly, because the results will be in the aggregation cache.
See Configuring log4j within Mondrian's environment.
The syntax of the connect string is described in the Configuration guide.
We have a roadmap of planned and not-yet-planned features.
Recommended books:
Microsoft Analysis Services has excellent online documentation of MDX, including a list of MDX functions.
We'd love to hear what you liked and didn't like about it. Post questions and comments to the forum. If you can think of ways that Mondrian can be improved, roll up your sleeves and help make it better!
If you modify Mondrian's source code, you are required by the terms of the Eclipse Public License to release your changes under that license (though not necessarily to the Mondrian project). Applications built on top of Mondrian, or plug-ins into Mondrian such as user-defined functions, do not need to be released open-source. But we'd appreciate any contributions, and of course, contributing your changes will make it easier for you to maintain your application when we release new versions of Mondrian.
I am trying to build a cube with measures from 2 different tables. I have tried a virtual cube, but it does not seem to work - it only relates measures and dimensions from the same table. Is there a way to specify that a measure is not coming from the fact table? Say using SQL select?
Virtual cubes sound like the right approach. The way to do it is to first create a dummy cube on your lookup table, with dimensions for as many columns as are applicable. (A classic example of this kind of cube is an 'ExchangeRate' cube, whose only dimensions are time and currency.)
Then create a virtual cube of the dummy cube and the real cube (onto your fact table).
Note that you will need to use shared dimensions for the cubes to join implicitly.
Use the <View> element INSTEAD OF the <Table> element. You need to specify the 'alias' attribute, which Mondrian uses as a table alias.
The XML 'CDATA' construct is useful in case there are strange characters in your SQL, but isn't essential.
<View alias="DFACD_filtered">
<SQL dialect="generic">
<![CDATA[select * from DFACD where CSOC = '09']]>
</SQL>
</View>
Consider this scenario. I have created some tables in Oracle, like this:
CREATE TABLE sales (
prodid INTEGER,
day INTEGER,
amount NUMBER);
and referenced it in my schema.xml like this:
<Cube name="Sales">
<Table name="sales"/>
...
<Measure name="Sales" column="amount" aggregator="sum"/>
<Measure name="Sales count" column="prodid" aggregator="count"/>
</Cube>
Now I start up Mondrian and get an error
ORA-00942: Table or view "sales" does not exist
while executing the
SQL statement
SELECT "prodid", count(*) FROM "sales" GROUP BY "prodid"
. The query
looks valid, and the table exists, so why is Oracle giving an error?
The problem is that table and column names are case-sensitive. You told Mondrian to look for a table called "sales", not "SALES" or "Sales".
Oracle's table and column names are case-sensitive too, provided that you enclose them in double-quotes, like this:
CREATE TABLE "sales" (
"prodid" INTEGER,
"day" INTEGER,
"amount" NUMBER);
If you omit the double-quotes, Oracle automatically converts the identifiers
to upper-case, so the first CREATE TABLE
command actually created a
table called "SALES". When the query gets run, Mondrian is looking for a table
called "sales" (because that's what you called it in your schema.xml), yet
Oracle only has a table called "SALES".
There are two possible solutions. The simplest is to change the objects to upper-case in your schema.xml file:
<Cube name="Sales">
<Table name="SALES"/>
...
<Measure name="Sales" column="AMOUNT" aggregator="sum"/>
<Measure name="Sales count" column="PRODID" aggregator="count"/>
</Cube>
Alternatively, if you decide you would like your table and column names to be
in lower or mixed case (or even, for that matter, to contain spaces), then you
must double-quote object names when you issue CREATE TABLE
statements to Oracle.
For example:
"SchemaTreeModel.java": Error #: 302 : cannot access class MondrianDef.Schema; java.io.IOException: class not found: class MondrianDef.Schema at line 29, column 14
You can't just compile the source code using your IDE; you must build using
ant, as described in the build instructions. This is
because several Java classes, such as mondrian.olap.MondrianDef
(as
in this case), mondrian.olap.MondrianResource
and
mondrian.olap.Parser
are generated from other files. I recommend that you
do ant clean
before trying to build again.
Another example:
"NamedObject.java": Error #: 704 : cannot access directory javax\jmi\reflect at line 4, column 1
You don't have the correct JAR files (in this case, lib/jmi.jar
)
on your classpath. Again, you should have followed the
build instructions. This problem often happens when people try to build
using an IDE. You must use ant for the first ever build, but you may be able to
setup your IDE to do incremental builds.
Mondrian uses a cache to improve performance. The first time you run a query, Mondrian will execute various SQL statements to load the data (you can see these statements by turning on tracing). The next time, it will use the information in the cache. See caching design for more information.
If the data in the RDBMS is modified, Mondrian does not know unless you tell it using the cache control API, and will continue to answer queries using stale data in its cache.
By the way, if you are using the JPivot web UI and refresh the browser, that does not help; it will simply regenerate the web page, not flush the cache.
Question:
I am using an MDX query with a calculated "aggregate" member. It aggregates the values between Node A and Node B. The dimension that it is aggregating on is a Time dimension. This Time dimension has a granularity of one minute. When executing this MDX query, the performance seems to be fairly bad.
Here is the query:
WITH MEMBER [Time].[AggregateValues] AS
'Aggregate([Time].[2004].[October].[1].[12].[10]
:
[Time].[2004].[October].[20].[12].[10])'
SELECT [Measures].[Volume] ON COLUMNS,
NON EMPTY {[Service].[Name].Members} ON ROWS
WHERE ([Time].[AggregateValues])
Is this normal behavior? Is there any way I can speed this up?
Answer:
The performance is bad because you are pulling 19 days * 1440 minutes per day = 27360 cells from the database into memory per cell that you actually display. Mondrian is a lot less efficient at crunching numbers than the database is, and uses a lot of memory.
The best way to improve performance is to push as much of the processing to the database as possible. If you were asking for a whole month, it would be easy:
WITH MEMBER [Time].[AggregateValues]
AS 'Aggregate({[Time].[2004].[October]})'
SELECT [Measures].[Volume] ON COLUMNS,
NON EMPTY {[Service].[Name].Members} ON ROWS
WHERE ([Time].[AggregateValues])
But since you're working with time periods which are not aligned with the dimensional structure, you'll have to chop up the interval:
WITH MEMBER [Time].[AggregateValues]
AS 'Aggregate({
[Time].[2004].[October].[1].[12].[10]
: [Time].[2004].[October].[1].[23].[59],
[Time].[2004].[October].[2]
: [Time].[2004].[October].[19],
[Time].[2004].[October].[20].[0].[00]
: [Time].[2004].[October].[20].[12].[10]})'
SELECT [Measures].[Volume] ON ROWS,
NON EMPTY {[Service].[Name]}
WHERE ([Time].[AggregateValues])
This will retrieve a much smaller number of cells from the database — 18
days + no more than 1440 minutes — and therefore do more of the heavy lifting
using SQL's GROUP BY
operator. If you want to improve it still further,
introduce hourly aggregates.
Q. I saw the perforce files, but a I couldn't find where to register and get new user, or the instructions that you have mentioned above.
A. Ask the project administrators (Julian) to register you. I would suggest that you start with guest level access and let's see if you need update access later. For more information, see the developer's guide.
Q. Do you have some model for development environment (e.g. eclipse 3.4 + ant 1.7 + jboss x.x + .....)?
A. Using Eclipse for Mondrian development works fine. There is an Eclipse Perforce plug-in, too, but you can use the Perforce client outside of Eclipse. Some people use IntelliJ IDEA (which is free for open-source use).
As a test web-server, most people use Tomcat 5.5.
Q. Are all the updated documentation in the perforce server? How could I get more materials, howtos, etc. to reduce my learning curve?
A. As with any open source project, the documentation is the web site (which is source-controlled in Perforce too), the forums and mailing lists, the test suite and the code.
Also, use Google, and learn How To Ask Questions The Smart Way.
Q. How could I enroll myself into Mondrian project?
A. First, join the community. Sign up as a user in the Pentaho developer community. Subscribe to the Mondrian mailing list, read the Mondrian forum regularly, and start answering questions.
Also, there are a lot of Mondrian related questions from the JPivot and Pentaho Analysis Tool projects. Consider joining those projects too.
We don't give people committer rights (privilege to check directly into the perforce source code system) until they have made a few contributions. So, fix a few bugs, and post them to the developer list mondrian@pentaho.org. If you're thinking of implementing a major feature, discuss it with the developers before you start work, so you do it consistent with the architecture.
Author: Julian Hyde; last modified May 2009.
Version: $Id: //open/mondrian/doc/faq.html#25 $
(log)
Copyright (C) 2002-2009 Julian Hyde