redis-om-spring icon indicating copy to clipboard operation
redis-om-spring copied to clipboard

findTop or findFirst JPA method fails with JedisDataException: no such index

Open edridudi opened this issue 4 months ago • 1 comments

Hey, I am unsure whether it's an issue or something I did wrong, and I would appreciate any help on this matter.

I have this model:

RedisCursorEntity.java:

package com.bloxbean.cardano.yaci.store.core.storage.impl.model;

import com.bloxbean.cardano.yaci.store.common.model.RedisBaseEntity;
import com.redis.om.spring.annotations.Document;
import com.redis.om.spring.annotations.Indexed;
import com.redis.om.spring.annotations.Searchable;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.data.annotation.Id;

@Data
@SuperBuilder
@NoArgsConstructor
@Document("cursor")
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class RedisCursorEntity extends RedisBaseEntity {

    @Id
    private String cursorId;
    @Indexed
    @Searchable
    private Long eventPublisherId;
    private String blockHash;
    @Indexed
    private Long slot;
    private Long block;
    private String prevBlockHash;
    private Integer era;
}

RedisBaseEntity.java

package com.bloxbean.cardano.yaci.store.common.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.LocalDateTime;

@Data
@SuperBuilder
@NoArgsConstructor
public class RedisBaseEntity {

    private LocalDateTime createDateTime;

    private LocalDateTime updateDateTime;

}

The repository I Use is as follows

@Repository
public interface RedisCursorRepository extends RedisDocumentRepository<RedisCursorEntity, String> {

    Optional<RedisCursorEntity> findFirstByEventPublisherIdOrderBySlotDesc(Long id);
}

findFirstByEventPublisherIdOrderBySlotDesc fails with the following exception:

org.springframework.dao.InvalidDataAccessApiUsageException: com.bloxbean.cardano.yaci.store.core.storage.impl.model.RedisCursorEntityIdx: no such index
	at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:67) ~[spring-data-redis-3.2.2.jar:3.2.2]
	at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:42) ~[spring-data-redis-3.2.2.jar:3.2.2]
	at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:40) ~[spring-data-redis-3.2.2.jar:3.2.2]
	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.translateExceptionIfPossible(JedisConnectionFactory.java:921) ~[spring-data-redis-3.2.2.jar:3.2.2]
	at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-6.1.3.jar:6.1.3]
	at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:335) ~[spring-tx-6.1.3.jar:6.1.3]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) ~[spring-tx-6.1.3.jar:6.1.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.3.jar:6.1.3]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.1.3.jar:6.1.3]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.3.jar:6.1.3]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:220) ~[spring-aop-6.1.3.jar:6.1.3]
	at jdk.proxy2/jdk.proxy2.$Proxy194.findFirstByEventPublisherIdOrderBySlotDesc(Unknown Source) ~[na:na]
	at com.bloxbean.cardano.yaci.store.core.storage.impl.RedisCursorStorage.getCurrentCursor(RedisCursorStorage.java:42) ~[main/:na]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:351) ~[spring-aop-6.1.3.jar:6.1.3]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713) ~[spring-aop-6.1.3.jar:6.1.3]
	at com.bloxbean.cardano.yaci.store.core.storage.impl.RedisCursorStorage$$SpringCGLIB$$0.getCurrentCursor(<generated>) ~[main/:na]
	at com.bloxbean.cardano.yaci.store.core.service.CursorService.getStartCursor(CursorService.java:48) ~[main/:na]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:351) ~[spring-aop-6.1.3.jar:6.1.3]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713) ~[spring-aop-6.1.3.jar:6.1.3]
	at com.bloxbean.cardano.yaci.store.core.service.CursorService$$SpringCGLIB$$0.getStartCursor(<generated>) ~[main/:na]
	at com.bloxbean.cardano.yaci.store.core.service.StartService.start(StartService.java:63) ~[main/:na]
	at com.bloxbean.cardano.yaci.store.core.service.AppcationEventListener.initialize(AppcationEventListener.java:23) ~[main/:na]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:365) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:237) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:168) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:149) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:451) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:384) ~[spring-context-6.1.3.jar:6.1.3]
	at org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:109) ~[spring-boot-3.2.2.jar:3.2.2]
	at org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:80) ~[spring-boot-3.2.2.jar:3.2.2]
	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) ~[spring-boot-3.2.2.jar:3.2.2]
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) ~[spring-boot-3.2.2.jar:3.2.2]
	at org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:80) ~[spring-boot-3.2.2.jar:3.2.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:348) ~[spring-boot-3.2.2.jar:3.2.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.2.jar:3.2.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.2.jar:3.2.2]
	at com.bloxbean.cardano.yaci.store.app.YaciStoreApplication.main(YaciStoreApplication.java:17) ~[main/:na]
Caused by: redis.clients.jedis.exceptions.JedisDataException: com.bloxbean.cardano.yaci.store.core.storage.impl.model.RedisCursorEntityIdx: no such index
	at redis.clients.jedis.Protocol.processError(Protocol.java:105) ~[jedis-5.0.2.jar:na]
	at redis.clients.jedis.Protocol.process(Protocol.java:162) ~[jedis-5.0.2.jar:na]
	at redis.clients.jedis.Protocol.read(Protocol.java:221) ~[jedis-5.0.2.jar:na]
	at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:351) ~[jedis-5.0.2.jar:na]

What might be the issue for this?

edridudi avatar Mar 18 '24 10:03 edridudi

@edridudi Then the index is not found is typically a sign that the framework can't process the model with the annotations @Indexed or @Searchable. Looking above the only issue I see is:

    @Indexed
    @Searchable
    private Long eventPublisherId;

The issue being that currently a field can only have one indexed field in the schema, @Indexed creates a field of type TAG while @Seachable creates one of type TEXT. So you should remove one of the annotations, for ID type fields typically @Indexed is what you want, to search by full value of the tag. If you are doing full-text searches on those IDs, using prefixes, suffices, partial string matches etc. then you want @Searchable. Give that a try and report back what you see. Cheers.

bsbodden avatar Mar 18 '24 16:03 bsbodden

It was my bad... The indexes were not found due to the wrong entity scan package set path. I would recommend though that if 0 indexes are found then try to search them at the found Repository component-level subpackages.

edridudi avatar Mar 23 '24 23:03 edridudi