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

Hi David,

The traverse query was written with the intention to replace the slicer but we never got around to actually do that in the 3.6 time frame. As it stands today, it's not a clean cut replacement. The slicer (permissive or non-permissive) will give you specific control over the query that is applicable for a couple of use-cases that is utilized by the PDE target platform provisioning system. One is for instance to guess whether a requirement stems from a PDE-feature 'include' or a PDE-feature 'requires' by looking at the version range (exact or not) in the requirement. The traverse query is generic and not capable of performing special considerations like that. It is however proven to be both faster and more memory conservative than the slicer so I guess the answer to your question all depends on your requirements. It would be easier to give a good answer if we knew more about what it is you want to accomplish.

Thomas Hallgren

On 2010-12-10 20:35, David Orme wrote:
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));

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,


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.

Thomas Hallgren

p2-dev mailing list

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