Commit d95dc894 authored by Boris Kocherov's avatar Boris Kocherov

use discover_member for cubevalue too

parent 5a240c4b
...@@ -191,18 +191,12 @@ ...@@ -191,18 +191,12 @@
} }
mdx_array.forEach(function (element) { mdx_array.forEach(function (element) {
switch (element.type) { if (element instanceof cArea || element instanceof cArea3D) {
case cElementType.cellsRange: element.foreach(cellForge);
case cElementType.cellsRange3D: } else if (element instanceof cRef || element instanceof cRef3D) {
case cElementType.array: element.getRange().getCells().forEach(cellForge);
element.foreach(cellForge); } else {
break; stringForge(element);
default:
if (element instanceof cRef || element instanceof cRef3D) {
element.getRange().getCells().forEach(cellForge);
} else {
stringForge(element);
}
} }
}); });
return members; return members;
...@@ -335,6 +329,68 @@ ...@@ -335,6 +329,68 @@
return scheme.execute.promise; return scheme.execute.promise;
} }
function discover_members(connection, members) {
var promises = [],
hierarchies = {},
scheme = getScheme(connection);
function discoverMember(connection, member_name) {
var settings = getProperties(connection),
prop = settings.prop;
prop.restrictions = {
// 'CATALOG_NAME': 'FoodMart',
'MEMBER_UNIQUE_NAME': member_name,
'CUBE_NAME': settings.cube
};
return xmla_request_retry("discoverMDMembers", prop)
.push(function (response) {
if (response.numRows > 0) {
return response;
} else {
throw "member not found";
}
});
}
function check_interseption(hierarchy) {
if (hierarchies.hasOwnProperty(hierarchy)) {
throw "The tuple is invalid because there is no intersection for the specified values.";
} else {
hierarchies[hierarchy] = 1;
}
}
members.forEach(function (member) {
var cached_member;
if (member) {
cached_member = scheme.members[member];
if (cached_member) {
check_interseption(cached_member.h);
promises.push(cached_member);
} else {
promises
.push(discoverMember(connection, member)
.push(function (r) {
var uname = r.getMemberUniqueName(),
hierarchy = r.getHierarchyUniqueName(),
cached_member;
check_interseption(hierarchy);
cached_member = {
uname: uname,
h: hierarchy,
caption: r.getMemberCaption()
};
if (!scheme.members.hasOwnProperty(uname)) {
scheme.members[uname] = cached_member;
}
return cached_member;
}));
}
}
});
return RSVP.all(promises);
}
function error_handler(current_cell_id) { function error_handler(current_cell_id) {
return function (error) { return function (error) {
console.error(current_cell_id, error); console.error(current_cell_id, error);
...@@ -393,57 +449,19 @@ ...@@ -393,57 +449,19 @@
return parseArgs([arg[1]])(); return parseArgs([arg[1]])();
}) })
.push(function (members) { .push(function (members) {
var promises = [], return discover_members(connection, members);
i;
function discoverMember(connection, member_name) {
var settings = getProperties(connection),
prop = settings.prop;
prop.restrictions = {
// 'CATALOG_NAME': 'FoodMart',
'MEMBER_UNIQUE_NAME': member_name,
'CUBE_NAME': settings.cube
};
return xmla_request_retry("discoverMDMembers", prop)
.push(function (response) {
if (response.numRows > 0) {
return response;
} else {
throw "member not found";
}
});
}
for (i = 0; i < members.length; i++) {
if (members[i]) {
promises.push(discoverMember(connection, members[i]));
}
}
return RSVP.all(promises);
}) })
.push(function (responses) { .push(function (members) {
var last_id = responses.length - 1, var last_id = members.length - 1,
ret, ret;
scheme = getScheme(connection),
hierarchies = {};
if (!caption) { if (!caption) {
caption = responses[last_id].getMemberCaption(); caption = members[last_id].caption;
} }
ret = new cString(caption); ret = new cString(caption);
ret.ca = true; ret.ca = true;
ret.cube_value = responses.map(function (r) { ret.cube_value = [];
var uname = r.getMemberUniqueName(), members.forEach(function (member) {
member = scheme.members[uname], ret.cube_value.push(member.uname);
hierarchy = r.getHierarchyUniqueName();
if (hierarchies.hasOwnProperty(hierarchy)) {
throw "The tuple is invalid because there is no intersection for the specified values.";
} else {
hierarchies[hierarchy] = 1;
}
if (!member) {
scheme.members[uname] = {h: hierarchy};
}
return uname;
}); });
return ret; return ret;
}) })
...@@ -525,7 +543,7 @@ ...@@ -525,7 +543,7 @@
cCUBEVALUE.prototype.CalculateLazy = function (queue, range) { cCUBEVALUE.prototype.CalculateLazy = function (queue, range) {
var scheme, var scheme,
connection, connection,
members, members = [],
current_cell_id = range.getCells()[0].getId(), current_cell_id = range.getCells()[0].getId(),
waiter = AddCubeValueCalculate(current_cell_id); waiter = AddCubeValueCalculate(current_cell_id);
return queue return queue
...@@ -534,26 +552,29 @@ ...@@ -534,26 +552,29 @@
scheme = getScheme(connection); scheme = getScheme(connection);
return parseArgs(arg.slice(1))(); return parseArgs(arg.slice(1))();
}) })
.push(function (members) {
return discover_members(connection, members);
})
.push(function (m) { .push(function (m) {
var hierarchies = {}; var member_uname,
members = m; member,
members.forEach(function (member) { h,
var h, hierarchy;
hierarchy = scheme.members[member].h; for (member_uname in m) {
if (hierarchies.hasOwnProperty(hierarchy)) { if (m.hasOwnProperty(member_uname)) {
throw "The tuple is invalid because there is no intersection for the specified values."; member = m[member_uname];
} else { hierarchy = member.h;
hierarchies[hierarchy] = 1; h = scheme.hierarchies[hierarchy];
} if (!h) {
h = scheme.hierarchies[hierarchy]; h = [];
if (!h) { scheme.hierarchies[hierarchy] = h;
h = []; }
scheme.hierarchies[hierarchy] = h; if (h.indexOf(member.uname) === -1) {
} h.push(member.uname);
if (h.indexOf(member) === -1) { }
h.push(member); members.push(member.uname);
} }
}); }
return waiter(); return waiter();
}) })
.push(function () { .push(function () {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment