Skip to content

Commit 733ed4e

Browse files
custom drilldown & example
1 parent 0f34f61 commit 733ed4e

File tree

4 files changed

+78
-17
lines changed

4 files changed

+78
-17
lines changed

example/index.html

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html>
33
<head lang="en">
44
<meta charset="UTF-8">
5-
<title>Demos</title>
5+
<title>LightPivot Demos</title>
66
<!-- build:css -->
77
<link rel="stylesheet" href="../source/css/LightPivot.css"/>
88
<!-- endbuild -->
@@ -66,13 +66,33 @@
6666
"SELECT NON EMPTY [Product].[P1].[Product Category].Members ON 0, NON EMPTY [Outlet].[H1].[Region].Members ON 1 FROM [HoleFoods]",
6767
"SELECT NON EMPTY [Product].[P1].[Product Category].Members ON 0,NON EMPTY [DateOfSale].[Actual].[YearSold].&[2010].children ON 1 FROM [HoleFoods] %FILTER [DateOfSale].[Actual].[YearSold].&[2010] %FILTER [Measures].[%COUNT]",
6868
"SELECT NON EMPTY [Product].[P1].[Product Category].Members ON 0,NON EMPTY [DateOfSale].[Actual].[YearSold].Members ON 1 FROM [HoleFoods]",
69-
"SELECT NON EMPTY [Product].[P1].[Product Category].Members ON 0,NON EMPTY [DateOfSale].[Actual].[YearSold].Members ON 1 FROM [HoleFoods]"
70-
][v];
69+
{
70+
basicMDX: "SELECT NON EMPTY [Product].[P1].[Product Category].Members ON 0,NON EMPTY [DateOfSale].[Actual].[YearSold].Members ON 1 FROM [HoleFoods]",
71+
DrillDownExpression: "NONEMPTYCROSSJOIN([Outlet].[H1].[Region].Members,[Outlet].[H1].[Country].Members)"
72+
}
73+
][v],
74+
setup;
7175

7276
if (location.hash.slice(1, 3) === "q=") {
7377
req = location.hash.slice(3);
7478
}
7579

80+
setup = {
81+
container: document.getElementById("pivot"), // HTMLElement which will contain table.
82+
dataSource: {
83+
MDX2JSONSource: "http://localhost:57772/SAMPLES", // MDX2JSON server address
84+
basicMDX: typeof req === "object" ? req.basicMDX : req
85+
}
86+
};
87+
88+
if (req.DrillDownExpression) { // set custom DrillDown on variant 10
89+
setup.DrillDownExpression = req.DrillDownExpression;
90+
var e = document.createElement("div");
91+
e.innerHTML = "<b>Custom DrillDown expression set up here: </b>"
92+
+ setup.DrillDownExpression;
93+
document.getElementById("mdxForm").appendChild(e);
94+
}
95+
7696
document.getElementById("mdxForm").addEventListener("submit", function () {
7797

7898
var yourMDX = document.getElementById("yourMDX").value;
@@ -83,15 +103,10 @@
83103

84104
});
85105

86-
mdxTo.innerHTML = "<b>Basic MDX:</b> <i>" + req + "</i>";
106+
mdxTo.innerHTML = "<b>Basic MDX:</b> <i>" + (typeof req === "object" ? req.basicMDX : req)
107+
+ "</i>";
87108

88-
var lp = new LightPivotTable({
89-
container: document.getElementById("pivot"), // HTMLElement which will contain table.
90-
dataSource: {
91-
MDX2JSONSource: "http://localhost:57772/SAMPLES", // MDX2JSON server address
92-
basicMDX: req
93-
}
94-
})
109+
var lp = new LightPivotTable(setup); // create widget
95110

96111
</script>
97112
</body>

source/css/LightPivot.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@
153153

154154
.lpt > .tableContainer td, .lpt > .tableContainer th {
155155
border-radius: 3px;
156-
padding: .5em;
156+
padding: .4em;
157157
text-align: center;
158158
}
159159

