CQ5 QueryBuilder - .adaptTo(Berlin) 2011

Alexander Klimetschek
Alexander KlimetschekSoftware Developer at Adobe
.adaptTo(Berlin)



       CQ5 QueryBuilder
       Alexander Klimetschek | Senior Developer, Day | @alexkli




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   1
Agenda

                                                                          (1) What it looks like & Use Cases
                                                                          (2) Philosophy & Consequences
                                                                          (3) Debugging
                                                                          (4) Queries & Samples
                                                                          (5) Running Queries
                                                                          (6) Facets
                                                                          (7) Extending




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.               2
QueryBuilder - What it looks like

§   Search for jar files, and order them newest first:
                                                       type=nt:file
                                                       nodename=*.jar
                                                       orderby=@jcr:content/jcr:lastModified
                                                       orderby.sort=desc

§   As URL:
                http://localhost:4502/bin/querybuilder.json?
                type=nt:file&nodename=*.jar&
                orderby=@jcr:content/jcr:lastModified&orderby.sort=desc


§   Result as JSON:                                     {
                                                             success: true,
                                                             results: 10,
                                                             total: 155,
                                                             offset: 0,
                                                             hits: [{
                                                               path: "/apps/cloudmgr/install/cq-change-admin-pwd-1.0.1-SNAPSHOT.jar"
                                                               excerpt: "application/java-archive"
                                                               name: "cq-change-admin-pwd-1.0.1-SNAPSHOT.jar"
                                                               ....
                                                             },{...}
                                                             ]
                                                         }



© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.                   3                                        QueryBuilder - AdaptTo(Berlin) 2011
Use Cases!?

§   Advanced query forms
     §   DAM Asset share
     §   form-based elements
     §   „querybuilder UI components“
     §   author can add/remove them
          individually
     §   normal form POST or via AJAX




     §   Content Finder would be cool....




§   Search component in CQ (for facets)
§   Quick AJAX json query from the client side

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   4   QueryBuilder - AdaptTo(Berlin) 2011
Philosophy

§   QueryBuilder is...
     §   an API to build queries for a query engine (JCR XPath underneath)
     §   especially via URL query parameters (GET & POSTs)
     §   compatible with HTML forms
     §   allowing to add/remove conditions („predicates“) individually
     §   allowing copy/paste of queries
     §   easily extensible
     §   providing some goodies (e.g. facets)




§   QueryBuilder is not...
     §   a query engine itself
     §   does not have its own search index
     §   or even cache


© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   5   QueryBuilder - AdaptTo(Berlin) 2011
Consequences: URL parameters

§   Set of key = value pairs
                                                                                                                                        d   er
          Java: hash maps, property files                                                                                       ry buil
     §                                                                                                            ue
                                                                                                            b in/q
                                                                                                     :4 502/ .jar& odified
                                                                                              al host name=* :lastM
                                                                                      :/  /loc e&node nt/jcr
§   Keep it short for GET requests                                               http nt:fil :conte
                                                                                       =
                                                                                  type by=@jcr
                                                                                        r
     §   as fallback, use POST to transport „long“ queries                        orde
     §   but short queries are more readable
     => Avoid duplication in parameter names
     => Allow to write custom „shortcut“ predicates (extensible)

§   Order must be encoded in parameter names
     §   HTML form GETs/POSTs are required to be in order
     §   but the Java servlet spec gives you a hash map....
     => Conflicts with short names above
     => Solution is not very intuitive the first time, but it works

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   6                       QueryBuilder - AdaptTo(Berlin) 2011
More Consequences

§   HTML checkbox behaviour
     §   checked: field=on
     §   not checked: <not sent with the request>
§   Predicates are separate entities
     §   though grouping exists
§   Copy/paste
     §   obvious one, but XPath for JCR does not respect it (limit & offset)
     §   nothing that can only be done through an API call
     §   global settings, given as p.offset=10
§   Extensible
     §   predicates evaluators as OSGi components
     §   SCR registration to associate with predicate name




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   7   QueryBuilder - AdaptTo(Berlin) 2011
QueryBuilder Debugger

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




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   8   QueryBuilder - AdaptTo(Berlin) 2011
Debug logs

§   For all query builder executed queries

§   Set „com.day.cq.search“ to INFO or DEBUG or TRACE level

§   Standard INFO level (shortened):
     15.09.2011 19:17:48.566 *INFO* ...QueryImpl                              executing query (URL):
     nodename=*.jar&type=nt%3afile
     15.09.2011 19:17:48.566 *INFO* ...QueryImpl                              executing query (predicate tree):
     ROOT=group: [
         {nodename=nodename: nodename=*.jar}
         {type=type: type=nt:file}
     ]
     15.09.2011 19:17:48.567 *INFO* ...QueryImpl                              xpath query: //element(*, nt:file)
     15.09.2011 19:17:48.569 *INFO* ...QueryImpl                              xpath query took 3 ms
     15.09.2011 19:17:48.569 *INFO* ...QueryImpl                              filtering predicates: {nodename=nodename: nodename=*.jar}
     15.09.2011 19:17:48.752 *INFO* ...QueryImpl                              >> xpath query returned 5098 results (counted)
     15.09.2011 19:17:48.753 *INFO* ...QueryImpl                              filtering took 184 ms
     15.09.2011 19:17:48.753 *INFO* ...QueryImpl                              >> after filtering there are 155 results
     15.09.2011 19:17:48.753 *INFO* ...QueryImpl                              entire query execution took 187 ms




