From 7cecc1ed7443c88aa2b2dba18a2e0b05960cb829 Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Mon, 25 Mar 2024 04:11:54 +0100 Subject: [PATCH] [vcs-log-graph] extract LinearGraphWrapper class to represent a graph with added or removed edges GitOrigin-RevId: 1d7c15ed869c1ff03a8617fbc2f80231fff61377 --- .../graph/impl/facade/LinearGraphWrapper.kt | 24 +++++ .../graph/linearBek/LinearBekController.kt | 6 +- .../log/graph/linearBek/LinearBekGraph.java | 87 ++++++------------- .../linearBek/LinearBekGraphBuilder.java | 24 ++--- 4 files changed, 64 insertions(+), 77 deletions(-) create mode 100644 platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/LinearGraphWrapper.kt diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/LinearGraphWrapper.kt b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/LinearGraphWrapper.kt new file mode 100644 index 000000000000..646a6d8f7263 --- /dev/null +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/LinearGraphWrapper.kt @@ -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 { + 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) +} \ No newline at end of file diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekController.kt b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekController.kt index 59414c11b54a..7eafa263e832 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekController.kt +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekController.kt @@ -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() } } } diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraph.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraph.java index b85bfd77d098..d7800f6f74cc 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraph.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraph.java @@ -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 getAdjacentEdges(int nodeIndex, @NotNull EdgeFilter filter) { - List 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 expandEdge(@NotNull final GraphEdge edge) { Set 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 downDottedEdges = myHiddenEdges.getAdjacentEdges(tail, EdgeFilter.NORMAL_DOWN); - List upDottedEdges = myHiddenEdges.getAdjacentEdges(firstChild, EdgeFilter.NORMAL_UP); + List downDottedEdges = getHiddenEdges().getAdjacentEdges(tail, EdgeFilter.NORMAL_DOWN); + List 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 getAddedEdges() { - Set result = myDottedEdges.getEdges(); - result.removeAll(ContainerUtil.filter(myHiddenEdges.getEdges(), graphEdge -> graphEdge.getType() == GraphEdgeType.DOTTED)); - result.removeAll(myLinearGraph.myDottedEdges.getEdges()); + Set result = getDottedEdges().getEdges(); + result.removeAll(ContainerUtil.filter(getHiddenEdges().getEdges(), graphEdge -> graphEdge.getType() == GraphEdgeType.DOTTED)); + result.removeAll(myLinearGraph.getDottedEdges().getEdges()); return result; } public Collection getRemovedEdges() { Set result = new HashSet<>(); - Set hidden = myHiddenEdges.getEdges(); + Set 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); } } } diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraphBuilder.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraphBuilder.java index d0dfce144834..0545ccfad71c 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraphBuilder.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/linearBek/LinearBekGraphBuilder.java @@ -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)); } }