[vcs-log-graph] extract LinearGraphWrapper class to represent a graph with added or removed edges

GitOrigin-RevId: 1d7c15ed869c1ff03a8617fbc2f80231fff61377
This commit is contained in:
Julia Beliaeva
2024-04-03 01:35:25 +00:00
committed by intellij-monorepo-bot
parent 03d0986877
commit 7cecc1ed74
4 changed files with 64 additions and 77 deletions
@@ -0,0 +1,24 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.vcs.log.graph.impl.facade
import com.intellij.vcs.log.graph.api.EdgeFilter
import com.intellij.vcs.log.graph.api.LinearGraph
import com.intellij.vcs.log.graph.api.elements.GraphEdge
import com.intellij.vcs.log.graph.collapsing.EdgeStorageWrapper
open class LinearGraphWrapper @JvmOverloads constructor(val graph: LinearGraph,
val hiddenEdges: EdgeStorageWrapper = EdgeStorageWrapper.createSimpleEdgeStorage(),
val dottedEdges: EdgeStorageWrapper = EdgeStorageWrapper.createSimpleEdgeStorage()) : LinearGraph {
override fun getAdjacentEdges(nodeIndex: Int, filter: EdgeFilter): List<GraphEdge> {
return buildList {
addAll(dottedEdges.getAdjacentEdges(nodeIndex, filter))
addAll(graph.getAdjacentEdges(nodeIndex, filter))
removeAll(hiddenEdges.getAdjacentEdges(nodeIndex, filter))
}
}
override fun nodesCount() = graph.nodesCount()
override fun getGraphNode(nodeIndex: Int) = graph.getGraphNode(nodeIndex)
override fun getNodeId(nodeIndex: Int) = graph.getNodeId(nodeIndex)
override fun getNodeIndex(nodeId: Int) = graph.getNodeIndex(nodeId)
}
@@ -1,4 +1,4 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.vcs.log.graph.linearBek
import com.intellij.openapi.diagnostic.Logger
@@ -95,8 +95,8 @@ class LinearBekController(controller: BekBaseController, permanentGraphInfo: Per
return object : LinearGraphAnswer(GraphChangesUtil.SOME_CHANGES) {
override fun getGraphUpdater(): Runnable {
return Runnable {
compiledGraph.myDottedEdges.removeAll()
compiledGraph.myHiddenEdges.removeAll()
compiledGraph.dottedEdges.removeAll()
compiledGraph.hiddenEdges.removeAll()
}
}
}
@@ -1,4 +1,4 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.vcs.log.graph.linearBek;
import com.intellij.util.containers.ContainerUtil;
@@ -6,71 +6,34 @@ import com.intellij.vcs.log.graph.api.EdgeFilter;
import com.intellij.vcs.log.graph.api.LinearGraph;
import com.intellij.vcs.log.graph.api.elements.GraphEdge;
import com.intellij.vcs.log.graph.api.elements.GraphEdgeType;
import com.intellij.vcs.log.graph.api.elements.GraphNode;
import com.intellij.vcs.log.graph.collapsing.EdgeStorageWrapper;
import com.intellij.vcs.log.graph.impl.facade.LinearGraphWrapper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
public class LinearBekGraph implements LinearGraph {
@NotNull protected final LinearGraph myGraph;
@NotNull protected final EdgeStorageWrapper myHiddenEdges;
@NotNull protected final EdgeStorageWrapper myDottedEdges;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class LinearBekGraph extends LinearGraphWrapper {
public LinearBekGraph(@NotNull LinearGraph graph) {
myGraph = graph;
myHiddenEdges = EdgeStorageWrapper.createSimpleEdgeStorage();
myDottedEdges = EdgeStorageWrapper.createSimpleEdgeStorage();
}
@Override
public int nodesCount() {
return myGraph.nodesCount();
}
@NotNull
@Override
public List<GraphEdge> getAdjacentEdges(int nodeIndex, @NotNull EdgeFilter filter) {
List<GraphEdge> result = new ArrayList<>();
result.addAll(myDottedEdges.getAdjacentEdges(nodeIndex, filter));
result.addAll(myGraph.getAdjacentEdges(nodeIndex, filter));
result.removeAll(myHiddenEdges.getAdjacentEdges(nodeIndex, filter));
return result;
}
@NotNull
@Override
public GraphNode getGraphNode(int nodeIndex) {
return myGraph.getGraphNode(nodeIndex);
}
@Override
public int getNodeId(int nodeIndex) {
return myGraph.getNodeId(nodeIndex);
}
@Nullable
@Override
public Integer getNodeIndex(int nodeId) {
return myGraph.getNodeIndex(nodeId);
super(graph);
}
public Collection<GraphEdge> expandEdge(@NotNull final GraphEdge edge) {
Set<GraphEdge> result = new HashSet<>();
assert edge.getType() == GraphEdgeType.DOTTED;
myDottedEdges.removeEdge(edge);
getDottedEdges().removeEdge(edge);
Integer tail = edge.getUpNodeIndex();
Integer firstChild = edge.getDownNodeIndex();
assert tail != null : "Collapsed from to an unloaded node";
assert firstChild != null : "Collapsed edge to an unloaded node";
List<GraphEdge> downDottedEdges = myHiddenEdges.getAdjacentEdges(tail, EdgeFilter.NORMAL_DOWN);
List<GraphEdge> upDottedEdges = myHiddenEdges.getAdjacentEdges(firstChild, EdgeFilter.NORMAL_UP);
List<GraphEdge> downDottedEdges = getHiddenEdges().getAdjacentEdges(tail, EdgeFilter.NORMAL_DOWN);
List<GraphEdge> upDottedEdges = getHiddenEdges().getAdjacentEdges(firstChild, EdgeFilter.NORMAL_UP);
for (GraphEdge e : ContainerUtil.concat(downDottedEdges, upDottedEdges)) {
myHiddenEdges.removeEdge(e);
getHiddenEdges().removeEdge(e);
if (e.getType() == GraphEdgeType.DOTTED) {
result.addAll(expandEdge(e));
}
@@ -86,35 +49,35 @@ public class LinearBekGraph implements LinearGraph {
private final LinearBekGraph myLinearGraph;
public WorkingLinearBekGraph(@NotNull LinearBekGraph graph) {
super(graph.myGraph);
super(graph.getGraph());
myLinearGraph = graph;
}
public Collection<GraphEdge> getAddedEdges() {
Set<GraphEdge> result = myDottedEdges.getEdges();
result.removeAll(ContainerUtil.filter(myHiddenEdges.getEdges(), graphEdge -> graphEdge.getType() == GraphEdgeType.DOTTED));
result.removeAll(myLinearGraph.myDottedEdges.getEdges());
Set<GraphEdge> result = getDottedEdges().getEdges();
result.removeAll(ContainerUtil.filter(getHiddenEdges().getEdges(), graphEdge -> graphEdge.getType() == GraphEdgeType.DOTTED));
result.removeAll(myLinearGraph.getDottedEdges().getEdges());
return result;
}
public Collection<GraphEdge> getRemovedEdges() {
Set<GraphEdge> result = new HashSet<>();
Set<GraphEdge> hidden = myHiddenEdges.getEdges();
Set<GraphEdge> hidden = getHiddenEdges().getEdges();
result.addAll(ContainerUtil.filter(hidden, graphEdge -> graphEdge.getType() != GraphEdgeType.DOTTED));
result.addAll(ContainerUtil.intersection(hidden, myLinearGraph.myDottedEdges.getEdges()));
result.removeAll(myLinearGraph.myHiddenEdges.getEdges());
result.addAll(ContainerUtil.intersection(hidden, myLinearGraph.getDottedEdges().getEdges()));
result.removeAll(myLinearGraph.getHiddenEdges().getEdges());
return result;
}
public void applyChanges() {
myLinearGraph.myDottedEdges.removeAll();
myLinearGraph.myHiddenEdges.removeAll();
myLinearGraph.getDottedEdges().removeAll();
myLinearGraph.getHiddenEdges().removeAll();
for (GraphEdge e : myDottedEdges.getEdges()) {
myLinearGraph.myDottedEdges.createEdge(e);
for (GraphEdge e : getDottedEdges().getEdges()) {
myLinearGraph.getDottedEdges().createEdge(e);
}
for (GraphEdge e : myHiddenEdges.getEdges()) {
myLinearGraph.myHiddenEdges.createEdge(e);
for (GraphEdge e : getHiddenEdges().getEdges()) {
myLinearGraph.getHiddenEdges().createEdge(e);
}
}
}
@@ -1,4 +1,4 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.vcs.log.graph.linearBek;
import com.intellij.util.Function;
@@ -33,7 +33,7 @@ final class LinearBekGraphBuilder {
@NotNull
public IntSet collapseAll() {
IntSet collapsedMerges = new IntOpenHashSet();
for (int i = myLinearBekGraph.myGraph.nodesCount() - 1; i >= 0; i--) {
for (int i = myLinearBekGraph.getGraph().nodesCount() - 1; i >= 0; i--) {
MergeFragment fragment = getFragment(i);
if (fragment != null) {
fragment.collapse(myLinearBekGraph);
@@ -268,27 +268,27 @@ final class LinearBekGraphBuilder {
}
private static void addEdge(LinearBekGraph graph, int up, int down) {
graph.myDottedEdges.createEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
graph.getDottedEdges().createEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
}
private static void removeEdge(LinearBekGraph graph, int up, int down) {
if (graph.myDottedEdges.hasEdge(up, down)) {
graph.myDottedEdges.removeEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
graph.myHiddenEdges.createEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
if (graph.getDottedEdges().hasEdge(up, down)) {
graph.getDottedEdges().removeEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
graph.getHiddenEdges().createEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
}
else {
GraphEdge edge = LinearGraphUtils.getEdge(graph.myGraph, up, down);
GraphEdge edge = LinearGraphUtils.getEdge(graph.getGraph(), up, down);
assert edge != null : "No edge between " + up + " and " + down;
graph.myHiddenEdges.createEdge(edge);
graph.getHiddenEdges().createEdge(edge);
}
}
private static void replaceEdge(LinearBekGraph graph, int up, int down) {
if (!graph.myDottedEdges.hasEdge(up, down)) {
GraphEdge edge = LinearGraphUtils.getEdge(graph.myGraph, up, down);
if (!graph.getDottedEdges().hasEdge(up, down)) {
GraphEdge edge = LinearGraphUtils.getEdge(graph.getGraph(), up, down);
assert edge != null : "No edge between " + up + " and " + down;
graph.myHiddenEdges.createEdge(edge);
graph.myDottedEdges.createEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
graph.getHiddenEdges().createEdge(edge);
graph.getDottedEdges().createEdge(new GraphEdge(up, down, null, GraphEdgeType.DOTTED));
}
}