Skip to content

Commit ad71b7e

Browse files
authored
fix: multi indices search serialization (#841)
* fix: multi indices search serialization * fix: dotnet format * feat: flag `MultipleQueries` as Obsolete. * fix: dotnet format
1 parent 8ed2b55 commit ad71b7e

File tree

3 files changed

+186
-2
lines changed

3 files changed

+186
-2
lines changed

src/Algolia.Search.Test/EndToEnd/Client/MultipleOperationsTest.cs

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,156 @@ public async Task TestMultipleOperations()
130130
Assert.That(multiQueri2.Results.ElementAt(0).Hits, Has.Exactly(2).Items);
131131
Assert.That(multiQueri2.Results.ElementAt(1).Hits, Is.Empty);
132132
}
133+
134+
[Test]
135+
public async Task TestMultipleOperationsUsingQueryMultiIndices()
136+
{
137+
var objectsToSave = new List<BatchOperation<MultipleOperationClass>>
138+
{
139+
new BatchOperation<MultipleOperationClass>
140+
{
141+
IndexName = _indexName1,
142+
Action = BatchActionType.AddObject,
143+
Body = new MultipleOperationClass { Firstname = "Jimmie" }
144+
},
145+
new BatchOperation<MultipleOperationClass>
146+
{
147+
IndexName = _indexName1,
148+
Action = BatchActionType.AddObject,
149+
Body = new MultipleOperationClass { Firstname = "Jimmie" }
150+
},
151+
new BatchOperation<MultipleOperationClass>
152+
{
153+
IndexName = _indexName2,
154+
Action = BatchActionType.AddObject,
155+
Body = new MultipleOperationClass { Firstname = "Jimmie" }
156+
},
157+
new BatchOperation<MultipleOperationClass>
158+
{
159+
IndexName = _indexName2,
160+
Action = BatchActionType.AddObject,
161+
Body = new MultipleOperationClass { Firstname = "Jimmie" }
162+
}
163+
};
164+
165+
var saveMultiple = await BaseTest.SearchClient.MultipleBatchAsync(objectsToSave);
166+
saveMultiple.Wait();
167+
168+
var objectsToRetrieve = new List<MultipleGetObject>
169+
{
170+
new MultipleGetObject { IndexName = _indexName1, ObjectID = saveMultiple.ObjectIDs.ElementAt(0) },
171+
new MultipleGetObject { IndexName = _indexName1, ObjectID = saveMultiple.ObjectIDs.ElementAt(1) },
172+
new MultipleGetObject { IndexName = _indexName2, ObjectID = saveMultiple.ObjectIDs.ElementAt(2) },
173+
new MultipleGetObject { IndexName = _indexName2, ObjectID = saveMultiple.ObjectIDs.ElementAt(3) }
174+
};
175+
176+
var multipleGet =
177+
await BaseTest.SearchClient.MultipleGetObjectsAsync<MultipleOperationClass>(objectsToRetrieve);
178+
Assert.That(multipleGet.Results, Has.Exactly(4).Items);
179+
Assert.True(multipleGet.Results.All(x => x.Firstname.Equals("Jimmie")));
180+
181+
for (int i = 0; i < 4; i++)
182+
{
183+
Assert.True(multipleGet.Results.ElementAt(i).ObjectID == saveMultiple.ObjectIDs.ElementAt(i));
184+
}
185+
186+
List<QueryMultiIndices> multipleSearch = new List<QueryMultiIndices>
187+
{
188+
new(_indexName1){HitsPerPage = 2 },
189+
new(_indexName2){HitsPerPage = 2 },
190+
};
191+
192+
MultipleQueriesRequest request = new MultipleQueriesRequest
193+
{
194+
Strategy = StrategyType.None,
195+
Requests = multipleSearch
196+
};
197+
198+
MultipleQueriesRequest request2 = new MultipleQueriesRequest
199+
{
200+
Strategy = StrategyType.StopIfEnoughMatches,
201+
Requests = multipleSearch
202+
};
203+
204+
var multiQueri = await BaseTest.SearchClient.MultipleQueriesAsync<MultipleOperationClass>(request);
205+
var multiQueri2 = await BaseTest.SearchClient.MultipleQueriesAsync<MultipleOperationClass>(request2);
206+
207+
Assert.That(multiQueri.Results, Has.Exactly(2).Items);
208+
Assert.That(multiQueri.Results.ElementAt(0).Hits, Has.Exactly(2).Items);
209+
Assert.That(multiQueri.Results.ElementAt(1).Hits, Has.Exactly(2).Items);
210+
211+
Assert.That(multiQueri2.Results, Has.Exactly(2).Items);
212+
Assert.That(multiQueri2.Results.ElementAt(0).Hits, Has.Exactly(2).Items);
213+
Assert.That(multiQueri2.Results.ElementAt(1).Hits, Is.Empty);
214+
}
215+
216+
[Test]
217+
public async Task TestMultipleQueriesWithQueryMultiIndicesObject()
218+
{
219+
var objectsToSave = new List<BatchOperation<MultipleOperationClass>>
220+
{
221+
new BatchOperation<MultipleOperationClass>
222+
{
223+
IndexName = _indexName3,
224+
Action = BatchActionType.AddObject,
225+
Body = new MultipleOperationClass { Firstname = "Jimmie" }
226+
},
227+
};
228+
229+
var saveMultiple = await BaseTest.SearchClient.MultipleBatchAsync(objectsToSave);
230+
saveMultiple.Wait();
231+
232+
var query = new Query()
233+
{
234+
Explain = new List<string> { "test1", "test2" },
235+
AroundPrecision = new List<AroundPrecision>
236+
{
237+
new(){From = 0, Value = 1},
238+
new(){From = 100, Value = 10}
239+
},
240+
CustomParameters = new Dictionary<string, object>()
241+
{
242+
{"hitsPerPage", 10}
243+
},
244+
TagFilters = new List<IEnumerable<string>>()
245+
{
246+
new List<string>{ "one", "two"},
247+
new List<string>{ "one-two", "two-two"}
248+
}
249+
};
250+
251+
var request = new MultipleQueriesRequest
252+
{
253+
Requests = new List<QueryMultiIndices>{
254+
new QueryMultiIndices(_indexName3)
255+
{
256+
Explain = new List<string>{"test1", "test2"},
257+
AroundPrecision = new List<AroundPrecision>
258+
{
259+
new(){From = 0, Value = 1},
260+
new(){From = 100, Value = 10}
261+
},
262+
CustomParameters = new Dictionary<string, object>()
263+
{
264+
{"hitsPerPage", 10}
265+
},
266+
TagFilters = new List<IEnumerable<string>>()
267+
{
268+
new List<string>{ "one", "two"},
269+
new List<string>{ "one-two", "two-two"}
270+
}
271+
}
272+
}
273+
};
274+
275+
var index = BaseTest.SearchClient.InitIndex(_indexName3);
276+
277+
var responseSearch = index.Search<MultipleOperationClass>(query);
278+
var responseMultipleQueries = BaseTest.SearchClient.MultipleQueries<MultipleOperationClass>(request);
279+
280+
Assert.AreEqual(responseSearch.Params, responseMultipleQueries.Results.First().Params);
281+
}
282+
133283
[Test]
134284
public async Task TestMultipleQueriesFacet()
135285
{

src/Algolia.Search/Models/Common/MultipleQueriesRequest.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
* THE SOFTWARE.
2222
*/
2323

24+
using System;
2425
using System.Collections.Generic;
2526
using Algolia.Search.Models.Search;
2627
using Algolia.Search.Serializer;
@@ -36,18 +37,24 @@ public class MultipleQueriesRequest
3637
/// <summary>
3738
/// List of requests
3839
/// </summary>
39-
public IEnumerable<MultipleQueries> Requests { get; set; }
40+
public IEnumerable<IMultipleQueries> Requests { get; set; }
4041

4142
/// <summary>
4243
/// Request strategy <see cref="Enums.StrategyType"/>
4344
/// </summary>
4445
public string Strategy { get; set; }
4546
}
4647

