diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression')
6 files changed, 18 insertions, 92 deletions
diff --git a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/ContextExpression.java b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/ContextExpression.java index 26cbce481..e7c3bc7ec 100644 --- a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/ContextExpression.java +++ b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/ContextExpression.java @@ -12,8 +12,8 @@ package org.eclipse.equinox.internal.p2.ql.expression; import java.util.Iterator; import org.eclipse.equinox.internal.p2.metadata.expression.*; -import org.eclipse.equinox.internal.p2.ql.Everything; -import org.eclipse.equinox.p2.metadata.expression.*; +import org.eclipse.equinox.p2.metadata.expression.IEvaluationContext; +import org.eclipse.equinox.p2.metadata.expression.IExpression; import org.eclipse.equinox.p2.ql.IContextExpression; import org.eclipse.equinox.p2.ql.ITranslationSupport; @@ -22,71 +22,17 @@ import org.eclipse.equinox.p2.ql.ITranslationSupport; * variable 'everything' and initialized it with the iterator that represents all * available items. */ -public final class ContextExpression<T> extends Unary implements IContextExpression<T>, IQLConstants { - private static final Object[] noParams = new Object[0]; - private final Class<T> elementClass; - private final Object[] parameters; - - public ContextExpression(Class<T> elementClass, Expression expression, Object[] parameters) { - super(expression); - this.elementClass = elementClass; - this.parameters = parameters == null ? noParams : parameters; - } - - public boolean accept(IExpressionVisitor visitor) { - return visitor.visit(operand); - } - - public void toString(StringBuffer bld, Variable rootVariable) { - operand.toString(bld, rootVariable); - } - - public IEvaluationContext createContext(Iterator<T> iterator) { - Variable everything = QLFactory.EVERYTHING; - IEvaluationContext context = EvaluationContext.create(parameters, everything); - context.setValue(everything, new Everything<T>(elementClass, iterator, QLUtil.needsRepeadedAccessToEverything(operand))); - return context; +public final class ContextExpression<T> extends org.eclipse.equinox.internal.p2.metadata.expression.ContextExpression<T> implements IContextExpression<T> { + public ContextExpression(Expression expression, Object[] parameters) { + super(expression, parameters); } - public IEvaluationContext createContext(Iterator<T> iterator, ITranslationSupport ts) { - Variable everything = QLFactory.EVERYTHING; + public IEvaluationContext createContext(Class<T> elementClass, Iterator<T> iterator, ITranslationSupport ts) { + Variable everything = ExpressionFactory.EVERYTHING; IExpression translations = QLFactory.TRANSLATIONS; IEvaluationContext context = EvaluationContext.create(parameters, new IExpression[] {everything, translations}); - context.setValue(everything, new Everything<T>(elementClass, iterator, QLUtil.needsRepeadedAccessToEverything(operand))); + context.setValue(everything, new Everything<T>(elementClass, iterator, operand)); context.setValue(translations, ts); return context; } - - public Class<T> getElementClass() { - return elementClass; - } - - public int getExpressionType() { - return 0; - } - - public String getOperator() { - throw new UnsupportedOperationException(); - } - - public int getPriority() { - return operand.getPriority(); - } - - public Object[] getParameters() { - return parameters; - } - - public int hashCode() { - return operand.hashCode(); - } - - @SuppressWarnings("unchecked") - public Iterator<T> iterator(IEvaluationContext context) { - return (Iterator<T>) evaluateAsIterator(context); - } - - public void toString(StringBuffer bld) { - toString(bld, QLFactory.EVERYTHING); - } } diff --git a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Flatten.java b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Flatten.java index b0ff4122c..8aa33622c 100644 --- a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Flatten.java +++ b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Flatten.java @@ -10,9 +10,10 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.ql.expression; +import org.eclipse.equinox.internal.p2.metadata.expression.CompoundIterator; + import java.util.Iterator; import org.eclipse.equinox.internal.p2.metadata.expression.Expression; -import org.eclipse.equinox.internal.p2.ql.FlattenIterator; import org.eclipse.equinox.p2.metadata.expression.IEvaluationContext; /** @@ -25,7 +26,7 @@ final class Flatten extends UnaryCollectionFilter { } public Iterator<?> evaluateAsIterator(IEvaluationContext context) { - return new FlattenIterator<Object>(operand.evaluateAsIterator(context)); + return new CompoundIterator<Object>(operand.evaluateAsIterator(context)); } public int getExpressionType() { diff --git a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLFactory.java b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLFactory.java index 17bbb657a..8568e680c 100644 --- a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLFactory.java +++ b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLFactory.java @@ -5,15 +5,12 @@ import java.lang.reflect.InvocationTargetException; import java.util.*; import org.eclipse.equinox.internal.p2.metadata.expression.*; import org.eclipse.equinox.p2.metadata.expression.IExpression; -import org.eclipse.equinox.p2.ql.IContextExpression; import org.eclipse.equinox.p2.ql.IQLFactory; public class QLFactory extends ExpressionFactory implements IQLFactory, IQLConstants { @SuppressWarnings("hiding") public static final IQLFactory INSTANCE = new QLFactory(); - public static final Variable EVERYTHING = new Variable(IExpressionConstants.VARIABLE_EVERYTHING); - public static final Variable TRANSLATIONS = new Variable(VARIABLE_TRANSLATIONS); protected static final Map<String, Constructor<?>> functionMap; @@ -60,8 +57,8 @@ public class QLFactory extends ExpressionFactory implements IQLFactory, IQLConst return new Condition((Expression) test, (Expression) ifTrue, (Expression) ifFalse); } - public <T> IContextExpression<T> contextExpression(Class<T> elementClass, IExpression expr, Object... parameters) { - return new ContextExpression<T>(elementClass, (Expression) expr, parameters); + public <T> org.eclipse.equinox.p2.metadata.expression.IContextExpression<T> contextExpression(IExpression expr, Object... parameters) { + return new ContextExpression<T>((Expression) expr, parameters); } public IExpression first(IExpression collection, IExpression lambda) { diff --git a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLUtil.java b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLUtil.java index 6d790b25b..5ae9b8c6b 100644 --- a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLUtil.java +++ b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/QLUtil.java @@ -73,24 +73,4 @@ public abstract class QLUtil implements IExpression, IQLConstants { }); return translationSupportNeeded[0]; } - - /** - * Checks if the expression will make repeated requests for the 'everything' iterator. - * @return <code>true</code> if repeated requests will be made, <code>false</code> if not. - */ - static boolean needsRepeadedAccessToEverything(Expression expression) { - final boolean[] repeatedAccessNeeded = new boolean[] {false}; - expression.accept(new IExpressionVisitor() { - public boolean visit(IExpression expr) { - // FIXME Needs proper counting - if (expr == QLFactory.EVERYTHING) { - repeatedAccessNeeded[0] = true; - return false; - } - return true; - } - }); - // return repeatedAccessNeeded[0]; - return true; - } } diff --git a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Select.java b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Select.java index 9ea863a0e..300d8d390 100644 --- a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Select.java +++ b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Select.java @@ -12,7 +12,6 @@ package org.eclipse.equinox.internal.p2.ql.expression; import java.util.Iterator; import org.eclipse.equinox.internal.p2.metadata.expression.*; -import org.eclipse.equinox.internal.p2.ql.MatchIteratorFilter; import org.eclipse.equinox.p2.metadata.expression.IEvaluationContext; import org.eclipse.equinox.p2.ql.IQLExpression; diff --git a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Unique.java b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Unique.java index 5d4953cea..270ac2b5e 100644 --- a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Unique.java +++ b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/Unique.java @@ -12,7 +12,6 @@ package org.eclipse.equinox.internal.p2.ql.expression; import java.util.*; import org.eclipse.equinox.internal.p2.metadata.expression.*; -import org.eclipse.equinox.internal.p2.ql.MatchIteratorFilter; import org.eclipse.equinox.p2.metadata.expression.IEvaluationContext; import org.eclipse.equinox.p2.ql.IQLExpression; @@ -21,8 +20,12 @@ import org.eclipse.equinox.p2.ql.IQLExpression; * once throughout the whole query. */ final class Unique extends Binary implements IQLConstants, IQLExpression { + /** + * A UniqueIterator that uses a set as a discriminator, ensuring that + * no element is returned twice. + */ static class UniqueIterator<T> extends MatchIteratorFilter<T> { - private final Set<T> uniqueSet; + final Set<T> uniqueSet; public UniqueIterator(Iterator<? extends T> iterator, Set<T> uniqueSet) { super(iterator); |