mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[vcs-log-graph] extract LinearGraphWrapper class to represent a graph with added or removed edges
GitOrigin-RevId: 1d7c15ed869c1ff03a8617fbc2f80231fff61377
This commit is contained in:
committed by
intellij-monorepo-bot
parent
03d0986877
commit
7cecc1ed74
+24
@@ -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)
|
||||
}
|
||||
+3
-3
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+25
-62
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-12
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user