[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [p2-dev] Executing a P2 traverse query

Pascal and Tomas,

Thanks for both of your assistance.  I've found the slicer example Pascal referred me to and think I understand the query examples.  A couple more questions:

Which approach is preferred?  It seems like the query interface might result in code that is easier to understand at a high level, but maybe I haven't understood the slicer deeply enough yet.  I note that the query interface is advertised as being marginally faster.

Is there an example anywhere putting together the bits required to use the query interface?

Here's what I have so far:

//Loading repos
Collection<IMetadataRepository> metadataReposList = new LinkedList<IMetadataRepository>();
metadataReposList.add(metadataManager.loadRepository(new URI(P2SITE), monitor));
metadataReposList.add(metadataManager.loadRepository(new URI(SECOND_P2SITE), monitor));
metadataReposList.add(metadataManager.loadRepository(new URI(THIRD_P2SITE), monitor));

//Querying
IQueryable<IInstallableUnit> allMetadataRepos = QueryUtil.compoundQueryable(metadataReposList);
Set<IInstallableUnit> toInstallOrUpdate = allMetadataRepos.query(
        QueryUtil.createIUAnyQuery(), monitor).toUnmodifiableSet();

Now suppose I've got two Features I want to use as a root to search from.  I know I need a traverse query, and I can see how to run a query against an IQueryable, but I'm not sure how to pass my two root Features in as arguments.  Or am I asking the wrong question?


Thanks in advance,

Dave

On Fri, Dec 10, 2010 at 8:35 AM, Thomas Hallgren <thomas@xxxxxxx> wrote:
On 2010-12-09 23:21, David Orme wrote:
Hi all,

I'm trying to execute a P2 query that can chase down all IUs resulting from starting with several features and traversing the tree of IUs and included features until all dependencies are satisfied.

I found the example of how to construct such a query at wiki.eclipse.org/Query_Language_for_p2, but can't work out how to run it against a set of inputs.

It seems that I need an IQueryable to execute against and some way to specify the set of Features to use as roots.

I've got an IQueryable, (and can successfully createIUAnyQuery() against it), but haven't been able to work out how to extend this to query for the subset that is reachable from a set of Features that are being treated as roots and are available via the IQueryable.

Any pointers to code snippets or anything else would be welcome.

The simplest query from the wiki looks like this:

$0.traverse(parent | parent.requirements.collect(rc | select(iu | iu ~= rc)).flatten())

It expects a collection (i.e. your set of roots) as it's first argument. You then apply it to your IQueryable.

In the _expression_, 'parent' is the variable holding each item from the roots. The _expression_ compares all iu's from your IQueryable with the requirements of the 'parent' and this results in new instances that will become 'parent' as the query traverses recursively.

HTH,
Thomas Hallgren


_______________________________________________
p2-dev mailing list
p2-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/p2-dev