diff --git a/src/api/controllers/data.ts b/src/api/controllers/data.ts index 306cacabed849bbc7dfc49b83ceafc2a0dd891fa..a6e4b1f343f4baf3252f347cc5c717ccea9391dd 100644 --- a/src/api/controllers/data.ts +++ b/src/api/controllers/data.ts @@ -20,7 +20,7 @@ import * as express from "express"; import { Request } from "../types"; -import { Query } from "../../common/query"; +import { Query, QueryOpts } from "../../common/query"; /** * Constroller responsable for data part from the API. In other @@ -48,7 +48,8 @@ export class DataCtrl { let view; try { - let query: Query = { metrics: [], dimensions: [], clauses: [], sort: [] }; + const qOpt: QueryOpts = { metrics: [], dimensions: []}; + let query = new Query(qOpt); for (let i = 0; i < metrics.length; ++i) { query.metrics.push(req.engine.getMetricByName(metrics[i])); } diff --git a/src/common/query.ts b/src/common/query.ts index 4cb0a9e986b6e183287d5bb2e279637080a1095a..b0d3112695e626601c20447f063fcdacda21b782 100644 --- a/src/common/query.ts +++ b/src/common/query.ts @@ -25,7 +25,7 @@ import { Clause } from "../core/clause"; /** * Internal representation of a query in BlenDB perspective. */ -export interface Query { +export interface QueryOpts { /** Set of metrics of the query. */ metrics: Metric[]; /** Set of dimensions of the query. */ @@ -35,3 +35,24 @@ export interface Query { /** List of metrics and dimensions to sort the query. */ sort?: (Metric|Dimension)[]; } + +export class Query { + /** Set of metrics of the query. */ + public readonly metrics: Metric[]; + /** Set of dimensions of the query. */ + public readonly dimensions: Dimension[]; + /** Set of clauses of the query. */ + public readonly clauses: Clause[]; + /** List of metrics and dimensions to sort the query. */ + public readonly sort: (Metric|Dimension)[]; + /** + * Create Query + * @param opts - Parameters required to create a query. + */ + constructor(opts: QueryOpts){ + this.metrics = opts.metrics.map((i) => i); + this.dimensions = opts.dimensions.map((i) => i); + this.clauses = (opts.clauses) ? opts.clauses.map((i) => i) : []; + this.sort = (opts.sort) ? opts.sort.map((i) => i) : []; + } +} diff --git a/src/core/engine.ts b/src/core/engine.ts index 712d722082d99f418a587f9dff24baf6b93da6af..1678e216ca84e986db251db81163d7561fdeff27 100644 --- a/src/core/engine.ts +++ b/src/core/engine.ts @@ -23,7 +23,7 @@ import { Metric, MetricStrOptions } from "./metric"; import { Clause } from "./clause"; import { Filter } from "./filter"; import { View } from "./view"; -import { Query } from "../common/query"; +import { Query, QueryOpts } from "../common/query"; import { Graph } from "../util/graph"; import { EnumType, EnumTypeOptions} from "./enumType"; import { Source , SourceStrOptions } from "./source"; @@ -278,14 +278,14 @@ export class Engine { */ private selectOptimalView (q: Query): View { let queries: Query[] = []; + let qOpt: QueryOpts; if (q.metrics.length > 0) { for (let i = 0; i < q.metrics.length; ++i) { - queries.push({ - metrics: [q.metrics[i]], + qOpt = { metrics: [q.metrics[i]], dimensions: q.dimensions, - clauses: (q.clauses) ? q.clauses : [], - sort: (q.sort) ? q.sort : [] - }); + clauses: q.clauses, + sort: q.sort }; + queries.push(new Query(qOpt)); } const views = queries.map((query) => { return ViewHandler.growView(query, this.getCover(query)); @@ -295,12 +295,7 @@ export class Engine { } else { - let query = { - metrics: q.metrics, - dimensions: q.dimensions, - clauses: (q.clauses) ? q.clauses : [], - sort: (q.sort) ? q.sort : [] - }; + let query = new Query(q); return ViewHandler.growView(query, this.getCover(query)); } diff --git a/src/util/graph.spec.ts b/src/util/graph.spec.ts index 8dc8ea982468a6e32235da45507d7dae24220dc8..34f1e18db4e2bebe263cf7f83e5354d62ade3bc3 100644 --- a/src/util/graph.spec.ts +++ b/src/util/graph.spec.ts @@ -27,7 +27,7 @@ import { Filter, FilterOperator } from "../core/filter"; import { Clause } from "../core/clause"; import { Graph } from "./graph"; import { AggregationType, RelationType, DataType } from "../common/types"; -import { Query } from "../common/query"; +import { Query, QueryOpts } from "../common/query"; describe("graph class", () => { @@ -193,7 +193,8 @@ describe("graph class", () => { }); expect(g.addView(view)).to.be.true; - const query: Query = { metrics: [], dimensions: [dim] }; + const qOpts: QueryOpts = {metrics: [], dimensions: [dim]}; + const query = new Query (qOpts); let children = g.cover(query); expect(children).to.be.an("array"); expect(children).to.have.length(1); @@ -256,8 +257,8 @@ describe("graph class", () => { for (let i = 0; i < views.length; ++i) { expect(g.addView(views[i])).to.be.true; } - - const query: Query = { metrics: [mets[0], mets[1]], dimensions: [dims[0], dims[1]] }; + const qOpts: QueryOpts = { metrics: [mets[0], mets[1]], dimensions: [dims[0], dims[1]]}; + const query = new Query(qOpts); let children = g.cover(query); expect(children).to.be.an("array"); expect(children).to.have.length(1); @@ -295,8 +296,8 @@ describe("graph class", () => { }); expect(g.addView(view)).to.be.true; - - const query: Query = { metrics: [], dimensions: [dims[1], dims[2]] }; + const qOpts: QueryOpts = { metrics: [], dimensions: [dims[1], dims[2]]}; + const query = new Query(qOpts); let children = g.cover(query); expect(children).to.be.an("array"); expect(children).to.have.length(1); @@ -334,8 +335,8 @@ describe("graph class", () => { }); expect(g.addView(view)).to.be.true; - - const query: Query = { metrics: [], dimensions: [] }; + const qOpts: QueryOpts = { metrics: [], dimensions: []}; + const query = new Query(qOpts); let children = g.cover(query); expect(children).to.be.an("array"); expect(children).to.be.empty; @@ -389,8 +390,8 @@ describe("graph class", () => { expect(g.addView(view1)).to.be.true; expect(g.addView(view2)).to.be.true; expect(g.addView(view3)).to.be.true; - - const query: Query = { metrics: [], dimensions: dims, clauses: [clause2] }; + const qOpts: QueryOpts = { metrics: [], dimensions: dims, clauses: [clause2]}; + const query = new Query(qOpts); let children = g.cover(query); expect(children).to.be.an("array"); expect(children).to.have.length(2); @@ -502,8 +503,8 @@ describe("graph class", () => { }); expect(g.addView(view0)).to.be.true; - - const query: Query = { metrics: [], dimensions: dims, clauses: testClauses }; + const qOpts: QueryOpts = { metrics: [], dimensions: dims, clauses: testClauses}; + const query = new Query(qOpts); let children = g.cover(query); expect(children).to.have.length(1); expect(children[0].id === view0.id).to.be.true; @@ -626,8 +627,8 @@ describe("graph class", () => { for (let i = 0; i < views.length; ++i) { expect(g.addView(views[i])).to.be.true; } - - const query: Query = { metrics: [], dimensions: dims, clauses: testClauses }; + const qOpts: QueryOpts = { metrics: [], dimensions: dims, clauses: testClauses}; + const query = new Query(qOpts); let children = g.cover(query); expect(children).to.have.length(1); expect(children[0].id === views[0].id).to.be.true; diff --git a/src/util/graph.ts b/src/util/graph.ts index 36a5ea1070d368b1b145ba7c9a37393b32b74ddc..0d57cf35106818cd8ccada197464d069f295fca7 100644 --- a/src/util/graph.ts +++ b/src/util/graph.ts @@ -321,7 +321,7 @@ export class Graph { public cover(q: Query): View[] { const metrics = q.metrics; const dimensions = q.dimensions; - const clauses = (q.clauses) ? q.clauses : []; + const clauses = q.clauses; let output: View[] = []; let verticesIds = this.verticesInQuery(q); @@ -621,7 +621,7 @@ export class Graph { private verticesInQuery(q: Query): string[] { const metrics = q.metrics; const dimensions = q.dimensions; - const clauses = (q.clauses) ? q.clauses : []; + const 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) { diff --git a/src/util/viewHandler.ts b/src/util/viewHandler.ts index 6ecc43f06fbb1eeb2888319080fb4a79e80ddf91..ced3027cc0581886d40144ae753f78afa0f1aad5 100644 --- a/src/util/viewHandler.ts +++ b/src/util/viewHandler.ts @@ -21,7 +21,7 @@ import { Opcode } from "../common/expression"; import { View } from "../core/view"; import { Clause } from "../core/clause"; -import { Query } from "../common/query"; +import { Query, QueryOpts } from "../common/query"; import { Dimension } from "../core/dimension"; import { Metric } from "../core/metric"; @@ -60,8 +60,8 @@ export class ViewHandler { metrics: q.metrics, dimensions: q.dimensions, origin: false, - clauses: (q.clauses) ? q.clauses : [], - sort: (q.sort) ? q.sort : [], + clauses: q.clauses, + sort: q.sort, operation: { opcode: Opcode.JOIN, values: views.map((i) => i) @@ -85,8 +85,8 @@ export class ViewHandler { metrics: q.metrics, dimensions: q.dimensions, origin: false, - clauses: (q.clauses) ? q.clauses : [], - sort: (q.sort) ? q.sort : [], + clauses: q.clauses, + sort: q.sort, operation: { opcode: Opcode.REDUCE, values: [view] @@ -109,17 +109,16 @@ export class ViewHandler { let metView: View = null; let partialJoin: View[] = null; let reduced: ViewsAndClauses = null; - let partialQuery: Query = { - metrics: q.metrics, - dimensions: q.dimensions, - clauses: q.clauses, - sort: q.sort - }; + let qOpt: QueryOpts; + + let partialQuery = new Query(q); partialJoin = views.map((i) => (i)); + if (q.metrics.length === 0) { // ignore metView if there are 0 metrics while (partialJoin.length > 1) { - partialQuery.clauses = clausesToCover; + qOpt = {metrics: partialQuery.metrics, dimensions: partialQuery.dimensions, clauses: clausesToCover}; + partialQuery = new Query(qOpt); reduced = ViewHandler.applyReduce(partialJoin, partialQuery); clausesToCover = reduced.clauses; partialJoin = ViewHandler.applyJoin(reduced.views); @@ -137,7 +136,8 @@ export class ViewHandler { partialJoin.splice(metViewId, 1); while (partialJoin.length > 1) { partialJoin.push(metView); // MetView is now the last view - partialQuery.clauses = clausesToCover; + qOpt = {metrics: partialQuery.metrics, dimensions: partialQuery.dimensions, clauses: clausesToCover}; + partialQuery = new Query(qOpt); reduced = ViewHandler.applyReduce(partialJoin, partialQuery); clausesToCover = reduced.clauses; metView = reduced.views.pop(); @@ -153,7 +153,8 @@ export class ViewHandler { // In this case, there are exactly 2 views reduced = ViewHandler.applyReduce(partialJoin, partialQuery); partialJoin = ViewHandler.applyJoin(reduced.views); - partialQuery.clauses = reduced.clauses; + qOpt = {metrics: partialQuery.metrics, dimensions: partialQuery.dimensions, clauses: reduced.clauses}; + partialQuery = new Query(qOpt); return ViewHandler.applyReduce(partialJoin, partialQuery).views[0]; } } @@ -355,11 +356,9 @@ export class ViewHandler { let clauses = partial0.clauses.concat(partial1.clauses); clauses = ViewHandler.removeDuplicatedClauses(clauses); - const partialQuery: Query = { - metrics: mets, - dimensions: dims, - clauses: 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); diff --git a/test/scenario.ts b/test/scenario.ts index 71c10136ed977625cc3ac545ed5febac17724697..882c8405069fab3eab5e73ebe4e2772aa3f88a70 100644 --- a/test/scenario.ts +++ b/test/scenario.ts @@ -27,11 +27,11 @@ import { Clause } from "../src/core/clause"; import { AggregationType, RelationType , DataType} from "../src/common/types"; import { ViewHandler } from "../src/util/viewHandler"; import { EngineScenario, AdapterScenario, DataCtrlScenario } from "../src/util/scenarioHandler"; +import { Query, QueryOpts } from "../src/common/query"; const configPath = process.env.BLENDB_SCHEMA_FILE; const config = ConfigParser.parse(configPath); - const mets : {[key: string]: Metric} = {}; for (let i in config.metrics) { let met = config.metrics[i]; @@ -50,8 +50,16 @@ for (let i in config.buildViews){ views[view.alias] = view.view; } +const wrongMet = new Metric({ + name: "met:this:is:just:a:test", + aggregation: AggregationType.COUNT, + dataType: DataType.INTEGER +}); + +const wrongDim = new Dimension({ name: "dim:this:is:just:a:test", dataType: DataType.INTEGER }); + /** - * Create new filters to use in clause and test + * Create new filters to use in clause and test * the clauses */ const filters: { [key: string]: Filter } = { @@ -102,8 +110,6 @@ const filters: { [key: string]: Filter } = { }) } -// Subdimensions - const subdims : {[key:string]: Dimension} = { "subdims_day" : new Dimension({ name: "subdims_day", @@ -131,9 +137,7 @@ const subdims : {[key:string]: Dimension} = { }) } -// Clauses - -const clauses: { [key: string]: Clause } = { +const clauses: { [key: string]: Clause } = { "lastDay": new Clause({filters: [filters["equal"]]}), "undefined": @@ -157,146 +161,207 @@ const clauses: { [key: string]: Clause } = { new Clause ({filters: [filters["equalFilterView"]]}) } -// Views -const JoinWithAncestors = ViewHandler.growView({ - metrics: [mets["met:sell:count:quantity"]], - dimensions: [dims["dim:seller:id"],dims["dim:provider:id"]], - clauses: [] -},[views["view:Sell"]]); +let qOpts : {[key: string]: QueryOpts} = { + "JoinWithAncestors": + { + metrics: [mets["met:sell:count:quantity"]], + dimensions: [dims["dim:seller:id"],dims["dim:provider:id"]] + }, + "joinWithNoMetrics": + { + metrics: [], + dimensions: [dims["dim:product:name"],dims["dim:seller:name"]] + }, + "growOneView": + { + metrics: [mets["met:seller:min:age"]], + dimensions: [dims["dim:seller:name"],dims["dim:seller:sex"]] + }, + "multipleClause": + { + metrics: [mets["met:sell:avg:quantity"]], + dimensions: [dims["dim:sell:datein"],dims["dim:seller:name"], + dims["dim:client:name"]], + // and between filters => (A) and (B) + clauses: [clauses["expired"],clauses["averageBought"]], + }, + "singleClause": + { + metrics: [mets["met:sell:avg:quantity"]], + dimensions: [dims["dim:sell:datein"],dims["dim:seller:name"], + dims["dim:client:name"]], + clauses: [clauses["expiredAndAverage"]], + }, + "equalfilter": + { + metrics: [], + dimensions: [dims["dim:client:name"],dims["dim:product:validity"]], + clauses: [clauses["lastDay"]], + }, + "withSortView:0": + { + metrics: [mets["met:sell:sum:quantity"]], + dimensions: [dims["dim:client:name"]], + sort: [mets["met:sell:sum:quantity"]] + }, + "withSortView:1": + { + metrics: [mets["met:sell:sum:quantity"]], + dimensions: [dims["dim:client:id"]] + }, + "subDimView:0": + { + metrics: [], + dimensions : [dims["dim:sell:datein"],subdims["subdims_day"], + subdims["subdims_month"],subdims["subdims_year"]] + }, + "subDimView:1": + { + metrics: [], + dimensions: [dims["dim:sell:datein"]] + }, + "joinOneView": + { + metrics: [mets["met:product:avg:pricein"]], + dimensions: [], + }, + "reduceAsView": + { + metrics: [mets["met:sell:sum:quantity"],mets["met:sell:avg:quantity"], + mets["met:sell:count:quantity"]], + dimensions: [dims["dim:sell:registered"], dims["dim:product:id"], + dims["dim:seller:id"], dims["dim:client:id"],dims["dim:sell:datein"]], + sort: [mets["met:sell:sum:quantity"]] + }, + "clientAverageBought:0": + { + metrics: [mets["met:sell:avg:quantity"]], + dimensions: [dims["dim:client:name"]], + clauses: [clauses["averageBought"]] + }, + "clientAverageBought:1": + { + metrics: [mets["met:sell:avg:quantity"]], + dimensions: [dims["dim:client:name"], dims["dim:seller:id"]] + }, + "queryNoParent": + { + metrics: [mets["met:sell:count:quantity"]], + dimensions: [subdims["subdims_none"]] + }, + "queryMetsDims": + { + metrics : Object.keys(mets).map((key) => mets[key]), + dimensions : Object.keys(dims).map((key) => dims[key]) + }, + "queryNoMets": + { + metrics: [wrongMet], + dimensions: [dims["dim:product:name"]] + }, + "queryNoDims": + { + metrics: [mets["met:buyout:min:quantity"]], + dimensions: [wrongDim] + }, + "queryProduct": + { + metrics: [mets["met:product:avg:pricein"], mets["met:product:max:pricein"], mets["met:product:min:pricein"], + mets["met:product:avg:priceout"],mets["met:product:max:priceout"],mets["met:product:min:priceout"]], + dimensions: [dims["dim:product:name"], dims["dim:product:validity"],dims["dim:product:id"]] + }, + "queryActive": + { + metrics: [mets["met:seller:max:age"]], + dimensions: [dims["dim:seller:name"],dims["dim:seller:status"]], + clauses: [clauses["equalClauseView"]] + }, + "querySubDim": + { + metrics : [], + dimensions : [subdims["subdims_day"],subdims["subdims_month"]] + }, + "wrongMet": + { + metrics: [wrongMet], + dimensions: [dims["dim:product:id"]] + }, + "wrongDim": + { + metrics: [mets["met:sell:avg:quantity"]], + dimensions: [wrongDim] + }, + "correct": + { + metrics: [mets["met:buyout:avg:quantity"]], + dimensions: [dims["dim:provider:id"]] + }, + "clausal": + { + metrics: [mets["met:product:avg:pricein"]], + dimensions: [dims["dim:product:name"], + dims["dim:product:id"]] + } +} -const joinWithNoMetrics = ViewHandler.growView({ - metrics: [], - dimensions: [dims["dim:product:name"],dims["dim:seller:name"]], - clauses: [] -}, [views["view:Product"],views["view:Sell"],views["view:Seller"]]); +const queries : {[key: string]: Query} = {}; +for(let i in qOpts){ + queries[i] = new Query(qOpts[i]); +} -const growOneView = ViewHandler.growView({ - metrics: [mets["met:seller:min:age"]], - dimensions: [dims["dim:seller:name"],dims["dim:seller:sex"]], - clauses: [] -}, [views["view:Seller"]]); +const JoinWithAncestors = ViewHandler.growView(queries["JoinWithAncestors"], + [views["view:Sell"]]); -const multipleClause = ViewHandler.growView({ - metrics: [mets["met:sell:avg:quantity"]], - dimensions: [dims["dim:sell:datein"],dims["dim:seller:name"], - dims["dim:client:name"]], - // and between filters => (A) and (B) - clauses: [clauses["expired"],clauses["averageBought"]] -}, [views["view:Sell"],views["view:Seller"],views["view:Client"],views["view:Product"]]); +const joinWithNoMetrics = ViewHandler.growView(queries["joinWithNoMetrics"], + [views["view:Product"], + views["view:Sell"], + views["view:Seller"]]); -const singleClause = ViewHandler.growView({ - metrics: [mets["met:sell:avg:quantity"]], - dimensions: [dims["dim:sell:datein"],dims["dim:seller:name"], - dims["dim:client:name"]], - clauses: [clauses["expiredAndAverage"]] -}, [views["view:Sell"],views["view:Seller"],views["view:Client"],views["view:Product"]]); +const growOneView = ViewHandler.growView(queries["growOneView"], + [views["view:Seller"]]); -const equalfilter = ViewHandler.queryJoin({ - metrics: [], - dimensions: [dims["dim:client:name"],dims["dim:product:validity"]], - clauses: [clauses["lastDay"]] -},[views["view:Sell"],views["view:Client"],views["view:Product"]]); +const multipleClause = ViewHandler.growView(queries["multipleClause"], + [views["view:Sell"], + views["view:Seller"], + views["view:Client"], + views["view:Product"]]); -const withSortView = ViewHandler.queryJoin({ - metrics: [mets["met:sell:sum:quantity"]], - dimensions: [dims["dim:client:name"]], - sort: [mets["met:sell:sum:quantity"]] - },[ViewHandler.queryReduce({ - metrics: [mets["met:sell:sum:quantity"]], - dimensions: [dims["dim:client:id"]] - },views["view:Sell"]),views["view:Client"]]); +const singleClause = ViewHandler.growView(queries["singleClause"], + [views["view:Sell"], + views["view:Seller"], + views["view:Client"], + views["view:Product"]]); -const subDimView = ViewHandler.queryJoin({ - metrics : [], - dimensions : [dims["dim:sell:datein"],subdims["subdims_day"], - subdims["subdims_month"],subdims["subdims_year"]]}, -[ViewHandler.queryReduce({ - metrics: [], - dimensions: [dims["dim:sell:datein"]] -},views["view:Sell"]),views["view:Sell"]]); +const equalfilter = ViewHandler.queryJoin(queries["equalfilter"], + [views["view:Sell"], + views["view:Client"], + views["view:Product"]]); +const withSortView = ViewHandler.queryJoin(queries["withSortView:0"], + [ViewHandler.queryReduce(queries["withSortView:1"], + views["view:Sell"]), + views["view:Client"]]); -const joinOneView = ViewHandler.queryJoin({ - metrics: [mets["met:product:avg:pricein"]], - dimensions: [] -},[views["view:Product"]]); +const subDimView = ViewHandler.queryJoin(queries["subDimView:0"], + [ViewHandler.queryReduce(queries["subDimView:1"], + views["view:Sell"]), + views["view:Sell"]]); -const reduceAsView = ViewHandler.queryReduce({ - metrics: [mets["met:sell:sum:quantity"],mets["met:sell:avg:quantity"], -mets["met:sell:count:quantity"]], - dimensions: [dims["dim:sell:registered"], dims["dim:product:id"], -dims["dim:seller:id"], dims["dim:client:id"],dims["dim:sell:datein"]], -sort: [mets["met:sell:sum:quantity"]] -},views["view:Sell"]); +const joinOneView = ViewHandler.queryJoin(queries["joinOneView"], + [views["view:Product"]]); -const clientAverageBought = ViewHandler.queryReduce({ - metrics: [mets["met:sell:avg:quantity"]], - dimensions: [dims["dim:client:name"]], - clauses: [clauses["averageBought"]] -},ViewHandler.queryJoin({ - metrics: [mets["met:sell:avg:quantity"]], - dimensions: [dims["dim:client:name"], dims["dim:seller:id"]] -},[views["view:Sell"],views["view:Client"]])); +const reduceAsView = ViewHandler.queryReduce(queries["reduceAsView"], + views["view:Sell"]); +const clientAverageBought = ViewHandler.queryReduce(queries["clientAverageBought:0"], + ViewHandler.queryJoin(queries["clientAverageBought:1"], + [views["view:Sell"],views["view:Client"]])); const viewProduct = views["view:Product"]; const viewActiveSeller = views["view:ActiveSeller"]; -const wrongMet = new Metric({ - name: "met:this:is:just:a:test", - aggregation: AggregationType.COUNT, - dataType: DataType.INTEGER -}); - -// Dimensions - -const wrongDim = new Dimension({ name: "dim:this:is:just:a:test", dataType: DataType.INTEGER }); - -// Queries - -const queryNoParent = { - metrics: [mets["met:sell:count:quantity"]], - dimensions: [subdims["subdims_none"]] -} - -const queryMetsDims = { - metrics : Object.keys(mets).map((key) => mets[key]), - dimensions : Object.keys(dims).map((key) => dims[key]) -}; - -const queryNoMets = { - metrics: [wrongMet], - dimensions: [dims["dim:product:name"]] -}; - -const queryNoDims = { - metrics: [mets["met:buyout:min:quantity"]], - dimensions: [wrongDim] -} - -const queryProduct = { - metrics: [mets["met:product:avg:pricein"], mets["met:product:max:pricein"], mets["met:product:min:pricein"], - mets["met:product:avg:priceout"],mets["met:product:max:priceout"],mets["met:product:min:priceout"]], - dimensions: [dims["dim:product:name"], dims["dim:product:validity"],dims["dim:product:id"]] -}; - - -const queryActive = { - metrics: [mets["met:seller:max:age"]], - dimensions: [dims["dim:seller:name"],dims["dim:seller:status"]], - clauses: [clauses["equalClauseView"]] -} - -// Metrics - -let emptyMetrics: Metric[] = []; -const querySubDim = { - metrics : emptyMetrics - , dimensions : [subdims["subdims_day"],subdims["subdims_month"]] -} - // Exports export const engineScenario: EngineScenario = { @@ -306,15 +371,15 @@ export const engineScenario: EngineScenario = { wrongDim: wrongDim, subDimensions: subdims, views: views, - queryMetsDims: queryMetsDims, - queryNoMets: queryNoMets, - queryNoDims: queryNoDims, - queryProduct: queryProduct, + queryMetsDims: queries["queryMetsDims"], + queryNoMets: queries["queryNoMets"], + queryNoDims: queries["queryNoDims"], + queryProduct: queries["queryProduct"], viewProduct: viewProduct, - queryActive: queryActive, + queryActive: queries["queryActive"], viewActiveSeller: viewActiveSeller, - querySubDim: querySubDim, - queryNoParent: queryNoParent + querySubDim: queries["querySubDim"], + queryNoParent: queries["queryNoParent"] }; export const adapterScenario: AdapterScenario = { @@ -333,20 +398,8 @@ export const adapterScenario: AdapterScenario = { }; export const dataCtrlScenario: DataCtrlScenario = { - wrongMet: { - metrics: [wrongMet], - dimensions: [dims["dim:product:id"]] - }, - wrongDim: { - metrics: [mets["met:sell:avg:quantity"]], - dimensions: [wrongDim] }, - correct: { - metrics: [mets["met:buyout:avg:quantity"]], - dimensions: [dims["dim:provider:id"]] - }, - clausal: { - metrics: [mets["met:product:avg:pricein"]], - dimensions: [dims["dim:product:name"], - dims["dim:product:id"]] - } + wrongMet: queries["wrongMet"], + wrongDim: queries["wrongDim"], + correct: queries["correct"], + clausal: queries["clausal"], };