[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[sirius-dev] PATCH: Ocl interpreter works very slowly.
|
Hello,
OCL interpreter works very slowly on my project. I have about 200
different nodes with many identical ocl expressions. As a result I
forced to wait about 666 sec.
After inserting cache implementation for ocl expressions I have result -
about 1sec.
Is it possible to apply my patch?
Patch in attachement.
---
Best regards,
Alexander Strakh
>From 282d6024a76b98a62b87e15f2c4b2ede3ba2f70a Mon Sep 17 00:00:00 2001
From: Alexander Strakh <strakh@xxxxxxxxx>
Date: Thu, 2 Oct 2014 15:48:16 +0400
Subject: [PATCH] Query caching impl
---
.../common/ocl/business/internal/interpreter/OclInterpreter.java | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/plugins/org.eclipse.sirius.common.ocl/src/org/eclipse/sirius/common/ocl/business/internal/interpreter/OclInterpreter.java b/plugins/org.eclipse.sirius.common.ocl/src/org/eclipse/sirius/common/ocl/business/internal/interpreter/OclInterpreter.java
index 243b5cc..d431365 100644
--- a/plugins/org.eclipse.sirius.common.ocl/src/org/eclipse/sirius/common/ocl/business/internal/interpreter/OclInterpreter.java
+++ b/plugins/org.eclipse.sirius.common.ocl/src/org/eclipse/sirius/common/ocl/business/internal/interpreter/OclInterpreter.java
@@ -17,6 +17,7 @@ import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.HashMap;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
@@ -72,6 +73,8 @@ public class OclInterpreter implements IInterpreter, IInterpreterProvider, IProp
/** The variables listener. */
private final List<IVariableStatusListener> variablesListeners = new LinkedList<IVariableStatusListener>();
+ private Map<String, OCLExpression<EClassifier>> oclExpressionsCache = new HashMap<String, OCLExpression<EClassifier>>();
+
/**
* {@inheritDoc}
*/
@@ -291,7 +294,11 @@ public class OclInterpreter implements IInterpreter, IInterpreterProvider, IProp
getOCLHelper().getOCL().getEnvironment().addElement(oclVar.getName(), (Variable) oclVar, false);
}
- final OCLExpression<EClassifier> query = getOCLHelper().createQuery(exp);
+ OCLExpression<EClassifier> query = oclExpressionsCache.get(exp);
+ if(query == null) {
+ query = getOCLHelper().createQuery(exp);
+ oclExpressionsCache.put(exp, query);
+ }
final Query<EClassifier, EClass, EObject> eval = getOCL().createQuery(query);
for (final Map.Entry<String, Object> variable : getVariables().entrySet()) {
--
1.8.4.5