Class NXQLQueryMaker

  • All Implemented Interfaces:
    QueryMaker
    Direct Known Subclasses:
    TagQueryMaker

    public class NXQLQueryMaker
    extends Object
    implements QueryMaker
    Transformer of NXQL queries into underlying SQL queries to the actual database.

    The examples below are using the NXQL statement syntax:

     SELECT * FROM File
     WHERE
       dc:title = 'abc'
       AND uid:uid = '123'
       AND dc:contributors = 'bob'    -- multi-valued
     
    If there are no proxies (ecm:isProxy = 0) we get:
     SELECT hierarchy.id
       FROM hierarchy
       LEFT JOIN dublincore ON hierarchy.id = dublincore.id
       LEFT JOIN uid ON hierarchy.id = uid.id
     WHERE
       hierarchy.primarytype IN ('File', 'SubFile')
       AND dublincore.title = 'abc'
       AND uid.uid = '123'
       AND EXISTS (SELECT 1 FROM dc_contributors WHERE hierarchy.id = dc_contributors.id
                   AND dc_contributors.item = 'bob')
       AND NX_ACCESS_ALLOWED(hierarchy.id, 'user1|user2', 'perm1|perm2')
     
    The data tables (dublincore, uid) are joined using a LEFT JOIN, as the schema may not be present on all documents but this shouldn't prevent the WHERE clause from being evaluated. Complex properties are matched using an EXISTS and a subselect. When proxies are matched (ecm:isProxy = 1) there are two additional FULL JOINs. Security checks, id, name, parents and path use the base hierarchy (_H), but all other data use the joined hierarchy.
     SELECT _H.id
       FROM hierarchy _H
       JOIN proxies ON _H.id = proxies.id                     -- proxy full join
       JOIN hierarchy ON hierarchy.id = proxies.targetid      -- proxy full join
       LEFT JOIN dublincore ON hierarchy.id = dublincore.id
       LEFT JOIN uid ON hierarchy.id = uid.id
     WHERE
       hierarchy.primarytype IN ('File', 'SubFile')
       AND dublincore.title = 'abc'
       AND uid.uid = '123'
       AND EXISTS (SELECT 1 FROM dc_contributors WHERE hierarchy.id = dc_contributors.id
                   AND dc_contributors.item = 'bob')
       AND NX_ACCESS_ALLOWED(_H.id, 'user1|user2', 'perm1|perm2') -- uses _H
     
    When both normal documents and proxies are matched, we UNION ALL the two queries. If an ORDER BY is requested, then columns from the inner SELECTs have to be aliased so that an outer ORDER BY can user their names.
    Author:
    Florent Guillaume