Skip to content

Commit

Permalink
fix: multi indices search serialization (#841)
Browse files Browse the repository at this point in the history
* fix: multi indices search serialization

* fix: dotnet format

* feat: flag `MultipleQueries` as Obsolete.

* fix: dotnet format
  • Loading branch information
morganleroi committed Aug 7, 2023
1 parent 8ed2b55 commit ad71b7e
Show file tree
Hide file tree
Showing 3 changed files with 186 additions and 2 deletions.
150 changes: 150 additions & 0 deletions src/Algolia.Search.Test/EndToEnd/Client/MultipleOperationsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,156 @@ public async Task TestMultipleOperations()
Assert.That(multiQueri2.Results.ElementAt(0).Hits, Has.Exactly(2).Items);
Assert.That(multiQueri2.Results.ElementAt(1).Hits, Is.Empty);
}

[Test]
public async Task TestMultipleOperationsUsingQueryMultiIndices()
{
var objectsToSave = new List<BatchOperation<MultipleOperationClass>>
{
new BatchOperation<MultipleOperationClass>
{
IndexName = _indexName1,
Action = BatchActionType.AddObject,
Body = new MultipleOperationClass { Firstname = "Jimmie" }
},
new BatchOperation<MultipleOperationClass>
{
IndexName = _indexName1,
Action = BatchActionType.AddObject,
Body = new MultipleOperationClass { Firstname = "Jimmie" }
},
new BatchOperation<MultipleOperationClass>
{
IndexName = _indexName2,
Action = BatchActionType.AddObject,
Body = new MultipleOperationClass { Firstname = "Jimmie" }
},
new BatchOperation<MultipleOperationClass>
{
IndexName = _indexName2,
Action = BatchActionType.AddObject,
Body = new MultipleOperationClass { Firstname = "Jimmie" }
}
};

var saveMultiple = await BaseTest.SearchClient.MultipleBatchAsync(objectsToSave);
saveMultiple.Wait();

var objectsToRetrieve = new List<MultipleGetObject>
{
new MultipleGetObject { IndexName = _indexName1, ObjectID = saveMultiple.ObjectIDs.ElementAt(0) },
new MultipleGetObject { IndexName = _indexName1, ObjectID = saveMultiple.ObjectIDs.ElementAt(1) },
new MultipleGetObject { IndexName = _indexName2, ObjectID = saveMultiple.ObjectIDs.ElementAt(2) },
new MultipleGetObject { IndexName = _indexName2, ObjectID = saveMultiple.ObjectIDs.ElementAt(3) }
};

var multipleGet =
await BaseTest.SearchClient.MultipleGetObjectsAsync<MultipleOperationClass>(objectsToRetrieve);
Assert.That(multipleGet.Results, Has.Exactly(4).Items);
Assert.True(multipleGet.Results.All(x => x.Firstname.Equals("Jimmie")));

for (int i = 0; i < 4; i++)
{
Assert.True(multipleGet.Results.ElementAt(i).ObjectID == saveMultiple.ObjectIDs.ElementAt(i));
}

List<QueryMultiIndices> multipleSearch = new List<QueryMultiIndices>
{
new(_indexName1){HitsPerPage = 2 },
new(_indexName2){HitsPerPage = 2 },
};

MultipleQueriesRequest request = new MultipleQueriesRequest
{
Strategy = StrategyType.None,
Requests = multipleSearch
};

MultipleQueriesRequest request2 = new MultipleQueriesRequest
{
Strategy = StrategyType.StopIfEnoughMatches,
Requests = multipleSearch
};

var multiQueri = await BaseTest.SearchClient.MultipleQueriesAsync<MultipleOperationClass>(request);
var multiQueri2 = await BaseTest.SearchClient.MultipleQueriesAsync<MultipleOperationClass>(request2);

Assert.That(multiQueri.Results, Has.Exactly(2).Items);
Assert.That(multiQueri.Results.ElementAt(0).Hits, Has.Exactly(2).Items);
Assert.That(multiQueri.Results.ElementAt(1).Hits, Has.Exactly(2).Items);

Assert.That(multiQueri2.Results, Has.Exactly(2).Items);
Assert.That(multiQueri2.Results.ElementAt(0).Hits, Has.Exactly(2).Items);
Assert.That(multiQueri2.Results.ElementAt(1).Hits, Is.Empty);
}

