You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-issues@jackrabbit.apache.org by "Thomas Mueller (JIRA)" <ji...@apache.org> on 2017/06/16 08:07:00 UTC

[jira] [Created] (OAK-6359) Change behavior for very complex queries

Thomas Mueller created OAK-6359:
-----------------------------------

             Summary: Change behavior for very complex queries
                 Key: OAK-6359
                 URL: https://issues.apache.org/jira/browse/OAK-6359
             Project: Jackrabbit Oak
          Issue Type: Improvement
            Reporter: Thomas Mueller
             Fix For: 1.8


Very complex queries can cause take a long time to parse, and can possibly cause OOME. It would be good if processing queries automatically stops after some number of loops, after some time, or some amount of memory was used. And then throw an exception "query too complex".

Example query:

{noformat}
//element(*,rep:Authorizable)[ ( (  
 jcr:like(fn:lower-case(fn:name()), 'audio%')
 or jcr:contains(@rep:principalName,'audio*')
 or jcr:contains(@cq:first-name,'audio*')
 or jcr:contains(@cq:last-name,'audio*')
 or jcr:contains(profile/@givenName,'audio*')
 or jcr:contains(profile/@familyName,'audio*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'conference%')
 or jcr:contains(@rep:principalName,'conference*')
 or jcr:contains(@cq:first-name,'conference*')
 or jcr:contains(@cq:last-name,'conference*')
 or jcr:contains(profile/@givenName,'conference*')
 or jcr:contains(profile/@familyName,'conference*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'details:%')
 or jcr:contains(@rep:principalName,'details:*')
 or jcr:contains(@cq:first-name,'details:*')
 or jcr:contains(@cq:last-name,'details:*')
 or jcr:contains(profile/@givenName,'details:*')
 or jcr:contains(profile/@familyName,'details:*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'conference%')
 or jcr:contains(@rep:principalName,'conference*')
 or jcr:contains(@cq:first-name,'conference*')
 or jcr:contains(@cq:last-name,'conference*')
 or jcr:contains(profile/@givenName,'conference*')
 or jcr:contains(profile/@familyName,'conference*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'code:%')
 or jcr:contains(@rep:principalName,'code:*')
 or jcr:contains(@cq:first-name,'code:*')
 or jcr:contains(@cq:last-name,'code:*')
 or jcr:contains(profile/@givenName,'code:*')
 or jcr:contains(profile/@familyName,'code:*') )
 and (  jcr:like(fn:lower-case(fn:name()), '123456%')
 or jcr:contains(@rep:principalName,'123456*')
 or jcr:contains(@cq:first-name,'123456*')
 or jcr:contains(@cq:last-name,'123456*')
 or jcr:contains(profile/@givenName,'123456*')
 or jcr:contains(profile/@familyName,'123456*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'further%')
 or jcr:contains(@rep:principalName,'further*')
 or jcr:contains(@cq:first-name,'further*')
 or jcr:contains(@cq:last-name,'further*')
 or jcr:contains(profile/@givenName,'further*')
 or jcr:contains(profile/@familyName,'further*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'dial%')
 or jcr:contains(@rep:principalName,'dial*')
 or jcr:contains(@cq:first-name,'dial*')
 or jcr:contains(@cq:last-name,'dial*')
 or jcr:contains(profile/@givenName,'dial*')
 or jcr:contains(profile/@familyName,'dial*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'in%')
 or jcr:contains(@rep:principalName,'in*')
 or jcr:contains(@cq:first-name,'in*')
 or jcr:contains(@cq:last-name,'in*')
 or jcr:contains(profile/@givenName,'in*')
 or jcr:contains(profile/@familyName,'in*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'numbers:%')
 or jcr:contains(@rep:principalName,'numbers:*')
 or jcr:contains(@cq:first-name,'numbers:*')
 or jcr:contains(@cq:last-name,'numbers:*')
 or jcr:contains(profile/@givenName,'numbers:*')
 or jcr:contains(profile/@familyName,'numbers:*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'http://wikipedia.org%')
 or jcr:contains(@rep:principalName,'http://wikipedia.org*')
 or jcr:contains(@cq:first-name,'http://wikipedia.org*')
 or jcr:contains(@cq:last-name,'http://wikipedia.org*')
 or jcr:contains(profile/@givenName,'http://wikipedia.org*')
 or jcr:contains(profile/@familyName,'http://wikipedia.org*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'conference%')
 or jcr:contains(@rep:principalName,'conference*')
 or jcr:contains(@cq:first-name,'conference*')
 or jcr:contains(@cq:last-name,'conference*')
 or jcr:contains(profile/@givenName,'conference*')
 or jcr:contains(profile/@familyName,'conference*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'number(s):%')
 or jcr:contains(@rep:principalName,'number(s):*')
 or jcr:contains(@cq:first-name,'number(s):*')
 or jcr:contains(@cq:last-name,'number(s):*')
 or jcr:contains(profile/@givenName,'number(s):*')
 or jcr:contains(profile/@familyName,'number(s):*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'emea:%')
 or jcr:contains(@rep:principalName,'emea:*')
 or jcr:contains(@cq:first-name,'emea:*')
 or jcr:contains(@cq:last-name,'emea:*')
 or jcr:contains(profile/@givenName,'emea:*')
 or jcr:contains(profile/@familyName,'emea:*') )
 and (  jcr:like(fn:lower-case(fn:name()), '%')
 or jcr:contains(@rep:principalName,'*')
 or jcr:contains(@cq:first-name,'*')
 or jcr:contains(@cq:last-name,'*')
 or jcr:contains(profile/@givenName,'*')
 or jcr:contains(profile/@familyName,'*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'test%')
 or jcr:contains(@rep:principalName,'test*')
 or jcr:contains(@cq:first-name,'test*')
 or jcr:contains(@cq:last-name,'test*')
 or jcr:contains(profile/@givenName,'test*')
 or jcr:contains(profile/@familyName,'test*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'to%')
 or jcr:contains(@rep:principalName,'to*')
 or jcr:contains(@cq:first-name,'to*')
 or jcr:contains(@cq:last-name,'to*')
 or jcr:contains(profile/@givenName,'to*')
 or jcr:contains(profile/@familyName,'to*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'join%')
 or jcr:contains(@rep:principalName,'join*')
 or jcr:contains(@cq:first-name,'join*')
 or jcr:contains(@cq:last-name,'join*')
 or jcr:contains(profile/@givenName,'join*')
 or jcr:contains(profile/@familyName,'join*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'the%')
 or jcr:contains(@rep:principalName,'the*')
 or jcr:contains(@cq:first-name,'the*')
 or jcr:contains(@cq:last-name,'the*')
 or jcr:contains(profile/@givenName,'the*')
 or jcr:contains(profile/@familyName,'the*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'meeting:%')
 or jcr:contains(@rep:principalName,'meeting:*')
 or jcr:contains(@cq:first-name,'meeting:*')
 or jcr:contains(@cq:last-name,'meeting:*')
 or jcr:contains(profile/@givenName,'meeting:*')
 or jcr:contains(profile/@familyName,'meeting:*') )
 and (  jcr:like(fn:lower-case(fn:name()), 'http://wikipedia.org%')
 or jcr:contains(@rep:principalName,'http://wikipedia.org*')
 or jcr:contains(@cq:first-name,'http://wikipedia.org*')
 or jcr:contains(@cq:last-name,'http://wikipedia.org*')
 or jcr:contains(profile/@givenName,'http://wikipedia.org*')
 or jcr:contains(profile/@familyName,'http://wikipedia.org*') ) ) ] 
 order by @rep:principalName
{noformat}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)