Skip to content

Commit

Permalink
feat(core): merge projection instead of overwriting
Browse files Browse the repository at this point in the history
`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)`.
  • Loading branch information
binier committed Jul 30, 2020
1 parent 00139dc commit 728f17b
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 8 deletions.
19 changes: 13 additions & 6 deletions packages/core/src/edge/edge-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export interface EdgeBuilderConstructor {

export class EdgeBuilder {
protected type?: string;
protected edges: Projection<EdgeBuilder>;
protected edges: Projection<EdgeBuilder> = {};
protected directives: Record<string, DirectiveBuilder> = {};
protected args: ArgsBuilder = new ArgsBuilder();

Expand All @@ -54,13 +54,20 @@ export class EdgeBuilder {
this.setEdges(edges);
}

protected setEdges(edges: EdgeBuilder | RawProjection<EdgeBuilder>) {
protected setEdges(
edges: EdgeBuilder | RawProjection<EdgeBuilder>,
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<ArgsBuilderData, 'func'>) {
Expand Down
7 changes: 5 additions & 2 deletions packages/core/src/query/query-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,11 @@ export class QueryBuilder extends EdgeBuilder {
return this;
}

project(projection: EdgeBuilder | RawProjection<EdgeBuilder>) {
this.setEdges(projection);
project(
projection: EdgeBuilder | RawProjection<EdgeBuilder>,
overwrite = false
) {
this.setEdges(projection, overwrite);
return this;
}

Expand Down

0 comments on commit 728f17b

Please sign in to comment.