[Olap4j-devel] [Mondrian] Convert Connection to OlapConnection

Julian Hyde jhyde at pentaho.com
Wed Apr 7 14:04:15 EDT 2010


You should be able to use the olap4j public API for this. Hand-parsing, as
you correctly observe, is brittle, and we made the parser part of the public
API to solve this problem. 
 
Create an olap4j connection, downcast to OlapConnection, then call
getParserFactory(), call createParser on that factory, then use the parser
to parse a string. Your code does not need to reference DefaultMdxPArserImpl
at all.
 
Note that after you have manipulated the parse tree, you can re-creeate the
MDX by calling String ParseTreeNode.unparse(ParseTreeWriter).
 
And also node that you can create parse trees 'by hand' without using a
parser.
 
If you are using the mondrian olap4j driver the olap4j connection will
contain a mondrian connection. You can unwrap it using the following code:
 
java.sql.Connection olap4jConnection;
mondrian.olap.Connection mondrianConnection =
  olap4jConnection.unwrap(mondrian.olap.Connection.class);
 
The connection will be an instance of
mondrian.olap4j.MondrianOlap4jConnection but, as with DefaultMdxParserImpl,
your code never needs to (nor should) reference that class directly.
 
Julian
 


  _____  

From: Josh Chappelle [mailto:jchappelle at 4redi.com] 
Sent: Wednesday, April 07, 2010 7:35 AM
To: jhyde at pentaho.com; 'Mondrian developer mailing list'; 'Luc Boudreau'
Cc: olap4j-devel at lists.sourceforge.net
Subject: RE: [Olap4j-devel] [Mondrian] Convert Connection to OlapConnection



The gui use case is exactly what we are doing. We have a web based
application and we use wicket for our presentation layer. We have created a
primitive mdx designer to create mdx views and save the mdx string to a
database. When the user wants to edit the mdx then it poses an issue of
parsing. We can do some ugly string manipulation but it starts to get ugly
and as we all know that kind of thing is brittle. That's why we need the
parser. I'm assuming I can create a ParseTreeVisitor implementation that can
parse the string and build up our objects.

 

If there is another class that is better suited for that please feel free to
let me know.

 

Thanks,

 

Josh


  _____  


From: mondrian-bounces at pentaho.org [mailto:mondrian-bounces at pentaho.org] On
Behalf Of Julian Hyde
Sent: Tuesday, April 06, 2010 8:57 PM
To: 'Luc Boudreau'
Cc: olap4j-devel at lists.sourceforge.net; 'Mondrian developer mailing list'
Subject: RE: [Olap4j-devel] [Mondrian] Convert Connection to OlapConnection

 

I agree with the 4 bundles of functionality you have proposed. But did you
realize that the parser bundle is already present? It's in the
org.olap4j.mdx.parser package:

 

http://www.olap4j.org/api/org/olap4j/mdx/parser/package-summary.html

 

The GUI use case you cite is a good one. But it can be done today using
MdxParser, MdxParserFactory, and the parse tree object model classes in the
org.olap4j.mdx package. And by the way, to get a parser factory, you call
OlapConnection.getParserFactory.

 

Behind the scenes, the olap4j driver is probably using DefaultMdxParserImpl.
(It is for both olap4j drivers that exist today.) But the app does not need
to know about DefaultMdxParserImpl in order to do what it needs to do, only
MdxParser.

 

Julian

 


  _____  


From: Luc Boudreau [mailto:lucboudreau at gmail.com] 
Sent: Tuesday, April 06, 2010 6:28 PM
To: jhyde at pentaho.com
Cc: Mondrian developer mailing list; olap4j-devel at lists.sourceforge.net
Subject: Re: [Olap4j-devel] [Mondrian] Convert Connection to OlapConnection


Database drivers who implement their own parser and grammar are free to not
use the one provided by olap4j. An OlapConnection still has to provide a
parser factory to public code. Nothing should change there. Yet this does
not constitute an argument for not exposing the internal parser. Olap4j
contains the only MDX parser available as far as I know and it would be a
shame to bury it at the bottom of the library.

I agree with keeping DefaultMdxParserImpl part of the SPI only. There is no
need to expose it and as I said in my previous email, I'd much rather see a
unified standard way of obtaining a MdxParser implementation. I'm not
talking about core API changes. Here's a very common and realistic use case
for it; a syntax-aware GUI editor for MDX queries which is not a query tool.

If your objection is related to the separation of intent of the different
components of olap4j, then I can assure you that I am fully aware of the
mixup that is already in place. Olap4j includes already an four distinctive
components bundled together... We talked about separating those in the past
and never got to doing it. Should we decide to do the actual work, I believe
that the natural separation of components should be as follows.

*	API (org.olap4j.* pagkages, minus the ones below)
This is the bulk of the olap4j code. 

