Compare commits

..

No commits in common. "9fefd93f098d300600c48fdcb88538c6eb83ad1c" and "16f6846d89a627cf5fd7fc0605adc1ac269ba97b" have entirely different histories.

2 changed files with 18 additions and 41 deletions

View file

@ -2,7 +2,6 @@ import { Brackets, DataSource, NotBrackets, ObjectLiteral, SelectQueryBuilder, W
import { dataSource } from "../data-source";
import { ConditionStructure, DynamicQueryStructure, FieldType, QueryResult } from "../type/dynamicQueries";
import { TableMeta } from "../type/tableMeta";
import { StringHelper } from "./stringHelper";
export default abstract class DynamicQueryBuilder {
public static allowedTables: Array<string> = [
@ -63,18 +62,11 @@ export default abstract class DynamicQueryBuilder {
count?: number;
noLimit?: boolean;
}): SelectQueryBuilder<ObjectLiteral> {
let affix = queryObj.id ?? StringHelper.random(10);
let query = dataSource.getRepository(queryObj.table).createQueryBuilder(`${affix}_${queryObj.table}`);
let affix = Math.random().toString(36).substring(2);
let query = dataSource.getRepository(queryObj.table).createQueryBuilder(`${queryObj.table}_${affix}`);
this.buildDynamicQuery(query, queryObj, affix);
if (queryObj.orderBy) {
queryObj.orderBy.forEach((order) => {
// compatability layer for none id (old) queries
if (order.id) query.addOrderBy(`${order.id}_${order.table}.${order.column}`, order.order);
});
}
if (!noLimit) {
query.offset(offset);
query.limit(count);
@ -86,10 +78,10 @@ export default abstract class DynamicQueryBuilder {
private static buildDynamicQuery(
query: SelectQueryBuilder<ObjectLiteral>,
queryObject: DynamicQueryStructure,
affix: string = "", // table id
affix: string = "",
depth: number = 0
): void {
const alias = `${affix}_${queryObject.table}`;
const alias = queryObject.table + "_" + affix;
let firstSelect = true;
let selects: Array<string> = [];
@ -116,12 +108,18 @@ export default abstract class DynamicQueryBuilder {
if (queryObject.join) {
for (const join of queryObject.join) {
let subaffix = join.id ?? StringHelper.random(10);
query.leftJoin(`${alias}.${join.foreignColumn}`, `${subaffix}_${join.table}`);
let subaffix = Math.random().toString(36).substring(2);
query.leftJoin(`${alias}.${join.foreignColumn}`, join.table + "_" + subaffix);
this.buildDynamicQuery(query, join, subaffix, depth + 1);
}
}
if (queryObject.orderBy) {
queryObject.orderBy.forEach((order) => {
query.addOrderBy(`${alias}.${order.column}`, order.order);
});
}
}
public static applyWhere(
@ -129,7 +127,6 @@ export default abstract class DynamicQueryBuilder {
conditions: Array<ConditionStructure>,
alias: string
): void {
console.log(conditions, alias);
for (const condition of conditions) {
if (condition.structureType == "condition") {
const whereClause = this.buildConditionClause(condition, alias);
@ -169,7 +166,7 @@ export default abstract class DynamicQueryBuilder {
condition: ConditionStructure & { structureType: "condition" },
alias: string
): { query: string; parameters: Record<string, unknown> } {
const parameterKey = `${condition.column}_${Math.random().toString(36).substring(2)}`;
const parameterKey = `${alias}_${condition.column}_${Math.random().toString(36).substring(2)}`;
let query = `${alias}.${condition.column}`;
let parameters: Record<string, unknown> = {};
@ -239,8 +236,6 @@ export default abstract class DynamicQueryBuilder {
parameters[`${parameterKey}_end`] = new Date(new Date().getFullYear() - (condition.value as number), 11, 31);
}
console.log(query, parameters);
return { query, parameters };
}
@ -384,7 +379,6 @@ export default abstract class DynamicQueryBuilder {
count: noLimit ? total : count,
};
} catch (error) {
console.log(error);
return {
stats: "error",
sql: error.sql,
@ -397,22 +391,19 @@ export default abstract class DynamicQueryBuilder {
}
const memberQuery: DynamicQueryStructure = {
id: "memberId",
select: "*",
table: "member",
orderBy: [
{ id: "memberId", depth: 0, table: "member", column: "lastname", order: "ASC" },
{ id: "memberId", depth: 0, table: "member", column: "firstname", order: "ASC" },
{ column: "lastname", order: "ASC" },
{ column: "firstname", order: "ASC" },
],
};
const memberByRunningMembershipQuery: DynamicQueryStructure = {
id: "memberId",
select: "*",
table: "member",
join: [
{
id: "membershipId",
select: "*",
table: "membership",
where: [{ structureType: "condition", concat: "_", operation: "null", column: "end", value: "" }],
@ -420,7 +411,7 @@ const memberByRunningMembershipQuery: DynamicQueryStructure = {
},
],
orderBy: [
{ id: "memberId", depth: 0, table: "member", column: "lastname", order: "ASC" },
{ id: "memberId", depth: 0, table: "member", column: "firstname", order: "ASC" },
{ column: "lastname", order: "ASC" },
{ column: "firstname", order: "ASC" },
],
};

View file

@ -1,10 +1,9 @@
export interface DynamicQueryStructure {
id: string;
select: string[] | "*";
table: string;
where?: Array<ConditionStructure>;
join?: Array<DynamicQueryStructure & { foreignColumn: string }>;
orderBy?: Array<OrderByStructure>; // only at top level
orderBy?: Array<OrderByStructure>;
}
export type ConditionStructure = (
@ -49,9 +48,6 @@ export type WhereOperation =
// TODO: age between | age equals | age greater | age smaller
export type OrderByStructure = {
id: string;
depth: number;
table: string;
column: string;
order: OrderByType;
};
@ -63,7 +59,6 @@ export type QueryResult = {
};
export const exampleQuery: DynamicQueryStructure = {
id: "1234",
select: ["firstname", "lastname"],
table: "member",
where: [
@ -97,19 +92,16 @@ export const exampleQuery: DynamicQueryStructure = {
],
join: [
{
id: "5678",
select: "*",
table: "communication",
foreignColumn: "sendNewsletter",
},
{
id: "91011",
select: "*",
table: "membership",
foreignColumn: "memberships",
join: [
{
id: "121314",
select: "*",
table: "membership_status",
foreignColumn: "status",
@ -128,16 +120,10 @@ export const exampleQuery: DynamicQueryStructure = {
],
orderBy: [
{
id: "1234",
depth: 0,
table: "member",
column: "firstname",
order: "ASC",
},
{
id: "1234",
depth: 0,
table: "member",
column: "lastname",
order: "ASC",
},