Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hallgren2010-02-19 12:13:19 +0000
committerThomas Hallgren2010-02-19 12:13:19 +0000
commit3a4abd5c6deca5395ea24bb742ab53fa21427f85 (patch)
tree9eb424ba5b281990970f584088d4ceef5bf05111 /bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/CollectionFilter.java
parent273e205c6904675b1b1314b6f4df5f9e962735b5 (diff)
downloadrt.equinox.p2-3a4abd5c6deca5395ea24bb742ab53fa21427f85.tar.gz
rt.equinox.p2-3a4abd5c6deca5395ea24bb742ab53fa21427f85.tar.xz
rt.equinox.p2-3a4abd5c6deca5395ea24bb742ab53fa21427f85.zip
302201 : Unify the two query approaches used in p2
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/CollectionFilter.java')
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/CollectionFilter.java49
1 files changed, 47 insertions, 2 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/CollectionFilter.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/CollectionFilter.java
index bb845d373..f4d320149 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/CollectionFilter.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/CollectionFilter.java
@@ -13,6 +13,8 @@ package org.eclipse.equinox.internal.p2.metadata.expression;
import java.util.Iterator;
import org.eclipse.equinox.p2.metadata.expression.IEvaluationContext;
import org.eclipse.equinox.p2.metadata.expression.IExpressionVisitor;
+import org.eclipse.equinox.p2.metadata.index.IIndex;
+import org.eclipse.equinox.p2.metadata.index.IIndexProvider;
/**
* Some kind of operation that is performed for each element of a collection. I.e.
@@ -51,13 +53,13 @@ public abstract class CollectionFilter extends Unary {
}
public final Object evaluate(IEvaluationContext context) {
- Iterator<?> lval = operand.evaluateAsIterator(context);
+ Iterator<?> lval = getInnerIterator(context);
context = lambda.prolog(context);
return evaluate(context, lval);
}
public final Iterator<?> evaluateAsIterator(IEvaluationContext context) {
- Iterator<?> lval = operand.evaluateAsIterator(context);
+ Iterator<?> lval = getInnerIterator(context);
context = lambda.prolog(context);
return evaluateAsIterator(context, lval);
}
@@ -82,4 +84,47 @@ public abstract class CollectionFilter extends Unary {
protected Iterator<?> evaluateAsIterator(IEvaluationContext context, Iterator<?> iterator) {
throw new UnsupportedOperationException();
}
+
+ private transient IIndexProvider<?> lastIndexProvider;
+ private transient IIndex<?> lastIndex;
+
+ private IIndex<?> getIndex(Class<?> elementClass, IIndexProvider<?> indexProvider) {
+ if (lastIndexProvider == indexProvider)
+ return lastIndex;
+
+ for (String member : getIndexCandidateMembers(elementClass, lambda.getItemVariable(), lambda.getOperand())) {
+ IIndex<?> index = indexProvider.getIndex(member);
+ if (index != null)
+ lastIndex = index;
+ }
+ lastIndexProvider = indexProvider;
+ return lastIndex;
+ }
+
+ protected Iterator<?> getInnerIterator(IEvaluationContext context) {
+ Object collection = operand.evaluate(context);
+ if (collection instanceof Everything<?>) {
+ // Try to find an index
+ //
+ IIndexProvider<?> indexProvider = context.getIndexProvider();
+ if (indexProvider != null) {
+ Class<?> elementClass = ((Everything<?>) collection).getElementClass();
+ IIndex<?> index = getIndex(elementClass, indexProvider);
+ if (index != null) {
+ Iterator<?> indexed = index.getCandidates(context, lambda.getItemVariable(), lambda.getOperand());
+ if (indexed != null)
+ return indexed;
+ }
+ }
+ }
+
+ // No index. We need every element
+ if (collection instanceof IRepeatableIterator<?>)
+ return ((IRepeatableIterator<?>) collection).getCopy();
+
+ Iterator<?> itor = RepeatableIterator.create(collection);
+ if (operand instanceof Variable)
+ ((Variable) operand).setValue(context, itor);
+ return itor;
+ }
}

Back to the top