§   For production, set it to WARN or ERROR ;-)


© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.           9                                  QueryBuilder - AdaptTo(Berlin) 2011
Anatomy of a query


                                                         Predicate name and type and parameter
              Predicates


                                                 type=cq:Page
                                                 property=jcr:content/cq:template
                                       {         property.value=/apps/geometrixx/templates/homepage



                                                                              Parameter        Value

                 Predicate‘s type is mirrored as parameter internally:

                                        type.type=cq:Page
                                        property.property=jcr:content/cq:template
                                        property.value=/apps/geometrixx/templates/homepage



© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.               10           QueryBuilder - AdaptTo(Berlin) 2011
Predicate resolution & execution

§   Internally, a predicate evaluator is resolved
§   Based on the type
§   OSGi component (using factories)



§   Handles:
     §   mapping to xpath (required)
     §   filtering of results
     §   custom ordering mechanism
     §   facet extraction




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   11   QueryBuilder - AdaptTo(Berlin) 2011
Multiple predicates of the same type

§   Fixed numbering scheme
§   Name = <nr>_<type>
§   Allows to define an order
     §   work around hash maps


                              type=cq:Page
                              1_property=jcr:content/cq:template
                              1_property.value=/apps/geometrixx/templates/homepage
                              2_property=jcr:content/jcr:title
                              2_property.value=English




§   No custom names possible!



© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   12   QueryBuilder - AdaptTo(Berlin) 2011
Standard predicates

                §   path                                                          §   tagid & tag
                     §   supports multiple paths                                  §   language
                     §   but beware: can be slow                                       §   page languages
                §   property                                                      §   event
                     §   JCR property                                                  §   calendar
                     §   different operations                                           §   example for shortening
                §   type
                     §   node type
                §   fulltext
                     §   full text search
                §   range
                §   daterange
                §   similar
                     §   rep:similar


© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   13                                QueryBuilder - AdaptTo(Berlin) 2011
Ordering

§   Use (special) orderby predicate
     §   sort ascending by default, use orderby.desc=true for descending

§   (1) Order by JCR properties
     §   orderby=@cq:tags
     §   orderby=@jcr:content/cq:tags

§   (2) Reference predicate by name
     §   orderby=1_property

     §   predicate evaluator must provide ordering
     §   simply a list of properties (=> used in xpath query)
     §   or a custom Comparator (=> run after filtering)

§   Multiple orderings
     §   1_orderby=@cq:tags
     §   2_orderby=@cq:lastModified
     §   3_orderby=nodename


© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   14   QueryBuilder - AdaptTo(Berlin) 2011
Grouping of predicates

§   Special group predicate
                                             fulltext=Management
                                             group.p.or=true
                                             group.1_path=/content/geometrixx/en
                                             group.2_path=/content/dam/geometrixx


§   Like brackets:
     §   (fulltext AND (path=... OR path=...))

§   Nested:
                                             fulltext=Management
                                             group.p.or=true
                                             group.1_group.path=/content/geometrixx/en
                                             group.1_group.type=cq:Page                      a re ! w !
                                                                                        Be w e s l o
                                             group.2_group.path=/content/dam/geometrixx C a n b
                                             group.2_group.type=dam:Asset

     §   (ft AND ( (path= AND type=) OR (path= AND type=) ))

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   15            QueryBuilder - AdaptTo(Berlin) 2011
Running queries

§   Default servlets
     §   JSON: http://localhost:4502/bin/querybuilder.json
     §   Atom feed: http://localhost:4502/bin/querybuilder.feed
     §   iCalendar: http://localhost:4502/bin/querybuilder.ics


§   Java API
                  PredicateGroup root = PredicateGroup.create(request.getParameterMap());
                  Query query = queryBuilder.createQuery(root, session);

                  SearchResult result = query.getResult();
                  for (Hit hit : result.getHits()) {
                      String path = hit.getPath();
                      // ....
                  }




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   16   QueryBuilder - AdaptTo(Berlin) 2011
JSON servlet

§   JSON: http://localhost:4502/bin/querybuilder.json


§   p.hits selects how the hits are written
     §   simple
          §   path, lastmodified, etc. only
     §   full
          §   full sling json rendering of node
          §   by default entire subtree
          §   p.nodedepth=1 as in sling‘s json (0 = infinity)
     §   selective
          §   p.properties is an array of properties to write
          §   just the node itself




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   17   QueryBuilder - AdaptTo(Berlin) 2011
Java API

§   From HTTP request:
                Session session = request.getResourceResolver().adaptTo(Session.class);
                PredicateGroup root = PredicateGroup.create(request.getParameterMap());
                Query query = queryBuilder.createQuery(root, session);

§   From hash map:
                Map map = new HashMap();
                map.put("path", "/content");
                map.put("type", "nt:file");
                Query query = builder.createQuery(PredicateGroup.create(map), session);


§   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);



© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   18   QueryBuilder - AdaptTo(Berlin) 2011
Persisted Queries

