Majlanky / couch-slacker

Spring data for CouchDB and CouchDB connector
https://github.com/Majlanky/couch-slacker
Apache License 2.0
23 stars 6 forks source link

IndexOutOfBoundsException error from CouchDbParsingQuery.java:176 #80

Closed davis-kuriakose closed 1 year ago

davis-kuriakose commented 1 year ago

I want to start by saying I'm really impressed with this library.

One use case I've discovered that when I use Pageable using PagingAndSortingRepository I am getting the below issue java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

The issue is only happening when we add a custom method. For example,

Scenario 1, For all data. Page findAll(Pageable pageable); Working as expected.

Scenario 2 For filter based on an attribute, Page findByKeyId(@Param("key") String key, Pageable pageable); In this scenario, if we provide size =2 and the actual resultset is only having size 1. In this case, only the issue is happening.

Impacted Class: com.groocraft.couchdb.slacker.repository.CouchDbParsingQuery

Method : private @NotNull Page wrapAsPage(@NotNull FindResult findResult, @NotNull Object[] parameters) {

IntStream.range(0, pageable.getPageSize()).forEach(i -> paged.add(findResult.getEntities().get(i)));

In the above condition page size requested might be more than the resultset, So in that case, the logic tries to get the element which is not valid (findResult.getEntities().get(i)). Hence we are getting the above exception.

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.base/java.util.LinkedList.checkElementIndex(LinkedList.java:559) ~[na:na] at java.base/java.util.LinkedList.get(LinkedList.java:480) ~[na:na] at com.groocraft.couchdb.slacker.repository.CouchDbParsingQuery.lambda$wrapAsPage$5(CouchDbParsingQuery.java:176) ~[couch-slacker-2.4.1.jar:na] at java.base/java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:104) ~[na:na] at java.base/java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:593) ~[na:na] at com.groocraft.couchdb.slacker.repository.CouchDbParsingQuery.wrapAsPage(CouchDbParsingQuery.java:176) ~[couch-slacker-2.4.1.jar:na] at com.groocraft.couchdb.slacker.repository.CouchDbParsingQuery.execute(CouchDbParsingQuery.java:116) ~[couch-slacker-2.4.1.jar:na] at com.groocraft.couchdb.slacker.repository.PageableAndSortableQuery.execute(PageableAndSortableQuery.java:55) ~[couch-slacker-2.4.1.jar:na] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.7.5.jar:2.7.5] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.7.5.jar:2.7.5] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:160) ~[spring-data-commons-2.7.5.jar:2.7.5] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139) ~[spring-data-commons-2.7.5.jar:2.7.5] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.23.jar:5.3.23] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.23.jar:5.3.23] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.23.jar:5.3.23] at com.sun.proxy.$Proxy108.findByStudyId(Unknown Source) ~[na:an]

Majlanky commented 1 year ago

Hi @davis-kuriakose I will check it ASAP. Thank you for the appreciation 😅

Majlanky commented 1 year ago

Ok, this should be fixed in 2.4.2 version. Just released it so you can try @davis-kuriakose 🎊 If something else not working, do not hesitate to create another issue or reopen the current one...

davis-kuriakose commented 1 year ago

Thank you for the quick resolution.