import org.simantics.databoard.Bindings;
import org.simantics.databoard.util.ObjectUtils;
import org.simantics.datatypes.literal.GUID;
-import org.simantics.db.AsyncReadGraph;
import org.simantics.db.ChangeSet;
import org.simantics.db.ChangeSet.StatementChange;
import org.simantics.db.MetadataI;
import org.simantics.db.common.utils.NameUtils;
import org.simantics.db.event.ChangeListener;
import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.exception.NoSingleResultException;
import org.simantics.db.layer0.adapter.GenericRelation;
import org.simantics.db.layer0.adapter.GenericRelationIndex;
import org.simantics.db.layer0.genericrelation.DependencyChanges.Change;
import org.simantics.db.layer0.genericrelation.DependencyChanges.ComponentModification;
import org.simantics.db.layer0.genericrelation.DependencyChanges.ComponentRemoval;
import org.simantics.db.layer0.genericrelation.DependencyChanges.LinkChange;
-import org.simantics.db.procedure.AsyncContextMultiProcedure;
-import org.simantics.db.procedure.AsyncContextProcedure;
+import org.simantics.db.procedure.SyncContextMultiProcedure;
+import org.simantics.db.procedure.SyncContextProcedure;
import org.simantics.db.service.CollectionSupport;
import org.simantics.db.service.DirectQuerySupport;
import org.simantics.db.service.GraphChangeListenerSupport;
Pair.make(Dependencies.FIELD_RESOURCE, "Long"),
Pair.make(Dependencies.FIELD_NAME, "String"),
Pair.make(Dependencies.FIELD_TYPES, "Text"),
- Pair.make(Dependencies.FIELD_GUID, "Text")
+ Pair.make(Dependencies.FIELD_GUID, "Text"),
+ Pair.make(Dependencies.FIELD_NAME_SEARCH, "Text"),
+ Pair.make(Dependencies.FIELD_TYPES_SEARCH, "Text")
};
final Resource resource;
class Process {
final ArrayList<Entry> result = new ArrayList<Entry>();
- final AsyncContextMultiProcedure<Resource, Resource> structure;
- final AsyncContextProcedure<Entry, String> names;
- final AsyncContextProcedure<Entry, Resource> type;
+ final SyncContextMultiProcedure<Resource, Resource> structure;
+ final SyncContextProcedure<Entry, String> names;
+ final SyncContextProcedure<Entry, Resource> type;
Process(ReadGraph graph, final Resource resource) throws DatabaseException {
final DirectQuerySupport dqs = graph.getService(DirectQuerySupport.class);
final CollectionSupport cs = graph.getService(CollectionSupport.class);
- names = dqs.compilePossibleRelatedValue(graph, L0.HasName, new AsyncContextProcedure<Entry, String>() {
+ names = dqs.compilePossibleRelatedValue(graph, L0.HasName, new SyncContextProcedure<Entry, String>() {
@Override
- public void execute(AsyncReadGraph graph, Entry entry, String name) {
+ public void execute(ReadGraph graph, Entry entry, String name) {
entry.name = name;
}
@Override
- public void exception(AsyncReadGraph graph, Throwable throwable) {
+ public void exception(ReadGraph graph, Throwable throwable) {
LOGGER.error("Could not compile possible related value for resource {}", resource, throwable);
}
});
- type = new AsyncContextProcedure<Entry, Resource>() {
+ type = new SyncContextProcedure<Entry, Resource>() {
@Override
- public void execute(AsyncReadGraph graph, Entry entry, Resource type) {
+ public void execute(ReadGraph graph, Entry entry, Resource type) {
entry.principalType = type;
}
@Override
- public void exception(AsyncReadGraph graph, Throwable throwable) {
+ public void exception(ReadGraph graph, Throwable throwable) {
LOGGER.error("Could not find type for resource {}", resource, throwable);
}
};
- structure = dqs.compileForEachObject(graph, L0.ConsistsOf, new AsyncContextMultiProcedure<Resource, Resource>() {
+ structure = dqs.compileForEachObject(graph, L0.ConsistsOf, new SyncContextMultiProcedure<Resource, Resource>() {
@Override
- public void execute(AsyncReadGraph graph, Resource parent, Resource child) {
+ public void execute(ReadGraph graph, Resource parent, Resource child) {
// WORKAROUND: don't browse virtual child resources
if(!child.isPersistent()) return;
Entry entry = new Entry(parent, child, "", "", "");
}
@Override
- public void finished(AsyncReadGraph graph, Resource parent) {
+ public void finished(ReadGraph graph, Resource parent) {
}
@Override
- public void exception(AsyncReadGraph graph, Throwable throwable) {
- LOGGER.error("Could not compile for resource {}", resource, throwable);
+ public void exception(ReadGraph graph, Throwable throwable) {
+ if (throwable instanceof NoSingleResultException) {
+ // Ignore
+ if (LOGGER.isDebugEnabled())
+ LOGGER.debug("Could not compile for resource {}", resource, throwable);
+ } else {
+ LOGGER.error("Could not compile for resource {}", resource, throwable);
+ }
}
});
+ result.add(new Entry(graph, resource));
+
graph.syncRequest(new ReadRequest() {
@Override
long time2 = System.nanoTime();
if (PROFILE)
- System.out.println("Found " + entries.size() + " dependencies in " + 1e-6 * (time2 - time) + "ms for " + graph.getPossibleURI(subject) + ".");
+ LOGGER.info("Found " + entries.size() + " dependencies in " + 1e-6 * (time2 - time) + "ms for " + graph.getPossibleURI(subject) + ".");
ArrayList<Object[]> result = new ArrayList<Object[]>();
for (Entry entry : entries) {
- result.add(new Object[] { ss.getRandomAccessId(entry.parent), ss.getRandomAccessId(entry.resource), entry.name, entry.types, entry.id });
+ if(entry.name == null) continue;
+ result.add(new Object[] { ss.getRandomAccessId(entry.parent), ss.getRandomAccessId(entry.resource), entry.name, entry.types, entry.id, entry.name, entry.types });
}
return result;
@Override
public List<Map<String, Object>> query(RequestProcessor session, String search, String bindingPattern, Object[] constants, int maxResultCount) {
- if(!Dependencies.getBindingPattern().equals(bindingPattern)) throw new IllegalArgumentException("DependenciesRelation supports indexing only with 'bfffff'");
+ if(!Dependencies.getBindingPattern().equals(bindingPattern)) throw new IllegalArgumentException("DependenciesRelation supports indexing only with 'bfffffff'");
IndexedRelations indexer = session.getService(IndexedRelations.class);
return indexer.query(null, search, session, resource, (Resource)constants[0], maxResultCount);
}
@Override
public List<Resource> queryResources(RequestProcessor session, String search, String bindingPattern, Object[] constants, int maxResultCount) {
- if(!Dependencies.getBindingPattern().equals(bindingPattern)) throw new IllegalArgumentException("DependenciesRelation supports indexing only with 'bfffff'");
+ if(!Dependencies.getBindingPattern().equals(bindingPattern)) throw new IllegalArgumentException("DependenciesRelation supports indexing only with 'bfffffff'");
IndexedRelations indexer = session.getService(IndexedRelations.class);
return indexer.queryResources(null, search, session, resource, (Resource)constants[0], maxResultCount);
}
@Override
public List<Map<String, Object>> list(RequestProcessor session, String bindingPattern, Object[] constants, int maxResultCount) {
- if(!Dependencies.getBindingPattern().equals(bindingPattern)) throw new IllegalArgumentException("DependenciesRelation supports indexing only with 'bfffff'");
+ if(!Dependencies.getBindingPattern().equals(bindingPattern)) throw new IllegalArgumentException("DependenciesRelation supports indexing only with 'bfffffff'");
IndexedRelations indexer = session.getService(IndexedRelations.class);
return indexer.query(null, null, session, resource, (Resource)constants[0], maxResultCount);
}
if (modifiedComponent == null
|| modifiedComponent.getPredicate().equals(changeInformation))
continue;
- //System.err.println("+comp modi " + NameUtils.getSafeName(graph, renamedComponent, true));
+ if (DEBUG) {
+ LOGGER.info("+comp modi " + NameUtils.getSafeName(graph, modifiedComponent.getObject(), true));
+ LOGGER.info(" +value " + NameUtils.getSafeName(graph, value, true));
+ }
w.addComponentModification(modifiedComponent.getObject());
}
for (Resource value : parameter.changedResources()) {
w.addComponentModification(value);
}
for (StatementChange change : parameter.changedStatements()) {
- //System.err.println("-stm " + NameUtils.getSafeName(graph, change.getSubject(), true) + " " + NameUtils.getSafeName(graph, change.getPredicate(), true) + " " + NameUtils.getSafeName(graph, change.getObject(), true));
+ if (DEBUG)
+ LOGGER.info("-stm " + NameUtils.getSafeName(graph, change.getSubject(), true) + " " + NameUtils.getSafeName(graph, change.getPredicate(), true) + " " + NameUtils.getSafeName(graph, change.getObject(), true));
Resource subject = change.getSubject();
Resource predicate = change.getPredicate();
Resource object = change.getObject();
} else if (predicate.equals(l0.IsLinkedTo)) {
w.addLinkChange(subject);
} else /*if (graph.isSubrelationOf(predicate, l0.DependsOn))*/ {
- //System.err.println("-modi " + NameUtils.getSafeName(graph, subject, true));
+ if (DEBUG)
+ LOGGER.info("-modi " + NameUtils.getSafeName(graph, subject, true));
w.addComponentModification(subject);
}
}
TimeLogger.log(DependenciesRelation.class, "trackAndIndex.onEvent: starting index update processing");
if(DEBUG)
- System.err.println("Adding metadata " + event + " in revision " + graph.getService(ManagementSupport.class).getHeadRevisionId());
+ LOGGER.info("Adding metadata " + event + " in revision " + graph.getService(ManagementSupport.class).getHeadRevisionId());
WriteGraph w = (WriteGraph)graph;
if(!event.isEmpty())
Collection<Object[]> _replacementObjects = Collections.emptyList();
Collection<Pair<String, String>> _typeChanges = Collections.emptyList();
- if(DEBUG) System.out.println("MODEL: " + NameUtils.getSafeLabel(graph, model));
+ if(DEBUG) LOGGER.info("MODEL: " + NameUtils.getSafeLabel(graph, model));
// final Change[] changes = event.get(model);
- if(DEBUG) System.out.println(" CHANGES: " + Arrays.toString(changes));
+ if(DEBUG) LOGGER.info(" CHANGES: " + Arrays.toString(changes));
if (changes != null) {
_additions = new ArrayList<Object[]>();
_removals = new ArrayList<Object>();
if(!entry.isValid(graph)) continue;
Resource parent = graph.getPossibleObject(entry.component, L0.PartOf);
if (parent != null) {
- _additions.add(new Object[] { ss.getRandomAccessId(parent), ss.getRandomAccessId(entry.component), name, types, id != null ? id.indexString() : "" });
+ _additions.add(new Object[] { ss.getRandomAccessId(parent), ss.getRandomAccessId(entry.component), name, types, id != null ? id.indexString() : "", name, types});
} else {
- //System.err.println("resource " + entry.component + ": no parent for entry " + name + " " + types);
+ //LOGGER.info("resource " + entry.component + ": no parent for entry " + name + " " + types);
}
} else {
- //System.err.println("resource " + entry.component + ": " + name + " " + types);
+ //LOGGER.info("resource " + entry.component + ": " + name + " " + types);
}
} else if(_entry instanceof ComponentModification) {
ComponentModification entry = (ComponentModification)_entry;
if(part != null) {
_replacementKeys.add(ss.getRandomAccessId(entry.component));
_replacementObjects.add(new Object[] { ss.getRandomAccessId(part),
- ss.getRandomAccessId(entry.component), name, types, id != null ? id.indexString() : "" });
+ ss.getRandomAccessId(entry.component), name, types, id != null ? id.indexString() : "", name, types});
}
}
}
}
final boolean reset = linkChange || event.hasUnresolved;
- //System.err.println("dependencies(" + NameUtils.getSafeLabel(graph, model) + "): reset=" + reset + " linkChange=" + linkChange + " unresolved=" + event.hasUnresolved );
+ //LOGGER.info("dependencies(" + NameUtils.getSafeLabel(graph, model) + "): reset=" + reset + " linkChange=" + linkChange + " unresolved=" + event.hasUnresolved );
if (reset || !_additions.isEmpty() || !_removals.isEmpty() || !_replacementKeys.isEmpty() || !_typeChanges.isEmpty()) {
if (doReset) {
if(DEBUG) {
- System.err.println("resetIndex " + reset + " " + typeNameChanges);
+ LOGGER.info("resetIndex " + reset + " " + typeNameChanges);
}
indexer.removeAll(null, graph, DependenciesRelation.this, resource, model);
if (!replacementKeys.isEmpty() && (replacementKeys.size() == replacementObjects.size())) {
if(DEBUG) {
- System.out.println(replacementKeys.size() + " index replacements: " + replacementKeys);
+ LOGGER.info(replacementKeys.size() + " index replacements: " + replacementKeys);
}
didChange |= indexer.replace(null, graph, DependenciesRelation.this, resource, model, Dependencies.FIELD_RESOURCE, replacementKeys, replacementObjects);
}
if (!removals.isEmpty()) {
if(DEBUG) {
- System.out.println(removals.size() + " index removals: " + removals);
+ LOGGER.info(removals.size() + " index removals: " + removals);
}
indexer.remove(null, graph, DependenciesRelation.this, resource, model, Dependencies.FIELD_RESOURCE, removals);
didChange = true;
}
if (!additions.isEmpty()) {
if(DEBUG) {
- for(Object[] os : additions) System.err.println("Adding to index " + model + ": " + Arrays.toString(os));
+ for(Object[] os : additions) LOGGER.info("Adding to index " + model + ": " + Arrays.toString(os));
}
- //System.out.println(additions.size() + " index insertions");
+ //LOGGER.info(additions.size() + " index insertions");
indexer.insert(null, graph, DependenciesRelation.this, resource, model, additions);
didChange = true;
}
for (Pair<String, String> nr : typeChanges) {
String query = Dependencies.FIELD_RESOURCE + ":[" + nr.second + " TO " + nr.second + "]";
- //System.out.println("query: " + query);
+ //LOGGER.info("query: " + query);
List<Map<String, Object>> results = indexer.query(null, query, graph, resource, model, Integer.MAX_VALUE);
if (results.size() != 1) {
return true;
return true;
}
}
-// System.err.println("Type " + nr.first + " was unchanged.");
+// LOGGER.info("Type " + nr.first + " was unchanged.");
}
return false;
}
@Override
public void reset(RequestProcessor processor, Resource input) {
if (DEBUG) {
- System.out.println("DependenciesRelation.reset: " + input);
+ LOGGER.info("DependenciesRelation.reset: " + input);
new Exception("DependenciesRelation.reset(" + listener + ")").printStackTrace(System.out);
}
DependenciesListenerStore store = processor.getSession().getService(DependenciesListenerStore.class);
ArrayList<Object[]> result = new ArrayList<Object[]>(entries.size());
for (Entry entry : entries) {
- result.add(new Object[] { ss.getRandomAccessId(entry.parent), ss.getRandomAccessId(entry.resource), entry.name, entry.types, entry.id });
+ result.add(new Object[] { ss.getRandomAccessId(entry.parent), ss.getRandomAccessId(entry.resource), entry.name, entry.types, entry.id, entry.name, entry.types });
}
Layer0X L0X = Layer0X.getInstance(graph);