§   Store query
     §   in Java properties file format
     §   in the repository
     §   as file node
     §   or as string property

                  Query query = .... // create query normally

                  // store query as file
                  queryBuilder.storeQuery(query, „/content/myquery“, true, session);


                  // load it again
                  Query query = queryBuilder.loadQuery(„/content/myquery“, session);



§   List component allows this



© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   19   QueryBuilder - AdaptTo(Berlin) 2011
Facets

§   Extract set of possible values found in current result
§   Options for a more specific query
§   Facet = set of buckets
     §   Facet = tag
     §   Buckets = product, business, marketing
§   Buckets can also be custom ranges
     §   Facet = daterange
     §   Buckets = yesterday, last week, last year...


                                           Map<String, Facet> facets = result.getFacets();
                                           for (String key : facets.keySet()) {
                                               Facet facet = facets.get(key);
                                               if (facet.getContainsHit()) {
                                                   writer.key(key).array();
                                                   for (Bucket bucket : facet.getBuckets()) {
                                                   }
                                               }
                                           }

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   20                QueryBuilder - AdaptTo(Berlin) 2011
Run new query based on facet/bucket

§   Simple as that:


                        String bucketURL =

                        query.refine(bucket).getPredicates().toURL();


§   Facets are extracted for all predictes in the current query
     §   keep them „empty“ if they should not search


                            type=cq:Page
                            1_property=jcr:content/cq:template
                            1_property.value=/apps/geometrixx/templates/homepage
                            2_property=jcr:content/jcr:title



                                                                   No value for 2_property

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.            21    QueryBuilder - AdaptTo(Berlin) 2011
Extending: Writing custom predicate evaluators

/** @scr.component metatype="no"
 *                factory="com.day.cq.search.eval.PredicateEvaluator/event" */
public class EventPredicateEvaluator extends AbstractPredicateEvaluator {
    public String getXPathExpression(Predicate p, EvaluationContext context) {
        final String from = p.get(„from“);
        final String to = p.get(„to“);

                     // build xpath snippet
                     return „@start = ,...‘ and @end = ,...‘“;
         }

         public String[] getOrderByProperties(Predicate predicate, EvaluationContext ctx) {
             return new String[] { „start“ };
         }

         public boolean canFilter(Predicate predicate, EvaluationContext context) {
             return false;
         }

         public boolean canXpath(Predicate predicate, EvaluationContext context) {
             return true;
         }
}

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   22   QueryBuilder - AdaptTo(Berlin) 2011
Filtering & Facet extraction

§   In addition or alternatively to xpath, a predicate can filter
§   goes over nodes in result and says include or drop

          public boolean includes(Predicate p, Row row, EvaluationContext context)




§   Facet extraction is „lazy“
§   Evaluator returns a FacetExtractor
§   Base implementations available
     §   PropertyFacetExtractor
          §   DistinctValuesFacetExtractor
          §   PredefinedBucketsFacetExtractor




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   23   QueryBuilder - AdaptTo(Berlin) 2011
Documentation

§   Basic docs plus some examples:
     §   http://wem.help.adobe.com/enterprise/en_US/10-0/wem/dam/
          customizing_and_extendingcq5dam/query_builder.html
§   Javadocs
     §   http://wem.help.adobe.com/enterprise/en_US/10-0/wem/javadoc/com/day/cq/search/
          package-summary.html




© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.   24   QueryBuilder - AdaptTo(Berlin) 2011
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
1 of 25

Recommended

HTL(Sightly) - All you need to know by
HTL(Sightly) - All you need to knowHTL(Sightly) - All you need to know
HTL(Sightly) - All you need to knowPrabhdeep Singh
11.9K views41 slides
JavaScript Basics and Best Practices - CC FE & UX by
JavaScript Basics and Best Practices - CC FE & UXJavaScript Basics and Best Practices - CC FE & UX
JavaScript Basics and Best Practices - CC FE & UXJWORKS powered by Ordina
1.3K views57 slides
Introduction to Sightly and Sling Models by
Introduction to Sightly and Sling ModelsIntroduction to Sightly and Sling Models
Introduction to Sightly and Sling ModelsStefano Celentano
10.4K views41 slides
DevNetCreate Workshop - build a react app - React crash course by
DevNetCreate Workshop - build a react app - React crash courseDevNetCreate Workshop - build a react app - React crash course
DevNetCreate Workshop - build a react app - React crash courseCisco DevNet
227 views38 slides
AEM Rich Text Editor (RTE) Deep Dive by
AEM Rich Text Editor (RTE) Deep DiveAEM Rich Text Editor (RTE) Deep Dive
AEM Rich Text Editor (RTE) Deep DiveHanish Bansal
2.3K views32 slides
Spring Boot by
Spring BootSpring Boot
Spring BootJiayun Zhou
2.5K views110 slides

More Related Content

What's hot

Introduction into ES6 JavaScript. by
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.boyney123
1.7K views43 slides
Javascript Basic by
Javascript BasicJavascript Basic
Javascript BasicKang-min Liu
1.8K views36 slides
JSON-LD for RESTful services by
JSON-LD for RESTful servicesJSON-LD for RESTful services
JSON-LD for RESTful servicesMarkus Lanthaler
20.8K views19 slides
AEM - Client Libraries by
AEM - Client LibrariesAEM - Client Libraries
AEM - Client LibrariesPrabhdeep Singh
2.1K views14 slides
JSON-LD: JSON for Linked Data by
JSON-LD: JSON for Linked DataJSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked DataGregg Kellogg
73.4K views50 slides
RESTful API 설계 by
RESTful API 설계RESTful API 설계
RESTful API 설계Jinho Yoo
15.5K views39 slides

