X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.graph.db%2Fsrc%2Forg%2Fsimantics%2Fgraph%2Fdb%2FStreamingTransferableGraphImportProcess.java;h=78c369f96679f9ba467b76df8bdc9f074d28e503;hp=3599eefc0ecc81c9cb6d012bf31415f48bcfc34f;hb=4b7c3f8eacf1e6e018d38f5b984c0ccd53919b58;hpb=c26409b1caf2f1e560d37c5befd11b442399c3fe diff --git a/bundles/org.simantics.graph.db/src/org/simantics/graph/db/StreamingTransferableGraphImportProcess.java b/bundles/org.simantics.graph.db/src/org/simantics/graph/db/StreamingTransferableGraphImportProcess.java index 3599eefc0..78c369f96 100644 --- a/bundles/org.simantics.graph.db/src/org/simantics/graph/db/StreamingTransferableGraphImportProcess.java +++ b/bundles/org.simantics.graph.db/src/org/simantics/graph/db/StreamingTransferableGraphImportProcess.java @@ -72,6 +72,7 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap TransferableGraphSource tg; VirtualGraph vg; IImportAdvisor2 advisor; + TGStatusMonitor monitor; ClusterBuilder2 builder; final TGResourceUtil resourceUtil = new TGResourceUtil(); @@ -99,9 +100,25 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap Resource NameOf; public StreamingTransferableGraphImportProcess(Session session, VirtualGraph vg, TransferableGraphSource tg, IImportAdvisor2 advisor) { + this(session, vg, tg, advisor, null); + } + + public StreamingTransferableGraphImportProcess(Session session, VirtualGraph vg, TransferableGraphSource tg, IImportAdvisor2 advisor, TGStatusMonitor monitor) { this.tg = tg; this.vg = vg; this.advisor = advisor; + this.monitor = monitor; + } + + private int updatePercentage(int percentage, int done, int total) { + if (monitor != null && (done & 63) == 0) { + int current = 100*done / total; + if (current > percentage) { + percentage = current; + monitor.status(percentage); + } + } + return percentage; } public void readIdentities(ReadGraph g) throws Exception { @@ -204,7 +221,7 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap } } else if(definition instanceof Internal) { - String uri = TransferableGraphUtils.getURI(resourceCount, identityMap, identity.resource); + String uri = TransferableGraphUtils.getTrueURI(resourceCount, identityMap, identity.resource); Resource existing = graph.getPossibleResource(uri); if(existing != null) { existingInternalMap.put(identity.resource, existing); @@ -271,6 +288,14 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap void findClusterSet(WriteOnlyGraph graph, Resource rootLibrary, int[] clustering, int[] clusterSets, long[] clusters, int id) throws DatabaseException { ClusteringSupport support = graph.getService(ClusteringSupport.class); if(id == Extensions.ROOT_LIBRARY_CLUSTER_SET || id == Extensions.INDEX_ROOT_CLUSTER_SET) return; + Resource indexRootClusterSetResource = rootLibrary; + if(indexRoot != null && support.isClusterSet(indexRoot)) { + indexRootClusterSetResource = indexRoot; + } else { + graph.setClusterSet4NewResource(rootLibrary); + graph.flushCluster(); + } + int indexRootCsHandle = builder.handle(indexRootClusterSetResource); for(int pos=0,index=0;index() { @Override @@ -480,13 +510,17 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap int inverse = handles[inv]; builder.addStatement(graph, object, inverse, subject); } - + + // Count from 0% -> 50% => total = statementCount*2 + percentage[0] = updatePercentage(percentage[0], done[0]++, statementCount*2); + } }); - tg.getValueCount(); - + int valueCount = tg.getValueCount(); + done[0] = 0; + class ValueProcedure extends InputStream implements TransferableGraphSourceValueProcedure { private TGResourceUtil util = new TGResourceUtil(); @@ -526,7 +560,8 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap s.skip(this); } builder.endValue(); - + work(); + } @Override @@ -546,8 +581,13 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap for (int i = 0; i < length; ++i) builder.appendValue(input.readUnsignedByte()); builder.endValue(); + work(); } + private void work() { + // Count from 50% -> 100% => [valueCount, valueCount*2) + percentage[0] = updatePercentage(percentage[0], valueCount + done[0]++, valueCount*2); + } }; tg.forValues2(null, new ValueProcedure());