diff options
author | Thomas Hallgren | 2010-03-11 00:57:20 +0000 |
---|---|---|
committer | Thomas Hallgren | 2010-03-11 00:57:20 +0000 |
commit | 3626278870d76d9f46feebcf478c2a5e318fe284 (patch) | |
tree | fa48d81512a23920da7cf28db87fa89df2966421 /bundles | |
parent | 81cb7652960172a6260792f144234711ef3b45ce (diff) | |
download | rt.equinox.p2-3626278870d76d9f46feebcf478c2a5e318fe284.tar.gz rt.equinox.p2-3626278870d76d9f46feebcf478c2a5e318fe284.tar.xz rt.equinox.p2-3626278870d76d9f46feebcf478c2a5e318fe284.zip |
Index optimization in Expression.
Diffstat (limited to 'bundles')
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"); |