What's hot(20)

Introduction into ES6 JavaScript. by boyney123
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.
boyney1231.7K views
JSON-LD: JSON for Linked Data by Gregg Kellogg
JSON-LD: JSON for Linked DataJSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked Data
Gregg Kellogg73.4K views
RESTful API 설계 by Jinho Yoo
RESTful API 설계RESTful API 설계
RESTful API 설계
Jinho Yoo15.5K views
Javascript this keyword by Pham Huy Tung
Javascript this keywordJavascript this keyword
Javascript this keyword
Pham Huy Tung2.3K views
Introduction to SASS by Jon Dean
Introduction to SASSIntroduction to SASS
Introduction to SASS
Jon Dean13K views
ES6 presentation by ritika1
ES6 presentationES6 presentation
ES6 presentation
ritika1564 views
CSS Animations & Transitions by Edward Meehan
CSS Animations & TransitionsCSS Animations & Transitions
CSS Animations & Transitions
Edward Meehan2.3K views
ReactJS presentation by Thanh Tuong
ReactJS presentationReactJS presentation
ReactJS presentation
Thanh Tuong5.7K views
AEM Sightly Template Language by Gabriel Walt
AEM Sightly Template LanguageAEM Sightly Template Language
AEM Sightly Template Language
Gabriel Walt47.6K views
JavaScript Tutorial by Bui Kiet
JavaScript  TutorialJavaScript  Tutorial
JavaScript Tutorial
Bui Kiet8.1K views
Presto: Optimizing Performance of SQL-on-Anything Engine by DataWorks Summit
Presto: Optimizing Performance of SQL-on-Anything EnginePresto: Optimizing Performance of SQL-on-Anything Engine
Presto: Optimizing Performance of SQL-on-Anything Engine
DataWorks Summit1.8K views
jpa-hibernate-presentation by John Slick
jpa-hibernate-presentationjpa-hibernate-presentation
jpa-hibernate-presentation
John Slick1.2K views
Build Your Own CMS with Apache Sling by Bob Paulin
Build Your Own CMS with Apache SlingBuild Your Own CMS with Apache Sling
Build Your Own CMS with Apache Sling
Bob Paulin15.8K views
Apache Spark Data Source V2 with Wenchen Fan and Gengliang Wang by Databricks
Apache Spark Data Source V2 with Wenchen Fan and Gengliang WangApache Spark Data Source V2 with Wenchen Fan and Gengliang Wang
Apache Spark Data Source V2 with Wenchen Fan and Gengliang Wang
Databricks5.8K views

Viewers also liked

Quiery builder by
Quiery builderQuiery builder
Quiery builderDevireddy Ravindrareddy
4K views21 slides
Apache SOLR in AEM 6 by
Apache SOLR in AEM 6Apache SOLR in AEM 6
Apache SOLR in AEM 6Yash Mody
8.9K views16 slides
Basics of Solr and Solr Integration with AEM6 by
Basics of Solr and Solr Integration with AEM6Basics of Solr and Solr Integration with AEM6
Basics of Solr and Solr Integration with AEM6DEEPAK KHETAWAT
6.4K views41 slides
Implementing Site Search in CQ5 / AEM by
Implementing Site Search in CQ5 / AEMImplementing Site Search in CQ5 / AEM
Implementing Site Search in CQ5 / AEMrtpaem
15.6K views17 slides
Virus and antivirus by
Virus and antivirusVirus and antivirus
Virus and antivirusHarshal Joshi
406 views17 slides
AEM (CQ) Dispatcher Caching Webinar 2013 by
AEM (CQ) Dispatcher Caching Webinar 2013AEM (CQ) Dispatcher Caching Webinar 2013
AEM (CQ) Dispatcher Caching Webinar 2013Andrew Khoury
25.2K views66 slides

Viewers also liked(20)

