newtonjs-graph icon indicating copy to clipboard operation
newtonjs-graph copied to clipboard

Bug: Graph re-renders on node status update

Open julie-ng opened this issue 5 years ago • 5 comments

Remove webcola engine because it needs to re-render layout entirely on every change, even just status color. See example below.

This leaves default d3 layout engine - for now.

newton-webcola-re-render

julie-ng avatar Nov 18 '19 21:11 julie-ng

Hello @julie-ng !

When the graph is updated, the links of the graph are re-rendered, and it triggers the Graph._bindLayout method. This method, only if the webcola engine is selected re-adjust the forces. And this new call to this.force.start() for the links of the graph cause the layer to be re-rendered entirely.

I do not think we should specify a InitialUnconstrainedIteration here because webcola will go through these iterations during rendering. However, even when specifying 0, it still re-render the layout entirely, which is super strange. I do not understand why.

Would it make sense, during a graph update, to check if the number of nodes changed, and if not, to avoid the re-rendering of the links by commenting the 2 lines here ?

If that makes sense, I can prepare a PR.

bsvetchine avatar Jan 26 '20 17:01 bsvetchine

By removing the 2 lines here: https://github.com/julie-ng/newtonjs-graph/blob/master/newton/graph/graph.js#L142 https://github.com/julie-ng/newtonjs-graph/blob/master/newton/graph/graph.js#L143

Everything looks fine (graph init and update, even updates with nodes addition and deletion).

bsvetchine avatar Jan 26 '20 17:01 bsvetchine

Hmm interesting find! You're right, theoretically if we are just updating node states, we do not need to redraw links. I think your suggestion is great as a first step, removing those 2 lines makes sense.

In the feature, I need to distinguish between updating nodes and links. I'm on vacation now, but maybe next week I will get to this :)

julie-ng avatar Jan 30 '20 23:01 julie-ng

Otherwise, but I think you are already aware of this, I believe the problem is located here https://github.com/julie-ng/newtonjs-graph/blob/master/newton/graph/views/links.js#L58. The call to the d3.js selection data method is supposed to identify the new links to create and the old links to remove. However, whatever data that comes in, even if the data is exactly the same than previously, it identifies all the links of the current graph to be deleted and all the new links to be created. However I still have no clue why.

bsvetchine avatar Jan 31 '20 16:01 bsvetchine

Hello @julie-ng !

I noticed that the data samples provided by the repository newtonjs-demo-data-editor contain a few discrepencies. By fixing them, I cannot reproduce this issue ; i.e. the graph is no more re-rendered entirely. I think that the root cause of this issue might just be malformed incoming data.

bertrandsvetchine avatar Mar 08 '20 15:03 bertrandsvetchine