This is an automated email from the ASF dual-hosted git repository.

jeb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-site.git


The following commit(s) were added to refs/heads/master by this push:
     new 2430a6d  added documentation for the sling.resource.filter bundle
2430a6d is described below

commit 2430a6da1afe35da8cb925a492af9f762e5c5174
Author: Jason E Bailey <[email protected]>
AuthorDate: Fri Jul 12 20:12:12 2019 -0400

    added documentation for the sling.resource.filter bundle
---
 src/main/jbake/content/documentation/bundles.md    |   1 +
 .../documentation/bundles/resource-filter.md       | 141 +++++++++++++++++++++
 2 files changed, 142 insertions(+)

diff --git a/src/main/jbake/content/documentation/bundles.md 
b/src/main/jbake/content/documentation/bundles.md
index 3e87c00..de7532c 100644
--- a/src/main/jbake/content/documentation/bundles.md
+++ b/src/main/jbake/content/documentation/bundles.md
@@ -20,6 +20,7 @@ in their README files instead of here.
 * [Validation](/documentation/bundles/validation.html)
 * [Repository 
Initialization](/documentation/bundles/repository-initialization.html)
 * [Distribution](/documentation/bundles/distribution.html)
+* [Filtering Resource Streams](/documentation/bundles/resource-filter.html)
 
 ## Resource Providers
 