Apache SOLR in AEM 6 by Yash Mody
Apache SOLR in AEM 6Apache SOLR in AEM 6
Apache SOLR in AEM 6
Yash Mody8.9K views
Basics of Solr and Solr Integration with AEM6 by DEEPAK KHETAWAT
Basics of Solr and Solr Integration with AEM6Basics of Solr and Solr Integration with AEM6
Basics of Solr and Solr Integration with AEM6
DEEPAK KHETAWAT6.4K views
Implementing Site Search in CQ5 / AEM by rtpaem
Implementing Site Search in CQ5 / AEMImplementing Site Search in CQ5 / AEM
Implementing Site Search in CQ5 / AEM
rtpaem15.6K views
AEM (CQ) Dispatcher Caching Webinar 2013 by Andrew Khoury
AEM (CQ) Dispatcher Caching Webinar 2013AEM (CQ) Dispatcher Caching Webinar 2013
AEM (CQ) Dispatcher Caching Webinar 2013
Andrew Khoury25.2K views
Query Analyser , SQL Server Groups, Transact –SQL by Komal Batra
Query Analyser , SQL Server Groups, Transact –SQLQuery Analyser , SQL Server Groups, Transact –SQL
Query Analyser , SQL Server Groups, Transact –SQL
Komal Batra538 views
Addmi 10-query builder by odanyboy
Addmi 10-query  builderAddmi 10-query  builder
Addmi 10-query builder
odanyboy478 views
Addmi 09.5-analysis ui-host-grouping by odanyboy
Addmi 09.5-analysis ui-host-groupingAddmi 09.5-analysis ui-host-grouping
Addmi 09.5-analysis ui-host-grouping
odanyboy465 views
Do you need an external search platform for Adobe Experience Manager? by therealgaston
Do you need an external search platform for Adobe Experience Manager?Do you need an external search platform for Adobe Experience Manager?
Do you need an external search platform for Adobe Experience Manager?
therealgaston2.2K views
Omnisearch in AEM 6.2 - Search All the Things by Justin Edelson
Omnisearch in AEM 6.2 - Search All the ThingsOmnisearch in AEM 6.2 - Search All the Things
Omnisearch in AEM 6.2 - Search All the Things
Justin Edelson4K views
Aem dispatcher – tips & tricks by Ashokkumar T A
Aem dispatcher – tips & tricksAem dispatcher – tips & tricks
Aem dispatcher – tips & tricks
Ashokkumar T A5.4K views
AEM (CQ) Dispatcher Security and CDN+Browser Caching by Andrew Khoury
AEM (CQ) Dispatcher Security and CDN+Browser CachingAEM (CQ) Dispatcher Security and CDN+Browser Caching
AEM (CQ) Dispatcher Security and CDN+Browser Caching
Andrew Khoury26.1K views
AEM Best Practices for Component Development by Gabriel Walt
AEM Best Practices for Component DevelopmentAEM Best Practices for Component Development
AEM Best Practices for Component Development
Gabriel Walt17.7K views
Kanban boards step by step by Giulio Roggero
Kanban boards step by stepKanban boards step by step
Kanban boards step by step
Giulio Roggero259.6K views
Introduction of Cloud computing by Rkrishna Mishra
Introduction of Cloud computingIntroduction of Cloud computing
Introduction of Cloud computing
Rkrishna Mishra387.4K views
How to Make Awesome SlideShares: Tips & Tricks by SlideShare
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
SlideShare3M views
Getting Started With SlideShare by SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
SlideShare4M views

Similar to CQ5 QueryBuilder - .adaptTo(Berlin) 2011

GlassFish REST Administration Backend by
GlassFish REST Administration BackendGlassFish REST Administration Backend
GlassFish REST Administration BackendArun Gupta
1.6K views39 slides
GlassFish REST Administration Backend at JavaOne India 2012 by
GlassFish REST Administration Backend at JavaOne India 2012GlassFish REST Administration Backend at JavaOne India 2012
GlassFish REST Administration Backend at JavaOne India 2012Arun Gupta
2.1K views38 slides
Writing Plugged-in Java EE Apps: Jason Lee by
Writing Plugged-in Java EE Apps: Jason LeeWriting Plugged-in Java EE Apps: Jason Lee
Writing Plugged-in Java EE Apps: Jason Leejaxconf
330 views18 slides
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se... by
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...Ivanti
314 views57 slides
BP-6 Repository Customization Best Practices by
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesAlfresco Software
1.2K views36 slides
Java EE 6 workshop at Dallas Tech Fest 2011 by
Java EE 6 workshop at Dallas Tech Fest 2011Java EE 6 workshop at Dallas Tech Fest 2011
Java EE 6 workshop at Dallas Tech Fest 2011Arun Gupta
1.2K views39 slides

Similar to CQ5 QueryBuilder - .adaptTo(Berlin) 2011(20)

GlassFish REST Administration Backend by Arun Gupta
GlassFish REST Administration BackendGlassFish REST Administration Backend
GlassFish REST Administration Backend
Arun Gupta1.6K views
GlassFish REST Administration Backend at JavaOne India 2012 by Arun Gupta
GlassFish REST Administration Backend at JavaOne India 2012GlassFish REST Administration Backend at JavaOne India 2012
GlassFish REST Administration Backend at JavaOne India 2012
Arun Gupta2.1K views
Writing Plugged-in Java EE Apps: Jason Lee by jaxconf
Writing Plugged-in Java EE Apps: Jason LeeWriting Plugged-in Java EE Apps: Jason Lee
Writing Plugged-in Java EE Apps: Jason Lee
jaxconf330 views
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se... by Ivanti
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
UEMB200: Next Generation of Endpoint Management Architecture and Discovery Se...
Ivanti314 views
BP-6 Repository Customization Best Practices by Alfresco Software
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
Alfresco Software1.2K views
Java EE 6 workshop at Dallas Tech Fest 2011 by Arun Gupta
Java EE 6 workshop at Dallas Tech Fest 2011Java EE 6 workshop at Dallas Tech Fest 2011
Java EE 6 workshop at Dallas Tech Fest 2011
Arun Gupta1.2K views
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe) by mfrancis
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
mfrancis320 views
Cloud Best Practices by Eric Bottard
Cloud Best PracticesCloud Best Practices
Cloud Best Practices
Eric Bottard1.3K views
Boston 2011 OTN Developer Days - Java EE 6 by Arun Gupta
Boston 2011 OTN Developer Days - Java EE 6Boston 2011 OTN Developer Days - Java EE 6
Boston 2011 OTN Developer Days - Java EE 6
Arun Gupta1.1K views
Gradleintroduction 111010130329-phpapp01 by Tino Isnich
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
Tino Isnich364 views
[Coscup 2012] JavascriptMVC by Alive Kuo
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
Alive Kuo1.3K views
Plugin-based software design with Ruby and RubyGems by Sadayuki Furuhashi
Plugin-based software design with Ruby and RubyGemsPlugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGems
Sadayuki Furuhashi7.9K views
Google AppEngine (GAE/J) - Introduction and Overview from a Java Guy by Max Völkel
Google AppEngine (GAE/J) - Introduction and Overview from a Java GuyGoogle AppEngine (GAE/J) - Introduction and Overview from a Java Guy
Google AppEngine (GAE/J) - Introduction and Overview from a Java Guy
Max Völkel1.4K views
12 core technologies you should learn, love, and hate to be a 'real' technocrat by Jonathan Linowes
12 core technologies you should learn, love, and hate to be a 'real' technocrat12 core technologies you should learn, love, and hate to be a 'real' technocrat
12 core technologies you should learn, love, and hate to be a 'real' technocrat
Jonathan Linowes911 views

