sort by new query structure
This commit is contained in:
parent
16f6846d89
commit
dbafd568dd
2 changed files with 34 additions and 17 deletions
|
@ -62,11 +62,17 @@ export default abstract class DynamicQueryBuilder {
|
|||
count?: number;
|
||||
noLimit?: boolean;
|
||||
}): SelectQueryBuilder<ObjectLiteral> {
|
||||
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<ObjectLiteral>,
|
||||
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<string> = [];
|
||||
|
||||
|
@ -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" },
|
||||
],
|
||||
};
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
export interface DynamicQueryStructure {
|
||||
id: string;
|
||||
select: string[] | "*";
|
||||
table: string;
|
||||
where?: Array<ConditionStructure>;
|
||||
join?: Array<DynamicQueryStructure & { foreignColumn: string }>;
|
||||
orderBy?: Array<OrderByStructure>;
|
||||
orderBy?: Array<OrderByStructure>; // 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",
|
||||
},
|
||||
|
|
Loading…
Add table
Reference in a new issue