[Test]
public async Task TestMultipleQueriesWithQueryMultiIndicesObject()
{
var objectsToSave = new List<BatchOperation<MultipleOperationClass>>
{
new BatchOperation<MultipleOperationClass>
{
IndexName = _indexName3,
Action = BatchActionType.AddObject,
Body = new MultipleOperationClass { Firstname = "Jimmie" }
},
};

var saveMultiple = await BaseTest.SearchClient.MultipleBatchAsync(objectsToSave);
saveMultiple.Wait();

var query = new Query()
{
Explain = new List<string> { "test1", "test2" },
AroundPrecision = new List<AroundPrecision>
{
new(){From = 0, Value = 1},
new(){From = 100, Value = 10}
},
CustomParameters = new Dictionary<string, object>()
{
{"hitsPerPage", 10}
},
TagFilters = new List<IEnumerable<string>>()
{
new List<string>{ "one", "two"},
new List<string>{ "one-two", "two-two"}
}
};

var request = new MultipleQueriesRequest
{
Requests = new List<QueryMultiIndices>{
new QueryMultiIndices(_indexName3)
{
Explain = new List<string>{"test1", "test2"},
AroundPrecision = new List<AroundPrecision>
{
new(){From = 0, Value = 1},
new(){From = 100, Value = 10}
},
CustomParameters = new Dictionary<string, object>()
{
{"hitsPerPage", 10}
},
TagFilters = new List<IEnumerable<string>>()
{
new List<string>{ "one", "two"},
new List<string>{ "one-two", "two-two"}
}
}
}
};

var index = BaseTest.SearchClient.InitIndex(_indexName3);

var responseSearch = index.Search<MultipleOperationClass>(query);
var responseMultipleQueries = BaseTest.SearchClient.MultipleQueries<MultipleOperationClass>(request);

Assert.AreEqual(responseSearch.Params, responseMultipleQueries.Results.First().Params);
}

[Test]
public async Task TestMultipleQueriesFacet()
{
Expand Down
11 changes: 9 additions & 2 deletions src/Algolia.Search/Models/Common/MultipleQueriesRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
* THE SOFTWARE.
*/

using System;
using System.Collections.Generic;
using Algolia.Search.Models.Search;
using Algolia.Search.Serializer;
Expand All @@ -36,18 +37,24 @@ public class MultipleQueriesRequest
/// <summary>
/// List of requests
/// </summary>
public IEnumerable<MultipleQueries> Requests { get; set; }
public IEnumerable<IMultipleQueries> Requests { get; set; }

/// <summary>
/// Request strategy <see cref="Enums.StrategyType"/>
/// </summary>
public string Strategy { get; set; }
}

/// <summary>
/// Multiple queries interface
/// </summary>
public interface IMultipleQueries { }

/// <summary>
/// Multiple queries
/// </summary>
public class MultipleQueries
[Obsolete("The recommended approach is to use a list of `QueryMultiIndices`.")]
public class MultipleQueries : IMultipleQueries
{
/// <summary>
/// The name of the index to perform the operation
Expand Down
27 changes: 27 additions & 0 deletions src/Algolia.Search/Models/Search/QueryMultiIndices.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Algolia.Search.Models.Common;

namespace Algolia.Search.Models.Search
{
/// <summary>
/// For more information regarding the parameters
/// https://www.algolia.com/doc/api-reference/search-api-parameters/
/// </summary>
public class QueryMultiIndices : Query, IMultipleQueries
{
/// <summary>
/// Create a new query with an empty search query, for a dedicated indice,
/// </summary>
/// <param name="indexName"></param>
/// <param name="searchQuery"></param>
public QueryMultiIndices(string indexName, string searchQuery = null)
{
IndexName = indexName;
SearchQuery = searchQuery;
}

/// <summary>
/// The name of the index to perform the operation
/// </summary>
public string IndexName { get; set; }
}
}

0 comments on commit ad71b7e

Please sign in to comment.