@@ -5,114 +5,92 @@ var MDXParser = function () {
55} ; 
66
77/** 
8-  * Performs DrillDown on MDX query . 
8+  * Debug method . 
99 * 
10-  * @param  {string } basicMDX  
11-  * @param  {string } filter  
12-  * @returns   { string } - new query.  
10+  * @param  {string } mdx  
11+  * @param  {string } [message]  
12+  * @private   
1313 */ 
14- MDXParser . prototype . drillDown  =  function  ( basicMDX ,  filter )  { 
15- 
16-     try  { 
17- 
18-         var  filterParts  =  filter . split ( / ( \( ? ) ( [ ^ \) ] * ) ( \) ? ) / ) , 
19-             clearFilter  =  filterParts [ 2 ] , 
20-             parts  =  basicMDX . split ( / ( \s + O N \s + 0 , \s * ) ( .* ) ( \s + O N \s + 1 \s * ) / i) , 
21-             oldPath  =  parts [ 2 ] . split ( / ( \( ? ) ( \[ [ ^ \( ^ \) ] * ) ( \) ? ) / ) ; 
22- 
23-         oldPath [ 2 ]  =  clearFilter  +  ".children" ; 
24-         parts [ 2 ]  =  oldPath . join ( "" ) ; 
25- 
26-         //console.log("\n\nIN: "+basicMDX+"\n\nFILTER: " + filter + "\n\nCUSTOM: "+  parts.join("") 
27-         //    + " %FILTER " + filterParts.join("")); 
28- 
29-         return  parts . join ( "" )  +  " %FILTER "  +  filterParts . join ( "" ) ; 
30- 
31-     }  catch  ( e )  { 
32- 
33-         console . error ( "Unable to get DrillDown statement from" ,  basicMDX ,  "with filter" ,  filter ) ; 
34-         return  "" ; 
35- 
36-     } 
37- 
14+ MDXParser . prototype . _warnMDX  =  function  ( mdx ,  message )  { 
15+     console . warn ( "MDX is not parsed:\n\n%s\n\n"  +  ( message  ? "("  +  message  +  ")"  : "" ) ,  mdx ) ; 
3816} ; 
3917
4018/** 
41-  * Replace dimension [1] with expression . 
19+  * Converts filter to setExpression that can be inserted to MDX . 
4220 * 
43-  * @param  {string } basicMDX 
44-  * @param  {string } expression 
45-  * @param  {string } [filter] 
46-  * @returns  {string } 
21+  * @param  filterSpec 
4722 */ 
48- MDXParser . prototype . customDrillDown  =  function  ( basicMDX ,  expression ,  filter )  { 
49- 
50-     try  { 
51- 
52-         var  parts  =  basicMDX . split ( / ( \s + O N \s + 0 , \s * ) ( .* ) ( \s + O N \s + 1 \s * ) / i) ; 
53- 
54-         parts [ 2 ]  =  expression ; 
55- 
56-         if  ( filter )  parts . push ( " %FILTER "  +  filter ) ; 
57- 
58-         //console.log("\n\nIN: "+basicMDX+"\n\nEXPR: " + expression + "\n\nFILTER: " 
59-         //    + filter + "\n\nCUSTOM: " + parts.join("")); 
60- 
61-         return  parts . join ( "" ) ; 
62- 
63-     }  catch  ( e )  { 
64- 
65-         console . error ( "Unable to get DrillDown statement from" ,  basicMDX ,  "by" ,  expression , 
66-             "with filter" ,  filter ) ; 
67-         return  "" ; 
68- 
23+ MDXParser . prototype . makeSetExpressionFromFilter  =  function  ( filterSpec )  { 
24+     if  ( filterSpec . match ( / ^ \( [ ^ \) , ] * , [ ^ \) ] * \) $ / ) )  { 
25+         return  "NONEMPTYCROSSJOIN"  +  filterSpec . slice ( 0 ,  filterSpec . length  -  1 )  +  ".children)" ; 
26+     }  else  { 
27+         return  filterSpec  +  ".children" ; 
6928    } 
70- 
7129} ; 
7230
7331/** 
74-  * Returns DrillThrough query for given  MDX query. 
32+  * Performs DrillDown on  MDX query. 
7533 * 
76-  * @param  {string } basicMDX 
77-  * @returns  {string } 
34+  * @param  {string } mdx 
35+  * @param  {string } filter 
36+  * @param  {string } [expression] - if is set, "* ON 1" will be replaced with "{value} ON 1" 
37+  * @returns  {string } - new query. 
7838 */ 
79- MDXParser . prototype . drillThrough  =  function  ( basicMDX )  { 
39+ MDXParser . prototype . drillDown  =  function  ( mdx ,   filter ,   expression )  { 
8040
81-     try  { 
41+     if  ( ! filter )  { 
42+         this . _warnMDX ( mdx ,  "no filter specified" ) ; 
43+         return  "" ; 
44+     } 
8245
83-         var  statement  =  [ "DRILLTHROUGH SELECT " ] 
84-             . concat ( basicMDX . split ( / ( \s + O N \s + 0 , \s * ) ( .* ) ( \s + O N \s + 1 \s * ) / i) . slice ( 2 ) ) . join ( "" ) ; 
46+     var  parts  =  mdx . split ( / ( s e l e c t ) ( .* ?) ( f r o m ) / ig) ;  // split by SELECT queries 
8547
86-         console . log ( "DRILLTHROUGH STATEMENT:" ,  statement ) ; 
48+     if  ( parts . length  <  4 )  { 
49+         this . _warnMDX ( mdx ) ; 
50+         return  "" ;  // no select query matched 
51+     } 
8752
88-         return  statement  ===  "DRILLTHROUGH SELECT "  ? ""  : statement ; 
53+     var  selectBody  =  parts [ parts . length  -  3 ] , 
54+         dimensions  =  selectBody . split ( / ( \s * O N \s * [ 0 1 ] \s * , ? \s * ) / ) ; 
8955
90-     }  catch  ( e )  { 
56+     if  ( dimensions . length  <  2 )  { 
57+         this . _warnMDX ( mdx ) ; 
58+         return  "" ;  // no dimensions matched 
59+     } 
9160
92-          console . error ( "Unable to get DrillThrough statement from" ,   basicMDX ) ; 
93-          return  "" ; 
61+     var   index   =   - 1 ; 
62+     dimensions . map ( function ( e , i ) { if ( e . match ( / \s * O N \s * [ 0 1 ] \s * , ? \s * / ) )   index = i - 1 ;   return  e ; } ) ; 
9463
64+     if  ( index  ===  - 1 )  { 
65+         this . _warnMDX ( mdx ,  "DrillDown is impossible" ) ; 
66+         return  "" ;  // DrillDown is impossible (no "1" dimension) 
9567    } 
9668
69+     dimensions [ index ]  =  expression  ||  this . makeSetExpressionFromFilter ( filter ) ; 
70+     for  ( var  i  in  dimensions )  { 
71+         if  ( dimensions [ i ] . length  ===  1 )  {  // "0" || "1" 
72+             dimensions [ i ] ( parseInt ( i ) ,  1 ) ; 
73+         } 
74+     } 
75+     parts [ parts . length  -  3 ]  =  dimensions . join ( "" ) ; 
76+ 
77+     return  this . applyFilter ( parts . join ( "" ) ,  filter ) ; 
78+ 
9779} ; 
9880
9981/** 
10082 * @param  {string } basicMDX 
101-  * @param  {string[] } filters 
83+  * @param  {string[] } [ filters]  
10284 */ 
103- MDXParser . prototype . customDrillThrough  =  function  ( basicMDX ,  filters )  { 
85+ MDXParser . prototype . drillThrough  =  function  ( basicMDX ,  filters )  { 
10486
10587    var  cubeAndFilters  =  basicMDX . split ( / ( F R O M \s * \[ [ ^ \] ] * ] .* ) / i) [ 1 ] , 
10688        query  =  "DRILLTHROUGH SELECT "  +  cubeAndFilters ; 
10789
108-     if  ( ! ( filters  instanceof  Array ) )  filters  =  [ filters ] ; 
109- 
11090    for  ( var  i  in  filters )  { 
111-         query  +=   " %FILTER "   +   filters [ i ] ; 
91+         query  =   this . applyFilter ( query ,   filters [ i ] ) ; 
11292    } 
11393
114-     console . log ( "CUSTOM DRILLTHROUGH STATEMENT: "  +  query ) ; 
115- 
11694    return  query ; 
11795
11896} ; 
0 commit comments