Recently uploaded

Info Session November 2023.pdf by
Info Session November 2023.pdfInfo Session November 2023.pdf
Info Session November 2023.pdfAleksandraKoprivica4
12 views15 slides
Business Analyst Series 2023 - Week 3 Session 5 by
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5DianaGray10
248 views20 slides
Piloting & Scaling Successfully With Microsoft Viva by
Piloting & Scaling Successfully With Microsoft VivaPiloting & Scaling Successfully With Microsoft Viva
Piloting & Scaling Successfully With Microsoft VivaRichard Harbridge
12 views160 slides
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N... by
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...James Anderson
85 views32 slides
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...Bernd Ruecker
37 views69 slides
handbook for web 3 adoption.pdf by
handbook for web 3 adoption.pdfhandbook for web 3 adoption.pdf
handbook for web 3 adoption.pdfLiveplex
22 views16 slides

Recently uploaded(20)

Business Analyst Series 2023 - Week 3 Session 5 by DianaGray10
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5
DianaGray10248 views
Piloting & Scaling Successfully With Microsoft Viva by Richard Harbridge
Piloting & Scaling Successfully With Microsoft VivaPiloting & Scaling Successfully With Microsoft Viva
Piloting & Scaling Successfully With Microsoft Viva
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N... by James Anderson
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
James Anderson85 views
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by Bernd Ruecker
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
Bernd Ruecker37 views
handbook for web 3 adoption.pdf by Liveplex
handbook for web 3 adoption.pdfhandbook for web 3 adoption.pdf
handbook for web 3 adoption.pdf
Liveplex22 views
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ... by Jasper Oosterveld
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf by Dr. Jimmy Schwarzkopf
STKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdfSTKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdf
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf
Special_edition_innovator_2023.pdf by WillDavies22
Special_edition_innovator_2023.pdfSpecial_edition_innovator_2023.pdf
Special_edition_innovator_2023.pdf
WillDavies2217 views
HTTP headers that make your website go faster - devs.gent November 2023 by Thijs Feryn
HTTP headers that make your website go faster - devs.gent November 2023HTTP headers that make your website go faster - devs.gent November 2023
HTTP headers that make your website go faster - devs.gent November 2023
Thijs Feryn22 views
Transcript: The Details of Description Techniques tips and tangents on altern... by BookNet Canada
Transcript: The Details of Description Techniques tips and tangents on altern...Transcript: The Details of Description Techniques tips and tangents on altern...
Transcript: The Details of Description Techniques tips and tangents on altern...
BookNet Canada136 views
Five Things You SHOULD Know About Postman by Postman
Five Things You SHOULD Know About PostmanFive Things You SHOULD Know About Postman
Five Things You SHOULD Know About Postman
Postman33 views