source/js/LightPivotTable.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,14 @@ LightPivotTable.prototype.tryDrillDown = function (filter) {
7575

7676
// clone dataSource config object
7777
for (var i in _.CONFIG.dataSource) { ds[i] = _.CONFIG.dataSource[i]; }
78-
ds.basicMDX = this.mdxParser.drillDown(ds.basicMDX, filter) || ds.basicMDX;
78+
79+
if (this.CONFIG.DrillDownExpression && this._dataSourcesStack.length < 2) {
80+
ds.basicMDX = this.mdxParser.customDrillDown(
81+
this.dataSource.BASIC_MDX, this.CONFIG.DrillDownExpression, filter
82+
) || this.dataSource.BASIC_MDX;
83+
} else {
84+
ds.basicMDX = this.mdxParser.drillDown(this.dataSource.BASIC_MDX, filter) || this.dataSource.BASIC_MDX;
85+
}
7986

8087
this.pushDataSource(ds);
8188

@@ -103,6 +110,7 @@ LightPivotTable.prototype.showDrillThrough = function (filters) {
103110
for (var i in _.CONFIG.dataSource) { ds[i] = _.CONFIG.dataSource[i]; }
104111
ds.action = "MDXDrillthrough";
105112
if (filters instanceof Array) {
113+
console.log("BASIC MDX: " + this.dataSource.BASIC_MDX, "\n\nFILTERS: " + filters);
106114
ds.basicMDX = this.mdxParser.customDrillThrough(this.dataSource.BASIC_MDX, filters)
107115
|| this.dataSource.basicMDX;
108116
} else {

source/js/MDXParser.js

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ MDXParser.prototype.drillDown = function (basicMDX, filter) {
1717

1818
var filterParts = filter.split(/(\(?)([^\)]*)(\)?)/),
1919
clearFilter = filterParts[2],
20-
parts = basicMDX.split(/(\s+ON\s+0,\s*)(.*)(\s+ON\s+1\s*)/),
20+
parts = basicMDX.split(/(\s+ON\s+0,\s*)(.*)(\s+ON\s+1\s*)/i),
2121
oldPath = parts[2].split(/(\(?)(\[[^\(^\)]*)(\)?)/);
2222

2323
oldPath[2] = clearFilter + ".children";
2424
parts[2] = oldPath.join("");
2525

26+
//console.log("\n\nIN: "+basicMDX+"\n\nFILTER: " + filter + "\n\nCUSTOM: "+ parts.join("")
27+
// + " %FILTER " + filterParts.join(""));
28+
2629
return parts.join("") + " %FILTER " + filterParts.join("");
2730

2831
} catch (e) {
@@ -34,6 +37,39 @@ MDXParser.prototype.drillDown = function (basicMDX, filter) {
3437

3538
};
3639

40+
/**
41+
* Replace dimension [1] with expression.
42+
*
43+
* @param {string} basicMDX
44+
* @param {string} expression
45+
* @param {string} [filter]
46+
* @returns {string}
47+
*/
48+
MDXParser.prototype.customDrillDown = function (basicMDX, expression, filter) {
49+
50+
try {
51+
52+
var parts = basicMDX.split(/(\s+ON\s+0,\s*)(.*)(\s+ON\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+
69+
}
70+
71+
};
72+
3773
/**
3874
* Returns DrillThrough query for given MDX query.
3975
*
@@ -45,7 +81,7 @@ MDXParser.prototype.drillThrough = function (basicMDX) {
4581
try {
4682

4783
var statement = ["DRILLTHROUGH SELECT "]
48-
.concat(basicMDX.split(/(\s+ON\s+0,\s*)(.*)(\s+ON\s+1\s*)/).slice(2)).join("");
84+
.concat(basicMDX.split(/(\s+ON\s+0,\s*)(.*)(\s+ON\s+1\s*)/i).slice(2)).join("");
4985

5086
console.log("DRILLTHROUGH STATEMENT:", statement);
5187

@@ -66,15 +102,17 @@ MDXParser.prototype.drillThrough = function (basicMDX) {
66102
*/
67103
MDXParser.prototype.customDrillThrough = function (basicMDX, filters) {
68104

69-
var cubeName = basicMDX.split(/FROM\s*\[([^\]]*)]/i)[1],
70-
query = "DRILLTHROUGH SELECT FROM [" + cubeName + "]";
105+
var cubeAndFilters = basicMDX.split(/(FROM\s*\[[^\]]*].*)/i)[1],
106+
query = "DRILLTHROUGH SELECT " + cubeAndFilters;
71107

72108
if (!(filters instanceof Array)) filters = [filters];
73109

74110
for (var i in filters) {
75111
query += " %FILTER " + filters[i];
76112
}
77113

114+
console.log("CUSTOM DRILLTHROUGH STATEMENT: " + query);
115+
78116
return query;
79117

80118
};

0 commit comments

Comments
 (0)