|
Nuxeo ECM Projects 5.4.3-SNAPSHOT | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.nuxeo.ecm.core.storage.sql.jdbc.NXQLQueryMaker
public class NXQLQueryMaker
Transformer of NXQL queries into underlying SQL queries to the actual database.
The examples below are based on the NXQL statement:
SELECT * FROM File WHERE dc:title = 'abc' AND uid:uid = '123' AND dc:contributors = 'bob' -- multi-valuedIf 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 _HWhen 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.
Nested Class Summary | |
---|---|
static class |
NXQLQueryMaker.DocKind
|
Nested classes/interfaces inherited from interface org.nuxeo.ecm.core.storage.sql.jdbc.QueryMaker |
---|
QueryMaker.Query, QueryMaker.QueryCannotMatchException, QueryMaker.QueryMakerException |
Field Summary | |
---|---|
static String |
TYPE_DOCUMENT
|
static String |
TYPE_RELATION
|
Constructor Summary | |
---|---|
NXQLQueryMaker()
|
Method Summary | |
---|---|
boolean |
accepts(String queryType)
Checks if this query maker accepts a given query. |
QueryMaker.Query |
buildQuery(SQLInfo sqlInfo,
Model model,
Session.PathResolver pathResolver,
String query,
QueryFilter queryFilter,
Object... params)
Builds the query. |
static String |
canonicalXPath(String xpath)
Canonicalizes a Nuxeo-xpath. |
String |
getName()
Gets the name for this query maker. |
static String |
simpleXPath(String xpath)
Turns the xpath into one where all indices have been replaced by *. |
Methods inherited from class java.lang.Object |
---|
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final String TYPE_DOCUMENT
public static final String TYPE_RELATION
Constructor Detail |
---|
public NXQLQueryMaker()
Method Detail |
---|
public String getName()
QueryMaker
getName
in interface QueryMaker
public boolean accepts(String queryType)
QueryMaker
Called first.
accepts
in interface QueryMaker
queryType
- the query
true
if the query is acceptedpublic QueryMaker.Query buildQuery(SQLInfo sqlInfo, Model model, Session.PathResolver pathResolver, String query, QueryFilter queryFilter, Object... params) throws StorageException
QueryMaker
buildQuery
in interface QueryMaker
sqlInfo
- the sql infomodel
- the modelpathResolver
- the path resolverquery
- the queryqueryFilter
- the query filterparams
- additional parameters, maker-specific
StorageException
public static String canonicalXPath(String xpath)
Replaces a/foo[123]/b
with a/123/b
A star or a star followed by digits can be used instead of just the digits as well.
xpath
- the xpath
public static String simpleXPath(String xpath)
xpath
- the xpath
|
Nuxeo ECM Projects 5.4.3-SNAPSHOT | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |