@@ -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