From dbafd568dd97d88d4166f7d2df229605a5107279 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Tue, 15 Apr 2025 10:02:15 +0200 Subject: [PATCH 1/3] sort by new query structure --- src/helpers/dynamicQueryBuilder.ts | 35 ++++++++++++++++-------------- src/type/dynamicQueries.ts | 16 +++++++++++++- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/helpers/dynamicQueryBuilder.ts b/src/helpers/dynamicQueryBuilder.ts index 446fc22..5297a12 100644 --- a/src/helpers/dynamicQueryBuilder.ts +++ b/src/helpers/dynamicQueryBuilder.ts @@ -62,11 +62,17 @@ export default abstract class DynamicQueryBuilder { count?: number; noLimit?: boolean; }): SelectQueryBuilder { - let affix = Math.random().toString(36).substring(2); - let query = dataSource.getRepository(queryObj.table).createQueryBuilder(`${queryObj.table}_${affix}`); + let affix = queryObj.id; + let query = dataSource.getRepository(queryObj.table).createQueryBuilder(`${affix}_${queryObj.table}`); this.buildDynamicQuery(query, queryObj, affix); + if (queryObj.orderBy) { + queryObj.orderBy.forEach((order) => { + query.addOrderBy(`${order.id}_${order.table}.${order.column}`, order.order); + }); + } + if (!noLimit) { query.offset(offset); query.limit(count); @@ -78,10 +84,10 @@ export default abstract class DynamicQueryBuilder { private static buildDynamicQuery( query: SelectQueryBuilder, queryObject: DynamicQueryStructure, - affix: string = "", + affix: string = "", // table id depth: number = 0 ): void { - const alias = queryObject.table + "_" + affix; + const alias = `${affix}_${queryObject.table}`; let firstSelect = true; let selects: Array = []; @@ -108,18 +114,12 @@ export default abstract class DynamicQueryBuilder { if (queryObject.join) { for (const join of queryObject.join) { - let subaffix = Math.random().toString(36).substring(2); - query.leftJoin(`${alias}.${join.foreignColumn}`, join.table + "_" + subaffix); + let subaffix = join.id; + query.leftJoin(`${alias}.${join.foreignColumn}`, `${subaffix}_${join.table}`); this.buildDynamicQuery(query, join, subaffix, depth + 1); } } - - if (queryObject.orderBy) { - queryObject.orderBy.forEach((order) => { - query.addOrderBy(`${alias}.${order.column}`, order.order); - }); - } } public static applyWhere( @@ -391,19 +391,22 @@ export default abstract class DynamicQueryBuilder { } const memberQuery: DynamicQueryStructure = { + id: "memberId", select: "*", table: "member", orderBy: [ - { column: "lastname", order: "ASC" }, - { column: "firstname", order: "ASC" }, + { id: "memberId", depth: 0, table: "member", column: "lastname", order: "ASC" }, + { id: "memberId", depth: 0, table: "member", 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: "" }], @@ -411,7 +414,7 @@ const memberByRunningMembershipQuery: DynamicQueryStructure = { }, ], orderBy: [ - { column: "lastname", order: "ASC" }, - { column: "firstname", order: "ASC" }, + { id: "memberId", depth: 0, table: "member", column: "lastname", order: "ASC" }, + { id: "memberId", depth: 0, table: "member", column: "firstname", order: "ASC" }, ], }; diff --git a/src/type/dynamicQueries.ts b/src/type/dynamicQueries.ts index 7ae4a79..ca6a7e5 100644 --- a/src/type/dynamicQueries.ts +++ b/src/type/dynamicQueries.ts @@ -1,9 +1,10 @@ export interface DynamicQueryStructure { + id: string; select: string[] | "*"; table: string; where?: Array; join?: Array; - orderBy?: Array; + orderBy?: Array; // only at top level } export type ConditionStructure = ( @@ -48,6 +49,9 @@ 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; }; @@ -59,6 +63,7 @@ export type QueryResult = { }; export const exampleQuery: DynamicQueryStructure = { + id: "1234", select: ["firstname", "lastname"], table: "member", where: [ @@ -92,16 +97,19 @@ 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", @@ -120,10 +128,16 @@ 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", }, -- 2.45.3 From e08b7e8683f5ffb8e2b5d7cd97a21a60f353ac75 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Tue, 15 Apr 2025 10:09:08 +0200 Subject: [PATCH 2/3] compatability layer --- src/helpers/dynamicQueryBuilder.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/helpers/dynamicQueryBuilder.ts b/src/helpers/dynamicQueryBuilder.ts index 5297a12..b2db630 100644 --- a/src/helpers/dynamicQueryBuilder.ts +++ b/src/helpers/dynamicQueryBuilder.ts @@ -2,6 +2,7 @@ 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 = [ @@ -62,14 +63,15 @@ export default abstract class DynamicQueryBuilder { count?: number; noLimit?: boolean; }): SelectQueryBuilder { - let affix = queryObj.id; + let affix = queryObj.id ?? StringHelper.random(10); let query = dataSource.getRepository(queryObj.table).createQueryBuilder(`${affix}_${queryObj.table}`); this.buildDynamicQuery(query, queryObj, affix); if (queryObj.orderBy) { queryObj.orderBy.forEach((order) => { - query.addOrderBy(`${order.id}_${order.table}.${order.column}`, order.order); + // compatability layer for none id (old) queries + if (order.id) query.addOrderBy(`${order.id}_${order.table}.${order.column}`, order.order); }); } @@ -114,7 +116,7 @@ export default abstract class DynamicQueryBuilder { if (queryObject.join) { for (const join of queryObject.join) { - let subaffix = join.id; + let subaffix = join.id ?? StringHelper.random(10); query.leftJoin(`${alias}.${join.foreignColumn}`, `${subaffix}_${join.table}`); this.buildDynamicQuery(query, join, subaffix, depth + 1); @@ -379,6 +381,7 @@ export default abstract class DynamicQueryBuilder { count: noLimit ? total : count, }; } catch (error) { + console.log(error); return { stats: "error", sql: error.sql, -- 2.45.3 From 68ddd4dec4755c7cd2762288ffdeccdb1ca2e6fa Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Tue, 15 Apr 2025 10:29:40 +0200 Subject: [PATCH 3/3] query builder where clause error --- src/helpers/dynamicQueryBuilder.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/helpers/dynamicQueryBuilder.ts b/src/helpers/dynamicQueryBuilder.ts index b2db630..159f518 100644 --- a/src/helpers/dynamicQueryBuilder.ts +++ b/src/helpers/dynamicQueryBuilder.ts @@ -129,6 +129,7 @@ export default abstract class DynamicQueryBuilder { conditions: Array, alias: string ): void { + console.log(conditions, alias); for (const condition of conditions) { if (condition.structureType == "condition") { const whereClause = this.buildConditionClause(condition, alias); @@ -168,7 +169,7 @@ export default abstract class DynamicQueryBuilder { condition: ConditionStructure & { structureType: "condition" }, alias: string ): { query: string; parameters: Record } { - const parameterKey = `${alias}_${condition.column}_${Math.random().toString(36).substring(2)}`; + const parameterKey = `${condition.column}_${Math.random().toString(36).substring(2)}`; let query = `${alias}.${condition.column}`; let parameters: Record = {}; @@ -238,6 +239,8 @@ 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 }; } -- 2.45.3