Skip to main content

[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


Back to the top