diff --git a/src/NRedisStack/ModulePrefixes.cs b/src/NRedisStack/ModulePrefixes.cs index 70dce707..8e46890c 100644 --- a/src/NRedisStack/ModulePrefixes.cs +++ b/src/NRedisStack/ModulePrefixes.cs @@ -17,7 +17,7 @@ public static class ModulePrefixes public static TdigestCommands TDIGEST(this IDatabase db) => new TdigestCommands(db); - public static SearchCommands FT(this IDatabase db, int? searchDialect = null) => new SearchCommands(db, searchDialect); + public static SearchCommands FT(this IDatabase db, int? searchDialect = 2) => new SearchCommands(db, searchDialect); public static JsonCommands JSON(this IDatabase db) => new JsonCommands(db); diff --git a/src/NRedisStack/Search/AggregationRequest.cs b/src/NRedisStack/Search/AggregationRequest.cs index 68d4a3c4..faab2bbd 100644 --- a/src/NRedisStack/Search/AggregationRequest.cs +++ b/src/NRedisStack/Search/AggregationRequest.cs @@ -2,7 +2,7 @@ using NRedisStack.Search.Literals; namespace NRedisStack.Search; -public class AggregationRequest +public class AggregationRequest : IDialectAwareParam { private List args = new List(); // Check if Readonly private bool isWithCursor = false; @@ -184,4 +184,10 @@ public bool IsWithCursor() { return isWithCursor; } + + int? IDialectAwareParam.Dialect + { + get { return dialect; } + set { dialect = value; } + } } diff --git a/src/NRedisStack/Search/FTSpellCheckParams.cs b/src/NRedisStack/Search/FTSpellCheckParams.cs index 74d3af86..cfc9e551 100644 --- a/src/NRedisStack/Search/FTSpellCheckParams.cs +++ b/src/NRedisStack/Search/FTSpellCheckParams.cs @@ -1,7 +1,7 @@ using NRedisStack.Search.Literals; namespace NRedisStack.Search { - public class FTSpellCheckParams + public class FTSpellCheckParams : IDialectAwareParam { List args = new List(); private List> terms = new List>(); @@ -59,38 +59,29 @@ public List GetArgs() } public void SerializeRedisArgs() - { - Distance(); - Terms(); - Dialect(); - } - - private void Dialect() { if (dialect != null) { args.Add(SearchArgs.DIALECT); args.Add(dialect); } - } - - private void Terms() - { foreach (var term in terms) { args.Add(SearchArgs.TERMS); args.Add(term.Value); args.Add(term.Key); } - } - - private void Distance() - { if (distance != null) { args.Add(SearchArgs.DISTANCE); args.Add(distance); } } + + int? IDialectAwareParam.Dialect + { + get { return dialect; } + set { dialect = value; } + } } } diff --git a/src/NRedisStack/Search/IDialectAwareParam.cs b/src/NRedisStack/Search/IDialectAwareParam.cs new file mode 100644 index 00000000..42ccfd3f --- /dev/null +++ b/src/NRedisStack/Search/IDialectAwareParam.cs @@ -0,0 +1,15 @@ +namespace NRedisStack.Search +{ + /// + /// Interface for dialect-aware parameters. + /// To provide a single interface to manage default dialect version under which to execute the query. + /// + internal interface IDialectAwareParam + { + /// + /// Selects the dialect version under which to execute the query. + /// + internal int? Dialect { get; set; } + } + +} \ No newline at end of file diff --git a/src/NRedisStack/Search/Query.cs b/src/NRedisStack/Search/Query.cs index 3f77d67e..524a191f 100644 --- a/src/NRedisStack/Search/Query.cs +++ b/src/NRedisStack/Search/Query.cs @@ -7,7 +7,7 @@ namespace NRedisStack.Search /// /// Query represents query parameters and filters to load results from the engine /// - public sealed class Query + public sealed class Query : IDialectAwareParam { /// /// Filter represents a filtering rules in a query @@ -691,5 +691,12 @@ public Query SetExpander(String field) _expander = field; return this; } + + int? IDialectAwareParam.Dialect + { + get { return dialect; } + set { dialect = value; } + } + } } \ No newline at end of file diff --git a/src/NRedisStack/Search/SearchCommands.cs b/src/NRedisStack/Search/SearchCommands.cs index 9bb74dde..6d9a64e6 100644 --- a/src/NRedisStack/Search/SearchCommands.cs +++ b/src/NRedisStack/Search/SearchCommands.cs @@ -6,21 +6,10 @@ namespace NRedisStack { public class SearchCommands : SearchCommandsAsync, ISearchCommands { - IDatabase _db; - public SearchCommands(IDatabase db, int? defaultDialect) : base(db) + private IDatabase _db; + public SearchCommands(IDatabase db, int? defaultDialect = 2) : base(db, defaultDialect) { _db = db; - SetDefaultDialect(defaultDialect); - this.defaultDialect = defaultDialect; - } - - public void SetDefaultDialect(int? defaultDialect) - { - if (defaultDialect == 0) - { - throw new System.ArgumentOutOfRangeException("DIALECT=0 cannot be set."); - } - this.defaultDialect = defaultDialect; } /// @@ -32,11 +21,7 @@ public RedisResult[] _List() /// public AggregationResult Aggregate(string index, AggregationRequest query) { - if (query.dialect == null && defaultDialect != null) - { - query.Dialect((int)defaultDialect); - } - + setDefaultDialectIfUnset(query); var result = _db.Execute(SearchCommandBuilder.Aggregate(index, query)); return result.ToAggregationResult(query); } @@ -130,20 +115,14 @@ public bool DropIndex(string indexName, bool dd = false) /// public string Explain(string indexName, string query, int? dialect = null) { - if (dialect == null && defaultDialect != null) - { - dialect = defaultDialect; - } + dialect = checkAndGetDefaultDialect(dialect); return _db.Execute(SearchCommandBuilder.Explain(indexName, query, dialect)).ToString()!; } /// public RedisResult[] ExplainCli(string indexName, string query, int? dialect = null) { - if (dialect == null && defaultDialect != null) - { - dialect = defaultDialect; - } + dialect = checkAndGetDefaultDialect(dialect); return _db.Execute(SearchCommandBuilder.ExplainCli(indexName, query, dialect)).ToArray(); } @@ -160,22 +139,21 @@ public Tuple> ProfileSearch(string /// public Tuple> ProfileAggregate(string indexName, AggregationRequest query, bool limited = false) { + setDefaultDialectIfUnset(query); return _db.Execute(SearchCommandBuilder.ProfileAggregate(indexName, query, limited)) .ToProfileAggregateResult(query); } /// public SearchResult Search(string indexName, Query q) { - if (q.dialect == null && defaultDialect != null) - { - q.Dialect((int)defaultDialect); - } + setDefaultDialectIfUnset(q); return _db.Execute(SearchCommandBuilder.Search(indexName, q)).ToSearchResult(q); } /// public Dictionary> SpellCheck(string indexName, string query, FTSpellCheckParams? spellCheckParams = null) { + setDefaultDialectIfUnset(spellCheckParams); return _db.Execute(SearchCommandBuilder.SpellCheck(indexName, query, spellCheckParams)).ToFtSpellCheckResult(); } diff --git a/src/NRedisStack/Search/SearchCommandsAsync.cs b/src/NRedisStack/Search/SearchCommandsAsync.cs index 6935e948..0da1c1f0 100644 --- a/src/NRedisStack/Search/SearchCommandsAsync.cs +++ b/src/NRedisStack/Search/SearchCommandsAsync.cs @@ -6,12 +6,33 @@ namespace NRedisStack { public class SearchCommandsAsync : ISearchCommandsAsync { - IDatabaseAsync _db; + private IDatabaseAsync _db; protected int? defaultDialect; - public SearchCommandsAsync(IDatabaseAsync db) + public SearchCommandsAsync(IDatabaseAsync db, int? defaultDialect = 2) { _db = db; + SetDefaultDialect(defaultDialect); + } + + internal void setDefaultDialectIfUnset(IDialectAwareParam param) + { + if (param != null && param.Dialect == null && defaultDialect != null) + { + param.Dialect = defaultDialect; + } + } + + internal int? checkAndGetDefaultDialect(int? dialect) => + (dialect == null && defaultDialect != null) ? defaultDialect : dialect; + + public void SetDefaultDialect(int? defaultDialect) + { + if (defaultDialect == 0) + { + throw new System.ArgumentOutOfRangeException("DIALECT=0 cannot be set."); + } + this.defaultDialect = defaultDialect; } /// @@ -23,11 +44,7 @@ public async Task _ListAsync() /// public async Task AggregateAsync(string index, AggregationRequest query) { - if (query.dialect == null && defaultDialect != null) - { - query.Dialect((int)defaultDialect); - } - + setDefaultDialectIfUnset(query); var result = await _db.ExecuteAsync(SearchCommandBuilder.Aggregate(index, query)); if (query.IsWithCursor()) { @@ -129,22 +146,14 @@ public async Task DropIndexAsync(string indexName, bool dd = false) /// public async Task ExplainAsync(string indexName, string query, int? dialect = null) { - if (dialect == null && defaultDialect != null) - { - dialect = defaultDialect; - } - + dialect = checkAndGetDefaultDialect(dialect); return (await _db.ExecuteAsync(SearchCommandBuilder.Explain(indexName, query, dialect))).ToString()!; } /// public async Task ExplainCliAsync(string indexName, string query, int? dialect = null) { - if (dialect == null && defaultDialect != null) - { - dialect = defaultDialect; - } - + dialect = checkAndGetDefaultDialect(dialect); return (await _db.ExecuteAsync(SearchCommandBuilder.ExplainCli(indexName, query, dialect))).ToArray(); } @@ -168,17 +177,14 @@ public async Task>> Pro /// public async Task SearchAsync(string indexName, Query q) { - if (q.dialect == null && defaultDialect != null) - { - q.Dialect((int)defaultDialect); - } - + setDefaultDialectIfUnset(q); return (await _db.ExecuteAsync(SearchCommandBuilder.Search(indexName, q))).ToSearchResult(q); } /// public async Task>> SpellCheckAsync(string indexName, string query, FTSpellCheckParams? spellCheckParams = null) { + setDefaultDialectIfUnset(spellCheckParams); return (await _db.ExecuteAsync(SearchCommandBuilder.SpellCheck(indexName, query, spellCheckParams))).ToFtSpellCheckResult(); }