Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZoltan Ujhelyi2021-06-29 13:24:39 +0000
committerZoltan Ujhelyi2021-06-30 18:59:06 +0000
commit98baeb63fa5e17b25cc6effa999432d9df13a64c (patch)
treecccea26c4d55b2dc0fe77bbefa320a8e4ab64cb2
parent721c3e4de57ccbd48aa71e35d07e1b8559af7206 (diff)
downloadorg.eclipse.viatra-98baeb63fa5e17b25cc6effa999432d9df13a64c.tar.gz
org.eclipse.viatra-98baeb63fa5e17b25cc6effa999432d9df13a64c.tar.xz
org.eclipse.viatra-98baeb63fa5e17b25cc6effa999432d9df13a64c.zip
[574447] Avoid indexing when base index is turned off in local search
The local search result provider asked for the built search operations to index all elements that are iterated over, however this is clearly erroneous when the backend was initialized with the no-base option. This change updates the indexing requirements with appropriate guard conditions, and adds a test case that verifies the indexing being turned off as necessary. Change-Id: I2e35ff767a0838a5e430dd8da96245530552f2f5 Signed-off-by: Zoltan Ujhelyi <zoltan.ujhelyi@incquerylabs.com>
-rw-r--r--query/plugins/org.eclipse.viatra.query.runtime.localsearch/src/org/eclipse/viatra/query/runtime/localsearch/matcher/integration/AbstractLocalSearchResultProvider.java9
-rw-r--r--query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/AllCpsTests.xtend1
-rw-r--r--query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/LocalSearchBaseIndexerSettingsTest.java77
-rw-r--r--query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/PatternBasedMatchSetModelProvider.java8
-rw-r--r--query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/api/ViatraQueryTest.xtend11
5 files changed, 103 insertions, 3 deletions
diff --git a/query/plugins/org.eclipse.viatra.query.runtime.localsearch/src/org/eclipse/viatra/query/runtime/localsearch/matcher/integration/AbstractLocalSearchResultProvider.java b/query/plugins/org.eclipse.viatra.query.runtime.localsearch/src/org/eclipse/viatra/query/runtime/localsearch/matcher/integration/AbstractLocalSearchResultProvider.java
index 541f5d9eb..4715e1faf 100644
--- a/query/plugins/org.eclipse.viatra.query.runtime.localsearch/src/org/eclipse/viatra/query/runtime/localsearch/matcher/integration/AbstractLocalSearchResultProvider.java
+++ b/query/plugins/org.eclipse.viatra.query.runtime.localsearch/src/org/eclipse/viatra/query/runtime/localsearch/matcher/integration/AbstractLocalSearchResultProvider.java
@@ -168,7 +168,10 @@ public abstract class AbstractLocalSearchResultProvider implements IQueryResultP
public void prepare() {
try {
runtimeContext.coalesceTraversals(() -> {
- indexInitializationBeforePlanning();
+ LocalSearchHints configuration = overrideDefaultHints(query);
+ if (configuration.isUseBase()) {
+ indexInitializationBeforePlanning();
+ }
prepareDirectDependencies();
runtimeContext.executeAfterTraversal(AbstractLocalSearchResultProvider.this::preparePlansForExpectedAdornments);
return null;
@@ -187,7 +190,9 @@ public abstract class AbstractLocalSearchResultProvider implements IQueryResultP
IPlanDescriptor plan = getOrCreatePlan(reference, backendContext, compiler, configuration, planProvider);
// Index keys
try {
- indexKeys(plan.getIteratedKeys());
+ if (configuration.isUseBase()) {
+ indexKeys(plan.getIteratedKeys());
+ }
} catch (InvocationTargetException e) {
throw new QueryProcessingException(e.getMessage(), null, e.getMessage(), query, e);
}
diff --git a/query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/AllCpsTests.xtend b/query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/AllCpsTests.xtend
index a0635178d..b51f52fd7 100644
--- a/query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/AllCpsTests.xtend
+++ b/query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/AllCpsTests.xtend
@@ -32,6 +32,7 @@ import org.junit.runners.Suite.SuiteClasses
ModelManipulationAvgAggregatorTest,
ModelManipulationTrickyJoinTest,
LocalSearchPlanCostOverflowTest,
+ LocalSearchBaseIndexerSettingsTest,
LiteralValuesTest,
DanglingTest,
NonRecursiveReachabilityTest,
diff --git a/query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/LocalSearchBaseIndexerSettingsTest.java b/query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/LocalSearchBaseIndexerSettingsTest.java
new file mode 100644
index 000000000..b04b56a67
--- /dev/null
+++ b/query/tests/org.eclipse.viatra.query.runtime.cps.tests/src/org/eclipse/viatra/query/runtime/cps/tests/LocalSearchBaseIndexerSettingsTest.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2014-2021 Zoltan Ujhelyi, IncQuery Labs Ltd.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-v20.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.viatra.query.runtime.cps.tests;
+
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.viatra.examples.cps.cyberPhysicalSystem.CyberPhysicalSystemPackage;
+import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine;
+import org.eclipse.viatra.query.runtime.base.api.IndexingLevel;
+import org.eclipse.viatra.query.runtime.base.api.NavigationHelper;
+import org.eclipse.viatra.query.runtime.cps.tests.queries.util.ApplicationInstancesOfApplicationTypeQuerySpecification;
+import org.eclipse.viatra.query.runtime.cps.tests.queries.util.ApplicationTypeWithHostedInstancesQuerySpecification;
+import org.eclipse.viatra.query.runtime.emf.EMFScope;
+import org.eclipse.viatra.query.runtime.localsearch.matcher.integration.LocalSearchHints;
+import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
+import org.eclipse.viatra.query.testing.core.ModelLoadHelper;
+import org.eclipse.viatra.query.testing.core.PatternBasedMatchSetModelProvider;
+import org.eclipse.viatra.query.testing.core.api.ViatraQueryTest;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LocalSearchBaseIndexerSettingsTest {
+ private final String snapshot = "org.eclipse.viatra.query.runtime.cps.tests/models/snapshots/test.snapshot";
+ private final ModelLoadHelper modelLoader = new ModelLoadHelper();
+
+ @Test
+ public void baseIndexerDisabledTestSimpleQuery() {
+ final QueryEvaluationHint hints = LocalSearchHints.getDefaultNoBase().build();
+ ResourceSet rs = new ResourceSetImpl();
+ final AdvancedViatraQueryEngine engine = AdvancedViatraQueryEngine.createUnmanagedEngine(new EMFScope(rs));
+
+ ViatraQueryTest.test(ApplicationInstancesOfApplicationTypeQuerySpecification.instance())
+ .on(new EMFScope(rs))
+ .withSnapshotMatches(modelLoader.loadExpectedResultsFromUri(rs, snapshot))
+ .with(new PatternBasedMatchSetModelProvider(engine, hints))
+ .assertEquals();
+
+ // Check that nothing is indexed here
+ final NavigationHelper index = EMFScope.extractUnderlyingEMFIndex(engine);
+ Assert.assertEquals(IndexingLevel.NONE,
+ index.getIndexingLevel(CyberPhysicalSystemPackage.Literals.APPLICATION_TYPE));
+ Assert.assertEquals(IndexingLevel.NONE,
+ index.getIndexingLevel(CyberPhysicalSystemPackage.Literals.APPLICATION_INSTANCE));
+ Assert.assertEquals(IndexingLevel.NONE,
+ index.getIndexingLevel(CyberPhysicalSystemPackage.Literals.APPLICATION_TYPE__INSTANCES));
+ engine.dispose();
+ }
+
+ @Test
+ public void baseIndexerDisabledTestComplexQuery() {
+ final QueryEvaluationHint hints = LocalSearchHints.getDefaultNoBase().build();
+ ResourceSet rs = new ResourceSetImpl();
+ final AdvancedViatraQueryEngine engine = AdvancedViatraQueryEngine.createUnmanagedEngine(new EMFScope(rs));
+
+ ViatraQueryTest.test(ApplicationTypeWithHostedInstancesQuerySpecification.instance())
+ .on(new EMFScope(rs))
+ .withSnapshotMatches(modelLoader.loadExpectedResultsFromUri(rs, snapshot))
+ .with(new PatternBasedMatchSetModelProvider(engine, hints))
+ .assertEquals();
+
+ // Check that nothing is indexed here
+ final NavigationHelper index = EMFScope.extractUnderlyingEMFIndex(engine);
+ Assert.assertEquals(IndexingLevel.NONE,
+ index.getIndexingLevel(CyberPhysicalSystemPackage.Literals.APPLICATION_TYPE));
+ Assert.assertEquals(IndexingLevel.NONE,
+ index.getIndexingLevel(CyberPhysicalSystemPackage.Literals.APPLICATION_INSTANCE));
+ Assert.assertEquals(IndexingLevel.NONE,
+ index.getIndexingLevel(CyberPhysicalSystemPackage.Literals.APPLICATION_TYPE__INSTANCES));
+ engine.dispose();
+ }
+}
diff --git a/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/PatternBasedMatchSetModelProvider.java b/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/PatternBasedMatchSetModelProvider.java
index 28135e1f0..456804de4 100644
--- a/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/PatternBasedMatchSetModelProvider.java
+++ b/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/PatternBasedMatchSetModelProvider.java
@@ -31,6 +31,14 @@ public class PatternBasedMatchSetModelProvider implements IMatchSetModelProvider
this(hint, new SnapshotHelper());
}
+ /**
+ * @since 2.6
+ */
+ public PatternBasedMatchSetModelProvider(AdvancedViatraQueryEngine engine, QueryEvaluationHint hint) {
+ this(hint, new SnapshotHelper());
+ this.engine = engine;
+ }
+
/**
* @deprecated
* Use @link #PatternMatchSetModelProvider(QueryEvaluationHint, SnapshotHelper) instead
diff --git a/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/api/ViatraQueryTest.xtend b/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/api/ViatraQueryTest.xtend
index 6b0c974f4..6ccb01c4c 100644
--- a/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/api/ViatraQueryTest.xtend
+++ b/query/tests/org.eclipse.viatra.query.testing.core/src/org/eclipse/viatra/query/testing/core/api/ViatraQueryTest.xtend
@@ -37,6 +37,7 @@ import org.eclipse.viatra.query.testing.core.XmiModelUtil
import org.eclipse.viatra.query.testing.core.internal.AnalyzedPatternBasedMatchSetModelProvider
import org.eclipse.viatra.query.testing.core.internal.DefaultMatchRecordEquivalence
import org.eclipse.viatra.query.testing.snapshot.QuerySnapshot
+import org.eclipse.viatra.query.testing.core.PatternBasedMatchSetModelProvider
/**
* This class defines an API to easily construct test cases. The base conception is to provide
@@ -197,13 +198,21 @@ class ViatraQueryTest {
* Adds a pattern-based match result set evaluated using the given hints.
*/
def with(QueryEvaluationHint hint) {
-
val modelProvider = new AnalyzedPatternBasedMatchSetModelProvider(hint, testCase.snapshotHelper, analyzers);
testCase.addMatchSetModelProvider(modelProvider)
this
}
/**
+ * Adds a custom pattern-based match set provider to be evaluated.
+ * @since 2.6
+ */
+ def with(PatternBasedMatchSetModelProvider modelProvider) {
+ testCase.addMatchSetModelProvider(modelProvider)
+ this
+ }
+
+ /**
* Adds a pattern-based match result set evaluated using the given query backend.
*/
def with(IQueryBackendFactory queryBackendFactory) {

Back to the top