You would normally get a cell set when using cubeExecuteMdx() or MDX call to Canvas API. The cell set is a bit hard to read and consume by other libraries like d3, so it’s better to process it before. Below is the function which can help you. You can simply copy and paste it into your controller or service and it will work.
The function is tm1flat(tm1o,attrs,bFilter).
–tm1o is the object which you get in response to MDX query
–attrs (optional). Object. Which specifies what attributes you want to use instead of element principal name. Property name is the dimension name and value is the Attribute name.
For example, {‘Year’:‘Financial Year’,‘Employee’:‘Full Name’,‘Version’:‘Description’}
–bFilter (optional). Boolean. If it’s true then each object will include dimensions from filters. By default, filters are not included.
The final result will look like this
[
{“Employee”:“Pamela Ansman-Wolfe O”,
“Period”:“Year”,
“Sales Quota Measure”:“Amount”,
“Scenario”:“Actual”,
“TM1CubeValue”:1199000,
“Year”:“2006”},
{“Employee”:“Stephen Jiang Y”,
“Period”:“Year”,
“Sales Quota Measure”:“Amount”,
“Scenario”:“Actual”,
“TM1CubeValue”:389000,
“Year”:“2007”},
…
]
Full Version:
function tm1flat(tm1o,attrs,bFilter){
//function to convert array into object
function toObject(val,label) {
var obj = {};
for (var i = 0; i < label.length; i++)
if (val[i] !== undefined && label[i] !== undefined ) obj[label[i]] = val[i];
return obj;
}
//========================================================
//collect all dimensions from rows and columns
//1) dimensions on columns
var dims=[];
for (var i=0;i<tm1o.Axes[1].Hierarchies.length;i++){
dims.push(tm1o.Axes[1].Hierarchies[i].Name);
}
//2)dimensions on rows
for (var i=0;i<tm1o.Axes[0].Hierarchies.length;i++){
dims.push(tm1o.Axes[0].Hierarchies[i].Name);
}
//3)OPTIONAL.filters
if(bFilter != null && bFilter==true){
for (var i=0;i<tm1o.Axes[2].Hierarchies.length;i++){
dims.push(tm1o.Axes[2].Hierarchies[i].Name);
}
}
//4)add value to the list of dimensions
dims.push('TM1CubeValue');
//create auxilary arrays. rc is the main one. it contains all reference points + value as the last element.tm1fo is the array to be returned.
var r1=[],
c1=[],
rc=[];
var cellCount=0;
var tm1fo=[];
//loop through rows
for(var j=0;j<tm1o.Axes[1].Tuples.length;j++){
for(var j1=0;j1<tm1o.Axes[1].Tuples[j].Members.length;j1++){
if(attrs != null && tm1o.Axes[1].Tuples[j].Members[j1].Attributes[attrs[tm1o.Axes[1].Hierarchies[j1].Name]] != null){
r1.push(tm1o.Axes[1].Tuples[j].Members[j1].Attributes[attrs[tm1o.Axes[1].Hierarchies[j1].Name]]);
}
else{
r1.push(tm1o.Axes[1].Tuples[j].Members[j1].Name);
}
}
//loop through columns
for(var k=0;k<tm1o.Axes[0].Tuples.length;k++){
for(var k1=0;k1<tm1o.Axes[0].Tuples[k].Members.length;k1++){
if(attrs != null && tm1o.Axes[0].Tuples[k].Members[k1].Attributes[attrs[tm1o.Axes[0].Hierarchies[k1].Name]] != null){
c1.push(tm1o.Axes[0].Tuples[k].Members[k1].Attributes[attrs[tm1o.Axes[0].Hierarchies[k1].Name]]);
}
else{
c1.push(tm1o.Axes[0].Tuples[k].Members[k1].Name);
}
}
rc=r1.concat(c1);
//include filter values
if(bFilter != null && bFilter==true){
for(var m=0;m<tm1o.Axes[2].Tuples[0].Members.length;m++){
if(attrs != null && tm1o.Axes[2].Tuples[0].Members[m].Attributes[attrs[tm1o.Axes[2].Hierarchies[m].Name]] != null){
rc.push(tm1o.Axes[2].Tuples[0].Members[m].Attributes[attrs[tm1o.Axes[2].Hierarchies[m].Name]]);
}
else{
rc.push(tm1o.Axes[2].Tuples[0].Members[m].Name);
}
}
}
//add value from Cells
rc.push(tm1o.Cells[cellCount].Value);
//console.log(rc);
tm1fo.push(toObject(rc,dims));
cellCount+=1;
//zero out auxilary arrays
c1=[];
rc=[];
}
r1=[];
}
//console.log(tm1fo);
return tm1fo;
};
Minified version:
function tm1flat(a,b,c){function d(a,b){for(var c={},d=0;d<b.length;d++)void 0!==a[d]&&void 0!==b[d]&&(c[b[d]]=a[d]);return c}for(var e=[],f=0;f<a.Axes[1].Hierarchies.length;f++)e.push(a.Axes[1].Hierarchies[f].Name);for(var f=0;f<a.Axes[0].Hierarchies.length;f++)e.push(a.Axes[0].Hierarchies[f].Name);if(null!=c&&1==c)for(var f=0;f<a.Axes[2].Hierarchies.length;f++)e.push(a.Axes[2].Hierarchies[f].Name);e.push("TM1CubeValue");for(var g=[],h=[],i=[],j=0,k=[],l=0;l<a.Axes[1].Tuples.length;l++){for(var m=0;m<a.Axes[1].Tuples[l].Members.length;m++)null!=b&&null!=a.Axes[1].Tuples[l].Members[m].Attributes[b[a.Axes[1].Hierarchies[m].Name]]?g.push(a.Axes[1].Tuples[l].Members[m].Attributes[b[a.Axes[1].Hierarchies[m].Name]]):g.push(a.Axes[1].Tuples[l].Members[m].Name);for(var n=0;n<a.Axes[0].Tuples.length;n++){for(var o=0;o<a.Axes[0].Tuples[n].Members.length;o++)null!=b&&null!=a.Axes[0].Tuples[n].Members[o].Attributes[b[a.Axes[0].Hierarchies[o].Name]]?h.push(a.Axes[0].Tuples[n].Members[o].Attributes[b[a.Axes[0].Hierarchies[o].Name]]):h.push(a.Axes[0].Tuples[n].Members[o].Name);if(i=g.concat(h),null!=c&&1==c)for(var p=0;p<a.Axes[2].Tuples[0].Members.length;p++)null!=b&&null!=a.Axes[2].Tuples[0].Members[p].Attributes[b[a.Axes[2].Hierarchies[p].Name]]?i.push(a.Axes[2].Tuples[0].Members[p].Attributes[b[a.Axes[2].Hierarchies[p].Name]]):i.push(a.Axes[2].Tuples[0].Members[p].Name);i.push(a.Cells[j].Value),k.push(d(i,e)),j+=1,h=[],i=[]}g=[]}return k}