diff --git a/src/util/graph.ts b/src/util/graph.ts index 359ac14c7895cb054ffd5602013760345863ed26..9fe4d683929053966797bdbfd1a5656323275d65 100644 --- a/src/util/graph.ts +++ b/src/util/graph.ts @@ -312,8 +312,8 @@ export class Graph { const dimensions = q.dimensions; const clauses = (q.clauses) ? q.clauses : []; let output: View[] = []; - let verticesIds = metrics.map((met) => met.name); - verticesIds = verticesIds.concat(dimensions.map((dim) => dim.name)); + let verticesIds = this.verticesInQuery(q); + for (let i = 0; i < this.vertices.length; ++i) { // Get the vertices and set their status and parent this.vertices[i].state = State.UNVISITED; @@ -364,8 +364,7 @@ export class Graph { // Recover the list of vertices let dimToCover = dimensions.map((dim) => dim); let metToCover = metrics.map((met) => met); - verticesIds = metrics.map((met) => met.name); - verticesIds = verticesIds.concat(dimensions.map((dim) => dim.name)); + verticesIds = this.verticesInQuery(q); while (verticesIds.length > 0) { // Choose a vertex and walks to his ancestors until // reach the root, when walking this path choose @@ -538,4 +537,33 @@ export class Graph { } + private verticesInQuery(q: Query): string[] { + const metrics = q.metrics; + const dimensions = q.dimensions; + const clauses = (q.clauses) ? q.clauses : []; + let verticesIds = metrics.map((met) => met.name); + verticesIds = verticesIds.concat(dimensions.map((dim) => dim.name)); + for (let i = 0; i < clauses.length; ++i) { + verticesIds = verticesIds.concat(clauses[i].filters.map((filter) => { + return filter.target.name; + })); + } + + const sorted = verticesIds.sort(); + if (sorted.length > 0) { + const unique = [sorted[0]]; + for (let i = 1; i < sorted.length; ++i) { + if (sorted[i - 1] !== sorted[i]) { + unique.push(sorted[i]); + } + } + return unique; + } + + else { + return []; + } + + } + }