Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hallgren2010-03-11 00:57:20 +0000
committerThomas Hallgren2010-03-11 00:57:20 +0000
commit3626278870d76d9f46feebcf478c2a5e318fe284 (patch)
treefa48d81512a23920da7cf28db87fa89df2966421 /bundles
parent81cb7652960172a6260792f144234711ef3b45ce (diff)
downloadrt.equinox.p2-3626278870d76d9f46feebcf478c2a5e318fe284.tar.gz
rt.equinox.p2-3626278870d76d9f46feebcf478c2a5e318fe284.tar.xz
rt.equinox.p2-3626278870d76d9f46feebcf478c2a5e318fe284.zip
Index optimization in Expression.
Diffstat (limited to 'bundles')
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/ExpressionMatchQuery.java13
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java37
2 files changed, 44 insertions, 6 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/ExpressionMatchQuery.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/ExpressionMatchQuery.java
index 8a6f6271c..1b0284165 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/ExpressionMatchQuery.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/ExpressionMatchQuery.java
@@ -10,11 +10,9 @@
*******************************************************************************/
package org.eclipse.equinox.p2.query;
-import java.util.HashSet;
-import java.util.Iterator;
+import java.util.*;
import org.eclipse.equinox.internal.p2.metadata.expression.Expression;
import org.eclipse.equinox.internal.p2.metadata.expression.ExpressionFactory;
-import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.expression.*;
import org.eclipse.equinox.p2.metadata.index.*;
@@ -25,12 +23,14 @@ import org.eclipse.equinox.p2.metadata.index.*;
public class ExpressionMatchQuery<T> implements IMatchQuery<T>, IQueryWithIndex<T> {
private final IMatchExpression<T> expression;
private final Class<? extends T> matchingClass;
- private IEvaluationContext context;
+ private final IEvaluationContext context;
+ private final List<String> indexedMembers;
public ExpressionMatchQuery(Class<? extends T> matchingClass, IExpression expression, Object... parameters) {
this.matchingClass = matchingClass;
this.expression = ExpressionUtil.getFactory().<T> matchExpression(expression, parameters);
this.context = this.expression.createContext();
+ this.indexedMembers = Expression.getIndexCandidateMembers(matchingClass, ExpressionFactory.THIS, (Expression) expression);
}
public ExpressionMatchQuery(Class<? extends T> matchingClass, String expression, Object... parameters) {
@@ -47,8 +47,9 @@ public class ExpressionMatchQuery<T> implements IMatchQuery<T>, IQueryWithIndex<
public IQueryResult<T> perform(IIndexProvider<T> indexProvider) {
Iterator<T> iterator = null;
- for (String member : Expression.getIndexCandidateMembers(IArtifactKey.class, ExpressionFactory.THIS, (Expression) expression)) {
- IIndex<T> index = indexProvider.getIndex(member);
+ int top = indexedMembers.size();
+ for (int idx = 0; idx < top; ++idx) {
+ IIndex<T> index = indexProvider.getIndex(indexedMembers.get(idx));
if (index != null) {
iterator = index.getCandidates(context, ExpressionFactory.THIS, expression);
if (iterator != null)
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java
index b71322fa4..00493e767 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java
@@ -17,12 +17,49 @@ import org.eclipse.equinox.internal.p2.director.QueryableArray;
import org.eclipse.equinox.internal.p2.director.Slicer;
import org.eclipse.equinox.internal.p2.metadata.InstallableUnit;
import org.eclipse.equinox.p2.metadata.*;
+import org.eclipse.equinox.p2.metadata.expression.SimplePattern;
import org.eclipse.equinox.p2.query.*;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
public class PerformanceTest extends AbstractProvisioningTest {
+ public void testMatchQueryVersusExpressionPerformance() throws Exception {
+
+ IMetadataRepository repo = getMDR("/testData/galileoM7");
+
+ IQuery<IInstallableUnit> expressionQuery = QueryUtil.createMatchQuery("id ~= /org.eclipse.*.feature.group/");
+ final SimplePattern pattern = SimplePattern.compile("org.eclipse.*.feature.group");
+ IQuery<IInstallableUnit> matchQuery = new MatchQuery<IInstallableUnit>() {
+ @Override
+ public boolean isMatch(IInstallableUnit candidate) {
+ return pattern.isMatch(candidate.getId());
+ }
+ };
+ IQueryResult<IInstallableUnit> result;
+ long tradQueryMS = 0;
+ long exprQueryMS = 0;
+
+ for (int i = 0; i < 5; ++i) {
+ long start = System.currentTimeMillis();
+ for (int idx = 0; idx < 80; ++idx) {
+ result = repo.query(expressionQuery, new NullProgressMonitor());
+ assertEquals(queryResultSize(result), 482);
+ }
+ tradQueryMS += (System.currentTimeMillis() - start);
+
+ start = System.currentTimeMillis();
+ for (int idx = 0; idx < 80; ++idx) {
+ result = repo.query(matchQuery, new NullProgressMonitor());
+ assertEquals(queryResultSize(result), 482);
+ }
+ exprQueryMS += (System.currentTimeMillis() - start);
+ }
+ System.out.println("ExpressionQuery took: " + tradQueryMS + " milliseconds");
+ System.out.println("MatchQuery took: " + exprQueryMS + " milliseconds");
+ System.out.println();
+ }
+
public void testCapabilityQueryPerformance() throws Exception {
IMetadataRepository repo = getMDR("/testData/galileoM7");

Back to the top