Skip to content

Commit 5d53478

Browse files
author
ondrej.basler
committed
Split collection of nodes and their levels, optimize graph search
1 parent c795662 commit 5d53478

File tree

1 file changed

+36
-24
lines changed

1 file changed

+36
-24
lines changed

src/main/kotlin/com/github/ivancarras/graphfity/plugin/task/GraphfityTask.kt

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,20 @@ abstract class GraphfityTask : DefaultTask() {
3434
val nodesLevel = HashMap<String, Int>()
3535
val dotFile = createDotFile(dotPath)
3636

37-
obtainDependenciesData(rootProject, nodes, dependencies, nodeTypes, nodesLevel)
37+
obtainNodesAndDependencies(rootProject, nodes, dependencies, nodeTypes)
38+
obtainNodesLevels(projectRootName, dependencies, nodesLevel)
3839
addNodesToFile(dotFile, nodes)
3940
addDependenciesToFile(dotFile, dependencies)
4041
addNodeLevelsToFile(dotFile, nodesLevel)
4142
generateGraph(dotFile)
4243
}
4344

4445
private fun getRootProject(projectRootName: String): Project {
45-
return project.findProject(projectRootName)
46-
?: throw kotlin.IllegalArgumentException("The property provided as projectRootPath: $projectRootName does not correspond to any project")
46+
return requireNotNull(
47+
project.findProject(projectRootName)
48+
) {
49+
"The property provided as projectRootPath: $projectRootName does not correspond to any project"
50+
}
4751
}
4852

4953
private fun loadNodeTypes(nodeTypesPath: String): List<NodeType> {
@@ -86,23 +90,16 @@ abstract class GraphfityTask : DefaultTask() {
8690
}
8791
}
8892

89-
private fun obtainDependenciesData(
93+
private fun obtainNodesAndDependencies(
9094
project: Project,
9195
projects: HashSet<NodeData>,
9296
dependencies: HashSet<Pair<NodeData, NodeData>>,
9397
nodeTypes: List<NodeType>,
94-
nodesLevel: HashMap<String, Int>,
95-
level: Int = 0
9698
) {
9799
val projectNodeData = mapProjectToNode(project, nodeTypes)
98100

99101
if (projectNodeData != null && projectNodeData.nodeType.isEnabled) {
100102
projects.add(projectNodeData)
101-
102-
val nodeLevel = nodesLevel[project.path]
103-
if (nodeLevel == null || level > nodeLevel) {
104-
nodesLevel[projectNodeData.path] = level
105-
}
106103
}
107104

108105
project.configurations.forEach { config ->
@@ -115,26 +112,41 @@ abstract class GraphfityTask : DefaultTask() {
115112
if (dependencyProjectNodeData != null && projectNodeData != null &&
116113
dependencyProjectNodeData.nodeType.isEnabled
117114
) {
118-
projects.add(dependencyProjectNodeData)
115+
dependencies.add(Pair(projectNodeData, dependencyProjectNodeData))
119116

120-
val nodeLevel = nodesLevel[dependencyProjectNodeData.path]
121-
if (nodeLevel == null || level > nodeLevel) {
122-
nodesLevel[dependencyProjectNodeData.path] = level + 1
117+
if (dependencyProjectNodeData !in projects) {
118+
obtainNodesAndDependencies(
119+
project = dependencyProject,
120+
projects = projects,
121+
dependencies = dependencies,
122+
nodeTypes = nodeTypes,
123+
)
123124
}
124-
dependencies.add(Pair(projectNodeData, dependencyProjectNodeData))
125-
obtainDependenciesData(
126-
dependencyProject,
127-
projects,
128-
dependencies,
129-
nodeTypes,
130-
nodesLevel,
131-
level + 1
132-
)
133125
}
134126
}
135127
}
136128
}
137129

130+
private fun obtainNodesLevels(
131+
rootProjectName: String,
132+
dependencies: HashSet<Pair<NodeData, NodeData>>,
133+
nodeLevel: HashMap<String, Int>,
134+
) {
135+
var currentLevel = listOf(rootProjectName)
136+
var level = 0
137+
while (currentLevel.isNotEmpty()) {
138+
currentLevel
139+
.forEach { nodeLevel[it] = level }
140+
141+
val nextLevel = dependencies
142+
.filter { it.first.path in currentLevel }
143+
.map { it.second.path }
144+
145+
currentLevel = nextLevel
146+
level++
147+
}
148+
}
149+
138150
private fun createDotFile(dotPath: String): File = File(dotPath + DOT_FILE).apply {
139151
delete()
140152
parentFile.mkdirs()

0 commit comments

Comments
 (0)