[ 
https://issues.apache.org/jira/browse/JCR-3082?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alex Parvulescu updated JCR-3082:
---------------------------------

    Attachment: JCR-3082.patch

It would appear that the DescendantSelfAxisScorer does not respect the 
DocIdSetIterator API on the advance() method.

The BooleanScorer2 has 2 scorers: a DescendantSelfAxisScorer and a MultiScorer.
When the MultiScorer is finished, the BooleanScorer2 will call advance on the 
DescendantSelfAxisScorer with a Integer.MAX_VALUE.

Because the DescendantSelfAxisScorer does not respect the api, instead of 
exausting the scorer, it only calls "subScorer.nextDoc()" once, thus reverting 
the current docId, to a smaller value, instead of NO_MORE_DOCS.
This propagates through all the embedded scorers, acting like there are more 
docs in the current query, when in fact there are no more.

I'm attaching a patch for this specific advance(Integer.MAX_VALUE) on the 
DescendantSelfAxisScorer that apparently fixes the problem.

The DescendantSelfAxisScorer still does not comply with the api, and it would 
be interesting to look at the other existing implementations in JR, to check 
for compliance.

At the very least we should enable this optimization for the case where it is 
called with NO_MORE_DOCS, to shortcut to the end of the stream.






                
> occasional index out of bounds exception while running 
> UserManagerImplTest.testFindAuthorizableByRelativePath
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: JCR-3082
>                 URL: https://issues.apache.org/jira/browse/JCR-3082
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-core
>            Reporter: Julian Reschke
>         Attachments: JCR-3082.patch
>
>
> Stack trace:
> java.lang.ArrayIndexOutOfBoundsException: 8
>       at 
> org.apache.jackrabbit.core.query.lucene.MultiScorer.score(MultiScorer.java:89)
>       at 
> org.apache.lucene.search.ConjunctionScorer.score(ConjunctionScorer.java:133)
>       at 
> org.apache.lucene.search.BooleanScorer2$2.score(BooleanScorer2.java:182)
>       at 
> org.apache.lucene.search.BooleanScorer2.score(BooleanScorer2.java:303)
>       at 
> org.apache.jackrabbit.core.query.lucene.LuceneQueryHits.nextScoreNode(LuceneQueryHits.java:68)
>       at 
> org.apache.jackrabbit.core.query.lucene.QueryHitsAdapter.nextScoreNodes(QueryHitsAdapter.java:54)
>       at 
> org.apache.jackrabbit.core.query.lucene.FilterMultiColumnQueryHits.nextScoreNodes(FilterMultiColumnQueryHits.java:63)
>       at 
> org.apache.jackrabbit.core.query.lucene.QueryResultImpl.collectScoreNodes(QueryResultImpl.java:328)
>       at 
> org.apache.jackrabbit.core.query.lucene.QueryResultImpl.getResults(QueryResultImpl.java:291)
>       at 
> org.apache.jackrabbit.core.query.lucene.SingleColumnQueryResult.<init>(SingleColumnQueryResult.java:66)
>       at 
> org.apache.jackrabbit.core.query.lucene.QueryImpl.execute(QueryImpl.java:134)
>       at 
> org.apache.jackrabbit.core.query.QueryImpl$1.perform(QueryImpl.java:130)
>       at 
> org.apache.jackrabbit.core.query.QueryImpl$1.perform(QueryImpl.java:1)
>       at 
> org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:200)
>       at 
> org.apache.jackrabbit.core.query.QueryImpl.execute(QueryImpl.java:126)
>       at 
> org.apache.jackrabbit.core.security.user.IndexNodeResolver.findNodes(IndexNodeResolver.java:109)
>       at 
> org.apache.jackrabbit.core.security.user.UserManagerImpl.findAuthorizables(UserManagerImpl.java:498)
>       at 
> org.apache.jackrabbit.core.security.user.UserManagerImpl.findAuthorizables(UserManagerImpl.java:462)
>       at 
> org.apache.jackrabbit.core.security.user.UserManagerImplTest.testFindAuthorizableByRelativePath(UserManagerImplTest.java:560)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>       at java.lang.reflect.Method.invoke(Unknown Source)
>       at junit.framework.TestCase.runTest(TestCase.java:154)
>       at junit.framework.TestCase.runBare(TestCase.java:127)
>       at junit.framework.TestResult$1.protect(TestResult.java:106)
>       at junit.framework.TestResult.runProtected(TestResult.java:124)
>       at junit.framework.TestResult.run(TestResult.java:109)
>       at junit.framework.TestCase.run(TestCase.java:118)
>       at 
> org.apache.jackrabbit.test.AbstractJCRTest.run(AbstractJCRTest.java:456)
>       at junit.framework.TestSuite.runTest(TestSuite.java:208)
>       at junit.framework.TestSuite.run(TestSuite.java:203)
>       at 
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>       at 
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to