16
16
17
17
package org.modelix.model.sync.bulk
18
18
19
+ import mu.KotlinLogging
19
20
import org.modelix.model.api.ConceptReference
20
21
import org.modelix.model.api.INode
21
22
import org.modelix.model.api.INodeReference
@@ -41,6 +42,9 @@ class ModelImporter(private val root: INode) {
41
42
private val originalIdToExisting: MutableMap <String , INode > = mutableMapOf ()
42
43
private val postponedReferences = ArrayList < () -> Unit > ()
43
44
private val nodesToRemove = HashSet <INode >()
45
+ private var numExpectedNodes = 0
46
+ private var currentNodeProgress = 0
47
+ private val logger = KotlinLogging .logger {}
44
48
45
49
/* *
46
50
* Incrementally updates this importers root based on the provided [ModelData] specification.
@@ -49,17 +53,34 @@ class ModelImporter(private val root: INode) {
49
53
*/
50
54
@JvmName(" importData" )
51
55
fun import (data : ModelData ) {
56
+ logger.info { " Building indices for import..." }
52
57
originalIdToExisting.clear()
53
58
postponedReferences.clear()
54
59
nodesToRemove.clear()
60
+ numExpectedNodes = countExpectedNodes(data.root)
61
+ currentNodeProgress = 0
55
62
buildExistingIndex(root)
63
+
64
+ logger.info { " Importing nodes..." }
56
65
data.root.originalId()?.let { originalIdToExisting[it] = root }
57
66
syncNode(root, data.root)
67
+
68
+ logger.info { " Synchronizing references..." }
58
69
postponedReferences.forEach { it.invoke() }
70
+
71
+ logger.info { " Removing extra nodes..." }
59
72
nodesToRemove.forEach { it.remove() }
73
+
74
+ logger.info { " Synchronization finished." }
60
75
}
61
76
77
+ private fun countExpectedNodes (data : NodeData ): Int =
78
+ 1 + data.children.sumOf { countExpectedNodes(it) }
79
+
62
80
private fun syncNode (node : INode , data : NodeData ) {
81
+ currentNodeProgress + = 1
82
+ // print instead of log, so that the progress line can be overwritten by the carriage return
83
+ print (" \r ($currentNodeProgress / $numExpectedNodes ) Synchronizing nodes... " )
63
84
syncProperties(node, data)
64
85
syncChildren(node, data)
65
86
syncReferences(node, data)
0 commit comments