diff --git a/src/alias.ts b/src/alias.ts index e588614..9ea7ad5 100644 --- a/src/alias.ts +++ b/src/alias.ts @@ -15,12 +15,15 @@ export class AttributeAlias { serialize(handler: Handler) { return handler.builders.escapeID(this.name); } - toString(handler: Handler = this.table.dbLangDatabaseInstance.getHandler()) { + getString(handler: Handler = this.table.dbLangDatabaseInstance.getHandler()) { return this.table.serialize(handler) + "." + this.serialize(handler); } - toStringFunc(handler: Handler) { + getStringFunc(handler: Handler) { return this.table.serialize(handler) + "(" + this.serialize(handler) + ")"; } + toString(){ + return this.table.dbLangTableName + "_" + this.name; + } } export class TableAlias { diff --git a/src/db.ts b/src/db.ts index 860e3aa..47935fd 100644 --- a/src/db.ts +++ b/src/db.ts @@ -4,7 +4,7 @@ import { Handler } from './defaultHandler'; import { Query } from './query'; import { attributeSettings, extendedAttributeSettings, onAction, dbType } from './types'; import { TableAlias } from "./alias" -import { insertResponse, readResponse, writeResponse } from "./responses" +import { insertResponse, readResponse, writeResponse, singleResponse } from "./responses" //import { postgresHandler } from "./postgresHandler" @@ -109,12 +109,15 @@ export class Attribute { serialize(handler: Handler) { return handler.builders.escapeID(this.name); } - toString(handler: Handler = this.table.dbLangDatabaseInstance.getHandler()) { + getString(handler: Handler = this.table.dbLangDatabaseInstance.getHandler()) { return this.table.serialize(handler) + "." + this.serialize(handler); } toStringFunc(handler: Handler) { return this.table.serialize(handler) + "(" + this.serialize(handler) + ")"; } + toString(){ + return this.table.dbLangTableName + "_" + this.name; + } } @@ -164,4 +167,4 @@ export class Table { export * from './funcs'; export { onAction }; export { dbType as databaseType } -export { readResponse, writeResponse, insertResponse } \ No newline at end of file +export { readResponse, writeResponse, insertResponse, singleResponse } \ No newline at end of file diff --git a/src/defaultHandler.ts b/src/defaultHandler.ts index 2c36030..abd2acf 100644 --- a/src/defaultHandler.ts +++ b/src/defaultHandler.ts @@ -241,7 +241,21 @@ export class Handler { select: (handler: Handler, q: selectQuery): QueryBuilder => { const builder = new QueryBuilder(); builder.addCode("select "); - builder.append(joinArg(", ")(handler, q.attr)); + let a = q.attr; + for (let i = 0; i < a.length; i++) { + const d = a[i]; + if (d instanceof Attribute || d instanceof AttributeAlias) + builder.addCode(d.getString(handler)+" "+ handler.builders.escapeID(d.toString())); + else if (d instanceof Modifier || d instanceof selectQuery || d instanceof Aggregation) { + builder.addCode("("); + builder.append(d.serialize(handler)); + builder.addCode(")"); + } else { + builder.addInjection(d); + } + if (i + 1 < a.length) builder.addCode(", "); + } + //builder.append(joinArg(", ")(handler, q.attr)); builder.addCode(` from `); if (q.from == null) { builder.addCode(" DUAL"); @@ -577,11 +591,11 @@ export class Handler { } aggregations = { - count: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "count(" + a.toString(handler) + ")" }]), - sum: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "sum(" + a.toString(handler) + ")" }]), - avg: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "avg(" + a.toString(handler) + ")" }]), - min: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "min(" + a.toString(handler) + ")" }]), - max: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "max(" + a.toString(handler) + ")" }]), + count: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "count(" + a.getString(handler) + ")" }]), + sum: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "sum(" + a.getString(handler) + ")" }]), + avg: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "avg(" + a.getString(handler) + ")" }]), + min: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "min(" + a.getString(handler) + ")" }]), + max: (handler: Handler, a: Attribute): QueryBuilder => new QueryBuilder([{ data: "max(" + a.getString(handler) + ")" }]), } joins = { @@ -590,6 +604,7 @@ export class Handler { for (let i = 0; i < j.tables.length; i++) { const t = j.tables[i]; if (t instanceof Table) qb.addCode(t.serialize(handler)); + else if (t instanceof TableAlias) qb.addCode(t.serializeAlias(handler)); else { qb.addCode("("); qb.append(t.serialize(handler)); @@ -608,6 +623,7 @@ export class Handler { using: (handler: Handler, j: usingJoin) => { const qb = new QueryBuilder(); if (j.tableA instanceof Table) qb.addCode(j.tableA.serialize(handler)); + else if (j.tableA instanceof TableAlias) qb.addCode(j.tableA.serializeAlias(handler)); else { qb.addCode("("); qb.append(j.tableA.serialize(handler)); @@ -618,10 +634,11 @@ export class Handler { if (j.type == joinType.right) qb.addCode("right "); if (j.type == joinType.full) qb.addCode("full "); qb.addCode("join "); - if (j.tableA instanceof Table) qb.addCode(j.tableA.serialize(handler)); + if (j.tableB instanceof Table) qb.addCode(j.tableB.serialize(handler)); + else if (j.tableB instanceof TableAlias) qb.addCode(j.tableB.serializeAlias(handler)); else { qb.addCode("("); - qb.append(j.tableA.serialize(handler)); + qb.append(j.tableB.serialize(handler)); qb.addCode(")"); } qb.addCode(" using ("); @@ -632,6 +649,7 @@ export class Handler { on: (handler: Handler, j: onJoin) => { const qb = new QueryBuilder(); if (j.tableA instanceof Table) qb.addCode(j.tableA.serialize(handler)); + else if (j.tableA instanceof TableAlias) qb.addCode(j.tableA.serializeAlias(handler)); else { qb.addCode("("); qb.append(j.tableA.serialize(handler)); @@ -642,10 +660,11 @@ export class Handler { if (j.type == joinType.right) qb.addCode("right "); if (j.type == joinType.full) qb.addCode("full "); qb.addCode("join "); - if (j.tableA instanceof Table) qb.addCode(j.tableA.serialize(handler)); + if (j.tableB instanceof Table) qb.addCode(j.tableB.serialize(handler)); + else if (j.tableB instanceof TableAlias) qb.addCode(j.tableB.serializeAlias(handler)); else { qb.addCode("("); - qb.append(j.tableA.serialize(handler)); + qb.append(j.tableB.serialize(handler)); qb.addCode(")"); } qb.addCode(" on ("); @@ -658,6 +677,7 @@ export class Handler { for (let i = 0; i < j.tables.length; i++) { const t = j.tables[i]; if (t instanceof Table) qb.addCode(t.serialize(handler)); + else if (t instanceof TableAlias) qb.addCode(t.serializeAlias(handler)); else { qb.addCode("("); qb.append(t.serialize(handler)); @@ -683,7 +703,7 @@ export class Handler { divide: joinArg("-/"), not: (handler: Handler, a: allModifierInput[]): QueryBuilder => { let e = a[0]; - if (e instanceof Attribute || e instanceof AttributeAlias) return new QueryBuilder([{ data: "not (" + e.toString(handler) + ")" }]) + if (e instanceof Attribute || e instanceof AttributeAlias) return new QueryBuilder([{ data: "not (" + e.getString(handler) + ")" }]) if (e instanceof Modifier || e instanceof selectQuery || e instanceof Aggregation) { const builder = new QueryBuilder(); builder.addCode("not ("); @@ -699,14 +719,14 @@ export class Handler { }, like: (handler: Handler, a: allModifierInput[]): QueryBuilder => { const builder = new QueryBuilder(); - if (a[0] instanceof Attribute || a[0] instanceof AttributeAlias) builder.addCode(a[0].toString()); + if (a[0] instanceof Attribute || a[0] instanceof AttributeAlias) builder.addCode(a[0].getString()); else if (a[0] instanceof Modifier || a[0] instanceof selectQuery || a[0] instanceof Aggregation) { builder.append(a[0].serialize(handler)); } else { builder.addInjection(a[0]); } builder.addCode(" LIKE "); - if (a[1] instanceof Attribute || a[1] instanceof AttributeAlias) builder.addCode(a[1].toString()); + if (a[1] instanceof Attribute || a[1] instanceof AttributeAlias) builder.addCode(a[1].getString()); else if (a[1] instanceof Modifier || a[1] instanceof selectQuery || a[1] instanceof Aggregation) { builder.append(a[1].serialize(handler)); } else { @@ -716,14 +736,14 @@ export class Handler { }, regexp: (handler: Handler, a: allModifierInput[]): QueryBuilder => { const builder = new QueryBuilder(); - if (a[0] instanceof Attribute || a[0] instanceof AttributeAlias) builder.addCode(a[0].toString()); + if (a[0] instanceof Attribute || a[0] instanceof AttributeAlias) builder.addCode(a[0].getString()); else if (a[0] instanceof Modifier || a[0] instanceof selectQuery || a[0] instanceof Aggregation) { builder.append(a[0].serialize(handler)); } else { builder.addInjection(a[0]); } builder.addCode(" REGEXP "); - if (a[1] instanceof Attribute || a[1] instanceof AttributeAlias) builder.addCode(a[1].toString()); + if (a[1] instanceof Attribute || a[1] instanceof AttributeAlias) builder.addCode(a[1].getString()); else if (a[1] instanceof Modifier || a[1] instanceof selectQuery || a[1] instanceof Aggregation) { builder.append(a[1].serialize(handler)); } else { @@ -736,7 +756,7 @@ export class Handler { builder.addCode("CONCAT("); for (let i = 0; i < a.length; i++) { const e = a[i]; - if (e instanceof Attribute || e instanceof AttributeAlias) builder.addCode(e.toString()); + if (e instanceof Attribute || e instanceof AttributeAlias) builder.addCode(e.getString()); else if (e instanceof Modifier || e instanceof selectQuery || e instanceof Aggregation) { builder.append(e.serialize(handler)); } else { @@ -834,7 +854,7 @@ function joinArg(type: string) { const builder = new QueryBuilder(); for (let i = 0; i < a.length; i++) { const d = a[i]; - if (d instanceof Attribute || d instanceof AttributeAlias) builder.addCode(d.toString(handler)); + if (d instanceof Attribute || d instanceof AttributeAlias) builder.addCode(d.getString(handler)); else if (d instanceof Modifier || d instanceof selectQuery || d instanceof Aggregation) { builder.addCode("("); builder.append(d.serialize(handler)); diff --git a/src/responses.ts b/src/responses.ts index d8f8ba1..cede0f9 100644 --- a/src/responses.ts +++ b/src/responses.ts @@ -1,21 +1,34 @@ +import { AttributeAlias } from "./alias"; +import { Attribute } from "./db"; +import { primaryData } from "./types"; -export class readResponse extends Array{ - constructor(rows:({[key: string]:any})[]){ - super(); - this.push(...rows); +export class singleResponse { + [key: string]: primaryData | any; + constructor(r: object) { + Object.assign(this, r); + } + getVal(a: Attribute | AttributeAlias) { + return this[a.toString()]; } } -export class writeResponse{ +export class readResponse extends Array{ + constructor(rows: ({ [key: string]: primaryData })[]) { + super(); + this.push(...rows.map(r => new singleResponse(r))); + } +} + +export class writeResponse { affectedRows: number; - constructor(affectedRows: number){ + constructor(affectedRows: number) { this.affectedRows = affectedRows; } } -export class insertResponse extends writeResponse{ +export class insertResponse extends writeResponse { insertId: number; - constructor(affectedRows: number, insertId: number){ + constructor(affectedRows: number, insertId: number) { super(affectedRows); this.insertId = insertId; }