diff --git a/src/main/jbake/content/documentation/bundles/resource-filter.md 
b/src/main/jbake/content/documentation/bundles/resource-filter.md
new file mode 100644
index 0000000..f59885f
--- /dev/null
+++ b/src/main/jbake/content/documentation/bundles/resource-filter.md
@@ -0,0 +1,141 @@
+title=Resource Filter          
+type=page
+status=published
+tags=requests
+~~~~~~
+
+[TOC]
+
+## Introduction
+Resource Filter bundle provides a number of services and utilities to identify 
and filter resources in a resource tree.
+
+## Resource Predicate Service
+`ResourcePredicate` is a service that allows you to convert a string that 
defines a simple matching requirements into a `Predicate<Resource>` for use 
with the Collections and the Streams Java API. In addition it also allows you 
to add parameters to the underlying context that the script will use.
+
+    @Reference
+    ResourcePredicates rp;
+    
+    Predicate<Resource> predicate = rp.parse("[jcr:content/created] < 
2013-08-08T16:32");
+    resourceCollection.stream().filter(predicate).forEach(
+        resource -> System.out.println(resource.getPath())
+    );
+
+## Resource Stream
+`ResourceStream` is a general utility to provide a `Stream<Resource>` which 
traverses a resource and it's subtree. The implementation takes a 
`Predicate<Resource>` object as part of the stream creation to define a branch 
selector that controls which children of a resource are followed.
+
+In addition there is a `getChildren(Predicate)` method which returns a 
filtered list of children of the given resource.
+
+
+## Resource Filter Stream
+`ResourceFilterStream` combines the `ResourceStream` functionality with the 
`ResourcePredicates` service to provide an ability to define a 
`Stream<Resource>` that follows specific child pages and looks for specific 
Resources as defined by the resources filter script. The ResourceStreamFilter 
is access by adaption.
+
+
+    ResourceFilterStream rfs = resource.adaptTo(ResourceFilterStream.class);
+    
+    rfs
+      .setBranchSelector("[jcr:primaryType] == 'cq:Page'")
+      .setChildSelector("[jcr:content/sling:resourceType] != 
'apps/components/page/folder'")
+      .stream()
+      .collect(Collections.toList());
+
+## ResourceFilter Scripting
+
+### Operators
+
+| Name        | Comparison Type | Description                                |
+| ---------        | --------------- | --------------------------------        
   |
+| and              | NA              | Logical AND                             
   |
+| &&               | NA              | Logical AND                             
   |
+| or               | NA              | Logical OR                              
   |
+|&#124;&#124;      | NA              | Logical OR                              
   |
+| ==               | String          | Equal operator for Strings              
   |
+| <                | Number          | Less than operator for Numbers          
   |
+| <=               | Number          | Less than or equal operator for Numbers 
   |
+| >                | Number          | Greater than operator for Numbers       
   |
+| >=               | Number          | Greater than or equal operator for 
Numbers |
+| !=               | String          | Is not equal to for Strings             
   |
+| ~=               | String - Regex  | Regex match against String              
   |
+| less than        | Number          | less than operator for Numbers          
   |
+| greater than     | Number          | greater than operator for Numbers       
   |
+| is               | String          | Equal operator for Strings              
   |
+| is not           | String          | Is not equal operator for Strings       
   |
+| like             | String - Regex  | Regex match against String              
   |
+| is like          | String - Regex  | Regex match against String              
   |
+| not like         | String - Regex  | Regex does not match String             
   |
+| contains         | String[]        | String[] contains all of items          
   |
+| contains not     | String[]        | String[] does not contain all of the 
items |
+| contains any     | String[]        | String[] contains at least one of items 
   |
+| contains not any | String[]        | String[] does not contain any of the 
items |
+### Logical Operators
+The 'and' and 'or' operators are logical operators that string together 
conditions. 'And' operators take precedence. 'Or' operators evaluate from left 
to right
+
+
+### Values
+
+Values for comparison are obtained through multiple methods
+
+| Method       | Description                               |
+| ----------   | ----------------------------------------  |
+| Literal      | Single(') or double (") quoted text in the query will be 
interpreted as a String. Boolean values of *true* and *false* will be 
translated to a String. |
+| Property     | A String between square brackets '[',']'s will be interpreted 
as a property value and will be retrieved from the Resource using the get 
method |
+| Function     | A string followed by parens containing an optional comma 
separated list of values. |
+
+### Types
+All types are converted to either a String or a Number. For direct equivalence 
the comparison is done as a String. For relational comparisons the object will 
be adapted to a number.
+
+### Dates/Instants
+Dates are special, there are multiple ways to enter a date.
+
+In line, as part of the query, a date can be identified as a string that 
conforms to a standard ISO-8601 date time.
+
+> '2013-08-08T16:32:59.000'
+>
+> '2013-08-08T16:32:59'
+>
+> '2013-08-08T16:32'
+
+Are all valid date representations that are defaulting to the UTC timezone.
+
+For a ISO8601 date with timezone offset use the date function.
+
+> date('2013-08-08T16:32:59.000+02:00')
+
+If you need a different date format then the date function can accommodate that
+
+> date('2013-08-08','yyyy-MM-dd')
+
+Or you can add your own custom Function 
+
+Dates are transitionally represented as a java.util.Instant which is then 
converted to a String in ISO-8601 format or as a Long number based on the type 
of comparison. The number representing the time in milliseconds since the EPOCH 
UTC region
+
+### Functions
+
+Functions provide the ability to add additional functionality to the Filter 
language. A Function is written in the format
+
+> string '(' comma, separated, list() ')'
+
+All functions MUST return either a String, a Number, or an Instant. Strings 
are assumed to be using the default UTF encoding.
+
+OOTB Functions are:
+
+| Name  | Arguments | Returns | Description                                    
                |
+| ----  | --------- | ------- | -----------------------------------            
                |
+| name  | none      | String  | Provides the name of the resource              
                |
+| date  | 0 - 2     | Instant | First argument is string representation of the 
date, second argument is a standard Java DateFormat representation of the 
value. No argument returns the current time. |
+| path  | none      | String  | path of the tested resource        |
+
+### Parameters
+The ResourceFilter and ResourceFilteStream can have key value pairs added so 
that the values may be used as part of the script resolution. Parameters are 
accessed by using the dollar sign '$'
+
+
+    rfs.setBranchSelector("[jcr:content/sling:resourceType] != 
$type").addParam("type","apps/components/page/folder");
+
+
+## Optimizing Traversals
+Similar to indexing in a query there are strategies that you can do within a 
tree traversal so that traversals can be done in an efficient manner across a 
large number of resources. The following strategies will assist in traversal 
optimization.
+
+### Limit traversal paths
+In a naive implementation of a tree traversal the traversal occurs across all 
nodes in the tree regardless of the ability of the tree structure to support 
the nodes that are being looked for. An example of this is a tree of Page 
resources that have have a child node of jcr:content which contains a subtree 
of data to define the page structure. If the jcr:content node is not capable of 
having a child resource of type Page and the goal of the traversal is to 
identify Page resources that mat [...]
+  
+### Limit memory consumption
+The instantiation of a Resource object from the underlying ResourceResolver is 
a non trivial consumption of memory. When the focus of a tree traversal is 
obtaining information from thousands of Resources, an effective method is to 
extract the information as part of the stream processing or utilizing the 
forEach method of the ResourceStream object which allows the resource to be 
garbage collected in an efficient manner. 

Reply via email to