TransferableGraphSource tg;
VirtualGraph vg;
IImportAdvisor2 advisor;
+ TGStatusMonitor monitor;
ClusterBuilder2 builder;
final TGResourceUtil resourceUtil = new TGResourceUtil();
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 {
void addMissing(int handleIndex, String external) {
allMissingExternals.put(external, handleIndex);
Set<String> removals = new HashSet<>();
- for(String ext : missingExternals) if(ext.startsWith(external)) return;
- for(String ext : missingExternals) if(external.startsWith(ext)) removals.add(ext);
+ for(String ext : missingExternals) if(ext.startsWith(external + "/")) return;
+ for(String ext : missingExternals) if(external.startsWith(ext + "/")) removals.add(ext);
missingExternals.removeAll(removals);
missingExternals.add(external);
}
TransientCacheAsyncListener.instance());
Resource child = childMap.get(def.name);
if(child == null) {
- addMissing(identity.resource, graph.getURI(parent) + "/" + def.name);
+ addMissing(identity.resource, graph.getURI(parent) + "/" + URIStringUtils.escape(def.name));
} else {
handles[identity.resource] = builder.handle(child);
}
} else {
- addMissing(identity.resource, TransferableGraphUtils.getURI(resourceCount, identityMap, def.parent) + "/" + def.name);
+ addMissing(identity.resource, TransferableGraphUtils.getURI(resourceCount, identityMap, def.parent) + "/" + URIStringUtils.escape(def.name));
}
}
}
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);
Collections.sort(missing);
for(String uri : missing) {
String[] parts = URIStringUtils.splitURI(uri);
+ // URIStringUtils.splitURI returns root URI in non-standard format, so fix it manually as a workaround
+ if (parts[0].equals("http://")) {
+ parts[0] = "http:/";
+ }
Resource parent = resolvedParents.get(parts[0]);
// TODO: proper exception message
- if(parent == null) throw new IllegalStateException("!!");
+ if(parent == null) {
+ throw new IllegalStateException("!!");
+ }
Resource childResource = graph.newResource();
graph.claim(childResource, InstanceOf, null, ExternalEntity);
Resource nameResource = graph.newResource();
graph.claim(nameResource, InstanceOf, null, String);
- graph.claimValue(nameResource, parts[1], WriteBindings.STRING);
+ graph.claimValue(nameResource, URIStringUtils.unescape(parts[1]), WriteBindings.STRING);
graph.claim(childResource, HasName, NameOf, nameResource);
graph.claim(parent, ConsistsOf, PartOf, childResource);
}
}
}
-
- 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 {
private TGResourceUtil util = new TGResourceUtil();
s.skip(this);
}
builder.endValue();
-
+ work();
+
}
@Override
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());