From 728f17b20e97b53713dd5f88fff78b78fcb81026 Mon Sep 17 00:00:00 2001 From: Zura Benashvili Date: Thu, 30 Jul 2020 13:21:58 +0400 Subject: [PATCH] feat(core): merge projection instead of overwriting `query.project(...).project(...)`. second call to `project` should deep merge projection instead of overwritting it, unless `overwrite` is true. BREAKING CHANGE: `query.project(...)` will now deep merge projections by default instead of overwriting them. to overwrite instead (previous default behavior): `query.project({}, true)`. --- packages/core/src/edge/edge-builder.ts | 19 +++++++++++++------ packages/core/src/query/query-builder.ts | 7 +++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/core/src/edge/edge-builder.ts b/packages/core/src/edge/edge-builder.ts index a7f4fc9..e871baf 100644 --- a/packages/core/src/edge/edge-builder.ts +++ b/packages/core/src/edge/edge-builder.ts @@ -34,7 +34,7 @@ export interface EdgeBuilderConstructor { export class EdgeBuilder { protected type?: string; - protected edges: Projection; + protected edges: Projection = {}; protected directives: Record = {}; protected args: ArgsBuilder = new ArgsBuilder(); @@ -54,13 +54,20 @@ export class EdgeBuilder { this.setEdges(edges); } - protected setEdges(edges: EdgeBuilder | RawProjection) { + protected setEdges( + edges: EdgeBuilder | RawProjection, + overwrite = false + ) { this.edges = Object.entries(edges) - .reduce((r, [k ,v]) => { - if (typeof v === 'object') r[k] = new EdgeBuilder(k, v); - else r[k] = v; + .reduce((r, [k, v]) => { + if (typeof v === 'object') { + if (r[k] instanceof EdgeBuilder) + (r[k] as EdgeBuilder).setEdges(v); + else + r[k] = new EdgeBuilder(k, v); + } else r[k] = v; return r; - }, {}); + }, overwrite ? {} : this.edges); } withArgs(args: ArgsBuilder | Omit) { diff --git a/packages/core/src/query/query-builder.ts b/packages/core/src/query/query-builder.ts index 93decab..cf75fce 100644 --- a/packages/core/src/query/query-builder.ts +++ b/packages/core/src/query/query-builder.ts @@ -56,8 +56,11 @@ export class QueryBuilder extends EdgeBuilder { return this; } - project(projection: EdgeBuilder | RawProjection) { - this.setEdges(projection); + project( + projection: EdgeBuilder | RawProjection, + overwrite = false + ) { + this.setEdges(projection, overwrite); return this; }