OLAP:Mondrian&JPviot
olap:online analytical processing(聯(lián)機(jī)分析處理),實(shí)時(shí)的分析大量數(shù)據(jù),其操作通常是 只讀的.online意味著即使是大量的數(shù)據(jù),系統(tǒng)對(duì)查詢的響應(yīng)也要足夠快.
olap使用一種技術(shù)叫做multimensional analysis(多維分析),關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)存成行和列的形式,多維數(shù)據(jù)表包含軸和單元.
mondrian包含4層:表示層,計(jì)算層,聚集層,存儲(chǔ)層.
表示層:指最終呈現(xiàn)在用戶顯示器上的,以及與用戶之間的交互,有許多方法來(lái)展現(xiàn)多維數(shù)據(jù),包括數(shù)據(jù)透視表,餅,柱,線狀圖.
計(jì)算層:分析,驗(yàn)證,執(zhí)行MDX查詢.
聚集層:一個(gè)聚集指內(nèi)存中一組計(jì)算值(cell),這些值通過(guò)維列來(lái)限制.計(jì)算層發(fā)送單元請(qǐng)求,如果請(qǐng)求不在緩存中,或者不能通過(guò)旋轉(zhuǎn)聚集導(dǎo)出的話,聚集層向存儲(chǔ)層發(fā)送請(qǐng)求.
聚合層是一個(gè)數(shù)據(jù)緩沖層,從數(shù)據(jù)庫(kù)來(lái)的單元數(shù)據(jù),聚合后提供給計(jì)算層。聚合層的主要作用是提高系統(tǒng)的性能。
存儲(chǔ)層:提供聚集單元數(shù)據(jù)和維表的成員,這些層可以不在同一機(jī)子上,但是計(jì)算和聚集層必須在同一臺(tái)機(jī)子上.
三種需要存儲(chǔ)的數(shù)據(jù):1:事實(shí)數(shù)據(jù)2:聚集3:維
配置文件中的特定含義:
1:cube(立方體):是維和量的集合
2:measure(量):一個(gè)具體的測(cè)量量
3:dimension(維):一個(gè)屬性或者一系列屬性,通過(guò)維可以將量分類
下面是我關(guān)于jpviot的修改:jpviot是顯示mondrian的一個(gè)taglib
問(wèn)題1:讓行和列的標(biāo)題顯示為中文,此問(wèn)題非常簡(jiǎn)單,只需要在你的schema中設(shè)置一下編碼即可,例如在FoodMart中設(shè)置如下
<?xml version="1.0" encoding="gb2312"?>
然后可以這樣描述Measure:
<Measure name="庫(kù)存消耗" column="store_cost" aggregator="sum" formatString="#,###.00"/>
所有帶name屬性的都可以替換成中文,jpviot會(huì)自動(dòng)顯示這些中文.
問(wèn)題2:關(guān)于去掉Measure標(biāo)題的問(wèn)題:
默認(rèn)生成的報(bào)表中會(huì)有這么一行
<tr>
<th rowspan="1" colspan="2" class="corner-heading" nowrap="nowrap"> </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>
這一行有個(gè)默認(rèn)的標(biāo)題是Measure,如果你不想刪除這一行,而僅僅想修改這個(gè)標(biāo)題的話,可以修改
WEB-INFclassescomtonbellerjpivotmondrianresources.properties.但是注意這個(gè)文件中內(nèi)容寫成英文沒(méi)問(wèn)題,如寫成中文的話應(yīng)該寫成unicode,例如023這樣的形式.
如果你要去掉這一行的話,修改配置文件和xsl恐怕做不到,我分析了其代碼,最終在代碼層次上做了修改:
修改的代碼為com.tonbeller.jpivot.table.ColumnAxisBuilderImpl:
將其構(gòu)造函數(shù)中的setHierarchyHeader的參數(shù)修改為setHierarchyHeader(NO_HEADER);這個(gè)函數(shù)支持3個(gè)參數(shù),我們修改后就不會(huì)顯示那個(gè)標(biāo)題行了.
問(wèn)題3:生成圖表后自動(dòng)生成chart表的問(wèn)題:
我測(cè)試生成圖表中的中文問(wèn)題都解決了,但是每次生成chart圖時(shí)會(huì)報(bào)UTF編碼錯(cuò)誤,從錯(cuò)誤判斷應(yīng)該是某個(gè)文件的編碼錯(cuò)誤,起初根據(jù)錯(cuò)誤判斷是filter的問(wèn)題,可是filter那點(diǎn)代碼中根本不涉及編碼的問(wèn)題.我將很多配置文件的編碼都改了也不行.因?yàn)槟莻€(gè)英文例子沒(méi)問(wèn)題,我查看了JFreechart的一個(gè)servlet(org.jfree.chart.servlet.DisplayChart),因?yàn)閖pviot就是調(diào)用這個(gè)servlet實(shí)現(xiàn)繪圖的,分析這個(gè)servlet我知道它會(huì)在一個(gè)臨時(shí)目錄生成png文件,然后交給servlet寫到瀏覽器的響應(yīng)中去,我找到那個(gè)臨時(shí)目錄(tomcattemp),發(fā)現(xiàn)里面已經(jīng)生成了正確的中文圖形.從而判斷圖形生成正確,但是寫到瀏覽器中時(shí)出了問(wèn)題.最后我查看能生成英文圖表的那個(gè)例子,發(fā)覺(jué)不僅僅在html中生成圖形,而且生成map.而這個(gè)map的生成全是在程序中做的,程序生成一個(gè)xml文件,通過(guò)chart.xsl解析生成map的最終html代碼.但是在程序中生成時(shí)并沒(méi)有加入編碼設(shè)置,因此問(wèn)題出在生成map這兒.
最終修改代碼如下:
com.tonbeller.jpivot.chart.ChartComponent:
在render函數(shù)中修改如下:
String desc="<?xml version="1.0" encoding="gb2312"?>";
String xchart =desc+"n"+ "<xchart>" + writeImageMap(filename, info, false) + "</xchart>";
這樣就為xchart設(shè)置了編碼.
問(wèn)題4:修改jfreechart中的默認(rèn)字體:
com.tonbeller.jpivot.chart.ChartComponent中定義了幾種字體,但是這幾種字體都是英文字體,我將其修改為宋體:
把所有的字體定義都改為"SimSun"
注意到這兒并沒(méi)有玩,如果你僅僅修改程序,仍舊會(huì)出現(xiàn)問(wèn)題,報(bào)錯(cuò)說(shuō)沒(méi)有適合"SimSun"的item
同時(shí)要修改一個(gè)配置文件:WEB-INFjpivotchartchartpropertiesform.xml
在這個(gè)配置文件中將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>
以上為我最近的一點(diǎn)心得,我會(huì)完善這篇文檔,將包含mondrian中schema的書寫方法和MDX查詢語(yǔ)言,歡迎大家交流
link1:微軟的MDX中文文檔