java /zongfeng 
mondrian是一個olap工具,jpviot是一個顯示它處理結果的taglib,使用這2個工具可以做復雜的統計匯總并顯示

OLAP:Mondrian&JPviot


olap:online analytical processing(聯機分析處理),實時的分析大量數據,其操作通常是 只讀的.online意味著即使是大量的數據,系統對查詢的響應也要足夠快.

olap使用一種技術叫做multimensional analysis(多維分析),關系數據庫將數據存成行和列的形式,多維數據表包含軸和單元.

mondrian包含4層:表示層,計算層,聚集層,存儲層.

表示層:指最終呈現在用戶顯示器上的,以及與用戶之間的交互,有許多方法來展現多維數據,包括數據透視表,餅,柱,線狀圖.

計算層:分析,驗證,執行MDX查詢.

聚集層:一個聚集指內存中一組計算值(cell),這些值通過維列來限制.計算層發送單元請求,如果請求不在緩存中,或者不能通過旋轉聚集導出的話,聚集層向存儲層發送請求.

聚合層是一個數據緩沖層,從數據庫來的單元數據,聚合后提供給計算層。聚合層的主要作用是提高系統的性能。

存儲層:提供聚集單元數據和維表的成員,這些層可以不在同一機子上,但是計算和聚集層必須在同一臺機子上.

三種需要存儲的數據:1:事實數據2:聚集3:維

配置文件中的特定含義:
1:cube(立方體):是維和量的集合

2:measure(量):一個具體的測量量

3:dimension(維):一個屬性或者一系列屬性,通過維可以將量分類

下面是我關于jpviot的修改:jpviot是顯示mondrian的一個taglib

問題1:讓行和列的標題顯示為中文,此問題非常簡單,只需要在你的schema中設置一下編碼即可,例如在FoodMart中設置如下

<?xml version="1.0" encoding="gb2312"?>

然后可以這樣描述Measure:

<Measure name="庫存消耗" column="store_cost" aggregator="sum" formatString="#,###.00"/>

所有帶name屬性的都可以替換成中文,jpviot會自動顯示這些中文.

問題2:關于去掉Measure標題的問題:

默認生成的報表中會有這么一行
<tr>
<th rowspan="1" colspan="2" class="corner-heading" nowrap="nowrap">&nbsp;</th><th rowspan="1" colspan="3" class="heading-heading" nowrap="nowrap"><img height="9" width="9" border="0" src="/jpivot/jpivot/table/drill-position-other.gif">Measures</th>
</tr>

這一行有個默認的標題是Measure,如果你不想刪除這一行,而僅僅想修改這個標題的話,可以修改
WEB-INFclassescomtonbellerjpivotmondrianresources.properties.但是注意這個文件中內容寫成英文沒問題,如寫成中文的話應該寫成unicode,例如023這樣的形式.

如果你要去掉這一行的話,修改配置文件和xsl恐怕做不到,我分析了其代碼,最終在代碼層次上做了修改:
修改的代碼為com.tonbeller.jpivot.table.ColumnAxisBuilderImpl:

將其構造函數中的setHierarchyHeader的參數修改為setHierarchyHeader(NO_HEADER);這個函數支持3個參數,我們修改后就不會顯示那個標題行了.

問題3:生成圖表后自動生成chart表的問題:

我測試生成圖表中的中文問題都解決了,但是每次生成chart圖時會報UTF編碼錯誤,從錯誤判斷應該是某個文件的編碼錯誤,起初根據錯誤判斷是filter的問題,可是filter那點代碼中根本不涉及編碼的問題.我將很多配置文件的編碼都改了也不行.因為那個英文例子沒問題,我查看了JFreechart的一個servlet(org.jfree.chart.servlet.DisplayChart),因為jpviot就是調用這個servlet實現繪圖的,分析這個servlet我知道它會在一個臨時目錄生成png文件,然后交給servlet寫到瀏覽器的響應中去,我找到那個臨時目錄(tomcattemp),發現里面已經生成了正確的中文圖形.從而判斷圖形生成正確,但是寫到瀏覽器中時出了問題.最后我查看能生成英文圖表的那個例子,發覺不僅僅在html中生成圖形,而且生成map.而這個map的生成全是在程序中做的,程序生成一個xml文件,通過chart.xsl解析生成map的最終html代碼.但是在程序中生成時并沒有加入編碼設置,因此問題出在生成map這兒.

最終修改代碼如下:

com.tonbeller.jpivot.chart.ChartComponent:

在render函數中修改如下:

String desc="<?xml version="1.0" encoding="gb2312"?>";
String xchart =desc+"n"+ "<xchart>" + writeImageMap(filename, info, false) + "</xchart>";
這樣就為xchart設置了編碼.

問題4:修改jfreechart中的默認字體:

com.tonbeller.jpivot.chart.ChartComponent中定義了幾種字體,但是這幾種字體都是英文字體,我將其修改為宋體:
把所有的字體定義都改為"SimSun"
注意到這兒并沒有玩,如果你僅僅修改程序,仍舊會出現問題,報錯說沒有適合"SimSun"的item
同時要修改一個配置文件:WEB-INFjpivotchartchartpropertiesform.xml
在這個配置文件中將SimSun加入其中,形式如下:

<listBox1 type="string" modelReference="fontName" label="Title font">
<listItem value="SansSerif" label="SansSerif"/>
<listItem value="Serif" label="Serif"/>
<listItem value="SimSun" label="SimSun"/>
<listItem value="Monospaced" label="Monospaced"/>
</listBox1>

以上為我最近的一點心得,我會完善這篇文檔,將包含mondrian中schema的書寫方法和MDX查詢語言,歡迎大家交流
link1:微軟的MDX中文文檔