TransferableGraphSource tg;
VirtualGraph vg;
IImportAdvisor2 advisor;
+ TGStatusMonitor monitor;
ClusterBuilder2 builder;
final TGResourceUtil resourceUtil = new TGResourceUtil();
Resource PartOf;
Resource HasName;
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 {
extensions = tg.getExtensions();
resourceCount = tg.getResourceCount();
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<clustering.length;index++) {
pos += clustering[index];
if(id < pos) {
if(cs == Extensions.ROOT_LIBRARY_CLUSTER_SET) csHandle = builder.handle(rootLibrary);
else if(cs == Extensions.INDEX_ROOT_CLUSTER_SET) {
if(indexRoot == null) throw new DatabaseException("No index root was available in TG import.");
- csHandle = builder.handle(indexRoot);
+ csHandle = indexRootCsHandle;
}
else {
findClusterSet(graph, rootLibrary, clustering, clusterSets, clusters, cs);
}
}
}
-
- tg.getStatementCount();
+
+ int[] done = { 0 };
+ int[] percentage = { 0 };
+
+ int statementCount = tg.getStatementCount();
tg.forStatements(null, new TransferableGraphSourceProcedure<int[]>() {
@Override
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 {
s.skip(this);
}
builder.endValue();
-
+ worked();
+
}
@Override
for (int i = 0; i < length; ++i)
builder.appendValue(input.readUnsignedByte());
builder.endValue();
+ worked();
}
+ private void worked() {
+ // Count from 50% -> 100% => [valueCount, valueCount*2)
+ percentage[0] = updatePercentage(percentage[0], valueCount + done[0]++, valueCount*2);
+ }
};
tg.forValues2(null, new ValueProcedure());