48+
/// <summary>
49+
/// Multiple queries interface
50+
/// </summary>
51+
public interface IMultipleQueries { }
52+
4753
/// <summary>
4854
/// Multiple queries
4955
/// </summary>
50-
public class MultipleQueries
56+
[Obsolete("The recommended approach is to use a list of `QueryMultiIndices`.")]
57+
public class MultipleQueries : IMultipleQueries
5158
{
5259
/// <summary>
5360
/// The name of the index to perform the operation
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Algolia.Search.Models.Common;
2+
3+
namespace Algolia.Search.Models.Search
4+
{
5+
/// <summary>
6+
/// For more information regarding the parameters
7+
/// https://www.algolia.com/doc/api-reference/search-api-parameters/
8+
/// </summary>
9+
public class QueryMultiIndices : Query, IMultipleQueries
10+
{
11+
/// <summary>
12+
/// Create a new query with an empty search query, for a dedicated indice,
13+
/// </summary>
14+
/// <param name="indexName"></param>
15+
/// <param name="searchQuery"></param>
16+
public QueryMultiIndices(string indexName, string searchQuery = null)
17+
{
18+
IndexName = indexName;
19+
SearchQuery = searchQuery;
20+
}
21+
22+
/// <summary>
23+
/// The name of the index to perform the operation
24+
/// </summary>
25+
public string IndexName { get; set; }
26+
}
27+
}

0 commit comments

Comments
 (0)