版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
mondrian源碼分析TOC\o"1-5"\h\z\o"CurrentDocument"1. 概述 1\o"CurrentDocument"1.1. 若干概念 1\o"CurrentDocument"架構(gòu) 2\o"CurrentDocument"2. 靜態(tài)類包分析 32.1. 包解釋 3\o"CurrentDocument"Schemamanger部分 4\o"CurrentDocument"包mondrian.calc 4\o"CurrentDocument"包mondrian.ola—接口 5\o"CurrentDocument"mdx函數(shù)包 5\o"CurrentDocument"funCall 5\o"CurrentDocument"Query類 6\o"CurrentDocument"包mondrian.rola—計(jì)算層 6\o"CurrentDocument"成員讀取包MemberReader 6\o"CurrentDocument"單元格讀取CellReader 8\o"CurrentDocument"RolapResult類 11\o"CurrentDocument"RolapEvaluator類 12\o"CurrentDocument"關(guān)于排序 12\o"CurrentDocument"聚集層Starlayer 13\o"CurrentDocument"概述 13\o"CurrentDocument"聚合裝載過程 13\o"CurrentDocument"segment詳解 14\o"CurrentDocument"緩存失效控制 17\o"CurrentDocument"交互管理層 18\o"CurrentDocument"初始化MondrianModel 18\o"CurrentDocument"獲取結(jié)果集 19\o"CurrentDocument"修改點(diǎn) 22\o"CurrentDocument"mondrian角色參數(shù)化 22\o"CurrentDocument"緩存失效控制 22\o"CurrentDocument"connection創(chuàng)建參數(shù)優(yōu)化 23\o"CurrentDocument"維度成員排序 23\o"CurrentDocument"對mondrianbug的修正 24\o"CurrentDocument"to-doList 24概述若干概念成員(member):成員是代表維度中一次或多次數(shù)據(jù)出現(xiàn)的項(xiàng)。度量值也可以算作一個(gè)維度,因此一個(gè)具體度量值項(xiàng)也可以作為一個(gè)成員。元組(tuple):是向量,用于定義來自多維數(shù)據(jù)集的數(shù)據(jù)切片;它由來自一個(gè)或多個(gè)維度的單個(gè)成員的有序集合組成。元組用于標(biāo)識來自多維數(shù)據(jù)集的特定多維數(shù)據(jù)塊;由來自多維數(shù)據(jù)集中各個(gè)維度的一個(gè)成員組成的元組完全描述單元值。換言之,元組是一種成員向量。例如:(時(shí)間.[下半年],路線.非陸地.航空),由單個(gè)成員組成的元組也可括在圓括號內(nèi),但這不是必需的。單元(cell):多維成員的交集創(chuàng)建單元,可以是單個(gè)單元或單元塊。元組唯一標(biāo)識多維數(shù)據(jù)集中的一部分;它不必指某個(gè)特定單元,也不必包括多維數(shù)據(jù)集中的所有維度。集合(set):集合是零個(gè)、一個(gè)或多個(gè)元組的有序集合。集合最常用于在MDX查詢中定義軸維度和切片器維度,并且同樣可能只具有單個(gè)元組或可能在某些情況下為空。下面的示例顯示具有兩個(gè)元組的集合:{(時(shí)間?[上半年],路線?非陸地?航空),(時(shí)間?[下半年],路線.非陸地.海路)}架構(gòu)mondrian總共包含四個(gè)層次:表示層,計(jì)算層,聚集層,存儲(chǔ)層.。表示層(presentationlayer):指最終呈現(xiàn)在用戶顯示器上的,以及與用戶之間的交互,有許多方法來展現(xiàn)多維數(shù)據(jù),包括數(shù)據(jù)透視表,餅,柱,線狀圖.計(jì)算層(dimensionallayer):分析,驗(yàn)證,執(zhí)行MDX查詢.一個(gè)mdx查詢語句會(huì)有多個(gè)處理階段。先是計(jì)算軸,然后是軸上的單元值。為效率起見,計(jì)算層批量將單元請求發(fā)送到聚集層。請求轉(zhuǎn)換器允許程序操作存在的請求,而不是為每個(gè)請求從頭構(gòu)造mdx請求。元數(shù)據(jù)描述了計(jì)算模型和它怎么匹配到關(guān)系模型。聚集層(starlayer):—個(gè)聚集指內(nèi)存中一組計(jì)算值(cell),這些值通過維列來限制?計(jì)算層發(fā)送單元請求,如果請求不在緩存中,或者不能通過旋轉(zhuǎn)聚集導(dǎo)出的話,聚集層向存儲(chǔ)層發(fā)送請求.聚集層是一個(gè)數(shù)據(jù)緩沖層(cache),從數(shù)據(jù)庫來的單元數(shù)據(jù),聚合后提供給計(jì)算層。聚集層的主要作用是提高系統(tǒng)的性能。存儲(chǔ)層:提供聚集單元數(shù)據(jù)(cell)和維表的成員(member),這些層可以不在同一機(jī)子上,但是計(jì)算和聚集層必須在同一臺(tái)機(jī)子上。有三種需要存儲(chǔ)的數(shù)據(jù):事實(shí)數(shù)據(jù)(事實(shí)表)、維度表和聚集數(shù)據(jù)(即聚合表)架構(gòu)圖如下:
PentahoAnalysisServices:MondrianProjectArchitectureHTTPXIMLiTdlIPJavaJPivotJ0LAPAPIOtherClientApp.XMLforAn白創(chuàng)劃玄apiSwingClhem靜態(tài)類包分析PentahoAnalysisServices:MondrianProjectArchitectureHTTPXIMLiTdlIPJavaJPivotJ0LAPAPIOtherClientApp.XMLforAn白創(chuàng)劃玄apiSwingClhem2?1?包解釋mondrian.calcmondrian.guimondrian.il8nmondrian.mdxmondrian.olapmondrian.olap4j提供編譯好的表達(dá)式。mondrian.calcmondrian.guimondrian.il8nmondrian.mdxmondrian.olapmondrian.olap4j設(shè)計(jì)Mondrianschema的圖形接口國際化和本地化工具為mdx表達(dá)式定義解析樹核心包,定義了連接和schema的元模型,用來執(zhí)行查詢中間層,olap服務(wù)器的驅(qū)動(dòng),用來代替jolap的mondrian.recorder任務(wù)處理記錄接口mondrian.rolapolap包的數(shù)據(jù)訪問層的實(shí)現(xiàn)mondrian.spi 用戶自定義擴(kuò)展的服務(wù)端支持接口
mondrian.tuimondrian.udfmondrian.utilmondrian.webmondrian.xmlaMondrian文本用戶接口mondrian.tuimondrian.udfmondrian.utilmondrian.webmondrian.xmla用戶定義方法Mondrian工具包Mondrian的servlet和tag庫
xmlforanalysisAPI的實(shí)現(xiàn)Schemamanger部分Mondrian.rolap.RolapSchema類是mondrianschema的核心類,該類在在建立RolapConnection時(shí)被建立,但是有個(gè)schemaPool維護(hù)著schema的緩存,參見RolapSchema.Pool內(nèi)部類。在RolapSchema對象生成之前,首先有個(gè)原始的MondrianDef$Schema對象,該對象相當(dāng)于mondrianschemaxml文件的簡單對應(yīng),由xml解析器直接生成。具體來說首先由xml文件解析成dom對象,然后再生成更加結(jié)構(gòu)化的MondrianDef$Schema,最后再load成更加高級的RolapSchema對象,具體參見RolapSchema.loac(StringcatalogUrl,StringcatalogStr);以MondrianDef$Schema或RolapSchema對象為根,都還會(huì)有一系列的內(nèi)部類去對應(yīng)于mondrianschema下的子元素。如果一個(gè)Hierarchy的hasAll為true,則會(huì)有一個(gè)allmember,對應(yīng)著也需要一個(gè)虛擬的alllevel,位于該Hierarchy的levels[0]位置。包mondrian.calcCalc是所有可計(jì)算表達(dá)式的基接口。在mondrian中關(guān)于表達(dá)式有如下兩個(gè)概念:ThelogicallanguageofparsedMDXfragments(Exp).Thephyiscallanguageofcompiledexpressions(Calc).兩種語言可以允許我們將邏輯語言(即mdx語言)和物理語言(howitistobeevaluated)分開.物理語言對類型的要求更加嚴(yán)格,andcertainconstructswhichareimplicitinthelogicallanguage(suchastheadditionofcallstothe<Member>.CurrentMemberfunction)aremadeexplicitinthephysicallanguage。Calc接口針對各種類型有許多子接口:其中IntegerCalc,BooleanCalc,DoubleCalcStringCalc是數(shù)值型的,MemberCalc,LevelCalc,HierarchyCalc,DimensionCalc!則用于olap模型中的元素。每一個(gè)子接口有都有一個(gè)實(shí)現(xiàn)的虛基類:AbstractlntegerCalc,AbstractBooleanCalcAbstractDoubleCalc,AbstractStringCalc,AbstractMemberCalc,AbstractLevelCalcAbstractHierarchyCalc,AbstractDimensionCalc表達(dá)式(Expression)通常由表達(dá)式編譯者(ExpCompiler)創(chuàng)建。對于一個(gè)給定的表達(dá)式通常有若干個(gè)evaluation策略,表達(dá)式編譯者在編譯過程中可以給我們一個(gè)選擇的機(jī)會(huì)。包mondrian?olap—接口Mondrian的核心包,定義了連接對象和完整的olap模型結(jié)構(gòu)元對象,并且允許執(zhí)行mdx查詢語句。mdx函數(shù)包mondrian.olap.fun定義了mdx內(nèi)置的函數(shù)集。函數(shù)(function)的定義:參數(shù)描述例子name函數(shù)名"Members"signature函數(shù)標(biāo)志"vDimension>.Members"description函數(shù)描述"Returnsthesetofallmembersinadimension."flagsEncodingofthesyntactictype,returntype,andparametertypesofthisoperator.Theencodingisdescribedbelow."pxd"Theflagsfieldisanstringwhichencodesthesyntactictype,returntype,andparametertypesofthisoperator.The first character determines the syntactic type, as described byFunUtil.decodeSyntacticType(String.The secondcharacterdeterminesthereturn type, as described byFunUtil.decodeReturnCategory(String).Thethirdandsubsequencecharactersdeterminethetypesoftheargumentsarguments,asdescribedbyFunUtil.decodeParameterCategories(String.Forexample,"pxd"means"anoperatorwithpropertysyntax(p)whichreturnsaset(x)andtakesadimension(d)asitsargument".funCallAFunCallisafunctionappliedtoalistofoperands.Theparsercreatesfunctioncallsasanunresolvedfunctioncall.Thevalidatorconvertsittoaresolvedfunctioncall,whichhasafunctiondefinitionandextratypeinformation。參見:Mondrian.olap.ResolveFunCallUnresolveFunCallQuery類用于mdx查詢。創(chuàng)建query創(chuàng)建:Connection.parseQuery(java.lang.String)。倉U建mondrian.olap.Parser類,基于java_cup實(shí)現(xiàn),調(diào)用其parse或debug_parse()方法,里面最主要是CUP$Parser$do_action()方法,內(nèi)部針對所有語句詞句做了解析。其中case75:生成最后的mondrian.olap.Query對象,內(nèi)部調(diào)用parser.makeQuery()方法,內(nèi)部初始化時(shí)會(huì)再調(diào)用query的resolve,mondrian.olap.QueryAxis的resolve(),進(jìn)而會(huì)執(zhí)行數(shù)據(jù)庫。執(zhí)行query執(zhí)行:Connection.execute(mondrian.olap.Query)返回結(jié)果:Result.有些查詢從緩存中讀取,非常迅速。當(dāng)也有些需要花費(fèi)些時(shí)間,這時(shí)可以通過MondrianProperties.QueryTimeout參數(shù)設(shè)置timeout。如果想控制返回結(jié)果不至于太大,可以通過MondrianProperties.QueryLimit參數(shù)控制返回的cell數(shù)目。在查詢執(zhí)行的任何時(shí)候,另一個(gè)進(jìn)程都可以通過 cancel()方法取消該查詢,此時(shí)Connection.execute(Query)會(huì)拋出異常。包mondrian.rolap—計(jì)算層實(shí)現(xiàn)最終的實(shí)際的olap數(shù)據(jù)訪問功能,包括讀取維度成員值和cell值。成員讀取包MemberReader概述包路徑:Mondrian.rolap。該部分的起點(diǎn)是RolapEvaluator類。當(dāng)一個(gè)類似于“member.children”的成員表達(dá)式被請求時(shí),RolapEvaluator將調(diào)用RolapSchemaReader對象.RolapSchemaReader將再負(fù)責(zé)調(diào)用各個(gè)MemberReader對象(每個(gè)維度一個(gè)memberReader)。在大部分場合下,將使用SmartMemberReader來迅速返回所需要的維度成員值。
Dc>ldgjfanglUlAmbaiR4jd?i4AMe35>jreMember?durceri&hemaR&aderSchemaR&lapStar寺?interiace>>AilBldpHierarchyiBqlMembeiSduiccCdeheMembeiRe^VSmartMernberR^jdcisourceO.aRolapSchemaRoIjpSchAmjRfiijdAiRclapCubeR&lapConrie?ti'Mi■+F:oIdpEvaludioiMemberCacheDc>ldgjfanglUlAmbaiR4jd?i4AMe35>jreMember?durceri&hemaR&aderSchemaR&lapStar寺?interiace>>AilBldpHierarchyiBqlMembeiSduiccCdeheMembeiRe^VSmartMernberR^jdcisourceO.aRolapSchemaRoIjpSchAmjRfiijdAiRclapCubeR&lapConrie?ti'Mi■+F:oIdpEvaludioiMemberCacheSmartMemberReaderSmartMemberReader實(shí)現(xiàn)了MemberReader接口,它實(shí)現(xiàn)了維度成員及其子成員的緩存,如果有一個(gè)成員位于緩存中,則還會(huì)有一個(gè)其子成員的列表。它同時(shí)緩存了level下的成員們。該類主要的成員有:source:MemberReader,用于實(shí)際從數(shù)據(jù)庫中讀取維度成員值。mapMemberToChildren:map,實(shí)現(xiàn)成員及其子成員的映射,key為RolapMember,value為ListvRolapMember〉。mapKeyToMember:map,實(shí)現(xiàn)所有成員的緩存,其中的key為MemberKeymapLevelToMembers:map,實(shí)現(xiàn)級別及其所有成員的映射,key為RolapLevel,value為ListvRolapMember〉。上述的source其實(shí)為mondrian.rolap.SqlMemberSource類,該類中反過來又存儲(chǔ)了SmartMemberReader對象,作為其cache成員屬性。成員讀取過程:smartMemberReader.getMemberChildren(parentMembers,children,constrain);最終通過source.getMemberChildren()…,其中反過來會(huì)把找到的children賦予mapKeyToMember。最終除了將結(jié)果返回在children輸出參數(shù)中,同時(shí)也對mapMemberToChildren賦值了。另外,smartMemberReader.getMembersInlevel()實(shí)現(xiàn)了對mapLevelToMembers的緩存。在newRolapEvaluator()時(shí)被調(diào)用。在讀取時(shí)會(huì)對成員進(jìn)行orderby(如果設(shè)置了ascending的話。)單元格讀取CellReader概述包路徑:Mondrian.rolap。Cells會(huì)被求值多次。第一次時(shí),Evaluator使用FastBatchingCellReader來求值。當(dāng)一個(gè)單元被求值時(shí),evaluateCurrent()被調(diào)用。此時(shí)FastBatchingCellReader并沒有被調(diào)用,而是為那個(gè)cell記錄了一個(gè)CellRequest并且return(notthrow)anexception。在所有的cells都有了對應(yīng)的CellRequests之后,Aggregation會(huì)生成SQL,以一個(gè)單獨(dú)的sql請求來載入所有的cells。然后由AggregatingCellReader重新計(jì)算cells,從緩存中返回cells值。++1'actT^bleRoDjpStjro..xAohpGtar.TableRolapStar.Condition十御nCendiiionRolapStar.CDlumnCljk£hjfriu-ztata.AggisgallonManaggrMethodssh-:'fjIdmovselsewhere0..AO..KAggre>]mti■:-ri.A^is「-八O..rtCtIIR亡qutstF:olspAggregationManager+utmFtialnteD:Objei:tcolumnList-LIii日lueList:Lisi++1'actT^bleRoDjpStjro..xAohpGtar.TableRolapStar.Condition十御nCendiiionRolapStar.CDlumnCljk£hjfriu-ztata.AggisgallonManaggrMethodssh-:'fjIdmovselsewhere0..AO..KAggre>]mti■:-ri.A^is「-八O..rtCtIIR亡qutstF:olspAggregationManager+utmFtialnteD:Objei:tcolumnList-LIii日lueList:LisiFlolaEZiStar.h.ri&asure+seiimentRefe+seiimentRefeo.M■+1/111十AggreqatlngCellReader11FartBstchlngEllRE日価1111■=.=.inierTace>.='ereaces??CtllR&ddsr八17■=:<IntarljaoaS-:-SagmbntDJtjSAtc&liKeyi|■jrdiriphn:i書A11111△1111JD■snssE4gmsntD出m占占=:p StiwntC'jiiSLetRolapEvalujt>n2?5?2?2?FastBatchingCellReader類主要方法,Objectget(Evaluatorevaluator)■ 首先根據(jù)當(dāng)前的上下文環(huán)境(即一組members)倉從建cellRequest,cellRequest中包含了所有必要的從star中取值的信息。該組members的交集便是要求值的單元格,其中切片軸上的成員和其他軸上的成員完全同等對待;其中度量軸上的成員要求上StoredMeasure(非計(jì)算成員CaculatedMember);度量值上的成員位于第一個(gè)。通過調(diào)用request的addConstrainedColumn()方法把各member對應(yīng)的column和value(屬StarColumnPredicate)值加至至Urequest中.■調(diào)用AggregationManager.getCellFromCache(request,pinnedSegments)方法從緩存中獲取cell值。首先根據(jù)request中的列組索引標(biāo)識從緩存中獲取aggreation緩存對象,如果為空說明緩存還未建立則直接返回null,如果有值則調(diào)用aggregation.getCellValue(measure,colValueKeys)方法獲取緩存的cell值;getCellValue內(nèi)部首先會(huì)根據(jù)measure查找匹配的segment,然后調(diào)用segment.getCellValue(keys)從segment的dataset緩存集中查找相應(yīng)的cell值。如果getCellFromCache返回為null則調(diào)用recordCellRequest()記錄需求。這些cellrequest會(huì)被組織成多個(gè)cellrequestbatch,以便將來聚合層進(jìn)行批讀取以提高效率。關(guān)于batch的詳細(xì)討論參見下面Batch類章節(jié)。上層會(huì)在適當(dāng)?shù)臅r(shí)候調(diào)用batchCellReading.loadAggregations()以實(shí)際讀取這些cell值,前提是batches對象中已有cellRequest了。每個(gè)batch的讀取參見batch.loadAggregation()方法,最終調(diào)用聚合層的方法,參見aggreation.load(….)。2?5?2?3?FastBatchingCellReader.Batch類每個(gè)batch對應(yīng)與一組特定的columns環(huán)境下的cell求取(具有相同的列和列值(列值是具體的值,不會(huì)是“all”值));從batch的屬性可以看出batch包含了哪些上下文:RolapStar.Column[],這個(gè)指明了基于哪些列(也即基于哪些維度,包括切片維度)進(jìn)行讀?。籗etvStarColumnPredicate>[],保存了每列的限定值,對于一列而言,限定值可能會(huì)有多個(gè)(畢竟是批處理,一次請求多個(gè));MeasureList,指明求取哪些度量值上的cell(度量值本質(zhì)是度量維上的限定值)。BitKey,該batch的唯一索引。如圖所示的一個(gè)mdx查詢結(jié)果界面:MDX查it昨富select-[[Measures].[YJD],[Measures],[GCLC]}ON匚DLliMN亦 上1NONEMPTVOrder(Crossjoin({[dimLX].'AlldimLXs]f[dirriLX].[AllciirnLXs]J疋罟紅]「rdimLX].[AlldimUfe].[寧波一梁孵hLdimLxj.[AIIdimLXs].[il!R5<^b[diml_x],[AlldimLXs].[H-匡]—墳門]「[diml_XJ.[Alldimucs].[同江一三亞][dimLX].[Al 壽繪][dlml_x].[AlldlmLXs].[^麗蠱]「[dlml_x][AlldimLXs].核拋£.]},{[dimTime].[AlldimTimes]r[Measures].[¥JD],DESC)ONROWSfrom|二矩:姦1莖周魚恰況]where[dlmstatlon].[Aldlmstatloins].[=i^市]措標(biāo)、擁擠度%」職測里程(公里)123.25%2955.032+〒潔一宴弊+全部32&?&7%120?604同江一三亞亠全苛32.45%317.769Slicer:[Jtl市-寧硬帀]此時(shí)會(huì)產(chǎn)生兩個(gè)batch,每個(gè)batch最終可能會(huì)產(chǎn)生若干segment,segment是cells的集合,segment數(shù)和度量值個(gè)數(shù)相同。一個(gè)batch是(其中“當(dāng)量數(shù)/適應(yīng)交通量=擁擠度”擁擠度是計(jì)算成員),最終產(chǎn)生3個(gè)segment,每個(gè)segment只有一個(gè)cell:(地市='寧波市',measure='觀察里程')(地市='寧波市',measure='當(dāng)量數(shù)')(地市='寧波市',measure='適應(yīng)交通量')另一個(gè)batch是(其中的G310等是路線代碼,最終過濾掉空值后就剩下兩個(gè)了),最終產(chǎn)生3個(gè)segment,每個(gè)segment有多個(gè)cell:(地市='寧波市',roadIdin(G310,G322,G210,S321....),measure='觀察里程')(地市='寧波市',roadIdin(G310,G322,G210,S321....),measure='當(dāng)量數(shù)')(地市='寧波市',roadIdin(G310,G322,G210,S321....),measure='適應(yīng)交通量')2、...RolapResult類RolapResult是一個(gè)運(yùn)行中的請求的結(jié)果集。Mondiran的執(zhí)行結(jié)果由RolapResult類表單,由于mdx查詢語句本身就包含onrows(行軸上)、oncolumns(列軸上)和where部分(切片軸上),結(jié)果集中相對應(yīng)的為ROlapAxis對象,這其中有個(gè)sliceAxis對象。因此結(jié)果集是由若干ROlapAxis對象和一個(gè)RolapCell組構(gòu)成的。每個(gè)axis對象又由若干Position對象組成,每個(gè)Position對象又可能由若干member組成(注意一個(gè)postion會(huì)橫跨多個(gè)維度的成員)。注意ROlapAxis是抽象類,實(shí)際的對象類可能隨著不同的軸是不同的。如圖:指標(biāo)路線詢查時(shí)風(fēng)?擁擠度%*觀測里程(公里)-所有踣線j全部123.2S%29S8.032下寧波一集毎j全部325,67%123.604廠T同江三亞j全部32.45%317.769圖中,column軸上兩個(gè)position(每個(gè)position含有一個(gè)成員),分別是:[[Measures].[YJD]][[Measures].[GCLC]]Row軸上有三個(gè)position(每個(gè)position含有二個(gè)成員),分別是:[[dimLX].[AlldimLXs],[dimTime].[AlldimTimes]][[dimLX].[AlldimLXs].[寧波—梁輝],[dimTime].[AlldimTimes]][[dimLX].[AlldimLXs].[同江-三亞],[dimTime].[AlldimTimes]]切片軸上貝9有一■個(gè)position:[[dimstation].[AlldimStations].[寧波市]]單元值們則放置在RolapResult中的cellInfos對象里,屬CellInfoContainer接口,其中存放著Celllnfo,并通過Cellkey進(jìn)行索引。CellKey:用于在maps里訪問cellinfo時(shí)使用的鍵值,根據(jù)cell的位置來決定鍵值。CellKey共有四個(gè)默認(rèn)實(shí)現(xiàn),及zero、one、two、three和many版的實(shí)現(xiàn),分別對應(yīng)著軸的個(gè)數(shù)。這些類中關(guān)鍵的屬性便是存儲(chǔ)各軸的位置值。CellInfo、CellInfoContainer:內(nèi)部類。CellInfo包含了一個(gè)cell所需要的所有信息(最關(guān)鍵的包含value值和一些formatter設(shè)置);最終將作為構(gòu)造ROlapCell對象的參數(shù)。CellInfoContainer顯然是cellinfo的容器,并使用CellKey來索弓I。ROlapCell:最終返回給jpivot的cell單元值。RolapEvaluator類最終負(fù)責(zé)在多維環(huán)境中執(zhí)行mdx表達(dá)式。該類中維護(hù)一個(gè)很重要的對象,即currentMembers,該上下文對象針對每個(gè)維度都包含了一個(gè)成員;通過setContext方法用來設(shè)置當(dāng)前維度,以開始計(jì)算當(dāng)前維度組合下的表達(dá)式值。關(guān)于排序排序有單元值排序和維度成員排序兩種場景,但單元值排序優(yōu)先級更高,只有當(dāng)單元值排序相當(dāng)時(shí),才再對成員值進(jìn)行排序。單元值排序有六種,升序、降序、打破Hierarchy升序、打破Hierarchy降序、topcount、bottomcount。其中前四種參見:FunUtil.SortMembers()中的方法,這是總?cè)肟?,其中有BreakMemberComparator、HierarchicalMemberComparator、BreakArrayComparator、HierarchicalArrayComparator等排序器(Array包含多個(gè)member,此時(shí)相當(dāng)于cell上下文環(huán)境由多個(gè)維度參與)。對于array類排序,參見其中的publicintcompare(Member[]a1,Member[]a2)方法;
對于單member類排序,參見其中的publicintcompareinternal(Memberal,Membera2)方法。維度成員排序似乎有三種:按照orderKey、按照ordinary、按照值(參見RolapMpareTo()方法,最終相當(dāng)于按字符串或數(shù)值比較,其中第三種內(nèi)部又會(huì)用到ascending屬性),這個(gè)是我們自己新增的屬性。具體參見FunUpareSiblingMembers()方法。聚集層Starlayer概述包mondrian.rolap.agg,管理聚合緩存,這些緩存中包含著各單元格值。RolapStar中含有aggregation(聚合),一個(gè)aggregation是針對一組columns的,該聚合可以包含多個(gè)segment,同一個(gè)aggregation中的每個(gè)segment都將覆蓋到相同的列集合;每個(gè)segment表達(dá)了一組cell值,這些cell自然是由具體的列值和一個(gè)必備度量值(如下面的unitsales)來限定,如:(Unitsales,Gender='F',Statein{'CA','OR'},MaritalStatus=anything),由于其中的列值可能會(huì)取多個(gè),因此最終表達(dá)的cell值也可能是多個(gè)。RolapStar中有一個(gè)aggregations,是一個(gè)map對象,通過request的constrainedColumnsBitKey來索弓丨一個(gè)aggregation。2.6.2.聚合裝載過程實(shí)際中無論是底層的單元值還是聚合后的單元值都是放在聚合對象aggregation中的。以aggregation.load(colums,measures,predicates,pinnedSegments為入口:■參數(shù)中的除了measure不一樣外,其限定的列(colums)及列值(prediactes)都是一致的。因此轉(zhuǎn)換成對對若干segment]]的求值:Segment.load(segment[],???.),在該方法內(nèi)部:>首先根據(jù)segments中的信息生成sql查詢語句,有兩個(gè)不同的生成類:AggQuerySpec和SegmentArrayQuerySpec,前者用于找到聚合表情況下的sql語句生成,后者用于基于原始表的sql語句生成。具體可以參見它們的generateSqlQuery()方法,這里注意對以distinctcount有不同的生成方法。Sql生成的核心類是sqlQuery,類似于交換系統(tǒng)中的QuerySqlFactory類。注意:聚合操作如avg、sum等都最終還是利用sql語句實(shí)現(xiàn)的,并非mondiran自己實(shí)現(xiàn)這些聚合功能。利用jdbc,執(zhí)行sql語句,獲取到j(luò)dbc結(jié)果集。參見mondrian.rolap.RolapUtil.executeQuery()方法。解析結(jié)果集,將結(jié)果集中的數(shù)據(jù)填充到rows[][]二維數(shù)值中,并且把各列的值也填充好。如圖:結(jié)果集每條記錄的值如寧波市、G010???.,前面兩個(gè)是維度列值,后面幾個(gè)是度量值。H?ru'A'skrrayLi£tCE>(id=5754)0□objecttia]Cia=5sg7)□*[0]Object[5] G4硏陰〕+A.[1]Object[5](id=5904^■[2]null■m■1[寧波市』G010;8924.75;317.769;27500.□]各列的值(其中第0項(xiàng)值為:[寧波市]):0?:=d-rieV sisS*rtsdSet<E>[2](i1=5751)+A[0]TreeSet<E>(id=5BB4)□?[1]TreeS?t<S>(id=5S63)+ 、."rowsArrayList<E>(id=5T54)inm 4^"丄Tlclrrc4■:frDr 4C4- 」■匚?■匚匚3:GOIO^S31B]決定采用稀疏性(sparse)還是稠密性(dense)SegmentDataSet存儲(chǔ);并創(chuàng)建該空的DataSet對象。每個(gè)segment關(guān)聯(lián)一個(gè)DataSet對象;但其稀疏性還是稠密性都是一致的。注意dataset中單元值的個(gè)數(shù)可能是1個(gè)或多個(gè),是由各限定列的指定值個(gè)數(shù)乘積,若所有限定列都取單值,則顯然最終決定一個(gè)唯一的單元。將上述的rows中間集轉(zhuǎn)換到SegmentDataSets集中。最后再分揀給每個(gè)segment,確保每個(gè)segment的setData(SegmentDataSet)被調(diào)用。■若干排序:ValueColumnConstraintComparatorsegment詳解■ 下圖是有兩個(gè)限定列的兩個(gè)segment的描述(注:其中roadid列雖然指定了8個(gè)候選值,但由于使用了空行/列過濾,最后只剩下兩個(gè)路線有值,故最后segment結(jié)果
集的單元數(shù)也只有兩個(gè),對應(yīng)于G010和G318的):Uuci.iiiL:盧二measuce=avg(FACT干線交調(diào).適丙棗誦旱□3yi=珪丈適衛(wèi)剛訕.uri=-=^1T-Seepcent#4{wea2ure=sun{礦JiSeepcent#4{wea2ure=sun{礦Ji匸T_干域發(fā)幅.觀測里_程;1I二叮r戔交訓(xùn)Jem詠站市-汁:J7貳I二疋十轅犬祕|吹很任iT.KOlDir-IGZilOrZCQ1,Z235..U2Zu,ZZ27,Z22C..^310rU213).?0A3I3--iID.2001,^239.-眈EG”范EQ龍注,LC..J31G-}其中第二個(gè)對應(yīng)的dataset為:[317.769,120.604]對應(yīng)的透視界面為(參見其中的“觀測里程”度量值,與上面的dataset一致):措標(biāo)迺查時(shí)間*擁擠度附■觀測里程(公里)-斯有路線+全部123.25%2955.03Z廠寧波一聚輝+全部326.&7%120.60斗鼻同江一三亞“全部32.45%317.759讓巳r:[地市二寧波市]再譬如有三個(gè)限定列的segment描述,它們位于另一個(gè)aggreation對象中:(其中timeld列的any代表所以可能的時(shí)間值,共有2003?2005三個(gè)年,所以最終該segment共有3個(gè)cell值)Segtwetit#E:■{measure=sum(FACT_干線交調(diào)■觀測里程)D:干線交調(diào)_觀測立匸地市=<寧波市}D工干線交調(diào)_觀測站.ROADID={S318]DTK]干線交調(diào)[時(shí)間.TIHEIJ=any}對應(yīng)的dataset為:[129.910,129.909,57.950]對應(yīng)的透視界面為(顯然該aggreation還有另外一個(gè)segment,其中的roadId對應(yīng)于G010—寧波梁輝):
指標(biāo)路線謂查時(shí)IU*捉擠度濟(jì)>觀測里程(公里)卜所有路線“全部123.25%29E5.0324■同江一二亞32.45%317.7692003^30.61^129.9102004^25.85%129.9092005^31.53%57.950亠寧波一架揮-全部326.57U120.6042003^250.12^40.2002004^390.74%40.2022005舉309.16^斗0.202Slicer:[地市二寧波市]再譬如維度中有多個(gè)層次的情況時(shí),一個(gè)維度會(huì)對應(yīng)多個(gè)列:Queryquery=connection.parseQuery("SELECT"+"{[Time].[1997],〃+"[Time].[1997].Children}ONCOLUMNS,"+"{[Customer].[USA],"+"[Customer].[USA].[OR],"+"[Customer].[USA].[WA]}ONROWS"+"FROM[Sales]");Resultresult二connection.execute(query);該語句執(zhí)行后產(chǎn)生的segment分別為(除了第一個(gè)外,其他segment都會(huì)包含多個(gè)cell,因?yàn)樗鼈兊南薅兄泻卸嘀档那闆r):SegmentYN#1YearNationUnitSales1997USA xxxPredicates:Year=1997,Nation二USASegmentYNS#1YearNation State Unit Sales1997USA OR xxx1997USA WA xxxPredicates: Year=1997, Nation二USA,State={OR,WA}SegmentYQN#1YearQuarterNationUnitSales1997Q1 USA xxx1997Q2 USA xxxPredicates:Year=1997,Quarter=any,Nation二USAYearQuarterNationStateUnitSalesSegmentYQNS#11997Q1 USA OR xxx1997Q1 USA WA xxx1997Q2 USA OR xxx1997Q2 USA WA xxxPredicates:Year=1997,Quarter=any,Nation二USA,State={0R,WA}2.6.4.緩存失效控制為了提高訪問效率,必須要使用緩存;但使用緩存必須在數(shù)據(jù)庫底層數(shù)據(jù)發(fā)生變化時(shí)做好數(shù)據(jù)的失效和刷新工資。老版的做法非常粗略:mondrian.rolap.RolapSchema.clearCache();這意味著連mondrianschema都被失效,與之關(guān)聯(lián)的全部緩存也都被失效。新版的做法是引入了mondrian.olap.CacheControl接口,可以很精細(xì)地由應(yīng)用控制緩存。為此mondrian引入了cellregion的概念,region是由一個(gè)或多個(gè)成員定義出的多維空間(定義時(shí)可以指定是否包含這些成員的子成員)。為了使緩存失效,你需要首先定義一個(gè)region,然后告訴mondrian失效該region內(nèi)的所有cells;為了確保一致性,mondrian還會(huì)自動(dòng)地把這些cell的聚合單元也一起失效。具體參見CacheControl.CellRegion類。最終調(diào)用cacheControl.flush(cellRegion)。具體失效時(shí),還是針對segment進(jìn)行的,因?yàn)閙ondiran中的ce
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 清城區(qū)小學(xué)考試真題及答案
- 皮試注射考試題及答案
- 掛靠礦山合同范本
- 初中英語口語教學(xué)中的跨學(xué)科融合教學(xué)實(shí)踐研究教學(xué)研究課題報(bào)告
- 2025年民辦文綺中學(xué)初三上學(xué)期語文12月考試卷及答案
- 智慧教育云平臺(tái)中大數(shù)據(jù)分析在小學(xué)英語教學(xué)中的應(yīng)用研究與實(shí)踐教學(xué)研究課題報(bào)告
- 2026年網(wǎng)絡(luò)在線學(xué)法普法考試題庫含完整答案(各地真題)
- 2026年材料員考試備考題庫附參考答案【研優(yōu)卷】
- 2025年醫(yī)保知識考試題庫及答案(醫(yī)保異地就醫(yī)結(jié)算報(bào)銷指南與模擬題)
- 《幼兒園主題活動(dòng)與幼兒社會(huì)交往能力培養(yǎng)的家園共育策略優(yōu)化實(shí)踐研究》教學(xué)研究課題報(bào)告
- NB-T42167-2018預(yù)制艙式二次組合設(shè)備技術(shù)要求
- 跟著音樂游中國智慧樹知到期末考試答案章節(jié)答案2024年廣州大學(xué)
- 硬科技早期投資-項(xiàng)目評估指南
- 2024年陜西省中考英語真題(A卷)
- 中國法律史-第二次平時(shí)作業(yè)-國開-參考資料
- (高清版)JTGT D81-2017 公路交通安全設(shè)施設(shè)計(jì)細(xì)則
- 餐飲服務(wù)人員職業(yè)道德培訓(xùn)課件
- 大學(xué)生當(dāng)兵職業(yè)生涯規(guī)劃書
- GB/T 31167-2023信息安全技術(shù)云計(jì)算服務(wù)安全指南
- 北京師范大學(xué)研究生培養(yǎng)方案
- 新防火門使用說明書
評論
0/150
提交評論