From 73cd631ec6f438e2bd851348ed0ac8671373a483 Mon Sep 17 00:00:00 2001 From: rafaelatc3sl <rpd17@c3sl> Date: Wed, 9 Jan 2019 10:13:00 -0200 Subject: [PATCH] Issue #94: Update view join algorithm Signed-off-by: rafaelatc3sl <rpd17@c3sl> --- src/util/viewHandler.ts | 71 ++++++++--------------------------------- 1 file changed, 14 insertions(+), 57 deletions(-) diff --git a/src/util/viewHandler.ts b/src/util/viewHandler.ts index ced3027..4c875c6 100644 --- a/src/util/viewHandler.ts +++ b/src/util/viewHandler.ts @@ -116,7 +116,7 @@ export class ViewHandler { partialJoin = views.map((i) => (i)); if (q.metrics.length === 0) { // ignore metView if there are 0 metrics - while (partialJoin.length > 1) { + if (partialJoin.length > 0) { qOpt = {metrics: partialQuery.metrics, dimensions: partialQuery.dimensions, clauses: clausesToCover}; partialQuery = new Query(qOpt); reduced = ViewHandler.applyReduce(partialJoin, partialQuery); @@ -134,7 +134,7 @@ export class ViewHandler { metView = partialJoin[metViewId]; partialJoin.splice(metViewId, 1); - while (partialJoin.length > 1) { + if (partialJoin.length > 0) { partialJoin.push(metView); // MetView is now the last view qOpt = {metrics: partialQuery.metrics, dimensions: partialQuery.dimensions, clauses: clausesToCover}; partialQuery = new Query(qOpt); @@ -309,76 +309,33 @@ export class ViewHandler { } /** - * Finds the pair of views most realted in a set of views and - * applies the JOIN operation in this set. - * Returns a set with the joined view and without the most - * related view. + * Apply JOIN operation in a set of views. + * Returns a set with the joined view. * @param v - Set of candidated views to be joined. */ private static applyJoin(v: View[]): View[] { - /* - At this point 2 views will be joined, first the - similarity with each pair of views is calculated, - the pair with the biggedt similarity will be joined. - Similarity is calculated with the number of common - dimensions in the keys. - */ const views = v.map((i) => i); - let similarity = 0; - let idx0 = 0; - let idx1 = 1; - for (let i = 0; i < views.length; ++i) { - for (let j = i + 1 ; j < views.length; ++j) { - const pi = views[i].dimensions; - const pj = views[j].dimensions; - let score = this.similarDimensions (pi, pj); - if (similarity < score) { - similarity = score; - idx0 = i; - idx1 = j; - } - } - } - const partial0 = views[idx0]; - const partial1 = views[idx1]; + let dims: Dimension[] = []; + let mets: Metric[] = []; + let clauses: Clause[] = []; - views.splice(idx1, 1); - views.splice(idx0, 1); + for (let i = 0; i < views.length; ++i) { + mets = mets.concat(views[i].metrics); + dims = dims.concat(views[i].dimensions); + clauses = clauses.concat(views[i].clauses); + } - let dims = partial0.dimensions.concat(partial1.dimensions); dims = ViewHandler.removeDuplicatedDimensions(dims); - - let mets = partial0.metrics.concat(partial1.metrics); mets = ViewHandler.removeDuplicatedMetrics(mets); - - let clauses = partial0.clauses.concat(partial1.clauses); clauses = ViewHandler.removeDuplicatedClauses(clauses); const qOpts: QueryOpts = {metrics: mets, dimensions: dims, clauses: clauses}; - const partialQuery = new Query(qOpts); - const partial = ViewHandler.queryJoin(partialQuery, [partial0, partial1]); - views.push(partial); - return views; - } - - /** - * Calculates the similarity of two sets of dimensions. In other - * other how many dimensions are in both sets. - * @param a - A set of dimensions. - * @param b - Another set of dimensions. - */ - private static similarDimensions(a: Dimension[], b: Dimension[]): number { - let count = 0; - for (let i = 0; i < a.length; ++i) { - if (b.some((itemB) => a[i].name === itemB.name)) { - count++; - } - } - return count; + const partial = ViewHandler.queryJoin(partialQuery, views); + return [partial]; } /** -- GitLab