diff --git a/src/adapter/postgres.spec.ts b/src/adapter/postgres.spec.ts index d9c5a2d71e7d649b890a350f79c407f0d1693489..ddbb00f671b1e192864fd2f91ae2b80acf348e28 100644 --- a/src/adapter/postgres.spec.ts +++ b/src/adapter/postgres.spec.ts @@ -40,7 +40,7 @@ describe("postgres adapter", () => { config = ConfigParser.parse("config/test.yaml"); if (config.adapter === "postgres") { fixture = new FixPostgres(config.connection); - fixture.load(config.loadViews, config.struct.create, (err) => { + fixture.load(config.loadViews, (err) => { if (err) { throw err; } diff --git a/src/api/controllers/collect.spec.ts b/src/api/controllers/collect.spec.ts index 57d7cd37b3c5c33013a5fc0a510404aa252e5424..d770c87d57a7a6debbd8e6ffbf8d4524f72cc46f 100644 --- a/src/api/controllers/collect.spec.ts +++ b/src/api/controllers/collect.spec.ts @@ -39,7 +39,7 @@ describe("API collect controller", () => { config = ConfigParser.parse("config/test.yaml"); if (config.adapter === "postgres") { fixture = new FixPostgres(config.connection); - fixture.LoadSource(config.sources, config.struct.create, (err) => { + fixture.loadSource(config.sources, (err) => { if (err) { throw err; } diff --git a/src/util/configParser.ts b/src/util/configParser.ts index 87f8ef6e25290307891f3b8f73d2977358e2e090..5af24cb5d6b55fb3ddc67b59bff1c48122d840a2 100644 --- a/src/util/configParser.ts +++ b/src/util/configParser.ts @@ -55,11 +55,6 @@ interface BuildView { alias: string; } -export interface LoadStruct{ - create: boolean; - insert: boolean; -} - export interface ParsedConfig { adapter: string; connection: Connection; @@ -68,7 +63,6 @@ export interface ParsedConfig { metrics: Metric[]; enumTypes: EnumType[]; dimensions: Dimension[]; - struct: LoadStruct; loadViews: LoadView[]; buildViews: BuildView[]; } @@ -114,15 +108,6 @@ export class ConfigParser { host: process.env.BLENDB_DB_HOST, port: parseInt(process.env.BLENDB_DB_PORT, 10) }; - - const strCreate = process.env.BLENDB_ST_CREATE; - const strInsert = process.env.BLENDB_ST_INSERT; - - let struct: LoadStruct = { - create: (strCreate) ? strCreate.toLowerCase() === "true" : false, - insert: (strInsert) ? strInsert.toLowerCase() === "true" : false - }; - let metricsOpts = config.metrics; let viewsOpts = config.views; let dimensionsOpts = config.dimensions; @@ -135,7 +120,6 @@ export class ConfigParser { metrics: [], enumTypes: [], dimensions: [], - struct: struct, loadViews: [], buildViews: [], sources: [] diff --git a/test/postgres/fixture.ts b/test/postgres/fixture.ts index d560d7eb52485ae886dd9e999498e4fe22399eb6..4a4e83fa35f6e90cd49b1890fafff48b6dfa5230 100644 --- a/test/postgres/fixture.ts +++ b/test/postgres/fixture.ts @@ -52,31 +52,23 @@ export class Fixture { this.database = config.database; } - public load(schemas: LoadView[], create: boolean, cb: (err: Error) => void): void { + public load(schemas: LoadView[], cb: (err: Error) => void): void { let client = new Client(this.config); /* Loading data has 2 steps: 1 - Create a table or truncate a existing one. - Create or truncate dependes from a parameter in the configure - file, this parameter reaches this function as the create - parameter. 2 - Insert data. */ - let init: string[] = []; let data: string[] = []; for (let i = 0; i < schemas.length; ++i) { - let table: TransSet = this.createTransSet(schemas[i].view, schemas[i].data, create); - init.push(table.init); - data = data.concat(table.data); + data = data.concat(this.extractDataView(schemas[i].view, schemas[i].data)); } - client.connect((error) => { if (error) { cb(error); return; } - /* Tables must be creates before data could be inserted, so the queries that create and insert are splited in 2 arrays. @@ -84,12 +76,22 @@ export class Fixture { is used. Inside series each query is executed, using each; */ series([(callback: (err: Error) => void) => { - each(init, (query, cback) => { - return client.query(query, [], (err: Error) => cback(err)); + each(schemas, (query, cback) => { + client.query(this.createTransSet(query.view, query.data, true), [], (err: Error) => { + if (err) { + let msg: string[] = err.message.split(" "); + if (msg[2] === "already" && msg[3] === "exists"){ + return client.query(this.createTransSet(query.view, query.data, false), [], (errTrunc: Error) => cback(errTrunc)); + } + } + else{ + return cback(err); + } + }); }, (errQuery: Error) => callback(errQuery)); }, (callback: (err: Error) => void) => { each(data, (query, cback) => { - return client.query(query, [], (err: Error) => cback(err)); + return client.query( query, [], (err: Error) => cback(err)); }, (errQuery: Error) => callback(errQuery)); }], (errQuery: Error) => { if (errQuery) { @@ -119,63 +121,70 @@ export class Fixture { } } - private createTransSet(view: View, filePath: string, create: boolean): TransSet { - let props = []; + private extractDataView(view: View, filePath: string): string[]{ + let name = "view_" + view.id; + let data: string[] = []; + let rows = JSON.parse(fs.readFileSync(filePath, {encoding : "utf8"})); + for (let i = 0; i < rows.length; ++i) { + let values = []; + let keys = []; + for (let key of Object.keys(rows[i])) { + keys.push("\"" + key + "\""); + values.push("'" + rows[i][key] + "'"); + } + data.push("INSERT INTO " + name + + "(" + keys.join(", ") + ") " + + "VALUES (" + values.join(", ") + ")"); + } + + return data; + } + + private createTransSet(view: View, filePath: string, create: boolean): string { + let name = "view_" + view.id; + let init: string = ""; + let props = []; for (let i = 0; i < view.metrics.length; ++i) { let met = view.metrics[i]; props.push("\"" + met.name + "\" " + this.typeConvertion(met.dataType)); } - for (let i = 0; i < view.dimensions.length; ++i) { let dim = view.dimensions[i]; props.push("\"" + dim.name + "\" " + this.typeConvertion(dim.dataType)); } - - let name = "view_" + view.id; - let transaction: TransSet = {init: "", data: []}; if (create) { - transaction.init = "CREATE TABLE " + name + "(" + props.join(", ") + ")"; + init = "CREATE TABLE " + name + "(" + props.join(", ") + ")"; } else { - transaction.init = "TRUNCATE TABLE " + name; - } - - transaction.data = []; - let rows = JSON.parse(fs.readFileSync(filePath, {encoding : "utf8"})); - for (let i = 0; i < rows.length; ++i) { - let values = []; - let keys = []; - for (let key of Object.keys(rows[i])) { - keys.push("\"" + key + "\""); - values.push("'" + rows[i][key] + "'"); - } - transaction.data.push("INSERT INTO " + name + - "(" + keys.join(", ") + ") " + - "VALUES (" + values.join(", ") + ")"); + init = "TRUNCATE TABLE " + name; } - return transaction; + return init; } - public LoadSource(source: Source[], create: boolean , cb: (err: Error) => void): void { + public loadSource(source: Source[] , cb: (err: Error) => void): void { let client = new Client(this.config); - let query: string[] = []; - for (let i = 0; i < source.length; i++ ){ - query[i] = this.ExtractData(source[i], create); - } - client.connect((error) => { if (error) { cb(error); return; } - series([(callback: (err: Error) => void) => { - each(query, (insere, cback) => { - return client.query(insere , [], (err: Error) => cback(err)); + each(source, (insere, cback) => { + client.query ( this.extractData(insere, true), [], (errCreate: Error) => { + if (errCreate) { + let msg: string[] = errCreate.message.split(" "); + if (msg[2] === "already" && msg[3] === "exists"){ + return client.query ( this.extractData(insere, false), [], (errTrunc: Error) => cback(errTrunc)); + } + } + else { + return cback(errCreate); + } + }); }, (errQuery: Error) => callback(errQuery)); - }], (errQuery: Error) => { + }], (errQuery: Error) => { if (errQuery) { client.end(); cb(errQuery); @@ -183,11 +192,11 @@ export class Fixture { client.end((err) => { cb(err); }); - }); - }); + }); + }); } - private ExtractData(data: Source , create: boolean): string{ + private extractData(data: Source, create: boolean): string{ let name: string; let type: DataType[]; let fields: string[]; @@ -208,6 +217,7 @@ export class Fixture { else{ consult = "TRUNCATE TABLE " + name + ";"; } + return consult; }