Thriller is a Java JDBC driver that executes MDX queries against an Essbase server, then maps the results back to a traditional JDBC ResultSet. It can be dropped in to such tools as ODI, FDMEE, JDBC-based database clients such as RazorSQL and SQuirreL, or just used with Java.

Currently, Thriller is not publicly available. Please email me if you’d like to use it.

Getting Started with Java

You can use the Thriller driver as you would any other JDBC driver. The JDBC URL syntax includes the server name, application, and cube to connect to, as shown here:

<br />
String embeddedSampleBasic = &quot;jdbc:essbase:thriller://epm11124/Sample.Basic&quot;;<br />
Class.forName(&quot;com.jasonwjones.hyperion.thriller.ThrillerDriver&quot;);<br />
Connection conn = DriverManager.getConnection(embeddedSampleBasic, &quot;admin&quot;, &quot;password&quot;);<br />

The Thriller JAR file should be on your class path. After creating the connection you can execute a query and fetch the result set.

Using in a Database Tool

Add the Thriller JAR file, specify the class name, and add other parameters as you normally would. In RazorSQL, your connection configuration might look like this:

RazorSQL connection configuration

RazorSQL connection configuration

You can try out the following query against Sample/Basic to see if things are working:

<br />
/**<br />
*<br />
* -- column.1.name = ENTITY<br />
* -- column.1.type = VARCHAR<br />
* -- column.2.name = ACCOUNT<br />
* -- column.2.type = VARCHAR<br />
* -- column.3.name = PERIOD<br />
* -- column.3.type = VARCHAR<br />
* -- column.4.name = VIEW<br />
* -- column.4.type = VARCHAR<br />
* -- column.5.name = AMOUNT<br />
* -- column.5.type = DECIMAL<br />
* -- column.5.precision = 9<br />
* -- column.5.scale = 2<br />
*<br />
* -- thriller.print-tuple-member-separately = true<br />
* -- thriller.header-tuple-separator = |<br />
*/</p>
<p>SELECT<br />
  {[Actual]}<br />
ON COLUMNS,<br />
  Non Empty(<br />
    Generate(<br />
      {Order(Uda([Market],&quot;Major Market&quot;),[Market].CurrentMember.MEMBER_NAME)}<br />
      ,CrossJoin({[Market].CurrentMember},Union(CrossJoin(Descendants([Profit],[Measures].Levels(0))<br />
      ,CrossJoin(Descendants([Year],[Year].Levels(0)),{[100]}))<br />
      ,Union(CrossJoin(Descendants([Total Expenses],[Measures].Levels(0))<br />
      ,CrossJoin(Descendants([Year],[Year].Levels(0)),{[100]}))<br />
      ,CrossJoin(Descendants([Inventory],[Measures].Levels(0))<br />
      ,CrossJoin(Descendants([Year],[Year].Levels(0)),{[200]})))))<br />
    )<br />
  )<br />
ON ROWS<br />
FROM Sample.Basic<br />