*	XML/A Generic Driver (org.olap4j.driver.xmla.*)
The XML/A driver depends on the API only. 

*	Query Model (org.olap4j.query.*)
The query model classes would depend on the API only. 

*	MDX Parser (some package that is non existent yet)
The MDX parser would be a very simplistic wrapper over the default parser
SPI classes and exposed as a MdxParser factory. It would depend on the API
core only. 

Each of those components can be part of the olap4j source tree for now, but
I'd like to take the opportunity to initiate a discussion about their
separation and get feedback about the ramifications. I don't mind doing the
actual work.

_____________________________
Luc Boudreau



On Tue, Apr 6, 2010 at 7:49 PM, Julian Hyde <jhyde at pentaho.com> wrote:

I stand by the comments I made in that forum post. MdxParser is part of
olap4j's public API, but DefaultMdxParserImpl is not and will never be.

 

http://www.olap4j.org/api/org/olap4j/mdx/parser/package-summary.html

 

The public API, remember, is for people building OLAP applications. To them,
olap4j needs to look like JDBC, but with one exception. JDBC drivers don't
supply a SQL parser, but parsing is more important to MDX applications so
every olap4j driver must supply an MDX parser that implements the MdxParser
interface.

 

The other important audience is developers of drivers. To a limited extent,
the olap4j code base gives them an SPI to help them build drivers.
DefaultMdxParserImpl is part of that SPI, as are the classes in
org.olap4j.impl. We will try to keep the SPI stable as olap4j eveolves but
we won't bust a gut over it.

 

Remember that different drivers might be talking to different OLAP engines,
and different engines have different dialects of MDX, so naturally the
driver writers might want to create their own parser. They can write a
parser from scratch, or they can start with the default MDX parser.

 

If you want to dismember the olap4j project to get the MDX parser, then go
ahead. olap4j is after all an open source project. But you're on your own.
You are in a small minority of olap4j users, and we don't intend to change
the olap4j API for your benefit.

 

It sounds like 

 

Julian

 

 


  _____  


From: Luc Boudreau [mailto:lucboudreau at gmail.com] 
Sent: Tuesday, April 06, 2010 3:58 PM
To: Mondrian developer mailing list
Cc: olap4j-devel at lists.sourceforge.net
Subject: Re: [Olap4j-devel] [Mondrian] Convert Connection to OlapConnection


As of olap4j revision 307 (
http://olap4j.svn.sourceforge.net/viewvc/olap4j?view=rev
<http://olap4j.svn.sourceforge.net/viewvc/olap4j?view=rev&revision=307>
&revision=307 ) the default MDX parser does not depend on OlapConnection. It
should not have been dependent on it in the first place. 

Mondrian developers: please modify the olap4j connection implementation and
remove the now deprecated call to DefaultMdxParserImpl(OlapConnection).
Modifications to the generic XML/A driver have already been performed.

This does not mean that DefaultMdxParserImpl is part of the public API yet.
There should be a default parser factory exposed to developers. In the
meanwhile, developers can directly instantiate it, but be advised that we do
not provide any guarantees on this object's signature and we reserve the
right to modify it in the future. To create a parser, developers can call
the empty constructor.

A compiled binary which includes those changes can be picked from the CI
server as of now :

http://ci.pentaho.com/view/Analysis/job/olap4j/258/

_____________________________
Luc Boudreau



On Tue, Apr 6, 2010 at 5:38 PM, Luc Boudreau <lucboudreau at gmail.com> wrote:


This topic was discussed in olap4j forums.

http://sourceforge.net/projects/olap4j/forums/forum/577988/topic/3545015

Although Julian's last comment mentioned that the parser is not officially
part of the public API, I for one would like to make it part of the public
API. There are many use cases for it and your request confirms it.

I'll see what I can do to detach the parser from the connection classes.

_____________________________
Luc Boudreau



On Tue, Apr 6, 2010 at 5:32 PM, Josh Chappelle <jchappelle at 4redi.com> wrote:

Hi,

 

We have a need to use the MdxParser component from the Olap4j project.
However up until this point we have not been using olap4j at all. To
instantiate a DefaultMdxParserImpl you have to provide an
org.olap4j.OlapConnection object in the constructor. Our software is using a
mondrian.olap.Connection. Is there a way to convert between these two
connection objects? If not does it mean that we will have to use the
org.olap4j.OlapConnection in order to use the MdxParser?

 

Thanks,

 

Josh 

 

_______________________________________________
Mondrian mailing list
Mondrian at pentaho.org
http://lists.pentaho.org/mailman/listinfo/mondrian

 

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.pentaho.org/pipermail/mondrian/attachments/20100407/b09b68ba/attachment.html 


More information about the Mondrian mailing list