Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import java.util.List;
import java.util.Set;

import com.redis.om.spring.ops.CommandListener;
import com.redis.om.spring.ops.NoOpCommandListener;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Expand Down Expand Up @@ -202,6 +204,7 @@ RedisModulesClient redisModulesClient( //
* @param rmc the Redis modules client for low-level access
* @param template the string Redis template for basic operations
* @param gsonBuilder the Gson builder for JSON serialization
* @param commandListener a command listener for monitoring Redis commands
* @return the Redis modules operations instance
*/
@Bean(
Expand All @@ -215,10 +218,28 @@ RedisModulesOperations<?> redisModulesOperations( //
StringRedisTemplate template, //
@Qualifier(
"omGsonBuilder"
) GsonBuilder gsonBuilder) {
return new RedisModulesOperations<>(rmc, template, gsonBuilder);
) GsonBuilder gsonBuilder, final CommandListener commandListener) {
return new RedisModulesOperations<>(rmc, template, gsonBuilder, commandListener);
}

/**
* Provides a default implementation of the CommandListener bean.
* <p>
* This method creates a no-operation (NoOp) implementation of the CommandListener interface.
* It is used as a fallback when no other CommandListener bean is defined in the application context.
* <p>
* The {@code @Fallback} annotation ensures that this bean is only used when no other
* CommandListener bean is available, allowing developers to override it with a custom implementation if needed.
*
* @return a NoOpCommandListener instance, which performs no operations.
*/
@Bean
@Fallback
public CommandListener commandListener() {
return new NoOpCommandListener();
}


/**
* Creates the JSON operations bean for RedisJSON commands.
* <p>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.redis.om.spring.ops;

import com.redis.om.spring.autocomplete.Suggestion;
import com.redis.om.spring.repository.query.autocomplete.AutoCompleteOptions;
import redis.clients.jedis.search.FTCreateParams;
import redis.clients.jedis.search.FTSearchParams;
import redis.clients.jedis.search.IndexOptions;
import redis.clients.jedis.search.Query;
import redis.clients.jedis.search.Schema;
import redis.clients.jedis.search.SearchProtocol;
import redis.clients.jedis.search.SearchResult;
import redis.clients.jedis.search.aggr.AggregationBuilder;
import redis.clients.jedis.search.aggr.AggregationResult;
import redis.clients.jedis.search.schemafields.SchemaField;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface CommandListener {
default void searchStarted(String indexName, Query q, FTSearchParams params) {}
default void searchFinished(String indexName, Query q, FTSearchParams params, SearchResult searchResult){}

default void createIndexStarted(String indexName, FTCreateParams params, List<SchemaField> fields, Schema schema, IndexOptions options){}
default void createIndexFinished(String indexName, FTCreateParams params, List<SchemaField> fields, Schema schema, IndexOptions options, String result){}

default void aggregateStarted(String indexName, AggregationBuilder q){}
default void aggregateFinished(String indexName, AggregationBuilder q){}

default void cursorDeleteStarted(String string, long cursorId){}
default void cursorDeleteFinished(String string, long cursorId, String result){}

default void cursorReadStarted(String string, long cursorId, int count){}
default void cursorReadFinished(String string, long cursorId, int count, AggregationResult aggregationResult){}

default void explainStarted(String string, Query q){}
default void explainFinished(String string, Query q, String s){}

default void infoStarted(String string){}
default void infoFinished(String string, Map<String, Object> stringObjectMap){}

default void dropIndexStarted(String string){}
default void dropIndexFinished(String string, String result){}

default void dropIndexAndDocumentsStarted(String string){}
default void dropIndexAndDocumentsFinished(String string, String result){}

default void addSuggestionStarted(String string, String key, String suggestion, double score){}
default void addSuggestionFinished(String string, String key, String suggestion, double score, long result){}

default void getSuggestionStarted(String string, String key, String prefix, AutoCompleteOptions options){}
default void getSuggestionFinished(String string, String key, String prefix, AutoCompleteOptions options, List<Suggestion> list){}

default void deleteSuggestionStarted(String string, String key, String entry){}
default void deleteSuggestionFinished(String string, String key, String entry, boolean result){}

default void getSuggestionLengthStarted(String string, String key){}
default void getSuggestionLengthFinished(String string, String key, long result){}

default void alterIndexStarted(String string, SchemaField[] fields){}
default void alterIndexFinished(String string, SchemaField[] fields, String result){}

default void setConfigStarted(String string, String option, String value){}
default void setConfigFinished(String string, String option, String value, String result){}

default void getConfigStarted(String string, String option){}
default void getConfigFinished(String string, String option, Map<String, Object> result){}

default void getIndexConfigStarted(String string, String option){}
default void getIndexConfigFinished(String string, String option, Map<String, Object> result){}

default void addAliasStarted(String string, String name){}
default void addAliasFinished(String string, String name, String result){}

default void updateAliasStarted(String string, String name){}
default void updateAliasFinished(String string, String name, String result){}

default void deleteAliasStarted(String string, String name){}
default void deleteAliasFinished(String string, String name, String result){}

default void updateSynonymStarted(String string, String synonymGroupId, String[] terms){}
default void updateSynonymFinished(String string, String synonymGroupId, String[] terms, String result){}

default void dumpSynonymStarted(String string){}
default void dumpSynonymFinished(String string, Map<String, List<String>> result){}

default void tagValsStarted(String string, String field){}
default void tagValsFinished(String string, String field, Set<String> result){}

default void commandFailed(SearchProtocol.SearchCommand command, String indexName, Throwable t){}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.redis.om.spring.ops;

import org.springframework.stereotype.Component;

@Component
public class NoOpCommandListener implements CommandListener {
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
* @param client the Redis modules client for executing commands
* @param template the Spring Data Redis template for additional Redis operations
* @param gsonBuilder the Gson builder for JSON serialization/deserialization configuration
*
* @param commandListener A command listener for monitoring Redis commands
*
* @author Redis OM Spring Team
* @see JSONOperations
* @see SearchOperations
Expand All @@ -37,7 +38,7 @@
* @see TDigestOperations
*/
public record RedisModulesOperations<K>(RedisModulesClient client, StringRedisTemplate template,
GsonBuilder gsonBuilder) {
GsonBuilder gsonBuilder, CommandListener commandListener) {

/**
* Creates and returns operations for interacting with RedisJSON module.
Expand Down Expand Up @@ -65,7 +66,7 @@ public JSONOperations<K> opsForJSON() {
* @return a {@link SearchOperations} instance for search and indexing operations
*/
public SearchOperations<K> opsForSearch(K index) {
return new SearchOperationsImpl<>(index, client, template);
return new SearchOperationsImpl<>(index, client, template, commandListener);
}

/**
Expand Down
Loading