Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 123163 Details for
Bug 261758
[query] CompoundQueryables don't support non-transitive queries
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Compound Queryable update
Transitive.patch (text/plain), 13.93 KB, created by
Ian Bull
on 2009-01-21 01:04:36 EST
(
hide
)
Description:
Compound Queryable update
Filename:
MIME Type:
Creator:
Ian Bull
Created:
2009-01-21 01:04:36 EST
Size:
13.93 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.equinox.p2.core >Index: src/org/eclipse/equinox/internal/provisional/p2/query/MatchQuery.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/provisional/p2/query/MatchQuery.java,v >retrieving revision 1.3 >diff -u -r1.3 MatchQuery.java >--- src/org/eclipse/equinox/internal/provisional/p2/query/MatchQuery.java 21 Jan 2009 02:05:25 -0000 1.3 >+++ src/org/eclipse/equinox/internal/provisional/p2/query/MatchQuery.java 21 Jan 2009 05:56:03 -0000 >@@ -11,6 +11,7 @@ > package org.eclipse.equinox.internal.provisional.p2.query; > > import java.util.Iterator; >+import org.eclipse.equinox.internal.provisional.p2.query.CompoundQueryable.IMultiQuery; > > /** > * This class represents the superclass of most of p2's queries. Every element >@@ -24,7 +25,7 @@ > * computation, to allow {@link IQueryable} implementations to optimize their > * execution of the query. > */ >-public abstract class MatchQuery implements IMatchQuery { >+public abstract class MatchQuery implements IMatchQuery, IMultiQuery { > > /** > * Returns whether the given object satisfies the parameters of this query. >@@ -35,6 +36,10 @@ > */ > public abstract boolean isMatch(Object candidate); > >+ public Query getCompoundingQuery() { >+ return this; >+ } >+ > /** > * Performs this query on the given iterator, passing all objects in the iterator > * that match the criteria of this query to the given result. >Index: src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQueryable.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQueryable.java,v >retrieving revision 1.1 >diff -u -r1.1 CompoundQueryable.java >--- src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQueryable.java 21 Jan 2009 02:05:25 -0000 1.1 >+++ src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQueryable.java 21 Jan 2009 05:56:02 -0000 >@@ -20,10 +20,20 @@ > > private IQueryable[] queryables; > >+ public interface IMultiQuery extends Query { >+ public Query getCompoundingQuery(); >+ } >+ > public CompoundQueryable(IQueryable[] queryables) { > this.queryables = queryables; > } > >+ private Query getCompoundingQuery(Query q) { >+ if (q instanceof IMultiQuery) >+ return ((IMultiQuery) q).getCompoundingQuery(); >+ return new MatchAllQuery(); >+ } >+ > public Collector query(Query query, Collector collector, IProgressMonitor monitor) { > if (monitor == null) { > monitor = new NullProgressMonitor(); >@@ -42,7 +52,7 @@ > for (int i = 0; i < queryables.length; i++) { > if (subMonitor.isCanceled()) > break; >- results = queryables[i].query(query, results, subMonitor.newChild(10)); >+ results = queryables[i].query(getCompoundingQuery(query), results, subMonitor.newChild(10)); > } > > if (!isMatchQuery) { >Index: src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQuery.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQuery.java,v >retrieving revision 1.5 >diff -u -r1.5 CompoundQuery.java >--- src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQuery.java 21 Jan 2009 02:05:26 -0000 1.5 >+++ src/org/eclipse/equinox/internal/provisional/p2/query/CompoundQuery.java 21 Jan 2009 05:56:02 -0000 >@@ -12,6 +12,7 @@ > package org.eclipse.equinox.internal.provisional.p2.query; > > import java.util.*; >+import org.eclipse.equinox.internal.provisional.p2.query.CompoundQueryable.IMultiQuery; > > /** > * A query that combines a group of sub-queries.<P> >@@ -26,7 +27,7 @@ > * > * @noextend This class is not intended to be subclassed by clients. > */ >-public abstract class CompoundQuery implements Query { >+public abstract class CompoundQuery implements Query, IMultiQuery { > protected Query[] queries; > protected boolean and; > >@@ -123,6 +124,10 @@ > } > return result; > } >+ >+ public Query getCompoundingQuery() { >+ return MatchCompoundQuery.this; >+ } > } > > /** >@@ -181,5 +186,20 @@ > gatherResults = result.accept(resultIterator.next()); > return result; > } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.equinox.internal.provisional.p2.query.CompoundQueryable.IMultiQuery#getCompoundingQuery() >+ */ >+ public Query getCompoundingQuery() { >+ Query[] parallelQueries = new Query[this.queries.length]; >+ for (int i = 0; i < this.queries.length; i++) { >+ if (queries[i] instanceof IMultiQuery) >+ parallelQueries[i] = ((IMultiQuery) queries[i]).getCompoundingQuery(); >+ else >+ parallelQueries[i] = new MatchAllQuery(); >+ } >+ return CompoundQuery.createCompoundQuery(parallelQueries, false); >+ >+ } > } > } >Index: src/org/eclipse/equinox/internal/provisional/p2/query/CompositeQuery.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/provisional/p2/query/CompositeQuery.java,v >retrieving revision 1.2 >diff -u -r1.2 CompositeQuery.java >--- src/org/eclipse/equinox/internal/provisional/p2/query/CompositeQuery.java 21 Jan 2009 02:05:25 -0000 1.2 >+++ src/org/eclipse/equinox/internal/provisional/p2/query/CompositeQuery.java 21 Jan 2009 05:56:02 -0000 >@@ -10,19 +10,20 @@ > package org.eclipse.equinox.internal.provisional.p2.query; > > import java.util.Iterator; >+import org.eclipse.equinox.internal.provisional.p2.query.CompoundQueryable.IMultiQuery; > > /** > * A Composite Query is an aggregate query in which each sub-query > * is executed in succession. The results from the ith sub-query > * are piped as input into the i+1th sub-query. > */ >-public class CompositeQuery implements Query { >+public class CompositeQuery implements Query, IMultiQuery { > protected Query[] queries; > > public CompositeQuery(Query[] queries) { > this.queries = queries; > } >- >+ > /** > * Set the queries of this composite. This is needed to allow subclasses of > * CompsiteQuery to set the queries in a constructor >@@ -45,4 +46,16 @@ > gatherResults = result.accept(iter.next()); > return result; > } >+ >+ public Query getCompoundingQuery() { >+ Query[] parallelQueries = new Query[this.queries.length]; >+ for (int i = 0; i < this.queries.length; i++) { >+ if (queries[i] instanceof IMultiQuery) >+ parallelQueries[i] = ((IMultiQuery) queries[i]).getCompoundingQuery(); >+ else >+ parallelQueries[i] = new MatchAllQuery(); >+ } >+ return new CompositeQuery(parallelQueries); >+ } >+ > } >Index: src/org/eclipse/equinox/internal/provisional/p2/query/MatchAllQuery.java >=================================================================== >RCS file: src/org/eclipse/equinox/internal/provisional/p2/query/MatchAllQuery.java >diff -N src/org/eclipse/equinox/internal/provisional/p2/query/MatchAllQuery.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/equinox/internal/provisional/p2/query/MatchAllQuery.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,20 @@ >+/******************************************************************************* >+* Copyright (c) 2009 EclipseSource and others. All rights reserved. This >+* program and the accompanying materials are made available under the terms of >+* the Eclipse Public License v1.0 which accompanies this distribution, and is >+* available at http://www.eclipse.org/legal/epl-v10.html >+* >+* Contributors: >+* EclipseSource - initial API and implementation >+******************************************************************************/ >+package org.eclipse.equinox.internal.provisional.p2.query; >+ >+/** >+ * A query that matches all elements. >+ */ >+public class MatchAllQuery extends MatchQuery { >+ >+ public boolean isMatch(Object candidate) { >+ return true; >+ } >+} >#P org.eclipse.equinox.p2.tests >Index: src/org/eclipse/equinox/p2/tests/core/CompoundQueryableTest.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/CompoundQueryableTest.java,v >retrieving revision 1.1 >diff -u -r1.1 CompoundQueryableTest.java >--- src/org/eclipse/equinox/p2/tests/core/CompoundQueryableTest.java 21 Jan 2009 02:05:24 -0000 1.1 >+++ src/org/eclipse/equinox/p2/tests/core/CompoundQueryableTest.java 21 Jan 2009 05:56:05 -0000 >@@ -14,6 +14,7 @@ > import org.eclipse.core.runtime.IProgressMonitor; > import org.eclipse.core.tests.harness.TestProgressMonitor; > import org.eclipse.equinox.internal.provisional.p2.query.*; >+import org.eclipse.equinox.internal.provisional.p2.query.CompoundQueryable.IMultiQuery; > > /** > * Tests the compound queryable >@@ -324,4 +325,116 @@ > assertTrue("1.0", monitor.isDone()); > assertTrue("1.1", monitor.isWorkDone()); > } >+ >+ class Greatest2ndNumberQuery extends ContextQuery implements IMultiQuery { >+ >+ public Query getCompoundingQuery() { >+ return new ContextQuery() { >+ >+ public Collector perform(Iterator iterator, Collector result) { >+ int greatest = Integer.MIN_VALUE; >+ int second = Integer.MIN_VALUE; >+ while (iterator.hasNext()) { >+ int item = ((Integer) iterator.next()).intValue(); >+ if (item > greatest) { >+ second = greatest; >+ greatest = item; >+ } else if (item > second && item < greatest) { >+ second = item; >+ } >+ >+ } >+ if (greatest == Integer.MIN_VALUE) >+ return result; >+ result.accept(second); >+ result.accept(greatest); >+ return result; >+ } >+ >+ }; >+ >+ } >+ >+ public Collector perform(Iterator iterator, Collector result) { >+ int greatest = Integer.MIN_VALUE; >+ int second = Integer.MIN_VALUE; >+ while (iterator.hasNext()) { >+ int item = ((Integer) iterator.next()).intValue(); >+ if (item > greatest) { >+ second = greatest; >+ greatest = item; >+ } else if (item > second && item < greatest) { >+ second = item; >+ } >+ >+ } >+ if (greatest == Integer.MIN_VALUE) >+ return result; >+ result.accept(second); >+ return result; >+ } >+ } >+ >+ Greatest2ndNumberQuery greatest2ndNumberQuery = new Greatest2ndNumberQuery(); >+ >+ public void testCompoundContextOrQuery() { >+ CompoundQueryable cQueryable = new CompoundQueryable(new IQueryable[] {queryable1, queryable2}); >+ CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); >+ Collector collector = cQueryable.query(CompoundQuery.createCompoundQuery(new Query[] {contextQuery, greatest2ndNumberQuery}, false), new Collector(), monitor); >+ assertEquals("1.0", 6, collector.size()); >+ Collection collection = collector.toCollection(); >+ assertTrue("1.2", collection.contains(2)); >+ assertTrue("1.2", collection.contains(4)); >+ assertTrue("1.2", collection.contains(6)); >+ assertTrue("1.4", collection.contains(8)); >+ assertTrue("1.2", collection.contains(10)); >+ assertTrue("1.6", collection.contains(12)); >+ } >+ >+ public void testDoubleCompoundContextAndQuery2() { >+ CompoundQueryable cQueryable1 = new CompoundQueryable(new IQueryable[] {queryable3, queryable2}); >+ CompoundQueryable cQueryable = new CompoundQueryable(new IQueryable[] {cQueryable1, queryable1}); >+ CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); >+ Collector collector = cQueryable.query(CompoundQuery.createCompoundQuery(new Query[] {greatest2ndNumberQuery, greatestNumberQuery}, true), new Collector(), monitor); >+ assertEquals("1.0", 0, collector.size()); >+ assertTrue("1.0", monitor.isDone()); >+ assertTrue("1.1", monitor.isWorkDone()); >+ } >+ >+ public void testDoubleCompoundContextAndQuery() { >+ CompoundQueryable cQueryable1 = new CompoundQueryable(new IQueryable[] {queryable3, queryable2}); >+ CompoundQueryable cQueryable = new CompoundQueryable(new IQueryable[] {cQueryable1, queryable1}); >+ CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); >+ Collector collector = cQueryable.query(CompoundQuery.createCompoundQuery(new Query[] {contextQuery, greatestNumberQuery}, true), new Collector(), monitor); >+ assertEquals("1.0", 0, collector.size()); >+ assertTrue("1.0", monitor.isDone()); >+ assertTrue("1.1", monitor.isWorkDone()); >+ } >+ >+ public void testCompositeQuery() { >+ CompoundQueryable cQueryable = new CompoundQueryable(new IQueryable[] {queryable1, queryable2}); >+ CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); >+ Collector collector = cQueryable.query(new CompositeQuery(new Query[] {contextQuery, greatest2ndNumberQuery}), new Collector(), monitor); >+ assertEquals("1.0", 1, collector.size()); >+ Collection collection = collector.toCollection(); >+ assertTrue("1.2", collection.contains(10)); >+ } >+ >+ public void testCompoundContextAndQuery() { >+ CompoundQueryable cQueryable = new CompoundQueryable(new IQueryable[] {queryable1, queryable2}); >+ CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); >+ Collector collector = cQueryable.query(CompoundQuery.createCompoundQuery(new Query[] {contextQuery, greatest2ndNumberQuery}, true), new Collector(), monitor); >+ assertEquals("1.0", 1, collector.size()); >+ Collection collection = collector.toCollection(); >+ assertTrue("1.2", collection.contains(10)); >+ } >+ >+ public void testMultipleContextQueries2() { >+ CompoundQueryable cQueryable = new CompoundQueryable(new IQueryable[] {queryable1, queryable2}); >+ CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor(); >+ Collector collector = cQueryable.query(greatest2ndNumberQuery, new Collector(), monitor); >+ assertEquals("1.0", 1, collector.size()); >+ Collection collection = collector.toCollection(); >+ assertTrue("1.1", collection.contains(10)); >+ } > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 261758
: 123163