From d63ba746ef7a01d6ea88df84161050d4d74c9f99 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes de Oliveira <lfo14@inf.ufpr.br> Date: Fri, 11 Aug 2017 09:59:53 -0300 Subject: [PATCH] Issue #34: Remove unrelated filters from query Signed-off-by: Lucas Fernandes de Oliveira <lfo14@inf.ufpr.br> --- src/adapter/postgres.spec.ts | 19 +++++++++++++++++++ src/adapter/postgres.ts | 17 +++++++++++++++-- test/scenario.ts | 13 ++++++++++++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/adapter/postgres.spec.ts b/src/adapter/postgres.spec.ts index 85687ae0..8b77b184 100644 --- a/src/adapter/postgres.spec.ts +++ b/src/adapter/postgres.spec.ts @@ -279,4 +279,23 @@ describe("postgres adapter", () => { done(); }); }); + + it("should get data when a filter does not have any effect on the query", (done) => { + let view = adapterScenario.notMatchFilterView; + adapter.getDataFromView(view, (err, result) => { + expect(err).to.be.a("null"); + expect(result).to.be.an("array"); + expect(result).to.have.length(5); + expect(result[0]).to.be.an("object"); + let keys: string[] = []; + keys = keys.concat(view.metrics.map((item) => item.name)); + keys = keys.concat(view.dimensions.map((item) => item.name)); + result.forEach((row) => { + expect(row).to.be.an("object"); + expect(row).to.have.all.keys(keys); + }); + + done(); + }); + }); }); diff --git a/src/adapter/postgres.ts b/src/adapter/postgres.ts index 2e5cd812..9055d2b9 100644 --- a/src/adapter/postgres.ts +++ b/src/adapter/postgres.ts @@ -179,7 +179,12 @@ export class PostgresAdapter extends Adapter { return clause.id === item.id; })); - toCover.forEach((item) => conds.push("(" + this.translateClause(item, nameMap) + ")")); + toCover.forEach((item) => { + const clause = "(" + this.translateClause(item, nameMap) + ")"; + if (clause !== "()") { + conds.push(clause); + } + }); // Assembly @@ -249,11 +254,19 @@ export class PostgresAdapter extends Adapter { } private translateClause(clause: Clause, map: {[key: string]: View}): string { - let r = clause.filters.map((item) => this.translateFilter(item, map)); + const r = clause.filters.map((item) => { + return this.translateFilter(item, map); + }).filter((item) => { + return item !== ""; + }); return r.join(" OR "); } private translateFilter(filter: Filter, map: {[key: string]: View}): string { + if (!map[filter.target.name]) { + return ""; + } + const viewId = map[filter.target.name].id; const leftSide = this.buildColumn(filter.target, viewId); const op = this.translateOperator(filter.operator); diff --git a/test/scenario.ts b/test/scenario.ts index a26bb2ab..fa42a220 100644 --- a/test/scenario.ts +++ b/test/scenario.ts @@ -50,6 +50,7 @@ interface AdapterScenario { notEqualView: View; gtltView: View; geleView: View; + notMatchFilterView: View; } interface DataCtrlScenario { @@ -257,6 +258,15 @@ const geleView = new View({ clauses: [clauses.view0ge, clauses.view0le] }); +const notMatchFilterView = new View({ + metrics: [mets[0]], + dimensions: [dims[0]], + materialized: false, + origin: false, + childViews: [views[0]], + clauses: [clauses.view7dim5] +}); + const subDimView = new View({ metrics: [mets[0]], dimensions: [subdims[0], subdims[1], dims[7], dims[8]], @@ -311,7 +321,8 @@ export const adapterScenario: AdapterScenario = { multiClauseView: multiClauseView, notEqualView: notEqualView, gtltView: gtltView, - geleView: geleView + geleView: geleView, + notMatchFilterView: notMatchFilterView }; export const dataCtrlScenario: DataCtrlScenario = { -- GitLab