May 3, 2020
Estimated Post Reading Time ~

Query Builder in Brief

  • QueryBuilder is an API used to build Queries for Query Engine.
  • The generated queries are compatible with HTML forms also.
  • Allows us to add and remove conditions
  • Allows us to copy and paste of Queries
  • Easily extensible
  • This QueryBuilder resides at server side and accepts a query description, creates and runs an XPath query.
  • The Query Description is simply a set of predicates.
  • Predicates are nothing but conditions. For each predicate type there is an evaluator component PredicateEvaluator that knows how to handle that specific predicate for XPath, filtering and facet extraction.
Standard Predicates:
  1. path
  2. property
  3. type
  4. fulltext
  5. range
  6. daterange
  7. nodename
  8. similar
  9. tagid & tag
  10. language
  11. event
  12. Also we can have the following predicates:
  • group of predicates
  • like brackets
  • order by predicates
Example usages
From HTTP Form Post Request: 
Session session = request.getResourceResolver().adaptTo(Session.class); Query query = queryBuilder.createQuery(PredicateGroup.create(request.getParameterMap()), session); SearchResult result = query.getResult(); ...

From key/value map: 
Map map = new HashMap(); map.put("path", "/content"); map.put("type", "nt:file"); Query query = builder.createQuery(PredicateGroup.create(map), session); SearchResult result = query.getResult(); ...
From predicates: 
PredicateGroup group = new PredicateGroup(); group.add(new Predicate("mypath", "path").set("path", "/content")); group.add(new Predicate("mytype", "type").set("type", "nt:file")); Query query = builder.createQuery(group, session); SearchResult result = query.getResult(); ...
QueryBuilder Debugger:
You can test and debug the queries at this URL

http://localhost:4502/libs/cq/search/content/querydebug.html

//Sample Application that retrieves the images from a DAM

<%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false"%>
<%@page import="com.day.cq.tagging.*, com.day.cq.wcm.api.*" %>

<%@page
import ="java.util.*,
javax.jcr.*,
org.apache.sling.api.resource.*,
org.apache.sling.api.scripting.*,
org.apache.sling.jcr.api.*,
com.day.cq.search.*,
com.day.cq.dam.api.Asset,
com.day.cq.search.result.*"
%>

<%        SlingRepository slingRep=sling.getService (SlingRepository.class);
            Session session=slingRep.loginAdministrative (null);
            //Instantiation of Map Object useful for storing the Query Description
Map<String, String> map=new HashMap<String, String>();
QueryBuilder queryBuilder;
            //Writing Query Description that goes to form a Query
map.put ("type", "dam:Asset");
map.put ("property", "jcr:content/metadata/dc:format");
map.put ("property.value", "image/jpeg");
            //resource resolving
queryBuilder=resource.getResourceResolver ().adaptTo(QueryBuilder.class);
            //creating query based on the Query Description
Query query=queryBuilder.createQuery (PredicateGroup.create(map),session);
            //Getting and storing the Results
SearchResult searchRes=query.getResult ();
String assPath=null;
            //Iterating for the no of times the requested resource found
for (Hit hit:searchRes.getHits()){
                       //Storing the path where the resource found
           String path1=hit.getPath ();
                       //Getting the resource from the path found
           Resource rs=resourceResolver.getResource (path1);
                       //Storing the resource into Asset object
          Asset asset=rs.adaptTo (Asset.class);
                      //Getting the path from the Asset object where the fetched data stored
          assPath=asset.getPath();
                      //finally rendering the asset data on the Page
             %><img src="<%=asset.getRendition ("cq5dam.thumbnail.140.100.png").getPath() %>" ></img>
<%
}
%>


By aem4beginner

No comments:

Post a Comment

If you have any doubts or questions, please let us know.