<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-5672165237896126100</id><updated>2009-12-08T15:43:15.114-08:00</updated><title type='text'>Julian Hyde on Open Source OLAP. And stuff.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default?start-index=26&amp;max-results=25'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>87</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-7659511255445702349</id><published>2009-12-08T12:14:00.000-08:00</published><updated>2009-12-08T12:47:28.653-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source BI survey COSS'/><title type='text'>Survey of open source business intelligence adoption</title><content type='html'>A &lt;a href="http://www.pentaho.com/news/releases/20091208_pentaho_dominates_osbi_adoption.php"&gt;new research report&lt;/a&gt; published by &lt;a href="http://www.b-eye-network.com/"&gt;BeyeNETWORK&lt;/a&gt; analyzes people's use of open source BI. It is gratifying to see Pentaho, and Pentaho projects Mondrian and Kettle, at the top of their categories. Weka, another Pentaho project, is a a narrow second to R for statistics/data mining.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BVv0WTpeWTs/Sx651-Gvi3I/AAAAAAAAAEE/_xK7EFoJNiM/s1600-h/osbi-products.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 122px;" src="http://3.bp.blogspot.com/_BVv0WTpeWTs/Sx651-Gvi3I/AAAAAAAAAEE/_xK7EFoJNiM/s200/osbi-products.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5412968139001400178" /&gt;&lt;/a&gt;With 1,000 respondents in small, medium and large companies, this is not a small survey. Pentaho's dominance across several categories makes &lt;a href="http://www.itbusinessedge.com/cm/blogs/vizard/open-source-vendor-stakes-claim-to-bi-market-leadership/?cs=37916"&gt;Jaspersoft's recent claim to be the most widely deployed BI software&lt;/a&gt; pretty difficult to believe.&lt;br /&gt;&lt;br /&gt;Pentaho's strategy has been to build a suite of best-of-breed open source components, foster those components and their communities, and integrate them into a design-time and run-time platform. This report shows that this strategy is paying off.&lt;br /&gt;&lt;br /&gt;The paper covers the bad stuff (performance problem areas, barriers to adoption) as well as the good, and surveys the information sources that people found useful in troubleshooting and getting to successful deployments. If you are evaluating open source BI products, the paper is well worth a read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-7659511255445702349?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/7659511255445702349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=7659511255445702349' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/7659511255445702349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/7659511255445702349'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/12/survey-of-open-source-business.html' title='Survey of open source business intelligence adoption'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_BVv0WTpeWTs/Sx651-Gvi3I/AAAAAAAAAEE/_xK7EFoJNiM/s72-c/osbi-products.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-1464049853761794320</id><published>2009-10-05T17:37:00.000-07:00</published><updated>2009-10-06T09:24:18.255-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pentaho analyzer jpivot pat open source olap viewer'/><title type='text'>Pentaho Analyzer</title><content type='html'>Pentaho today &lt;a href="http://www.pentaho.com/news/releases/20091005_pentaho_announces_strategic_technology_acquisition.php"&gt;announced a new OLAP viewer&lt;/a&gt;, called Pentaho Analyzer Enterprise Edition, based on LucidEra's ClearView component.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BVv0WTpeWTs/SsqXldTlnwI/AAAAAAAAAD0/Pga8sxxd-zs/s1600-h/analyzer_table.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_BVv0WTpeWTs/SsqXldTlnwI/AAAAAAAAAD0/Pga8sxxd-zs/s320/analyzer_table.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389286573879959298" /&gt;&lt;/a&gt; This is great news for Pentaho customers, the community, and the BI world at large. While &lt;a href="http://www.pentaho.com/products/analysis/"&gt;Pentaho Analysis (Mondrian)&lt;/a&gt; is one of its strongest components, the current OLAP viewer (based on &lt;a href="http://jpivot.sourceforge.net/"&gt;JPivot&lt;/a&gt;) has been one of its weakest.&lt;br /&gt;&lt;br /&gt;The new viewer puts Pentaho at the top of the heap, in competition with best-of-breed OLAP viewers. It is designed to be intuitive for business users (yes, those people who don't speak MDX!), is built using the latest web technologies, and integrates seamlessly with Mondrian and the rest of the Pentaho suite.&lt;br /&gt;&lt;br /&gt;It is going to revolutionize the experience of using OLAP within the Pentaho suite.&lt;br /&gt;&lt;br /&gt;Naturally, &lt;a href="http://www.tholis.com/news/pentaho-quo-vadis-/"&gt;there are concerns&lt;/a&gt;. First, the new viewer is only part of Pentaho's Enterprise Edition (EE) suite. If Pentaho is committed to open source BI, why not release it open source? Second, what will happen to &lt;a href="http://code.google.com/p/pentahoanalysistool/"&gt;Pentaho Analysis Tool (PAT)&lt;/a&gt;, the successor to JPivot being developed by the Pentaho community? I'd like to take the opportunity to answer these concerns, because I think this is news that everyone should be celebrating.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Why is the new Analyzer not open source?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There's been a lot of talk about open source business models, 'open core', good and evil, and all that. Releasing ClearView as part of Enterprise Edition is perfectly in sync with Pentaho's business model and with my intuitions about what makes sense for open source. Here's my rationale.&lt;br /&gt;&lt;br /&gt;If you release a piece of software open source out of sheer, 'I love the world!' altruism, you won't necessarily see much benefit. Pentaho is a for-profit business, and they are savvy about leveraging the benefits of open source software. And let's not kid ourselves, there are considerable downsides to releasing something open source. Your competitors can pick up the software and incorporate your hard work into their suite. And your customers may decide that the free version is so good that they aren't going to give you any of their money.&lt;br /&gt;&lt;br /&gt;Open source allows you to bring a component to a wider audience, an audience that will test, document and improve the component, and will support each other on the forums. Only the Community Edition (CE) components get that boost. Therefore, Pentaho's strategy is to release the core functionality in CE. That means the high-performance core of the system, the code paths that get run trillions of times an hour, and that means all the components that are necessary to build a functional and useful BI application.&lt;br /&gt;&lt;br /&gt;In particular, people ask me whether there is a high-performance 'Mondrian on steroids' in EE. No there isn't. None of us want to maintain alternative code-paths, because the extra complexity would slow down future development. If I were to create a performance optimization in EE, the community would probably replicate that optimization in CE within a few weeks. Improving the core Mondrian system for everyone brings more people into the community, and that brings more people to EE.&lt;br /&gt;&lt;br /&gt;And by the way, this doesn't just apply to the Pentaho Analysis part of the suite. Pentaho adds major new functionality to the suite each release, and most of that goes into open source components.&lt;br /&gt;&lt;br /&gt;So, what's left to go into EE? Bells and whistles, things that make the product easier to use, easier to manage, and things that make your boss want to reach for his or her checkbook. And of course support, releases that are certified and indemnified, and more regular. I don't think that's a bad deal, however you look at it.&lt;br /&gt;&lt;br /&gt;It also helps if the components are delivered under a business-friendly license like &lt;a href="http://www.gnu.org/copyleft/lesser.html"&gt;LGPL&lt;/a&gt; or &lt;a href="http://www.eclipse.org/legal/epl-v10.html"&gt;EPL&lt;/a&gt;. Otherwise you will not attract contributions from OEM vendors, who are the companies with the skills to extend components as complex as Mondrian or Pentaho Data Integration (Kettle). Once again, Pentaho is taking a risk by using business-friendly licenses, because there is always a chance that Pentaho's competitors will scoop up the fruits of its labors. (As in fact &lt;a href="http://www.jaspersoft.com/jasperanalysis"&gt;they do&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BVv0WTpeWTs/SsqX_Vuif1I/AAAAAAAAAD8/X3VrSW3gIRo/s1600-h/analyzer_chart.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://4.bp.blogspot.com/_BVv0WTpeWTs/SsqX_Vuif1I/AAAAAAAAAD8/X3VrSW3gIRo/s320/analyzer_chart.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389287018522115922" /&gt;&lt;/a&gt;But Pentaho's faith in the open source process pays off. ClearView is proof of that. If Mondrian had not been available under a business-friendly open source license, LucidEra would probably have written it on top of another vendor's engine, and Pentaho would not have been able to use it. Incidentally, LucidEra has contributed many important enhancements to Mondrian in areas of both performance and functionality over the past three years. This has improved Mondrian for everyone, and we know that ClearView performs very well against Mondrian.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;What will happen to PAT?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To restate what I said above, there is a network effect when you make a component open source. The more people that use a component, the more people are going to contribute to it. We want as many people to use Mondrian as possible, and in particular we want the right people to use it (the people who are going to make major improvements).&lt;br /&gt;&lt;br /&gt;So, for Mondrian's continuing health as an open source component, we need the Community Edition of Mondrian to be good enough to build business applications on. For that, we need to make PAT successful.&lt;br /&gt;&lt;br /&gt;I personally have been laying the ground work for PAT for a number of years. I spearheaded the &lt;a href="http://www.olap4j.org/"&gt;olap4j&lt;/a&gt; API, knowing that the community would be more likely to write the next generation OLAP viewer if it was guaranteed to be portable across OLAP engines. Then I kicked off the halogen project, a collaboration between Pentaho developers and the community to build a viewer using olap4j and GWT. Pentaho developers contributed code and user interface design to that project, even working in their spare time when the current Pentaho sprint used up all of their 'official' cycles. And the PAT project used the halogen code, and the knowledge of the halogen developers, as a starting point.&lt;br /&gt;&lt;br /&gt;It's not healthy to have too close a relationship between an OLAP server and viewer. There should always be room for competition, an opportunity to use a new viewer or (gasp!) different OLAP server if the 'standard' one isn't ideal. I created olap4j with competition in mind, and the experiment seems to be working: PAT can run against Mondrian's native interface, Mondrian's XMLA server, and against SQL Server Analysis Services via XMLA.&lt;br /&gt;&lt;br /&gt;I want to make it easier to build alternative front-ends on top of olap4j, so I have been encouraging PAT developers to contribute to olap4j's query model and library of transforms. I would like to see Analyzer move to olap4j internally (it currently uses Mondrian's native API), and perhaps migrate some of the logic in Analyzer to olap4j so that we can share the costs of maintaining it with the community.&lt;br /&gt;&lt;br /&gt;Lastly, as I realized at the recent community meetup in Barcelona, we have a great team, and we need to harness their energy. After a beer or two with PAT developers &lt;a href="http://twitpic.com/ia5go"&gt;Tom and Paul&lt;/a&gt;, some inspiring demos from &lt;a href="http://twitpic.com/ia1oi"&gt;Pedro and Daniel&lt;/a&gt;, we hatched ideas of incorporating spark lines and writeback into PAT, and I'm sure the ideas will keep on flowing. With this much inspiration and hard work coming from the community, how can we possibly fail?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-1464049853761794320?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/1464049853761794320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=1464049853761794320' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1464049853761794320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1464049853761794320'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/10/pentaho-analyzer.html' title='Pentaho Analyzer'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_BVv0WTpeWTs/SsqXldTlnwI/AAAAAAAAAD0/Pga8sxxd-zs/s72-c/analyzer_table.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-7615067644962095988</id><published>2009-08-17T04:11:00.000-07:00</published><updated>2009-08-17T05:57:28.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='streaming sql social media rss twitter friendfeed facebook'/><title type='text'>What API should Facebook and FriendFeed use to publish the social stream?</title><content type='html'>&lt;a href="http://arstechnica.com/web/news/2009/08/stream-resistance-is-futile-facebook-assimilates-friendfeed.ars"&gt;Ars Technica reports that&lt;/a&gt; "&lt;i&gt;social networking giant Facebook has acquired FriendFeed. This deal reflects Facebook's growing fixation on the social stream, but it's hard to see how the two services will be merged. [...]&lt;br /&gt;&lt;br /&gt;[Facebook's] powerful but esoteric SQL-like query system all add up to a steep learning curve. By comparison, FriendFeed has a simple and elegant API that exposes a lot of information and is much more accommodating to developers.&lt;/i&gt;"&lt;br /&gt;&lt;br /&gt;It seems to me that streaming SQL is the correct solution to this problem. Not a SQL-like language, not an API (although you of course have to use an API to execute queries and get the results), and not just traditional SQL on finite relations, but SQL where streams are a first-class construct.&lt;br /&gt;&lt;br /&gt;I'm not a big believer in 'SQL-like' languages; they give SQL a bad name. Someone once said that the C programming language combines all the power of assembly language with all the ease-of-use of assembly language. The same could be said for 'SQL-like' languages: they tend offer limited capabilities of a fixed API, but you have to learn a new language to do so.&lt;br /&gt;&lt;br /&gt;Full SQL is difficult to implement because it must be possible to combine the relational operators (join, filter, union, project, and so forth), and other language features such as types and built-in operators, in any combination. Implementors often give up on this (what language designers call &lt;a href="http://en.wikipedia.org/wiki/Orthogonal#Computer_science"&gt;orthogonality&lt;/a&gt;), and what they get to is termed a SQL-like language. The full power of SQL only accrues when the implementor has implemented the whole language, and achieved orthogonality.&lt;br /&gt;&lt;br /&gt;Nor can the problem be solved particularly easily or efficiently using regular SQL, because every query is going to be of the form 'tell me what has changed since I last ran the query'. That kind of activity throws a conventional database into a tailspin.&lt;br /&gt;&lt;br /&gt;So, streaming SQL could solve this problem. Has anyone tried it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-7615067644962095988?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/7615067644962095988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=7615067644962095988' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/7615067644962095988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/7615067644962095988'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/08/what-api-should-facebook-and-friendfeed.html' title='What API should Facebook and FriendFeed use to publish the social stream?'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-5656456503582779922</id><published>2009-07-29T00:12:00.000-07:00</published><updated>2009-07-29T02:18:10.878-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter realtime web streaming sql'/><title type='text'>Twitter makes the realtime web look more like the old web</title><content type='html'>Twitter has a &lt;a href="http://search.twitter.com"&gt;new home page&lt;/a&gt;, in the time-honored style of a search engine home page. Claire Cain Miller &lt;a href="http://bits.blogs.nytimes.com/2009/07/28/twitter-plays-up-search-with-new-home-page/"&gt;writes in the New York Times&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;It has become a cliché that first-time visitors to Twitter respond with some version of: "I don’t get it." [The new home page] tries to solve that problem.&lt;/i&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BVv0WTpeWTs/SnAFD_hMacI/AAAAAAAAADc/00URfIVDIyU/s1600-h/twitter.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://2.bp.blogspot.com/_BVv0WTpeWTs/SnAFD_hMacI/AAAAAAAAADc/00URfIVDIyU/s320/twitter.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5363792722346666434" /&gt;&lt;/a&gt;That problem is worth solving, but the home page is also an interesting sign of the melding of the old and the new.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Old web, new web&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The old web is that vast repository of content, ranked by how many people reference that content, and navigated by search engines such as Google. The new web is populated by dynamic content, where what happened in the last minute is much more important than what happened yesterday.&lt;br /&gt;&lt;br /&gt;The new, real-time web has been a wild frontier. There's a cachet to being a Twitter user; you're among pioneers, one of the elite who 'get it', not one of the ordinary folks. That's a problem for Twitter, because they need those millions of ordinary folks first to 'get it', then to get something useful out of it, come back, and start spending their click-through dollars.&lt;br /&gt;&lt;br /&gt;But harnessing the power of the real-time web is no easy problem. First of all, streaming content is a new paradigm. Facebook are doing well at introducing a lot of people to that idea of the ever-changing home page; Twitter's minimalist concept needs more getting used to, but the search engine front-end to the stream of chatter will surely help.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, you need different tools to convert the noise in Twitter other social media feeds into information. A search engine is not going to cut it. The new tools cannot work on the streaming data alone; they have to combine the new data with old, organize the data, and cluster the data with other data that is similar based on subject matter, geographical proximity, or proximity of users in the social network. The stream of content hurtling past our eyes looks like chatter, just noise, until we rank it, look for trends, and put it into historical context.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Old analytics, new analytics&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I find it interesting because at &lt;a href="http://www.sqlstream.com"&gt;SQLstream&lt;/a&gt; we are dealing with a very similar problems for enterprise data. Business users would like to see the full spectrum of data, from right now to the distant past, but when making decisions, they want more recent data to carry more weight; they also want to take into account similarity of subject matter, geographical proximity, and the structure of social networks.&lt;br /&gt;&lt;br /&gt;Traditional analytic solutions use data warehouses, analogous to the old, static, web and its search engine guardians. A data warehouse treats all data equally, regardless of its age. There is so much data that it has to be stored on disk, and it takes several hours to organize that data, so while a typical data warehouse will contain data from five years ago until close of business yesterday, the most important data — what happened today — hasn't reached the data warehouse yet.&lt;br /&gt;&lt;br /&gt;SQLstream melds the old (the data warehouse) with the new (streaming events and transactions arriving over the wire), presenting a unified view via the SQL query language. We say that we "query the future", meaning that you can place standing queries that react when events of interest occur. These queries cache their working sets in memory, so the response time is a few milliseconds, and throughput tens or hundreds of thousands of records per second.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://julianhyde.blogspot.com/2008/02/streaming-sql-meets-olap.html"&gt;data sources that SQLstream can handle&lt;/a&gt; are diverse. Some of the data comes from traditional sources, like corporate transaction processing systems. Some sources are often considered too high-volume to process in a data warehouse, such as click-stream and system monitoring data. And there are &lt;a href="http://www.intelligententerprise.com/blog/archives/2008/12/bi_on_content_f.html"&gt;new sources like Twitter, social media, Atom and RSS feeds&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The problems of the real-time web and the real-time enterprise are surprisingly similar. Without tools to filter, aggregate, rank, and provide historical context, all of these data sources just look like noise and have little apparent value. At SQLstream, we are providing the tools to convert streams into valuable information.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-5656456503582779922?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/5656456503582779922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=5656456503582779922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/5656456503582779922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/5656456503582779922'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/07/twitter-makes-realtime-web-look-more.html' title='Twitter makes the realtime web look more like the old web'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BVv0WTpeWTs/SnAFD_hMacI/AAAAAAAAADc/00URfIVDIyU/s72-c/twitter.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-4528706684314092922</id><published>2009-07-26T10:11:00.000-07:00</published><updated>2009-07-29T19:40:24.924-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='limerick'/><title type='text'>An unfortunate fellow named Hyde</title><content type='html'>A limerick featuring my family name and ending with a pun. What could be better?&lt;br /&gt;&lt;br /&gt;An unfortunate fellow named Hyde&lt;br /&gt;fell down an outhouse and died.&lt;br /&gt;By mischance, his brother&lt;br /&gt;fell down another.&lt;br /&gt;And now they're interred side-by-side.&lt;br /&gt;&lt;br /&gt;(Reportedly due to Johnny Carson.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-4528706684314092922?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/4528706684314092922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=4528706684314092922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/4528706684314092922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/4528706684314092922'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/07/unfortunate-fellow-named-hyde.html' title='An unfortunate fellow named Hyde'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-4237213732088786678</id><published>2009-07-23T12:45:00.000-07:00</published><updated>2009-07-23T12:54:54.085-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian jpivot pentaho analysis howto'/><title type='text'>Introduction to Pentaho Analysis</title><content type='html'>Joshua Tolley has written a nice &lt;a href="https://wiki.csinitiative.com/display/tri/Pentaho+Analysis+-+OLAP+How-To"&gt;step-by-step guide to using Pentaho Analysis&lt;/a&gt;. The tutorial is from the end-user's point of view, which of course is the most important perspective.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://wiki.csinitiative.com/download/attachments/2425482/OLAPnavigator.png?version=1&amp;modificationDate=1247768365022"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 247px; height: 405px;" src="https://wiki.csinitiative.com/download/attachments/2425482/OLAPnavigator.png?version=1&amp;modificationDate=1247768365022" border="0" alt="" /&gt;&lt;/a&gt;If you're interested in the back-end stuff, a couple of weeks ago Joshua also wrote a nice &lt;a href="http://blog.endpoint.com/2009/07/mdx.html"&gt;MDX primer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-4237213732088786678?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/4237213732088786678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=4237213732088786678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/4237213732088786678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/4237213732088786678'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/07/introduction-to-pentaho-analysis.html' title='Introduction to Pentaho Analysis'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-128806514313762280</id><published>2009-07-10T17:45:00.000-07:00</published><updated>2009-07-10T18:00:01.425-07:00</updated><title type='text'>Functional dependency optimizations in Mondrian</title><content type='html'>Eric McDermid just checked in a nice new feature into Mondrian which optimizes the SQL generated by MySQL. It takes advantage of the fact that in MySQL, if some of your GROUP BY columns are unique, you can leave the other columns out of the GROUP BY clause, and MySQL does less work.&lt;br /&gt;&lt;br /&gt;In some cases, a lot less work. MySQL implements GROUP BY by sorting, and since this reduces the volume of data being sorted, Eric reports significant performance improvements. Unfortunately it only works on MySQL, since MySQL is the database I know which has this feature.&lt;br /&gt;&lt;br /&gt;See the latest &lt;a href="http://p4webhost.eigenbase.org:8080/open/mondrian/doc/schema.html#Functional_dependency_optimizations"&gt;schema documentation&lt;/a&gt; for more details.&lt;br /&gt;&lt;br /&gt;I'll note that we reserve the right to change the syntax a little in future versions. In mondrian-4.0 we're adding physical schemas, which will include much more information about tables and relationships, so it would make sense to declare unique keys along with that. But rest assured that even if we do change the syntax, the feature will still be present.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-128806514313762280?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/128806514313762280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=128806514313762280' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/128806514313762280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/128806514313762280'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/07/functional-dependency-optimizations-in.html' title='Functional dependency optimizations in Mondrian'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-6307425355657845641</id><published>2009-06-30T16:04:00.000-07:00</published><updated>2009-06-30T16:46:02.870-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mozilla firefox 3.5 sqlstream'/><title type='text'>SQLstream powers Firefox 3.5 realtime downloads monitor</title><content type='html'>Mozilla launched &lt;a href="http://www.mozilla.com/firefox"&gt;Firefox 3.5&lt;/a&gt; today, and with it, a neat applet, powered by &lt;a href="http://www.sqlstream.com"&gt;SQLstream&lt;/a&gt;, to monitor downloads in real time.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BVv0WTpeWTs/SkqjjCsFmtI/AAAAAAAAADM/UvqG-XUOhHA/s1600-h/heatmap.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 316px;" src="http://2.bp.blogspot.com/_BVv0WTpeWTs/SkqjjCsFmtI/AAAAAAAAADM/UvqG-XUOhHA/s320/heatmap.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5353270929495792338" /&gt;&lt;/a&gt;You can see the results at &lt;a href="http://downloadstats.mozilla.com"&gt;Mozilla's download stats page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A few weeks ago, &lt;a href="http://www.creativereview.co.uk/cr-blog/2009/june/apple-hyperwall"&gt;Apple's Hyperwall&lt;/a&gt; was awe-inspiring as a piece of visual art, but it was less impressive as a piece of real-time data integration, because the data was &lt;a href="http://www.appleinsider.com/articles/09/06/09/apple_stuns_wwdc_crowd_with_pulsating_app_store_hyperwall.html "&gt;delayed five minutes&lt;/a&gt; from the app store.&lt;br /&gt;&lt;br /&gt;SQLstream gathers data from Mozilla's download centers around the world, assigns each record a latitude and longitude, and summarizes the information in a continuously executing SQL query. Data is read with sub-second latencies, and then aggregated (using SQLstream's streaming GROUP BY operator) into summary records each describing a second of activity.&lt;br /&gt;&lt;br /&gt;A server-side Java program reads the data using JDBC, serializes it as JSON, and transmits it to all connected web clients. Clients render the charts using the Canvas tag, newly introduced in &lt;a href="http://en.wikipedia.org/wiki/HTML_5"&gt;HTML 5&lt;/a&gt;. The results are very impressive visually, but to a back-end guy like myself, the plumbing is impressive too.&lt;br /&gt;&lt;br /&gt;The amazing thing is that SQLstream makes this so easy. Our official company blurb talks about "shortening data integration projects from months to weeks", but this project took just a couple of days of work.&lt;br /&gt;&lt;br /&gt;By the way, don't try to view the page in Microsoft's Internet Explorer. Ten years ago, Internet Explorer led the charge to enhance the capabilities of the web browser, introducing dynamic HTML (DHTML), XML handling in the browser, ActiveX controls and other capabilities, but those days are over. With HTML 5 there is a renaissance in web standards; Firefox is leading the pack, with other 'modern' browsers such as &lt;a href="http://apple.com/safari"&gt;Safari&lt;/a&gt;, &lt;a href="http://www.opera.com"&gt;Opera&lt;/a&gt; and &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt; not far behind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-6307425355657845641?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/6307425355657845641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=6307425355657845641' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6307425355657845641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6307425355657845641'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/06/sqlstream-powers-firefox-35-realtime.html' title='SQLstream powers Firefox 3.5 realtime downloads monitor'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BVv0WTpeWTs/SkqjjCsFmtI/AAAAAAAAADM/UvqG-XUOhHA/s72-c/heatmap.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-3633192392818034961</id><published>2009-06-28T13:24:00.000-07:00</published><updated>2009-06-28T13:40:18.394-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista fail'/><title type='text'>Black screen, white pointer on Vista</title><content type='html'>Last night I had a problem where Vista gives me a black screen and white pointer. You can move the pointer around, but you can't do anything useful (except, as noted below, press the Shift key 5 times). I tried restarting in safe mode, and I got a black screen with 'Safe mode' in each corner of the screen, but otherwise the same experience.&lt;br /&gt;&lt;br /&gt;I had a huge sinking feeling. I've had this problem twice before in the last twelve months. On the other two occasions, Dell technical support asked the usual questions for an hour or so, then told me to re-install Vista. An operating system that needs to be re-installed every 6 months is not a productive operating system, even if the operating system is great in between times. Which Vista isn't, anyway.&lt;br /&gt;&lt;br /&gt;Luckily, this time I found &lt;a href="http://social.technet.microsoft.com/forums/en-US/itprovistadesktopui/thread/193b7008-ce4b-4d03-acc3-b8d7ffe610d5/"&gt;this post at Microsoft TechNet&lt;/a&gt;. The problem was exactly as described in the post, and so was the cause (corrupted windows event log files) and the solution (rename the directory, or delete the event log files).&lt;br /&gt;&lt;br /&gt;I'm pleased to say I discovered the same hack that they did: press the shift key five times, which gives you the 'Do you want to turn on Sticky Keys?' dialog. (Yes, this is literally the ONLY meaningful interaction you can have with what is obviously an instance of Vista which is functioning but just not listening.) Then you click on the 'Go to the Ease of Access Center do disable the keyboard shortcut', and because this brings up an explorer window, you can then type in the address bar to launch all kinds of other commands.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://social.technet.microsoft.com/Profile/en-US/?user=towz"&gt;towz&lt;/a&gt; and others who posted to that forum; proving that even for Microsoft products, the crowd can sometimes provide better technical support than the professionals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-3633192392818034961?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/3633192392818034961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=3633192392818034961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/3633192392818034961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/3633192392818034961'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/06/black-screen-white-pointer-on-vista.html' title='Black screen, white pointer on Vista'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-5469642486750116035</id><published>2009-06-17T17:35:00.000-07:00</published><updated>2009-06-17T17:57:19.390-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gis olap'/><title type='text'>Spatial OLAP using GeoMondrian</title><content type='html'>I received an email from Thierry Badard of Laval University, Québec:&lt;br /&gt;&lt;blockquote&gt;After the release of a new version of its open source spatial ETL tool, &lt;a href="http://www.geokettle.org/"&gt;GeoKettle&lt;/a&gt; yesterday (please see &lt;a href="http://geosoa.scg.ulaval.ca/en/index.php?module=announce&amp;amp;ANN_user_op=view&amp;amp;ANN_id=12"&gt;the announcement&lt;/a&gt; for more details), the &lt;a href="http://geosoa.scg.ulaval.ca/"&gt;GeoSOA research group at Laval University, Quebec, Canada&lt;/a&gt; is proud to announce the availibility as new open source projects of &lt;a href="http://www.geo-mondrian.org/"&gt;GeoMondrian&lt;/a&gt;, the first implementation of a Spatial OLAP (SOLAP) server and &lt;a href="http://www.spatialytics.org/"&gt;Spatialytics&lt;/a&gt;, a lightweight cartographic component which enables navigation in SOLAP data cubes.&lt;/blockquote&gt;&lt;blockquote&gt;GeoKettle, GeoMondrian and Spatialytics are components of the complete geospatial BI (Business Intelligence) software stack developed by the GeoSOA research group.&lt;br /&gt;&lt;/blockquote&gt;For some screenshots of the project, see &lt;a href="http://www.geobi.org/2009/03/georeport-pentaho-cdf-integration-has.html"&gt;Fabio D'Ovidio's blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;This is the kind of news that makes me proud to have gotten involved in open source. I'm not an expert on spatial software, so I could never have written a spatial OLAP engine; I didn't even realize the need existed. I'm delighted that people who are experts in the field could build upon my efforts and all of the other people who have contributed to &lt;a href="http://mondrian.pentaho.org"&gt;Mondrian&lt;/a&gt; and &lt;a href="http://jpivot.sourceforge.net"&gt;JPivot&lt;/a&gt; over the years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;I hear that they are also involved in a &lt;a href="http://www.geobi.org/2009/06/geolap-news-from-gsoc-2009.html"&gt;Google Summer of Code (GSoC) project to integrate with Pentaho Community Dashboard Framework (CDF)&lt;/a&gt;. That makes a lot of sense.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;And of course I would be happy to receive contributions back to Mondrian if it makes it easier for them to maintain the code base.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wish the GeoMondrian, GeoKettle and Spatialytics projects every success, and look forward to them bringing BI to a new audience.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-5469642486750116035?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/5469642486750116035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=5469642486750116035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/5469642486750116035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/5469642486750116035'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/06/spatial-olap-using-geomondrian.html' title='Spatial OLAP using GeoMondrian'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-2859338247682311979</id><published>2009-06-11T18:18:00.000-07:00</published><updated>2009-06-22T10:18:41.110-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian mdx writeback'/><title type='text'>Cell writeback in Mondrian</title><content type='html'>&lt;div&gt;Writeback is a feature that allows you to modify OLAP cell values and see the effects ripple through the data set, automatically modifying child and parent cells, and also cells derived using calculations. This allows you to perform 'what if' analysis and applications such as budgeting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have added experimental support for writeback to Mondrian.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Mondrian's case, the term 'writeback' is a bit misleading. In a ROLAP system such as Mondrian, writing back to the database would be difficult, since values are stored in a fact table but we allow cells of any granularity to be modified. One modified cell might contain thousands of fact table rows. So, we don't write cells back to the database, but just retain the modified cells in memory, and propagate the modifications to related cells.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's how to use the experimental writeback support. Some of the details may change later as we make the feature more usable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, enable writeback for your cube. Create a dimension called 'Scenario', and a measure called 'Atomic Cell Count':&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;div&gt;&amp;lt;Cube name='Sales'&amp;gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;Dimension name='Scenario' foreignKey='time_id'&amp;gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;Hierarchy primaryKey='time_id' hasall='true'&amp;gt;&lt;/div&gt;&lt;div&gt;            &amp;lt;InlineTable alias='_dummy'&amp;gt;&lt;/div&gt;&lt;div&gt;                &amp;lt;ColumnDefs&amp;gt;&lt;/div&gt;&lt;div&gt;                    &amp;lt;ColumnDef name='foo' type='Numeric'/&amp;gt;&lt;/div&gt;&lt;div&gt;                &amp;lt;/ColumnDefs&amp;gt;&lt;/div&gt;&lt;div&gt;                &amp;lt;Rows/&amp;gt;&lt;/div&gt;&lt;div&gt;            &amp;lt;/InlineTable&amp;gt;&lt;/div&gt;&lt;div&gt;            &amp;lt;Level name='Scenario' column='foo'/&amp;gt;&lt;/div&gt;&lt;div&gt;        &amp;lt;/Hierarchy&amp;gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;/Dimension&amp;gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;!-- Other dimensions... --&amp;gt;&lt;/div&gt;&lt;div&gt;   &amp;lt;Measure name='Atomic' aggregator='count'/&amp;gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;!-- Other measures... --&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/Cube&amp;gt;&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;(Yes, this is a lot of crud to add to your cube definition, and it's temporary. In future, we will let you flag a cube as 'writeback enabled', and a [Scenario] dimension and [Atomic Cell Count] measure will be created automatically. Also, we will make it easier for you to create dimensions that have only calculated members, without resorting to inline tables.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next, create a Scenario:&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;div&gt;Connection connection;&lt;/div&gt;&lt;div&gt;Scenario scenario = connection.createScenario();&lt;/div&gt;&lt;div&gt;int scenarioId = scenario.getId();&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;(The Scenario API will soon move to &lt;a href="http://www.olap4j.org/"&gt;olap4j&lt;/a&gt;: before mondrian-4.0, I hope. This includes the class &lt;code&gt;mondrian.olap.Scenario&lt;/code&gt;, the method &lt;code&gt;mondrian.olap.Cell.setValue()&lt;/code&gt;, and the method &lt;code&gt;mondrian.olap.Connection.createScenario()&lt;/code&gt;. It will be optional for an olap4j driver to support writeback, but Mondrian's olap4j driver will, of course.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Write a query that uses the scenario. Assuming that &lt;code&gt;scenarioId&lt;/code&gt; above was 1, the query&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;SELECT [Measures].[Unit Sales] ON COLUMNS,&lt;div&gt;    {[Product],&lt;/div&gt;&lt;div&gt;     [Product].Children,&lt;/div&gt;&lt;div&gt;     [Product].[Drink].Children} ON ROWS&lt;/div&gt;&lt;div&gt;FROM [Sales]&lt;/div&gt;&lt;div&gt;WHERE [Scenario].[1]&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;returns&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;div&gt;[Product]                 [Unit Sales]&lt;/div&gt;&lt;div&gt;========================= ============&lt;/div&gt;&lt;div&gt;(All)                          266,773&lt;/div&gt;&lt;div&gt; + Drink                        24,597&lt;/div&gt;&lt;div&gt; +--+ Alcoholic Beverages        6,838&lt;/div&gt;&lt;div&gt; +--+ Beverages                 13,573&lt;/div&gt;&lt;div&gt; +--+ Dairy                      4,186&lt;/div&gt;&lt;div&gt; + Food                        191,940&lt;/div&gt;&lt;div&gt; + Non-Consumable               50,236&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;Choose one of the cells returned from the query and modify its value. For example, let's reduce the sales of Drink by 1,000 from 24,597 to 23,597:&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;div&gt;Result result = connection.executeQuery(...);&lt;/div&gt;&lt;div&gt;Cell cell = result.getCell(new int[] {0, 1});&lt;/div&gt;&lt;div&gt;cell.setValue(23597, AllocationPolicy.EQUAL_ALLOCATION);&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;Execute the query again, and it returns&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;div&gt;[Product]                 [Unit Sales]&lt;/div&gt;&lt;div&gt;========================= ============&lt;/div&gt;&lt;div&gt;(All)                          265,773&lt;/div&gt;&lt;div&gt; + Drink                        23,597&lt;/div&gt;&lt;div&gt; +--+ Alcoholic Beverages        6,563&lt;/div&gt;&lt;div&gt; +--+ Beverages                 12,990&lt;/div&gt;&lt;div&gt; +--+ Dairy                      4,043&lt;/div&gt;&lt;div&gt; + Food                        191,940&lt;/div&gt;&lt;div&gt; + Non-Consumable               50,236&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;The value for Drink is 23,597, as expected, and the values of its children have been correspondingly reduced.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How the value is allocated to the children (and in fact all descendants) is decided by the allocation policy. In this case, we specified EQUAL_ALLOCATION, which means that all atomic cells have the same value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An atomic cell is the finest grained value that can be viewed multidimensionally; for this cube, it is an instance of a particular customer buying a particular product, on a particular promotion, on a particular day, in a particular store. That makes for an awful lot of of atomic cells, but there may be fewer atomic cells than fact table rows. If the fact table does not have a primary key on (customer, product, time, promotion, store) some cells may have more than one fact table row. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If instead we had written&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;div&gt;cell.setValue(23597, AllocationPolicy.EQUAL_INCREMENT);&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;the query would have returned&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;div&gt;[Product]                 [Unit Sales]&lt;/div&gt;&lt;div&gt;========================= ============&lt;/div&gt;&lt;div&gt;(All)                          265,773&lt;/div&gt;&lt;div&gt; + Drink                        23,597&lt;/div&gt;&lt;div&gt; +--+ Alcoholic Beverages        6,560&lt;/div&gt;&lt;div&gt; +--+ Beverages                 13,022&lt;/div&gt;&lt;div&gt; +--+ Dairy                      4,015&lt;/div&gt;&lt;div&gt; + Food                        191,940&lt;/div&gt;&lt;div&gt; + Non-Consumable               50,236&lt;/div&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div&gt;We notice that Beverages has not been reduced as much under EQUAL_INCREMENT policy than EQUAL_ALLOCATION policy; the average value for atomic cells of Beverages must be greater than for Drink as a whole.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Allocation policies are defined consistent with Analysis Services' &lt;a href="http://technet.microsoft.com/en-us/library/ms145488.aspx"&gt;UPDATE CUBE statement&lt;/a&gt;. Mondrian does not currently implement WEIGHTED_ALLOCATION or WEIGHTED_INCREMENT policies.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Treating scenarios as a dimension is an elegant and powerful idea. Using the Scenario dimension, you can easily switch from one scenario to another, or you can compare scenarios side-by-side.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that you can also set a connection's current scenario. This effectively becomes the default value for the Scenario dimension in that connection, so you do not need to specify Scenario in the slicer. However, there still needs to be an explicit scenario in the context when you call &lt;code&gt;Cell.setValue()&lt;/code&gt;. I'm not sure whether the benefit of having a scenario for a connection outweighs the benefit/confusion, and we may discontinue this feature.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Remember, this is still an experimental feature. There is some cleanup to be done, some performance tuning, and the API needs to be moved into olap4j. But most importantly, it's not useful until a user interface, such as PAT or JPivot, supports scenarios and modifying cell values.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-2859338247682311979?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/2859338247682311979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=2859338247682311979' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/2859338247682311979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/2859338247682311979'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/06/cell-writeback-in-mondrian.html' title='Cell writeback in Mondrian'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-6088042116573288868</id><published>2009-05-26T16:12:00.000-07:00</published><updated>2009-05-26T18:17:21.793-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webinar mysql mondrian continuous data integration'/><title type='text'>Webinar: Eliminating MySQL Bottlenecks and Replication Issues using Real-Time Queries &amp; Continuous ETL</title><content type='html'>Would you like to find out how to build a continuous ETL process integrating source systems, MySQL data warehouse, and Mondrian OLAP engine?&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I'm going to be hosting a webinar tomorrow describing how to do this using SQLstream. (Basically a repeat of the webinar I gave at the MySQL conference this year, but many of you missed it.)&lt;br /&gt;&lt;br /&gt;Join me and Damian Black, CEO of SQLstream, on the webinar at 11am PDT/2pm EDT tomorrow, Wednesday 27th May. To register for the webinar, visit &lt;a href="https://www2.gotomeeting.com/register/668399275"&gt;https://www2.gotomeeting.com/register/668399275&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-6088042116573288868?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/6088042116573288868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=6088042116573288868' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6088042116573288868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6088042116573288868'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/05/webinar-eliminating-mysql-bottlenecks.html' title='Webinar: Eliminating MySQL Bottlenecks and Replication Issues using Real-Time Queries &amp; Continuous ETL'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-6648165930275572690</id><published>2009-05-19T17:42:00.000-07:00</published><updated>2009-05-19T18:15:10.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian physical schema bnf xsd clapham'/><title type='text'>Explaining the structure of Mondrian schemas</title><content type='html'>There are some &lt;a href="http://wiki.pentaho.com/display/analysis/Physical+Schema+Design+Discussion"&gt;major schema changes coming in Mondrian 4.0&lt;/a&gt;, and I'm writing up specifications for these so that everyone knows what's coming and has chance to influence it.&lt;br /&gt;&lt;br /&gt;But before I do that, I thought I'd try to improve how we describe the structure of XML schemas in the present release, just a bit. I have tried a couple of things. First, I created an XML skeleton that shows which elements can occur inside which other elements:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="text-indent: -20px"&gt;    &lt;code&gt;        &lt;div style="padding-left:20px"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Schema"&gt;Schema&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Cube"&gt;Cube&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Table"&gt;Table&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggName"&gt;AggName&lt;/a&gt;&amp;gt;&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;aggElements&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggPattern"&gt;AggPattern&lt;/a&gt;&amp;gt;&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;aggElements&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Dimension"&gt;Dimension&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Hierarchy"&gt;Hierarchy&lt;/a&gt;&amp;gt;&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;relation&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Closure"&gt;Closure&lt;/a&gt;/&amp;gt;&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Level"&gt;Level&lt;/a&gt;&amp;gt;&lt;/div&gt;                            &lt;div style="padding-left:120px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_KeyExpression"&gt;KeyExpression&lt;/a&gt;&amp;gt;&lt;/div&gt;                                &lt;div style="padding-left:140px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;                            &lt;div style="padding-left:120px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_NameExpression"&gt;NameExpression&lt;/a&gt;&amp;gt;&lt;/div&gt;                                &lt;div style="padding-left:140px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;                            &lt;div style="padding-left:120px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_CaptionExpression"&gt;CaptionExpression&lt;/a&gt;&amp;gt;&lt;/div&gt;                                &lt;div style="padding-left:140px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;                            &lt;div style="padding-left:120px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_OrdinalExpression"&gt;OrdinalExpression&lt;/a&gt;&amp;gt;&lt;/div&gt;                                &lt;div style="padding-left:140px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;                            &lt;div style="padding-left:120px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_ParentExpression"&gt;ParentExpression&lt;/a&gt;&amp;gt;&lt;/div&gt;                                &lt;div style="padding-left:140px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;                            &lt;div style="padding-left:120px;"&gt;&amp;lt;&lt;a  href="http://mondrian.pentaho.org/documentation/schema.php#XML_Property"&gt;Property&lt;/a&gt;&amp;gt;&lt;/div&gt;                                &lt;div style="padding-left:140px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_PropertyExpression"&gt;PropertyExpression&lt;/a&gt;&amp;gt;&lt;/div&gt;                                    &lt;div style="padding-left:160px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_DimensionUsage"&gt;DimensionUsage&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Measure"&gt;Measure&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_MeasureExpression"&gt;MeasureExpression&lt;/a&gt;&amp;gt;&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_MemberProperty"&gt;CalculatedMemberProperty&lt;/a&gt;/&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_CalculatedMember"&gt;CalculatedMember&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Formula"&gt;Formula&lt;/a&gt;/&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_MemberProperty"&gt;CalculatedMemberProperty&lt;/a&gt;/&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_NamedSet"&gt;NamedSet&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Formula"&gt;Formula&lt;/a&gt;/&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_VirtualCube"&gt;VirtualCube&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_CubeUsages"&gt;CubeUsages&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_CubeUsage"&gt;CubeUsage&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_VirtualCubeDimension"&gt;VirtualCubeDimension&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_VirtualCubeMeasure"&gt;VirtualCubeMeasure&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Role"&gt;Role&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SchemaGrant"&gt;SchemaGrant&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_CubeGrant"&gt;CubeGrant&lt;/a&gt;&amp;gt;&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_HierarchyGrant"&gt;HierarchyGrant&lt;/a&gt;&amp;gt;&lt;/div&gt;                            &lt;div style="padding-left:120px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_MemberGrant"&gt;MemberGrant&lt;/a&gt;/&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Union"&gt;Union&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_RoleUsage"&gt;RoleUsage&lt;/a&gt;/&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_UserDefinedFunction"&gt;UserDefinedFunction&lt;/a&gt;/&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Parameter"&gt;Parameter&lt;/a&gt;/&amp;gt;&lt;/div&gt;        &lt;br/&gt;        relation ::=&lt;br/&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Table"&gt;Table&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_View"&gt;View&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_SQL"&gt;SQL&lt;/a&gt;/&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_InlineTable"&gt;InlineTable&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_ColumnDefs"&gt;ColumnDefs&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_ColumnDef"&gt;ColumnDef&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Rows"&gt;Rows&lt;/a&gt;&amp;gt;&lt;/div&gt;                    &lt;div style="padding-left:80px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Row"&gt;Row&lt;/a&gt;&amp;gt;&lt;/div&gt;                        &lt;div style="padding-left:100px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Value"&gt;Value&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_Join"&gt;Join&lt;/a&gt;&amp;gt;&lt;/div&gt;                &lt;div style="padding-left:60px;"&gt;relation&lt;/div&gt;        &lt;br/&gt;        aggElement ::=&lt;br/&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggExclude"&gt;AggExclude&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggFactCount"&gt;AggFactCount&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggIgnoreColumn"&gt;AggIgnoreColumn&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggForeignKey"&gt;AggForeignKey&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggMeasure"&gt;AggMeasure&lt;/a&gt;&amp;gt;&lt;/div&gt;            &lt;div style="padding-left:40px;"&gt;&amp;lt;&lt;a href="http://mondrian.pentaho.org/documentation/schema.php#XML_AggLevel"&gt;AggLevel&lt;/a&gt;&amp;gt;&lt;/div&gt;    &lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You can see the full version in the &lt;a href="http://mondrian.pentaho.org/documentation/schema.php#Schema_files"&gt;Mondrian schema guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This approach shows where things are located, but it doesn't show how many of each element can belong to a particular parent element, or the order in which they are required. So, I wrote up a small &lt;a href="http://p4webhost.eigenbase.org:8080/open/mondrian/doc/schema.bnf"&gt;BNF grammar&lt;/a&gt; and used &lt;a href="http://clapham.hydromatic.net"&gt;Clapham&lt;/a&gt; to generate a &lt;a href="http://clapham.hydromatic.net/mondrian-3.1-bnf/"&gt;railroad diagram&lt;/a&gt;. For comparison, the &lt;a href="http://clapham.hydromatic.net/mondrian-4.0-bnf/"&gt;railroad diagram for the work-in-progress mondrian-4.0 schema is here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-6648165930275572690?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/6648165930275572690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=6648165930275572690' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6648165930275572690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6648165930275572690'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/05/explaining-structure-of-mondrian.html' title='Explaining the structure of Mondrian schemas'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-6355218775713867132</id><published>2009-05-11T01:29:00.000-07:00</published><updated>2009-05-11T02:07:43.057-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bnf javacc parser grammar generator'/><title type='text'>Clapham: A railroad diagram generator</title><content type='html'>I don't work with the Oracle database very much anymore, and one thing I miss is their server documentation. I still have my old copy of the Oracle 7.3 SQL Language Reference, and sometimes I reach for it when the SQL:2008 standard has fuddled my brain and I want to be reassured that SQL can be simple, powerful and trustworthy. The calming effect is partly due to the authoritative tone, but the railroad diagrams&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm"&gt;&lt;/a&gt; describing the syntax of each command say 'Don't worry'.&lt;br /&gt;&lt;br /&gt;For example, here is &lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm"&gt;Oracle 10.2's CREATE TABLE&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/img/relational_table.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 596px; height: 218px;" src="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/img/relational_table.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yes, railroad diagrams. You can easily get lost in something as large as the SQL language, with its hundreds of commands, keywords and unexpected clauses, and railroad diagrams are the map.&lt;br /&gt;&lt;br /&gt;When it came to writing our documentation for &lt;a href="http://www.sqlstream.com/"&gt;SQLstream&lt;/a&gt;, we of course wanted to include railroad diagrams to illustrate our dialect of SQL. It's possible to construct the diagrams by hand, but it's tedious, error prone, and it's difficult to get the diagrams to look consistent. Unbelievably, we couldn't find a tool to generate them, so we ended up writing them by hand.&lt;br /&gt;&lt;br /&gt;Now I've gotten a little breathing room after the release of SQLstream 2.0, I took a couple of days to write an open-source railroad diagram generator. I've released it on &lt;a href="http://sourceforge.net/projects/clapham"&gt;Sourceforge, and named it Clapham&lt;/a&gt;, after the South London town which is home to the most complicated railway junction you ever saw.&lt;br /&gt;&lt;br /&gt;This has been a nice return to old-school open source, with its mantras "release early, release often"; and "don't whine: contribute". The diagrams aren't yet as pretty as Oracle's, but we're getting there. Even though this is the very first release, and the project is barely alpha, it has already &lt;a href="http://clapham.hydromatic.net/farrago/"&gt;generated charts for LucidDB's not inconsiderable SQL grammar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;More details at the &lt;a href="http://clapham.hydromatic.net/"&gt;home page&lt;/a&gt;, and you can &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=243703&amp;amp;package_id=297002&amp;amp;release_id=681840"&gt;download release clapham-0.1.003 from SourceForge&lt;/a&gt;. Contributions welcome, of course.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-6355218775713867132?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/6355218775713867132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=6355218775713867132' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6355218775713867132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6355218775713867132'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/05/clapham-railroad-diagram-generator.html' title='Clapham: A railroad diagram generator'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-2590586374515504298</id><published>2009-04-30T10:43:00.000-07:00</published><updated>2009-04-30T11:22:19.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian cache calculated members'/><title type='text'>How Mondrian evaluates expressions</title><content type='html'>When it comes to expression evaluation, Mondrian keeps things simple. It doesn't tend to cache the results of expressions, but calculates them each time they are evaluated. Eventually the calculation tunnels through all calculated members and ends up at an atomic cell. Atomic cells are retrieved from the database, and stored in the cell value cache, so they are only calculated once.&lt;br /&gt;&lt;br /&gt;By the way, an atomic cell is not necessarily at the lowest level of the hierarchy; Mondrian would prefer to load cells at a coarse granularity, and leave the hard work of aggregating values to the database, or even better, an aggregate table. And Mondrian does its best to retrieve atomic cells in batches. It gathers together requests for lots of cells of the same granularity and generates a single SQL statement to retrieve them all at once.&lt;br /&gt;&lt;br /&gt;Mondrian's 'keep it simple' scheme comes unstuck when a particular calculation is repeated many times over. Nick Goodman came up with a classic example of this in &lt;a href="http://jira.pentaho.org:8080/browse/MONDRIAN-552"&gt;bug MONDRIAN-552&lt;/a&gt;. The query is as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;with member [Measures].[Profit Change] as&lt;br /&gt;   ([Measures].[Profit], [Time].CurrentMember)&lt;br /&gt;   - ([Measures].[Profit], [Time].PrevMember)&lt;br /&gt;member [Measures].[Running Total] as&lt;br /&gt;   ([Measures].[Profit], [Time].CurrentMember)&lt;br /&gt;   + ([Measures].[Running Total], [Time].PrevMember)&lt;br /&gt;member [Measures].[Average Daily Running Total] as&lt;br /&gt;   Avg(&lt;br /&gt;       Descendants(&lt;br /&gt;           [Time].CurrentMember, [Time.Weekly].[Day])&lt;br /&gt;      [Measures].[Running Total])&lt;br /&gt;select&lt;br /&gt;   {[Measures].[Profit Change],&lt;br /&gt;     [Measures].[Running Total],&lt;br /&gt;     [Measures].[Average Daily Running Total]} ON COLUMNS,&lt;br /&gt;   {[Time.Weekly].[Week].Members} ON ROWS&lt;br /&gt;from [Sales]&lt;/pre&gt;&lt;/blockquote&gt;Note how [Measures].[Running Total] is recursive. The running total for week 3 is defined as the running total for week 2 plus the profit for week 3. To calculate the average running total for week 99, Mondrian computes profit for the first 99 weeks and to calculate the average running total for week 100, Mondrian computes profit 100 for the first 100 weeks. There's lots of wasted effort: Mondrian has computed profit 50,000 times when it could have done it just 100 times and cached the results.&lt;br /&gt;&lt;br /&gt;The solution is simple: wrap the calculation for [Measures].[Running Total] in the &lt;a href="http://mondrian.pentaho.org/documentation/performance.php#Optimizing_Calculations_with_the_Expression_Cache"&gt;Cache() function&lt;/a&gt;, and Mondrian will compute the value only once.&lt;br /&gt;&lt;br /&gt;You will see that in the bug I come up with a couple of proposals for making Mondrian better. I don't think Mondrian should automatically cache every expression, because caching costs time and memory, and most expressions are only evaluated once or twice. And by the way, you should use the Cache function sparingly, for the same reason.&lt;br /&gt;&lt;br /&gt;But it would be nice if Mondrian could automatically detect some cases where expression caching is desirable. The proposed 'cache' property of a calculated member would have three values: 0 (never cache), 1 (always cache) and null (Mondrian should use its best judgment). Most calculated members would leave the caching up to Mondrian, so we would need to come up with a simple, effective rule that governs caching before we implemented this feature. What do you think the rule should be?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-2590586374515504298?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/2590586374515504298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=2590586374515504298' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/2590586374515504298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/2590586374515504298'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/04/how-mondrian-evaluates-expressions.html' title='How Mondrian evaluates expressions'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-4463970001347490698</id><published>2009-04-27T15:11:00.000-07:00</published><updated>2009-04-27T15:20:06.526-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pat pentaho analysis tool olap4j slice dice jpivot'/><title type='text'>PAT 0.2</title><content type='html'>PAT (Pentaho Analysis Tool) project renews my faith in open source. A team of folks from Pentaho's community have got together and are cooking up a new UI for Mondrian. Due to the magic of olap4j, it will work against other OLAP engines too.&lt;br /&gt;&lt;br /&gt;They just released version 0.2, and &lt;a href="http://pentahomusings.blogspot.com/2009/04/pat-02-arrives.html"&gt;Tom's release notes&lt;/a&gt; are an amusing and informative history of the project. Download from the &lt;a href="http://code.google.com/p/pentahoanalysistool/"&gt;project home page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-4463970001347490698?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/4463970001347490698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=4463970001347490698' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/4463970001347490698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/4463970001347490698'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/04/pat-02.html' title='PAT 0.2'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-6537313086400326400</id><published>2009-04-10T17:31:00.000-07:00</published><updated>2009-04-11T00:51:56.798-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian mdx formatting olap4j'/><title type='text'>Formatting MDX as plain text</title><content type='html'>&lt;div&gt;When Mondrian tools output MDX results as text, such as in the cmdRunner  utility, we've been using the same old crappy format for years. For example, the  query&lt;/div&gt; &lt;pre&gt;select&lt;br /&gt;  crossjoin(&lt;br /&gt;    {[Time].[1997].[Q1],  [Time].[1997].[Q2].[4]},&lt;br /&gt;    {[Measures].[Unit Sales], [Measures].[Store  Sales]}) on 0,&lt;br /&gt;  {[USA].[CA].[Los Angeles],&lt;br /&gt;   [USA].[WA].[Seattle],&lt;br /&gt;   [USA].[CA].[San Francisco]} on 1&lt;br /&gt;FROM [Sales]&lt;/pre&gt;&lt;div&gt;is formatted as&lt;/div&gt; &lt;pre&gt;Axis #0:&lt;br /&gt;{}&lt;br /&gt;Axis #1:&lt;br /&gt;{[Time].[1997].[Q1], [Measures].[Unit  Sales]}&lt;br /&gt;{[Time].[1997].[Q1], [Measures].[Store  Sales]}&lt;br /&gt;{[Time].[1997].[Q2].[4], [Measures].[Unit  Sales]}&lt;br /&gt;{[Time].[1997].[Q2].[4], [Measures].[Store Sales]}&lt;br /&gt;Axis #2:&lt;br /&gt;{[Store].[All Stores].[USA].[CA].[Los Angeles]}&lt;br /&gt;{[Store].[All  Stores].[USA].[WA].[Seattle]}&lt;br /&gt;{[Store].[All Stores].[USA].[CA].[San  Francisco]}&lt;br /&gt;Row #0: 6,373&lt;br /&gt;Row #0: 13,736.97&lt;br /&gt;Row #0: 1,865&lt;br /&gt;Row #0: 3,917.49&lt;br /&gt;Row #1: 6,098&lt;br /&gt;Row #1: 12,760.64&lt;br /&gt;Row #1: 2,121&lt;br /&gt;Row #1: 4,444.06&lt;br /&gt;Row #2: 439&lt;br /&gt;Row #2: 936.51&lt;br /&gt;Row #2: 149&lt;br /&gt;Row #2: 327.33&lt;/pre&gt; &lt;div&gt;I've just &lt;a href="http://p4web.eigenbase.org/@md=d&amp;amp;c=6PU@12590?ac=10"&gt;checked in&lt;/a&gt; an alternative formatter that makes the result look  more like a pivot table. The same query would come out like  this:&lt;/div&gt;&lt;pre&gt;                     1997       1997        1997        1997&lt;br /&gt;                     Q1         Q1          Q2          Q2&lt;br /&gt;                                            4           4&lt;br /&gt;                     Unit Sales Store Sales Unit Sales Store Sales&lt;br /&gt;=== == ============= ========== =========== ========== ===========&lt;br /&gt;USA CA Los Angeles   6,373      13,736.97   1,865      3,917.49&lt;br /&gt;USA WA Seattle       6,098      12,760.64   2,121      4,444.06&lt;br /&gt;USA CA San Francisco 439        936.51      149        327.33&lt;/pre&gt;&lt;div&gt;Two questions:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Should we move this code into the &lt;a href="http://www.olap4j.org/"&gt;olap4j&lt;/a&gt; code base? (It would seem to make sense  because it doesn't require any mondrian internals to do the job, and the  processing requires a 'grid model' similar to query models already part of  olap4j. But I don't want to 'dump' code that is not generally useful.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. What do people feel is the ideal format for formatting MDX results as  text? As a starting point, another couple of possible formats are below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;"Oracle" format&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;                     1997&lt;br /&gt;                     Q1                      Q2&lt;br /&gt;                                            4&lt;br /&gt;                     Unit Sales Store Sales Unit Sales Store Sales&lt;br /&gt;=== == ============= ========== =========== ========== ===========&lt;br /&gt;USA CA Los Angeles        6,373   13,736.97      1,865    3,917.49&lt;br /&gt;    WA Seattle            6,098   12,760.64      2,121    4,444.06&lt;br /&gt;    CA San Francisco        439      936.51        149      327.33&lt;/pre&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;"MySQL"  format&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;|                          | 1997                                                |&lt;br /&gt;|                          | Q1                       |  Q2                      |&lt;br /&gt;|                          |                          | 4                        |&lt;br /&gt;|                          | Unit Sales | Store Sales | Unit Sales | Store Sales |&lt;br /&gt;+-----+----+---------------+------------+-------------+------------+-------------+&lt;br /&gt;| USA | CA | Los Angeles   |      6,373 |   13,736.97 |      1,865 |   3,917.49  |&lt;br /&gt;|     | WA | Seattle       |      6,098 |   12,760.64 |     2,121  |    4,444.06 |&lt;br /&gt;|     | CA | San Francisco |        439 |     936.51  |        149 |      327.33 |&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-6537313086400326400?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/6537313086400326400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=6537313086400326400' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6537313086400326400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6537313086400326400'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/04/formatting-mdx-as-plain-text.html' title='Formatting MDX as plain text'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-7466747269030858612</id><published>2009-04-07T23:58:00.000-07:00</published><updated>2009-04-08T01:36:27.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oracle simba mdx olap olap4j standardization'/><title type='text'>The last MDX holdout folds, but true OLAP interop is still a long way off</title><content type='html'>&lt;div&gt;Oracle, the last major OLAP vendor to embrace &lt;a href="http://en.wikipedia.org/wiki/Multidimensional_Expressions"&gt;MDX&lt;/a&gt;, has finally &lt;a href="http://www.simba.com/MDX-Provider-for-Oracle-OLAP.htm"&gt;added MDX support to its server&lt;/a&gt;. The MDX Provider for Oracle OLAP, developed in partnership with &lt;a href="http://www.simba.com"&gt;Simba&lt;/a&gt;, implements the OLE DB for OLAP API and the MDX query language, and went beta this week.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The most obvious application of this technology, and I'm sure the initial revenue driver, will be to allow end-users to use Excel 2007 as their client for slicing and dicing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simba's architecture diagram shows the MDX provider loaded onto the same machine as the Excel client. It wouldn't seem technically difficult to run the MDX provider as a server, and have multiple clients connect via OLE DB for OLAP or via XML for Analysis. (Licensing may be a different matter.)&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.simba.com/images/MDX-Connector-for-Oracle-OLAP.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 383px; height: 317px;" src="http://www.simba.com/images/MDX-Connector-for-Oracle-OLAP.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;This announcement means that now it is possible to talk MDX to every major OLAP server. (Are there any OLAP servers that do not speak MDX? I can't think of any.) The OLAP market has moved very slowly towards standardization, but this is a significant moment, even a tipping point. In a conversation five years ago, Oracle executives agreed that MDX was a fine language, but said they would not support it, because that would be to acknowledge that Microsoft was the thought-leader in the OLAP marketplace. It's that old PR strategy: deny in public, agree in private. And in a sense their strategy worked, because without a standard language, the OLAP market could not begin to commoditize.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is still a long way to go towards OLAP interoperability. Servers differ widely in their support of MDX. Unlike SQL, the MDX language is not in the hands of an independent standards organization; even the originators of the de facto standard, Microsoft, have not released a specification for MDX or &lt;a href="http://www.xmla.org"&gt;XMLA&lt;/a&gt; for several years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A query language is no good without an API to issue queries, and APIs only exist in Microsoft's own technologies: COM (OLE DB for OLAP), .NET (adomd.net) and web services (XMLA).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have been advocating &lt;a href="http://www.olap4j.org"&gt;olap4j&lt;/a&gt; as the standard API for Java-based OLAP, but it has yet to receive public backing from vendors outside the open source community. And there are no OLAP APIs for languages such as python, perl, and php.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The final point of concern is the emergence of Simba as virtually the sole supplier of MDX, OLE DB for OLAP and XMLA technology. Simba is an excellent company, who understand MDX very well, and have invested in building a technology stack. But they also benefit from a close relationship with Microsoft. (Remember those specifications for MDX and XMLA I referred to earlier? Though they have not seen public updates for several years, I'm sure those specifications still exist behind the walls of Castle Redmond, and are available to Microsoft's partners.)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as I am aware, Simba have been responsible for all of the projects in the last few years to bolt MDX support on to existing servers and applications. (With a sole exception: I was never able to find out where JasperSoft sourced the technology for its &lt;a href="http://www.jaspersoft.com/jaspersoft_app16.html"&gt;ODBO Connect&lt;/a&gt; product.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To summarize, this is a milestone moment in the development of OLAP technology, but there is still cause for concern. OLAP APIs exist only for a small number of languages, vendors show little inclination to provide true interoperability, and the key technology is provided by a small number of players.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can help. If  you are a user of OLAP technology it is in your interests to see the emergence of standards in the OLAP marketplace. So, please ask your vendor what they are doing about interoperability. Ask them whether there are OLAP clients, other than their own, that run on their server. And ask them for APIs to connect to their server from all of the languages you use in your organization. Then, we may move a little closer to the goal of OLAP for all.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-7466747269030858612?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/7466747269030858612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=7466747269030858612' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/7466747269030858612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/7466747269030858612'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/04/last-mdx-holdout-folds-but-true-olap.html' title='The last MDX holdout folds, but true OLAP interop is still a long way off'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-903810947836140325</id><published>2009-04-05T15:50:00.000-07:00</published><updated>2009-04-05T16:06:48.795-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian olap writeback splash olap4j palo jpalo'/><title type='text'>A what-if scenario: musing about adding writeback capability to Mondrian</title><content type='html'>&lt;div&gt;The &lt;a href="http://www.pentaho.com/summit09/"&gt;Pentaho Partner Summit&lt;/a&gt; last week was a great chance to meet people who are using — and being successful — with Mondrian.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always, people are thinking of using it in ways that I hadn't imagined. A couple of comments got me thinking about adding writeback support, something we'd long talked about, but seriously considered implementing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Writeback allows the OLAP end-user to modify cell values and see the effects ripple through their spreadsheet. As you can imagine, it is useful for doing what-if analysis, especially budgeting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If the cell is a sum of finer-grained cells, we need to modify those finer-grained cells also, and all of the totals of other dimensionalities created from those finer-grained cells, otherwise things just don't add up. This is hard to implement, because you sometimes need to modify a lot of cells, and even harder for ROLAP engines like Mondrian, because such engines don't store cells, they read directly from the unaggregated fact table.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, I went looking for existing APIs for writeback.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Microsoft offers support for writeback via the &lt;a href="http://msdn.microsoft.com/en-us/library/ms145568.aspx"&gt;UPDATE CUBE&lt;/a&gt; MDX statement. As always with Microsoft's MDX support, it's difficult to tell whether this is 'standard MDX', but the command seems to be well thought-out. The fact that it is an MDX command rather than an API call allows them to use an MDX expression as the rule by which to pro-rate changes to child cells.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also looked at the &lt;a href="http://www.jpalo.com/en/products/palo_java_api.html"&gt;JPalo Java API&lt;/a&gt;. (I've always wanted to work more closely with &lt;a href="http://www.palo.net/"&gt;Palo&lt;/a&gt;. Although they're an OLAP engine, they have a different architecture (C and MOLAP) and core target audience (Excel users), and they're open source, so I see a lot of benefit to them and us if we pool resources. I invited them to join the &lt;a href="http://www.olap4j.org/"&gt;olap4j&lt;/a&gt; process early on, but they preferred to define their own Palo-specific Java API. I'm still hopeful.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=209776"&gt;downloaded their most recent release from SourceForge&lt;/a&gt; and found that it was a release out of date (2.0 versus 2.5) and didn't contain the source code. There is a more up-to-date version in &lt;a href="http://jpalo.svn.sourceforge.net/viewvc/jpalo/trunk/"&gt;subversion&lt;/a&gt;. In DbConnection I found the setDataNumericSplashed method:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt; /**&lt;/div&gt;&lt;div&gt;  * Sets the given &lt;code&gt;double&lt;/code&gt; value at the specified cell.&lt;/div&gt;&lt;div&gt;  * The splashMode paramater is only important for consolidated cells and&lt;/div&gt;&lt;div&gt;  * determines how the value is scattered among the consolidated elements.&lt;/div&gt;&lt;div&gt;  * Please use the defined class constants for valid values. Although more&lt;/div&gt;&lt;div&gt;  * modes are currently defined only three are supported, namely:&lt;/div&gt;&lt;div&gt;  * SPLASH_MODE_DEFAULT, SPLASH_MODE_BASE_SET and SPLASH_MODE_BASE_ADD&lt;/div&gt;&lt;div&gt;  * @param cube {@link CubeInfo} representation&lt;/div&gt;&lt;div&gt;  * @param coordinates {@link ElementInfo} representations which specify the&lt;/div&gt;&lt;div&gt;  * coordinates&lt;/div&gt;&lt;div&gt;  * @param value the new value&lt;/div&gt;&lt;div&gt;  * @param splashMode the splash mode, use defined class constants&lt;/div&gt;&lt;div&gt;  */&lt;/div&gt;&lt;div&gt; public void setDataNumericSplashed(CubeInfo cube, ElementInfo[] coordinate, double value, int splashMode);&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;I couldn't find any more documentation than that, but 'splash mode' seems to be equivalent to Microsoft's update strategies USE_EQUAL_ALLOCATION etc.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are several remaining questions. What are the right changes to the olap4j API to support writeback? Support for the UPDATE CUBE statement is the leading contender. I'd love to hear what the olap4j community — especially the folks building the &lt;a href="http://wiki.pentaho.com/display/COM/Pentaho+Analysis+Tool"&gt;Pentaho Analysis Tool&lt;/a&gt; — think of this API, and how they would expose writeback in their UI.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I presume we'll need a scheme for transaction management. End-users will want to save their work, come back another day and continue where they left off. Several end-users might be using Mondrian at the same time, and want to see their numbers, not anyone else's. So, I think we'll need to introduce a concept I'd call a 'scenario', which is a property of a connection and can be persisted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'll need to figure out how to implement writeback within a Mondrian's ROLAP-with-caching architecture. Writing to the fact table is not tenable, because the modified cells can be of a multitude of dimensionalities. Neither is writing to an aggregate table, for the same reason. Ideal would be to write to disk a minimal description of the cells the user has modified — in XML, say — and do the other magic in the caching layer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lastly, I just need to find time to implement it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-903810947836140325?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/903810947836140325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=903810947836140325' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/903810947836140325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/903810947836140325'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/04/what-if-scenario-musing-about-adding.html' title='A what-if scenario: musing about adding writeback capability to Mondrian'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-3248997853782973475</id><published>2009-03-31T14:20:00.001-07:00</published><updated>2009-03-31T14:24:31.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian crosstab'/><title type='text'>Time crosstab in Mondrian</title><content type='html'>The Mondrian/Pentaho community are smarter than I am. &lt;a href="http://forums.pentaho.org/showthread.php?p=210498"&gt;Tom Barber wanted a way to display many months on one screen&lt;/a&gt;, and &lt;a href="http://pedroalves-bi.blogspot.com/2009/03/interesting-olap-date-crosstab-question.html"&gt;Pedro Alves figured out a way to display it as a years x months crosstab&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Yeslj5UWDbY/Sc6_apfAgLI/AAAAAAAAAAU/irXpVCRdjZU/s320/result2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 185px;" src="http://3.bp.blogspot.com/_Yeslj5UWDbY/Sc6_apfAgLI/AAAAAAAAAAU/irXpVCRdjZU/s320/result2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-3248997853782973475?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/3248997853782973475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=3248997853782973475' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/3248997853782973475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/3248997853782973475'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/03/time-crosstab-in-mondrian.html' title='Time crosstab in Mondrian'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Yeslj5UWDbY/Sc6_apfAgLI/AAAAAAAAAAU/irXpVCRdjZU/s72-c/result2.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-8394031466984827213</id><published>2009-03-23T11:40:00.000-07:00</published><updated>2009-03-23T12:03:48.747-07:00</updated><title type='text'>Being an open source vendor is like being Irish</title><content type='html'>There's been a lot of flap recently about the definition of an &lt;a href="http://blogs.the451group.com/opensource/2009/02/02/define-open-source-vendor"&gt;open source vendor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Just about every piece of software these days will have some fraction that is based on open source code, so every software company is to some degree an open source vendor. And in the process of developing this code, the company's developers will need to participate in the community of those projects, and possibly fix bugs and contribute features.&lt;br /&gt;&lt;br /&gt;So, whether you are an open source vendor, or for that matter, &lt;a href="http://blogs.opennms.org/?p=656"&gt;open core vendor&lt;/a&gt; or &lt;a href="http://blogs.the451group.com/opensource/2009/03/16/define-free-software-vendor/"&gt;free software vendor&lt;/a&gt; is a question of degree. That means that everyone gets to argue what level the bar is set, and it all descends into silliness.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It reminds me of the fact that, especially at this time of year, everyone in the United States &lt;a href="http://blogs.abcnews.com/politicalpunch/2009/03/president-ob-13.html"&gt;gets to be Irish&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In contrast, there is a very clear &lt;a href="http://www.opensource.org/docs/definition.php"&gt;definition for open source software&lt;/a&gt;. The beauty of it is that it doesn't matter whether the software is written by an employee of open source vendor, an anarchist student, or Microsoft-loving independent consultant. If it has an open source license, it's open source software. As simple as that.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-8394031466984827213?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/8394031466984827213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=8394031466984827213' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/8394031466984827213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/8394031466984827213'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/03/being-open-source-vendor-is-like-being.html' title='Being an open source vendor is like being Irish'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-6256712358193463505</id><published>2009-03-11T15:27:00.000-07:00</published><updated>2009-03-15T01:26:56.886-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mondrian kettle pentaho oem training'/><title type='text'>Pentaho Partner Summit 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pentaho.com/email/partner_summit09.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 380px; " src="http://www.pentaho.com/email/partner_summit09.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Are you thinking of incorporating Mondrian, or perhaps the entire Pentaho BI Suite, in your application? The Pentaho Partner Summit, on April 2nd and 3rd in Menlo Park, CA, is a good chance to get an overview of the technology.&lt;br /&gt;&lt;br /&gt;The first day will contain an executive overview for vendors thinking of using the technology. Chance to hear myself, Matt Casters (Kettle lead), Zack Urlocker (MySQL VP Marketing and general Open Source luminary) and Richard Daley (Pentaho CEO) hold forth, then a cocktail reception where you get to tell us what you think.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second day will have in depth training for OEM, reseller, and systems integrator partners who are already building apps using Pentaho technology.&lt;br /&gt;&lt;br /&gt;Read the agenda, get details, and register at &lt;a href="http://www.pentaho.com/summit09/agenda.php"&gt;http://www.pentaho.com/summit09/agenda.php&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-6256712358193463505?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/6256712358193463505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=6256712358193463505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6256712358193463505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/6256712358193463505'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/03/pentaho-partner-summit-2009.html' title='Pentaho Partner Summit 2009'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-1652082261421917585</id><published>2009-02-27T16:47:00.000-08:00</published><updated>2009-02-27T16:58:47.456-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ggro hawkwatch'/><title type='text'>Golden Gate Raptor Observatory is seeking volunteers</title><content type='html'>Every fall, I &lt;a href="http://julianhyde.blogspot.com/2008/08/hawkwatch.html"&gt;volunteer with the Golden Gate Raptor Observatory&lt;/a&gt;, identifying and counting migrating hawks. The location is spectacular &amp;mdash; Hawk Hill overlooks the Golden Gate Bridge &amp;mdash; and the hawks even more so.&lt;br /&gt;&lt;br /&gt;If you live in the Bay Area and think this might be your thing, attend one of the informational meetings: Wed 29th or Thu 30th April from 7 - 9.30pm, or Sat 2nd May 10am - 12.30pm.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BVv0WTpeWTs/SaiLSAkrMFI/AAAAAAAAADE/7yWyNeuobTY/s1600-h/ggro2009-flyer.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 309px; height: 400px;" src="http://2.bp.blogspot.com/_BVv0WTpeWTs/SaiLSAkrMFI/AAAAAAAAADE/7yWyNeuobTY/s400/ggro2009-flyer.png" alt="" id="BLOGGER_PHOTO_ID_5307645302363861074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Can anyone identify the 3 birds at the top of the flyer? Bonus points for age &amp;amp; gender.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-1652082261421917585?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/1652082261421917585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=1652082261421917585' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1652082261421917585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1652082261421917585'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/02/golden-gate-raptor-observatory-is.html' title='Golden Gate Raptor Observatory is seeking volunteers'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BVv0WTpeWTs/SaiLSAkrMFI/AAAAAAAAADE/7yWyNeuobTY/s72-c/ggro2009-flyer.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-1320772154487808157</id><published>2009-02-16T15:06:00.000-08:00</published><updated>2009-02-16T15:42:37.843-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='baby sebastian beer camra'/><title type='text'>Welcome, Sebastian Hyde!</title><content type='html'>Those of you who follow me in &lt;a href="http://twitter.com/julianhyde"&gt;Twitter&lt;/a&gt; and &lt;a href="http://www.facebook.com/profile.php?id=706953192"&gt;Facebook&lt;/a&gt; will know that my thoughts have been on &lt;a href="http://www.facebook.com/album.php?aid=65483&amp;amp;id=706953192"&gt;the birth of my son, Sebastian Hyde&lt;/a&gt;, and not on open-source BI or streaming SQL as much as usual.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;British fathers often celebrate their baby's arrival by "wetting the baby's head" at a local hostelry. Unlike the Christening ceremony that it is patterned after, this involves lots of beer but no baby. My friend Rhys (who, my American readers may like to note, is British but not English) devised a variation of that tradition he called "baby bingo", and we carried out the ceremony at &lt;a href="http://www.barclayspub.com/"&gt;Barclay's pub&lt;/a&gt; on Friday.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.expressandstar.com/2007/10/06/festival-pot-tribute-to-legend/"&gt;As my father well knows&lt;/a&gt;, beer and commemorative plaques go together. Rhys, Jacq and Sabine just presented us an excellent framed image listing the beers that we consumed in Sebastian's honor. I wonder what Sebastian will make of it when he's older?&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BVv0WTpeWTs/SZn5IlmKzWI/AAAAAAAAAC8/PpFDp3Zde0E/s1600-h/sebastian.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 132px;" src="http://4.bp.blogspot.com/_BVv0WTpeWTs/SZn5IlmKzWI/AAAAAAAAAC8/PpFDp3Zde0E/s400/sebastian.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5303543962131942754" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-1320772154487808157?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/1320772154487808157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=1320772154487808157' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1320772154487808157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1320772154487808157'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/02/welcome-sebastian-hyde.html' title='Welcome, Sebastian Hyde!'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BVv0WTpeWTs/SZn5IlmKzWI/AAAAAAAAAC8/PpFDp3Zde0E/s72-c/sebastian.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5672165237896126100.post-1718086890022712202</id><published>2009-02-07T14:53:00.000-08:00</published><updated>2009-02-07T15:55:40.083-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arithmetic journalism'/><title type='text'>Calculus: it's so basic that even moronic headline writers should know about it</title><content type='html'>The following &lt;a href="http://www.telegraph.co.uk/scienceandtechnology/technology/facebook/4512806/Facebook-at-five-Ten-times-more-traffic-to-Twitter-website-than-Facebook-in-last-year.html"&gt;headline in the Daily Telegraph&lt;/a&gt; struck me as really odd:&lt;blockquote&gt;"Facebook at five: Ten times more traffic to Twitter website than Facebook in last year"&lt;/blockquote&gt;The actual facts in the article show that the headline was patently false:&lt;div&gt;&lt;ul&gt;&lt;li&gt;"Over the last year, traffic to Twitter [...] has increased by 1191 per cent, while traffic to Facebook has grown just 110 per cent"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"Facebook [...] received 133 times more UK internet visits than Twitter"&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;If the headline had read "Ten times more growth in traffic to Twitter website than Facebook in last year" or "133 times more traffic to Twitter website than Facebook in last year", it would have been correct. I'm guessing that the headline writer omitted the word 'growth', presumably to save an inch of headline space, and turned the truth on its head: by a factor of a thousand.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem is that journalists are confusing a quantity and the time derivative of that quantity, and it bugs the heck out of me. Journalists who have a professional respect for punctuation, grammar and fact-checking seem to have a disdain for basic numeracy concepts like time derivatives. Do they not understand the difference, or do they think that we're too dumb to notice?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hear financial journalists trotting out that such and such tax would "raise 15 million pounds". What, on the very morning it is introduced? No; we, the reader, are supposed to insert "per year" to compensate for the journalistic shorthand.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here in the U.S., the terms "deficit" and "debt" are often used synonymously in the public discourse, where in fact, one is the derivative of the other. With record deficits and national debt looming, and astronomical numbers that we have a duty as citizens to try to comprehand, we need the help of journalists more than ever to help us make sense of the world.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5672165237896126100-1718086890022712202?l=julianhyde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://julianhyde.blogspot.com/feeds/1718086890022712202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5672165237896126100&amp;postID=1718086890022712202' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1718086890022712202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5672165237896126100/posts/default/1718086890022712202'/><link rel='alternate' type='text/html' href='http://julianhyde.blogspot.com/2009/02/calculus-its-so-basic-that-even-moronic.html' title='Calculus: it&apos;s so basic that even moronic headline writers should know about it'/><author><name>Julian Hyde</name><uri>http://www.blogger.com/profile/17816795169191026372</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02113230808232141537'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry></feed>