1. good to know.
2. why?

- Jason

On Wed, Jun 6, 2018, at 9:54 AM, Carsten Ziegeler wrote:
> Forgot one thing: each time we change the resource api package, we need
> to re-release the resource resolver (although we might not need to
> implement anything there) - which is another indicator whether the
> resource api package is a good candidate or not
> 
> Regards
> 
> Carsten
> 
> 
> 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