@@ -5,114 +5,92 @@ var MDXParser = function () {
5
5
} ;
6
6
7
7
/**
8
- * Performs DrillDown on MDX query .
8
+ * Debug method .
9
9
*
10
- * @param {string } basicMDX
11
- * @param {string } filter
12
- * @returns { string } - new query.
10
+ * @param {string } mdx
11
+ * @param {string } [message]
12
+ * @private
13
13
*/
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 ) ;
38
16
} ;
39
17
40
18
/**
41
- * Replace dimension [1] with expression .
19
+ * Converts filter to setExpression that can be inserted to MDX .
42
20
*
43
- * @param {string } basicMDX
44
- * @param {string } expression
45
- * @param {string } [filter]
46
- * @returns {string }
21
+ * @param filterSpec
47
22
*/
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" ;
69
28
}
70
-
71
29
} ;
72
30
73
31
/**
74
- * Returns DrillThrough query for given MDX query.
32
+ * Performs DrillDown on MDX query.
75
33
*
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.
78
38
*/
79
- MDXParser . prototype . drillThrough = function ( basicMDX ) {
39
+ MDXParser . prototype . drillDown = function ( mdx , filter , expression ) {
80
40
81
- try {
41
+ if ( ! filter ) {
42
+ this . _warnMDX ( mdx , "no filter specified" ) ;
43
+ return "" ;
44
+ }
82
45
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
85
47
86
- console . log ( "DRILLTHROUGH STATEMENT:" , statement ) ;
48
+ if ( parts . length < 4 ) {
49
+ this . _warnMDX ( mdx ) ;
50
+ return "" ; // no select query matched
51
+ }
87
52
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 * ) / ) ;
89
55
90
- } catch ( e ) {
56
+ if ( dimensions . length < 2 ) {
57
+ this . _warnMDX ( mdx ) ;
58
+ return "" ; // no dimensions matched
59
+ }
91
60
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 ; } ) ;
94
63
64
+ if ( index === - 1 ) {
65
+ this . _warnMDX ( mdx , "DrillDown is impossible" ) ;
66
+ return "" ; // DrillDown is impossible (no "1" dimension)
95
67
}
96
68
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
+
97
79
} ;
98
80
99
81
/**
100
82
* @param {string } basicMDX
101
- * @param {string[] } filters
83
+ * @param {string[] } [ filters]
102
84
*/
103
- MDXParser . prototype . customDrillThrough = function ( basicMDX , filters ) {
85
+ MDXParser . prototype . drillThrough = function ( basicMDX , filters ) {
104
86
105
87
var cubeAndFilters = basicMDX . split ( / ( F R O M \s * \[ [ ^ \] ] * ] .* ) / i) [ 1 ] ,
106
88
query = "DRILLTHROUGH SELECT " + cubeAndFilters ;
107
89
108
- if ( ! ( filters instanceof Array ) ) filters = [ filters ] ;
109
-
110
90
for ( var i in filters ) {
111
- query += " %FILTER " + filters [ i ] ;
91
+ query = this . applyFilter ( query , filters [ i ] ) ;
112
92
}
113
93
114
- console . log ( "CUSTOM DRILLTHROUGH STATEMENT: " + query ) ;
115
-
116
94
return query ;
117
95
118
96
} ;
0 commit comments