CQ5 QueryBuilder - .adaptTo(Berlin) 2011

  • 1. .adaptTo(Berlin) CQ5 QueryBuilder Alexander Klimetschek | Senior Developer, Day | @alexkli © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 1
  • 2. Agenda (1) What it looks like & Use Cases (2) Philosophy & Consequences (3) Debugging (4) Queries & Samples (5) Running Queries (6) Facets (7) Extending © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 2
  • 3. QueryBuilder - What it looks like § Search for jar files, and order them newest first: type=nt:file nodename=*.jar orderby=@jcr:content/jcr:lastModified orderby.sort=desc § As URL: http://localhost:4502/bin/querybuilder.json? type=nt:file&nodename=*.jar& orderby=@jcr:content/jcr:lastModified&orderby.sort=desc § Result as JSON: { success: true, results: 10, total: 155, offset: 0, hits: [{ path: "/apps/cloudmgr/install/cq-change-admin-pwd-1.0.1-SNAPSHOT.jar" excerpt: "application/java-archive" name: "cq-change-admin-pwd-1.0.1-SNAPSHOT.jar" .... },{...} ] } © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 3 QueryBuilder - AdaptTo(Berlin) 2011
  • 4. Use Cases!? § Advanced query forms § DAM Asset share § form-based elements § „querybuilder UI components“ § author can add/remove them individually § normal form POST or via AJAX § Content Finder would be cool.... § Search component in CQ (for facets) § Quick AJAX json query from the client side © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 4 QueryBuilder - AdaptTo(Berlin) 2011
  • 5. Philosophy § QueryBuilder is... § an API to build queries for a query engine (JCR XPath underneath) § especially via URL query parameters (GET & POSTs) § compatible with HTML forms § allowing to add/remove conditions („predicates“) individually § allowing copy/paste of queries § easily extensible § providing some goodies (e.g. facets) § QueryBuilder is not... § a query engine itself § does not have its own search index § or even cache © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 5 QueryBuilder - AdaptTo(Berlin) 2011
  • 6. Consequences: URL parameters § Set of key = value pairs d er Java: hash maps, property files ry buil § ue b in/q :4 502/ .jar& odified al host name=* :lastM :/ /loc e&node nt/jcr § Keep it short for GET requests http nt:fil :conte = type by=@jcr r § as fallback, use POST to transport „long“ queries orde § but short queries are more readable => Avoid duplication in parameter names => Allow to write custom „shortcut“ predicates (extensible) § Order must be encoded in parameter names § HTML form GETs/POSTs are required to be in order § but the Java servlet spec gives you a hash map.... => Conflicts with short names above => Solution is not very intuitive the first time, but it works © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 6 QueryBuilder - AdaptTo(Berlin) 2011
  • 7. More Consequences § HTML checkbox behaviour § checked: field=on § not checked: <not sent with the request> § Predicates are separate entities § though grouping exists § Copy/paste § obvious one, but XPath for JCR does not respect it (limit & offset) § nothing that can only be done through an API call § global settings, given as p.offset=10 § Extensible § predicates evaluators as OSGi components § SCR registration to associate with predicate name © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 7 QueryBuilder - AdaptTo(Berlin) 2011
  • 8. QueryBuilder Debugger § http://localhost:4502/libs/cq/search/content/querydebug.html © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 8 QueryBuilder - AdaptTo(Berlin) 2011
  • 9. Debug logs § For all query builder executed queries § Set „com.day.cq.search“ to INFO or DEBUG or TRACE level § Standard INFO level (shortened): 15.09.2011 19:17:48.566 *INFO* ...QueryImpl executing query (URL): nodename=*.jar&type=nt%3afile 15.09.2011 19:17:48.566 *INFO* ...QueryImpl executing query (predicate tree): ROOT=group: [ {nodename=nodename: nodename=*.jar} {type=type: type=nt:file} ] 15.09.2011 19:17:48.567 *INFO* ...QueryImpl xpath query: //element(*, nt:file) 15.09.2011 19:17:48.569 *INFO* ...QueryImpl xpath query took 3 ms 15.09.2011 19:17:48.569 *INFO* ...QueryImpl filtering predicates: {nodename=nodename: nodename=*.jar} 15.09.2011 19:17:48.752 *INFO* ...QueryImpl >> xpath query returned 5098 results (counted) 15.09.2011 19:17:48.753 *INFO* ...QueryImpl filtering took 184 ms 15.09.2011 19:17:48.753 *INFO* ...QueryImpl >> after filtering there are 155 results 15.09.2011 19:17:48.753 *INFO* ...QueryImpl entire query execution took 187 ms § For production, set it to WARN or ERROR ;-) © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 9 QueryBuilder - AdaptTo(Berlin) 2011
  • 10. Anatomy of a query Predicate name and type and parameter Predicates type=cq:Page property=jcr:content/cq:template { property.value=/apps/geometrixx/templates/homepage Parameter Value Predicate‘s type is mirrored as parameter internally: type.type=cq:Page property.property=jcr:content/cq:template property.value=/apps/geometrixx/templates/homepage © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 10 QueryBuilder - AdaptTo(Berlin) 2011
  • 11. Predicate resolution & execution § Internally, a predicate evaluator is resolved § Based on the type § OSGi component (using factories) § Handles: § mapping to xpath (required) § filtering of results § custom ordering mechanism § facet extraction © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 11 QueryBuilder - AdaptTo(Berlin) 2011
  • 12. Multiple predicates of the same type § Fixed numbering scheme § Name = <nr>_<type> § Allows to define an order § work around hash maps type=cq:Page 1_property=jcr:content/cq:template 1_property.value=/apps/geometrixx/templates/homepage 2_property=jcr:content/jcr:title 2_property.value=English § No custom names possible! © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 12 QueryBuilder - AdaptTo(Berlin) 2011
  • 13. Standard predicates § path § tagid & tag § supports multiple paths § language § but beware: can be slow § page languages § property § event § JCR property § calendar § different operations § example for shortening § type § node type § fulltext § full text search § range § daterange § similar § rep:similar © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 13 QueryBuilder - AdaptTo(Berlin) 2011
  • 14. Ordering § Use (special) orderby predicate § sort ascending by default, use orderby.desc=true for descending § (1) Order by JCR properties § orderby=@cq:tags § orderby=@jcr:content/cq:tags § (2) Reference predicate by name § orderby=1_property § predicate evaluator must provide ordering § simply a list of properties (=> used in xpath query) § or a custom Comparator (=> run after filtering) § Multiple orderings § 1_orderby=@cq:tags § 2_orderby=@cq:lastModified § 3_orderby=nodename © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 14 QueryBuilder - AdaptTo(Berlin) 2011
  • 15. Grouping of predicates § Special group predicate fulltext=Management group.p.or=true group.1_path=/content/geometrixx/en group.2_path=/content/dam/geometrixx § Like brackets: § (fulltext AND (path=... OR path=...)) § Nested: fulltext=Management group.p.or=true group.1_group.path=/content/geometrixx/en group.1_group.type=cq:Page a re ! w ! Be w e s l o group.2_group.path=/content/dam/geometrixx C a n b group.2_group.type=dam:Asset § (ft AND ( (path= AND type=) OR (path= AND type=) )) © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 15 QueryBuilder - AdaptTo(Berlin) 2011
  • 16. Running queries § Default servlets § JSON: http://localhost:4502/bin/querybuilder.json § Atom feed: http://localhost:4502/bin/querybuilder.feed § iCalendar: http://localhost:4502/bin/querybuilder.ics § Java API PredicateGroup root = PredicateGroup.create(request.getParameterMap()); Query query = queryBuilder.createQuery(root, session); SearchResult result = query.getResult(); for (Hit hit : result.getHits()) { String path = hit.getPath(); // .... } © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 16 QueryBuilder - AdaptTo(Berlin) 2011
  • 17. JSON servlet § JSON: http://localhost:4502/bin/querybuilder.json § p.hits selects how the hits are written § simple § path, lastmodified, etc. only § full § full sling json rendering of node § by default entire subtree § p.nodedepth=1 as in sling‘s json (0 = infinity) § selective § p.properties is an array of properties to write § just the node itself © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 17 QueryBuilder - AdaptTo(Berlin) 2011
  • 18. Java API § From HTTP request: Session session = request.getResourceResolver().adaptTo(Session.class); PredicateGroup root = PredicateGroup.create(request.getParameterMap()); Query query = queryBuilder.createQuery(root, session); § From hash map: Map map = new HashMap(); map.put("path", "/content"); map.put("type", "nt:file"); Query query = builder.createQuery(PredicateGroup.create(map), session); § 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); © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 18 QueryBuilder - AdaptTo(Berlin) 2011
  • 19. Persisted Queries § Store query § in Java properties file format § in the repository § as file node § or as string property Query query = .... // create query normally // store query as file queryBuilder.storeQuery(query, „/content/myquery“, true, session); // load it again Query query = queryBuilder.loadQuery(„/content/myquery“, session); § List component allows this © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 19 QueryBuilder - AdaptTo(Berlin) 2011
  • 20. Facets § Extract set of possible values found in current result § Options for a more specific query § Facet = set of buckets § Facet = tag § Buckets = product, business, marketing § Buckets can also be custom ranges § Facet = daterange § Buckets = yesterday, last week, last year... Map<String, Facet> facets = result.getFacets(); for (String key : facets.keySet()) { Facet facet = facets.get(key); if (facet.getContainsHit()) { writer.key(key).array(); for (Bucket bucket : facet.getBuckets()) { } } } © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 20 QueryBuilder - AdaptTo(Berlin) 2011
  • 21. Run new query based on facet/bucket § Simple as that: String bucketURL = query.refine(bucket).getPredicates().toURL(); § Facets are extracted for all predictes in the current query § keep them „empty“ if they should not search type=cq:Page 1_property=jcr:content/cq:template 1_property.value=/apps/geometrixx/templates/homepage 2_property=jcr:content/jcr:title No value for 2_property © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 21 QueryBuilder - AdaptTo(Berlin) 2011
  • 22. Extending: Writing custom predicate evaluators /** @scr.component metatype="no" * factory="com.day.cq.search.eval.PredicateEvaluator/event" */ public class EventPredicateEvaluator extends AbstractPredicateEvaluator { public String getXPathExpression(Predicate p, EvaluationContext context) { final String from = p.get(„from“); final String to = p.get(„to“); // build xpath snippet return „@start = ,...‘ and @end = ,...‘“; } public String[] getOrderByProperties(Predicate predicate, EvaluationContext ctx) { return new String[] { „start“ }; } public boolean canFilter(Predicate predicate, EvaluationContext context) { return false; } public boolean canXpath(Predicate predicate, EvaluationContext context) { return true; } } © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 22 QueryBuilder - AdaptTo(Berlin) 2011
  • 23. Filtering & Facet extraction § In addition or alternatively to xpath, a predicate can filter § goes over nodes in result and says include or drop public boolean includes(Predicate p, Row row, EvaluationContext context) § Facet extraction is „lazy“ § Evaluator returns a FacetExtractor § Base implementations available § PropertyFacetExtractor § DistinctValuesFacetExtractor § PredefinedBucketsFacetExtractor © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 23 QueryBuilder - AdaptTo(Berlin) 2011
  • 24. Documentation § Basic docs plus some examples: § http://wem.help.adobe.com/enterprise/en_US/10-0/wem/dam/ customizing_and_extendingcq5dam/query_builder.html § Javadocs § http://wem.help.adobe.com/enterprise/en_US/10-0/wem/javadoc/com/day/cq/search/ package-summary.html © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 24 QueryBuilder - AdaptTo(Berlin) 2011
  • 25. © 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n