Skip to content

Commit

Permalink
feat(aggregations,sequelize): Fix aggregation on many-to-many relations
Browse files Browse the repository at this point in the history
  • Loading branch information
doug-martin committed Jul 16, 2020
1 parent 2bf35a9 commit db6ecb2
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 15 deletions.
10 changes: 9 additions & 1 deletion packages/query-sequelize/src/query/filter-query.builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,15 @@ export class FilterQueryBuilder<Entity extends Model<Entity>> {
* @param query - the query to apply.
*/
aggregateOptions(query: Query<Entity>, aggregate: AggregateQuery<Entity>): FindOptions {
let opts: FindOptions = {};
let opts: FindOptions = { raw: true };
opts = this.applyAggregate(opts, aggregate);
opts = this.applyFilter(opts, query.filter);
return opts;
}

relationAggregateOptions(query: Query<Entity>, aggregate: AggregateQuery<Entity>): FindOptions {
// joinTableAttributes is used by many-to-many relations and must be empty.
let opts: FindOptions = { joinTableAttributes: [], raw: true } as FindOptions;
opts = this.applyAggregate(opts, aggregate);
opts = this.applyFilter(opts, query.filter);
return opts;
Expand Down
22 changes: 9 additions & 13 deletions packages/query-sequelize/src/services/relation-query.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,12 @@ export abstract class RelationQueryService<Entity extends Model> {
const relationQueryBuilder = this.getRelationQueryBuilder<Model>(relationEntity);
const results = ((await this.ensureIsEntity(dto).$get(
relationName as keyof Entity,
relationQueryBuilder.aggregateOptions(
relationQueryBuilder.relationAggregateOptions(
assembler.convertQuery({ filter }),
assembler.convertAggregateQuery(aggregate),
),
)) as unknown) as Model[];
const [agg] = results.map((r) =>
AggregateBuilder.convertToAggregateResponse(r.get({ plain: true }) as Record<string, unknown>),
);
)) as unknown) as Record<string, unknown>[];
const [agg] = results.map((r) => AggregateBuilder.convertToAggregateResponse(r));
return assembler.convertAggregateResponse(agg);
}

Expand Down Expand Up @@ -303,19 +301,17 @@ export abstract class RelationQueryService<Entity extends Model> {
const relationEntity = this.getRelationEntity(relationName);
const assembler = AssemblerFactory.getAssembler(RelationClass, relationEntity);
const relationQueryBuilder = this.getRelationQueryBuilder(relationEntity);
const findOptions = relationQueryBuilder.aggregateOptions(
const findOptions = relationQueryBuilder.relationAggregateOptions(
assembler.convertQuery({ filter }),
assembler.convertAggregateQuery(aggregate),
);
return entities.reduce(async (mapPromise, e) => {
const map = await mapPromise;
const results = ((await this.ensureIsEntity(e).$get(
relationName as keyof Entity,
findOptions,
)) as unknown) as Model[];
const [agg] = results.map((r) =>
AggregateBuilder.convertToAggregateResponse(r.get({ plain: true }) as Record<string, unknown>),
);
const results = (await this.ensureIsEntity(e).$get(relationName as keyof Entity, findOptions)) as Record<
string,
unknown
>[];
const [agg] = results.map((r) => AggregateBuilder.convertToAggregateResponse(r));
map.set(e, assembler.convertAggregateResponse(agg));
return map;
}, Promise.resolve(new Map<Entity, AggregateResponse<Relation>>()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export class SequelizeQueryService<Entity extends Model<Entity>> extends Relatio
if (!result) {
return {};
}
return AggregateBuilder.convertToAggregateResponse(result.get({ plain: true }) as Record<string, unknown>);
return AggregateBuilder.convertToAggregateResponse((result as unknown) as Record<string, unknown>);
}

async count(filter: Filter<Entity>): Promise<number> {
Expand Down

0 comments on commit db6ecb2

Please sign in to comment.