Add `RelationalView.addData` (#442)
Now that we want to implement RelationalView de/serialization, we need a way to construct one without adding data to it. Now that we're allowing `addData` to be called explicitly, we also want to make sure it's idempotent, which necessitated a small change to reference handling. A new test verifies idempotency. Test plan: travis Paired with @wchargin
This commit is contained in:
parent
4ee1ed54c8
commit
64df5b09c3
|
@ -11,7 +11,9 @@ export function exampleData(): GithubResponseJSON {
|
|||
}
|
||||
|
||||
export function exampleRelationalView(): RelationalView {
|
||||
return new RelationalView(exampleData());
|
||||
const rv = new RelationalView();
|
||||
rv.addData(exampleData());
|
||||
return rv;
|
||||
}
|
||||
|
||||
export function exampleGraph(): Graph {
|
||||
|
|
|
@ -32,7 +32,7 @@ export class RelationalView {
|
|||
_mapReferences: Map<N.RawAddress, N.ReferentAddress[]>;
|
||||
_mapReferencedBy: Map<N.RawAddress, N.TextContentAddress[]>;
|
||||
|
||||
constructor(data: Q.GithubResponseJSON) {
|
||||
constructor() {
|
||||
this._repos = new Map();
|
||||
this._issues = new Map();
|
||||
this._pulls = new Map();
|
||||
|
@ -41,6 +41,13 @@ export class RelationalView {
|
|||
this._userlikes = new Map();
|
||||
this._mapReferences = new Map();
|
||||
this._mapReferencedBy = new Map();
|
||||
}
|
||||
|
||||
addData(data: Q.GithubResponseJSON) {
|
||||
// Warning: calling `addData` can put the RelationalView in an inconistent
|
||||
// state. for example, if called with {repo: {issues: [1,2,3]}} and then with
|
||||
// {repo: {issues: [4, 5]}}, then calls to repo.issues() will only give back
|
||||
// issues 4 and 5 (although issues 1, 2, and 3 will still be in the view)
|
||||
this._addRepo(data.repository);
|
||||
this._addReferences();
|
||||
}
|
||||
|
@ -281,6 +288,9 @@ export class RelationalView {
|
|||
}
|
||||
|
||||
_addReferences() {
|
||||
// TODO(perf): _addReferences regenerates all refs from scratch
|
||||
this._mapReferences = new Map();
|
||||
this._mapReferencedBy = new Map();
|
||||
// refToAddress maps a "referencing string" to the address that string refers to.
|
||||
// There are 3 kinds of valid referencing strings:
|
||||
// - A canonical URL pointing to a GitHub entity, e.g.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
import * as R from "./relationalView";
|
||||
import * as N from "./nodes";
|
||||
import {exampleRelationalView} from "./example/example";
|
||||
import {exampleData, exampleRelationalView} from "./example/example";
|
||||
|
||||
describe("plugins/github/relationalView", () => {
|
||||
// Sharing this state is OK because it's just a view - no mutation allowed!
|
||||
|
@ -213,4 +213,14 @@ describe("plugins/github/relationalView", () => {
|
|||
expect(nFoundReferences).toEqual(nReferences);
|
||||
});
|
||||
});
|
||||
|
||||
it("addData is idempotent", () => {
|
||||
const rv1 = new R.RelationalView();
|
||||
rv1.addData(exampleData());
|
||||
const rv2 = new R.RelationalView();
|
||||
rv2.addData(exampleData());
|
||||
rv2.addData(exampleData());
|
||||
// may be fragile
|
||||
expect(rv1).toEqual(rv2);
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue