X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.issues.common%2Fsrc%2Forg%2Fsimantics%2Fissues%2Fcommon%2FConstraintIssueSource.java;fp=bundles%2Forg.simantics.issues.common%2Fsrc%2Forg%2Fsimantics%2Fissues%2Fcommon%2FConstraintIssueSource.java;h=3df2d96d829e713ea29cd9559cafe1c6cd10c4ea;hb=0ffcb1180dcccf28e66a391338885be224ba1c47;hp=0000000000000000000000000000000000000000;hpb=342a2b006b88330280060c16c2ab50374468a4c6;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/ConstraintIssueSource.java b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/ConstraintIssueSource.java new file mode 100644 index 000000000..3df2d96d8 --- /dev/null +++ b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/ConstraintIssueSource.java @@ -0,0 +1,116 @@ +package org.simantics.issues.common; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.simantics.db.Issue; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.QueryMemoryWatcher; +import org.simantics.db.common.utils.Logger; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.util.ModelTransferableGraphSourceRequest.DomainOnlyProcessor; +import org.simantics.db.service.CollectionSupport; +import org.simantics.db.service.QueryControl; +import org.simantics.issues.ontology.IssueResource; +import org.simantics.layer0.Layer0; +import org.simantics.scl.db.SCLFunctions; +import org.simantics.scl.runtime.function.Function1; + +import gnu.trove.set.hash.THashSet; + +/** + * @author Antti Villberg + */ +public class ConstraintIssueSource implements BatchIssueSource { + + private final Resource resource; + + public ConstraintIssueSource(Resource resource) { + this.resource = resource; + } + + @Override + public Map> run(IProgressMonitor monitor, ReadGraph graph, BatchIssueValidationContext context) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + Set emptySet = Collections.emptySet(); + CollectionSupport cs = graph.getService(CollectionSupport.class); + Map> result = cs.createMap(Set.class); + monitor.setTaskName("Constraint analysis"); + + DomainOnlyProcessor domain = context.domain; + + int entityCount = domain.internals.size(); + + IssueResource ISSUE = IssueResource.getInstance(graph); + Resource type = graph.getSingleType(resource, ISSUE.IssueSource); + List>> validators = new ArrayList<>(); + for(Resource constraint : graph.getObjects(type, ISSUE.IssueSource_HasConstraint)) { + Function1> validator = graph.getRelatedValue2(constraint, L0.Constraint_Validator, constraint); + //Resource function = graph.getSingleObject(constraint, L0.Constraint_Validator); + validators.add(validator); + } + + QueryControl qc = graph.getService(QueryControl.class); + qc.flush(graph); + + // Allow this process to make 50k queries + QueryMemoryWatcher memory = new QueryMemoryWatcher(graph, 50000, 0.5, 300); + + SCLFunctions.runWithGraph(graph, () -> { + + int totalExaminedCount = 0; + int examinedCount = 1000; + + for(Resource r : domain.internals) { + + Set set = emptySet; + if (examinedCount >= 1000) { + monitor.subTask(contextProgressMessage(totalExaminedCount, entityCount)); + examinedCount = 0; + if(monitor.isCanceled()) return; + memory.maintain(); + } + for(Function1> validator : validators) { + try { + @SuppressWarnings("unchecked") + List issues = validator.apply(r);//(List)Functions.exec(graph, validator, graph, r); + if (issues != null && !issues.isEmpty()) { + if (set == emptySet) + set = new THashSet(); + set.addAll(issues); + } + } catch (Throwable t) { + Logger.defaultLogError(t); + } + } + ++totalExaminedCount; + ++examinedCount; + if(!set.isEmpty()) + result.put(r, set); + + } + + }); + + return result; + + } + + private static String contextProgressMessage(int totalExaminedCount, int entityCount) { + StringBuilder sb = new StringBuilder(80) + .append("Validating resources").append(" ").append(100*totalExaminedCount / entityCount).append("% ready."); + return sb.toString(); + } + + @Override + public Resource getResource() { + return resource; + } + +}