This started out as a separate Object which was part of a bigger set of code, 
from which the feedback eventually had it end up as a single method in the 
Resource interface.

The libraries I mentioned would be entirely separate, all of this came from 
here:
https://github.com/apache/sling-whiteboard/tree/master/streams

Which, once the streaming finds a home, would be split into two separate 
packages that would allow you to create a predicate like this:
where(property("jcr:primaryType").is("page")).and(property("activated").is(true));

or use a dsl to create a predicate with:
"[jcr:primaryType] is 'page' and [activated] is true"

So no, this is not meant to be an inclusion of these libraries into the API.


- Jason

On Wed, Jun 6, 2018, at 9:53 AM, Carsten Ziegeler wrote:
> I haven't really followed the whole discussion but the keyword in your a
> response to me is "library". I see the value of having this as a library
> everyone can use. But I think we usually should keep library code
> separate from the pure (in lack of a better word) api like the resource
> api. There are tons of useful libraries out there, if we would add all
> of them to the resource api, I guess we would create one of the biggest
> apis in the world :)
> 
> But I guess it has already been considered whether this should go
> somewhere else or not.
> 
> So just my 2cents
> 
> Regards
> 
> Carsten
> 
> 
> Jason E Bailey wrote
> > Hi Jörg,
> > 
> > I think this is, in part, a matter of personal experience. My team and I 
> > have found traversing a sub tree traversal so useful that I've created 
> > libraries of predicates and an expression language to ease the creation of 
> > predicates for those traversals. I would estimate that we use a traversal 
> > about 2 - 3 times  a month, sometimes as part of a new component, or when 
> > pulling reports and operational queries.
> > 
> > We use it, when writing code, more then get/list children of a resource.
> > 
> > I do think the ability to do a traversal should be part of a core library, 
> > the reasoning for that is that there are currently multiple instances of a 
> > some sort of tree traversal in multiple bundles now. From Sling Query to 
> > the default GET servlets. When I start seeing the same thing over and over 
> > again that tells me it should be centralized.
> > 
> > I did just commit one change based on this conversation, since their tends 
> > to be a focus on "whole subtree" which is something I don't actually use, I 
> > removed the method
> > 
> > - stream();
> > 
> > leaving just
> > 
> > - stream(Predicate<Resource>)
> > 
> > That leaves open the possibility of static predicates to do things like
> > 
> > stream(CHILDREN);
> > stream(ALL_DESCENDANTS)
> > stream(PAGES)
> > 
> > As for extensions of existing methods, I think there would be an interest 
> > in that. maybe something like
> > 
> > Stream<Resource> listChildren(Predicate<Resource> childSelector);
> > 
> > which I think would make a great patch.
> > 
> >  I appreciate the feedback.
> > 
> > Thanks!
> > - Jason
> > 
> > On Tue, Jun 5, 2018, at 6:30 PM, Jörg Hoh wrote:
> >> Hi,
> >>
> >> sorry for joining the game a bit late ... At the moment it's not clear to
> >> me, why we actually want to extend the API with this functionality; while I
> >> totally understand the value and beauty of streams, I wonder if the usecase
> >> "traverse the whole subtree" happens really that often that it qualifies
> >> for an extension of the API. Personally I implemented it once or twice over
> >> the course of some years, but that's not something I need to have in the
> >> public API. I consider it as a convenience function I can easily implement
> >> on top of the already existing Resource API.
> >>
> >> I would rather provide versions of the listChildren method which return
> >> streams (or any other method of the Resource API which returns a list  or
> >> an iterator over resources).
> >>
> >> Jörg
> >>
> >>
> >> 2018-06-04 20:24 GMT+02:00 Jason E Bailey <j...@apache.org>:
> >>
> >>> At this point I'm looking for feedback to say whether there is a consensus
> >>> that the proposed API
> >>>
> >>> - stream()
> >>> - stream(Predicate<Resource>)
> >>>
> >>> where each one attempts to iterate through the tree is *sufficient enough
> >>> for the initial release*. I believe Stefan's concern was that he believed
> >>> someone encountering stream() on a resource would believe that it's only a
> >>> stream of the immediate children.
> >>>
> >>> I believe, he would prefer something like
> >>>
> >>> - treeStream()
> >>>
> >>> I'm inclined to see just stream() as the base method, as that's the
> >>> standard convention for a method that generates a stream.
> >>>
> >>> feedback appreciated.
> >>> Also there is a new pull request now that I've rolled everything back
> >>> https://github.com/apache/sling-org-apache-sling-api/pull/5
> >>>
> >>>
> >>>
> >>> - Jason
> >>>
> >>> On Mon, Jun 4, 2018, at 2:02 PM, Jason E Bailey wrote:
> >>>> You got it. Thats's what I was attempting to describe and that's the
> >>>> type of filtering we do a lot of.
> >>>>
> >>>> - Jason
> >>>>
> >>>> On Mon, Jun 4, 2018, at 1:58 PM, Daniel Klco wrote:
> >>>>> It seems redundant, but I think they're somewhat different concepts.
> >>> The
> >>>>> Predicate passed into the stream method is for evaluating the Resources
> >>>>> relevant for traversal, whereas (at least I'm assuming) that any
> >>> subsequent
> >>>>> filters would filter the subsequent stream of resources. Having that
> >>> sort
> >>>>> of redundancy would allow you to traverse a structure like the
> >>> following:
> >>>>>
> >>>>> - myasset.jpg (dam:Asset)
> >>>>>   - renditions (nt:folder)
> >>>>>     - original (nt:file)
> >>>>>     - rendition1.jpg (nt:file)
> >>>>>
> >>>>> so if you wanted to get just a stream of the nt:file resources you
> >>> could do:
> >>>>>
> >>>>> myassetResource.stream(maxDepth(2)).filter(isResourceType("nt:file")).
> >>> forEach(e
> >>>>> -> {DO_SOMETHING});
> >>>>>
> >>>>> I like the idea of adding the predicates either in the API or as a
> >>> separate
> >>>>> dependency as there are likely a few common patterns that would be used
> >>>>> quite a bit.
> >>>>>
> >>>>> -Dan
> >>>>>
> >>>>> On Mon, Jun 4, 2018 at 1:31 PM, Jason E Bailey <j...@apache.org> wrote:
> >>>>>
> >>>>>>
> >>>>>>
> >>>>>> - Jason
> >>>>>>
> >>>>>> On Mon, Jun 4, 2018, at 12:35 PM, Daniel Klco wrote:
> >>>>>>
> >>>>>>>
> >>>>>>> Rather than having another parameter, what about providing a
> >>>>>>> ResourceChildrenPredicate? Based on the current API it looks like
> >>> you'd
> >>>>>>> have to provide the current resource to make this work, but it
> >>> seems like
> >>>>>>> it would be very useful to have a predicate which would only allow
> >>> for
> >>>>>> both
> >>>>>>> direct children or children up to a particular depth. I'd see it
> >>> useful
> >>>>>> to
> >>>>>>> provide 2-3 different default predicates to help with common
> >>> activities:
> >>>>>>>
> >>>>>>> ResourceChildrenPredicate - filter the stream of resources based
> >>> on their
> >>>>>>> child status
> >>>>>>> ResourceTypePredicate - filter the stream of resource based on
> >>> their
> >>>>>>> resource type
> >>>>>>> ValuePredicate - filter the stream of resources based on a value
> >>> in the
> >>>>>>> resource's ValueMap
> >>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>> Funny you should mention this. The original ResourceStream object
> >>> came
> >>>>>> from the whiteboard streams project. Which has a whole package
> >>> dedicated
> >>>>>> to defining static predicates. There's even an expression languages
> >>> in
> >>>>>> their as well. However, for filtering, there's already a filter
> >>> method that
> >>>>>> a Stream provides. It's redundant to have a pre-filtered stream.
> >>>>>>
> >>>>>> However, as a limitation on the stream, you can do the same thing. It
> >>>>>> would something like
> >>>>>>
> >>>>>> - resource.stream(CHILD_RESOURCES);
> >>>>>>
> >>>>>> or
> >>>>>>
> >>>>>> - resource.stream(maxDepth(1));
> >>>>>>
> >>>>>> maxDepth being a static method that you've imported from the
> >>> appropriate
> >>>>>> library that provides a Predicate
> >>>>>>
> >>>
> >>
> >>
> >>
> >> -- 
> >> Cheers,
> >> Jörg Hoh,
> >>
> >> http://cqdump.wordpress.com
> >> Twitter: @joerghoh
> -- 
> Carsten Ziegeler
> Adobe Research Switzerland
> cziege...@apache.org

Reply via email to