Skip to content
Snippets Groups Projects
Commit 7e472b06 authored by rafaelatc3sl's avatar rafaelatc3sl
Browse files

Issue #91: Refactor engine


Signed-off-by: default avatarrafaelatc3sl <rpd17@c3sl>
parent 773a7101
No related branches found
No related tags found
No related merge requests found
Pipeline #18741 passed
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
import { Engine } from "../src/core/engine"; import { Engine } from "../src/core/engine";
import { PostgresAdapter } from "../src/adapter/postgres"; import { PostgresAdapter } from "../src/adapter/postgres";
import { ConfigParser } from "../src/util/configParser"; import { ConfigParser } from "../src/util/configParser";
import { QueryOpts, Query } from "../src/common/query";
import * as path from "path"; import * as path from "path";
import * as fs from "fs"; import * as fs from "fs";
...@@ -37,14 +38,12 @@ const configFile = process.argv[2]; ...@@ -37,14 +38,12 @@ const configFile = process.argv[2];
const schemaFile = process.argv[3]; const schemaFile = process.argv[3];
const config = ConfigParser.parse(configFile); const config = ConfigParser.parse(configFile);
const referencePath = path.dirname(configFile); const referencePath = path.dirname(configFile);
const engine = new Engine();
const engine = new Engine(config);
const adapter = new PostgresAdapter(config.connection); const adapter = new PostgresAdapter(config.connection);
let schema = ""; let schema = "";
config.metrics.forEach ((met) => engine.addMetric(met));
config.dimensions.forEach ((dim) => engine.addDimension(dim));
for (let i = 0; i < config.buildViews.length; ++i) { for (let i = 0; i < config.buildViews.length; ++i) {
const view = config.buildViews[i].view; const view = config.buildViews[i].view;
const filePath = config.buildViews[i].file; const filePath = config.buildViews[i].file;
...@@ -77,11 +76,9 @@ for (let i = 0; i < config.buildViews.length; ++i) { ...@@ -77,11 +76,9 @@ for (let i = 0; i < config.buildViews.length; ++i) {
const view = config.buildViews[i].view; const view = config.buildViews[i].view;
const alias = config.buildViews[i].alias; const alias = config.buildViews[i].alias;
if (!view.origin) { if (!view.origin) {
const materializedView = engine.query({ const qOpt: QueryOpts = { metrics: view.metrics,dimensions: view.dimensions,
metrics: view.metrics, clauses: view.clauses };
dimensions: view.dimensions, const materializedView = engine.query(new Query(qOpt));
clauses: view.clauses
});
const table = adapter.getQueryFromView(materializedView); const table = adapter.getQueryFromView(materializedView);
let query = "-- View: " + alias + "\n"; let query = "-- View: " + alias + "\n";
......
...@@ -28,13 +28,7 @@ import { Middleware } from "../types"; ...@@ -28,13 +28,7 @@ import { Middleware } from "../types";
* @param config - Parsed database schema. * @param config - Parsed database schema.
*/ */
export function EngineMw (config: ParsedConfig): Middleware { export function EngineMw (config: ParsedConfig): Middleware {
let engine: Engine = new Engine(); let engine: Engine = new Engine(config);
config.metrics.forEach ((met) => engine.addMetric(met));
config.dimensions.forEach ((dim) => engine.addDimension(dim));
config.views.forEach ((view) => engine.addView(view));
config.enumTypes.forEach ((enumt) => engine.addEnumType(enumt));
config.sources.forEach ((sourc) => engine.addSource(sourc));
return function engineMiddleware(req, res, next) { return function engineMiddleware(req, res, next) {
req.engine = engine; req.engine = engine;
......
...@@ -23,30 +23,15 @@ import { Engine } from "./engine"; ...@@ -23,30 +23,15 @@ import { Engine } from "./engine";
import { FilterOperator } from "./filter"; import { FilterOperator } from "./filter";
import { View } from "./view"; import { View } from "./view";
import { engineScenario } from "../../test/scenario"; import { engineScenario } from "../../test/scenario";
import { ConfigParser } from "../util/configParser";
describe("engine class", () => { describe("engine class", () => {
const engine = new Engine();
const met = engineScenario.metrics; const configPath = process.env.BLENDB_SCHEMA_FILE;
const dim = engineScenario.dimensions; let config = ConfigParser.parse(configPath);
const engine = new Engine(config);
const subdim = engineScenario.subDimensions; const subdim = engineScenario.subDimensions;
const views = engineScenario.views;
for (let key in met){
if (met[key]){
engine.addMetric(met[key]);
}
}
for (let key in dim){
if (dim[key]){
engine.addDimension(dim[key]);
}
}
for (let key in views){
if (views[key]){
engine.addView(views[key]);
}
}
for (let key in subdim){ for (let key in subdim){
if (subdim[key]){ if (subdim[key]){
engine.addDimension(subdim[key]); engine.addDimension(subdim[key]);
...@@ -166,7 +151,7 @@ describe("engine class", () => { ...@@ -166,7 +151,7 @@ describe("engine class", () => {
expect(clause.filters[0]).to.have.property("target"); expect(clause.filters[0]).to.have.property("target");
expect(clause.filters[0]).to.have.property("value"); expect(clause.filters[0]).to.have.property("value");
expect(clause.filters[0]).to.have.property("operator"); expect(clause.filters[0]).to.have.property("operator");
expect(clause.filters[0].target).to.be.equal(dim["dim:client:name"]); expect(clause.filters[0].target).to.be.equal(engine.getDimensionByName("dim:client:name"));
expect(clause.filters[0].value).to.be.equal("Laci"); expect(clause.filters[0].value).to.be.equal("Laci");
expect(clause.filters[0].operator).to.be.equal(FilterOperator.EQUAL); expect(clause.filters[0].operator).to.be.equal(FilterOperator.EQUAL);
}); });
...@@ -183,7 +168,7 @@ describe("engine class", () => { ...@@ -183,7 +168,7 @@ describe("engine class", () => {
expect(clause.filters[0]).to.have.property("target"); expect(clause.filters[0]).to.have.property("target");
expect(clause.filters[0]).to.have.property("operator"); expect(clause.filters[0]).to.have.property("operator");
expect(clause.filters[0]).to.have.property("value"); expect(clause.filters[0]).to.have.property("value");
expect(clause.filters[0].target).to.be.equal(met["met:product:avg:pricein"]); expect(clause.filters[0].target).to.be.equal(engine.getMetricByName("met:product:avg:pricein"));
expect(clause.filters[0].value).to.be.equal("0"); expect(clause.filters[0].value).to.be.equal("0");
expect(clause.filters[0].operator).to.be.equal(FilterOperator.NOTEQUAL); expect(clause.filters[0].operator).to.be.equal(FilterOperator.NOTEQUAL);
}); });
...@@ -284,7 +269,7 @@ describe("engine class", () => { ...@@ -284,7 +269,7 @@ describe("engine class", () => {
expect(clause.filters[0]).to.have.property("target"); expect(clause.filters[0]).to.have.property("target");
expect(clause.filters[0]).to.have.property("operator"); expect(clause.filters[0]).to.have.property("operator");
expect(clause.filters[0]).to.have.property("value"); expect(clause.filters[0]).to.have.property("value");
expect(clause.filters[0].target).to.be.equal(dim["dim:sell:datein"]); expect(clause.filters[0].target).to.be.equal(engine.getDimensionByName("dim:sell:datein"));
expect(clause.filters[0].value).to.be.equal("2018-02-17"); expect(clause.filters[0].value).to.be.equal("2018-02-17");
expect(clause.filters[0].operator).to.be.equal(operators[op]); expect(clause.filters[0].operator).to.be.equal(operators[op]);
} }
...@@ -301,7 +286,7 @@ describe("engine class", () => { ...@@ -301,7 +286,7 @@ describe("engine class", () => {
expect(clause.filters[0]).to.have.property("target"); expect(clause.filters[0]).to.have.property("target");
expect(clause.filters[0]).to.have.property("operator"); expect(clause.filters[0]).to.have.property("operator");
expect(clause.filters[0]).to.have.property("value"); expect(clause.filters[0]).to.have.property("value");
expect(clause.filters[0].target).to.be.equal(dim["dim:seller:id"]); expect(clause.filters[0].target).to.be.equal(engine.getDimensionByName("dim:seller:id"));
expect(clause.filters[0].value).to.be.equal("0"); expect(clause.filters[0].value).to.be.equal("0");
expect(clause.filters[0].operator).to.be.equal(operators[op]); expect(clause.filters[0].operator).to.be.equal(operators[op]);
} }
......
...@@ -28,6 +28,7 @@ import { Graph } from "../util/graph"; ...@@ -28,6 +28,7 @@ import { Graph } from "../util/graph";
import { EnumType, EnumTypeOptions} from "./enumType"; import { EnumType, EnumTypeOptions} from "./enumType";
import { Source , SourceStrOptions } from "./source"; import { Source , SourceStrOptions } from "./source";
import { ViewHandler } from "../util/viewHandler"; import { ViewHandler } from "../util/viewHandler";
import { ParsedConfig } from "../util/configParser";
/** /**
* Represents the database schema from the BlenDB perspective. * Represents the database schema from the BlenDB perspective.
...@@ -52,13 +53,16 @@ export class Engine { ...@@ -52,13 +53,16 @@ export class Engine {
private graph: Graph; private graph: Graph;
/** Constructs an empty database schema. */ /** Constructs an empty database schema. */
constructor () { constructor (config: ParsedConfig) {
this.enumTypes = [];
this.views = [];
this.metrics = [];
this.dimensions = [];
this.sources = [];
this.graph = new Graph(); this.graph = new Graph();
config.metrics.forEach ((met) => this.addMetric(met));
config.dimensions.forEach ((dim) => this.addDimension(dim));
config.views.forEach ((view) => this.addView(view));
config.enumTypes.forEach ((enumt) => this.addEnumType(enumt));
config.sources.forEach ((sourc) => this.addSource(sourc));
} }
/** Gets all the available */ /** Gets all the available */
......
...@@ -24,14 +24,6 @@ import { Dimension } from "../core/dimension"; ...@@ -24,14 +24,6 @@ import { Dimension } from "../core/dimension";
import { Query } from "../common/query"; import { Query } from "../common/query";
export interface EngineScenario { export interface EngineScenario {
/**
* All metrics from /config/*
*/
metrics: {[key: string]: Metric};
/**
* All dimensions from /config/*
*/
dimensions: {[key: string]: Dimension};
/** /**
* subDimensions from scenario * subDimensions from scenario
*/ */
...@@ -44,10 +36,6 @@ export interface EngineScenario { ...@@ -44,10 +36,6 @@ export interface EngineScenario {
* Dimension that does not exist on /config/* * Dimension that does not exist on /config/*
*/ */
wrongDim: Dimension; wrongDim: Dimension;
/**
* All views from /config/*
*/
views: {[key: string]: View};
/** /**
* Query that have all metrics and dimensions * Query that have all metrics and dimensions
*/ */
......
...@@ -365,12 +365,9 @@ const viewActiveSeller = views["view:ActiveSeller"]; ...@@ -365,12 +365,9 @@ const viewActiveSeller = views["view:ActiveSeller"];
// Exports // Exports
export const engineScenario: EngineScenario = { export const engineScenario: EngineScenario = {
metrics: mets,
dimensions: dims,
wrongMet: wrongMet, wrongMet: wrongMet,
wrongDim: wrongDim, wrongDim: wrongDim,
subDimensions: subdims, subDimensions: subdims,
views: views,
queryMetsDims: queries["queryMetsDims"], queryMetsDims: queries["queryMetsDims"],
queryNoMets: queries["queryNoMets"], queryNoMets: queries["queryNoMets"],
queryNoDims: queries["queryNoDims"], queryNoDims: queries["queryNoDims"],
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment