Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hallgren2010-03-09 22:56:48 +0000
committerThomas Hallgren2010-03-09 22:56:48 +0000
commit4fcf6f3590cc065409c77d40f916feb0cad6c304 (patch)
treef97a818a2600a8c703191e6651a1d06fc200f7d2
parentf132871e558df2d448cf72ceeddfa1d5691da81c (diff)
downloadrt.equinox.p2-4fcf6f3590cc065409c77d40f916feb0cad6c304.tar.gz
rt.equinox.p2-4fcf6f3590cc065409c77d40f916feb0cad6c304.tar.xz
rt.equinox.p2-4fcf6f3590cc065409c77d40f916feb0cad6c304.zip
303469 : [discovery] Discover bundles have anonymous MatchQuery subclasses (IAE)
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java31
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java7
2 files changed, 33 insertions, 5 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java
index df8deb674..b5051bf3d 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java
@@ -58,10 +58,18 @@ public abstract class Index<T> implements IIndex<T> {
Binary eqExpr = (Binary) targetExpr;
IExpression lhs = eqExpr.lhs;
IExpression rhs = eqExpr.rhs;
- if (isIndexedMember(lhs, variable, memberName))
- return concatenateUnique(queriedKeys, rhs.evaluate(ctx));
- if (isIndexedMember(rhs, variable, memberName))
- return concatenateUnique(queriedKeys, lhs.evaluate(ctx));
+ if (isIndexedMember(lhs, variable, memberName)) {
+ Object val = safeEvaluate(ctx, rhs);
+ if (val == null)
+ return null;
+ return concatenateUnique(queriedKeys, val);
+ }
+ if (isIndexedMember(rhs, variable, memberName)) {
+ Object val = safeEvaluate(ctx, lhs);
+ if (val == null)
+ return null;
+ return concatenateUnique(queriedKeys, val);
+ }
// Not applicable for indexing
return null;
@@ -103,7 +111,12 @@ public abstract class Index<T> implements IIndex<T> {
// We must evaluate the lhs to find the referenced keys
//
CollectionFilter cf = (CollectionFilter) targetExpr;
- Iterator<?> values = cf.getOperand().evaluateAsIterator(ctx);
+ Iterator<?> values;
+ try {
+ values = cf.getOperand().evaluateAsIterator(ctx);
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
if (!values.hasNext())
// No keys are requested but we know that an exists must
// fail at this point. An all will however succeed regardless
@@ -125,4 +138,12 @@ public abstract class Index<T> implements IIndex<T> {
}
return null;
}
+
+ private static Object safeEvaluate(IEvaluationContext ctx, IExpression expr) {
+ try {
+ return expr.evaluate(ctx);
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java
index 2d71470f4..c5f35eef0 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java
@@ -56,6 +56,13 @@ public class TestIndexes extends AbstractProvisioningTest {
assertEquals(queryResultSize(result), 1);
}
+ public void testComplexIndexMatches() throws Exception {
+ IMetadataRepository repo = getMDR("/testData/galileoM7");
+ IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery("id ~= /*.feature.group/ && properties['org.eclipse.equinox.p2.type.group'] == true && providedCapabilities.exists(p | p.namespace == 'org.eclipse.equinox.p2.iu' && p.name == id)");
+ IQueryResult<IInstallableUnit> result = repo.query(query, getMonitor());
+ assertEquals(queryResultSize(result), 487);
+ }
+
private IMetadataRepository getMDR(String uri) throws Exception {
URI metadataRepo = getTestData("1.1", uri).toURI();

Back to the top