public async Task RulesTest() { var saveObjects = await _index.SaveObjectsAsync(new List <MobilePhone> { new MobilePhone { ObjectID = "iphone_7", Brand = "Apple", Model = "7" }, new MobilePhone { ObjectID = "iphone_8", Brand = "Apple", Model = "8" }, new MobilePhone { ObjectID = "iphone_x", Brand = "Apple", Model = "X" }, new MobilePhone { ObjectID = "one_plus_one", Brand = "OnePlus", Model = "One" }, new MobilePhone { ObjectID = "one_plus_two", Brand = "OnePlus", Model = "Two" } }); // Set attributesForFaceting to [“brand”] using setSettings and collect the taskID IndexSettings settings = new IndexSettings { AttributesForFaceting = new List <string> { "brand", "model" } }; var setSettingsResponse = await _index.SetSettingsAsync(settings); saveObjects.Wait(); setSettingsResponse.Wait(); Rule ruleToSave = new Rule { ObjectID = "brand_automatic_faceting", Enabled = false, #pragma warning disable 612, 618 Condition = new Condition { Anchoring = "is", Pattern = "{facet:brand}" }, #pragma warning restore 612, 618 Consequence = new Consequence { FilterPromotes = false, Params = new ConsequenceParams { AutomaticFacetFilters = new List <AutomaticFacetFilter> { new AutomaticFacetFilter { Facet = "brand", Disjunctive = true, Score = 42 } } } }, Validity = new List <TimeRange> { new TimeRange { From = DateTimeHelper.UnixTimeToDateTime(1532439300), // 07/24/2018 13:35:00 UTC Until = DateTimeHelper.UnixTimeToDateTime(1532525700) // 07/25/2018 13:35:00 UTC }, new TimeRange { From = DateTimeHelper.UnixTimeToDateTime(1532612100), // 07/26/2018 13:35:00 UTC Until = DateTimeHelper.UnixTimeToDateTime(1532698500) // 07/27/2018 13:35:00 UTC } }, Description = "Automatic apply the faceting on `brand` if a brand value is found in the query" }; var saveRuleResponse = await _index.SaveRuleAsync(ruleToSave); Rule ruleToSave2 = new Rule { ObjectID = "query_edits", Conditions = new List <Condition> { new Condition { Anchoring = "is", Pattern = "mobile phone", Alternatives = Alternatives.Of(true) }, }, Consequence = new Consequence { Params = new ConsequenceParams { Query = new ConsequenceQuery { Edits = new List <Edit> { new Edit { Type = EditType.Remove, Delete = "mobile" }, new Edit { Type = EditType.Replace, Delete = "phone", Insert = "ihpone" }, } } } } }; Rule ruleToSave3 = new Rule { ObjectID = "query_promo", Consequence = new Consequence { Params = new ConsequenceParams { Filters = "brand:OnePlus" } } }; Rule ruleToSave4 = new Rule { ObjectID = "query_promo_only_summer", #pragma warning disable 612, 618 Condition = new Condition { Context = "summer" }, #pragma warning restore 612, 618 Consequence = new Consequence { Params = new ConsequenceParams { Filters = "model:One" } } }; var batchRulesResponse = await _index.SaveRulesAsync(new List <Rule> { ruleToSave2, ruleToSave3, ruleToSave4 }); saveRuleResponse.Wait(); batchRulesResponse.Wait(); // Retrieve all the rules using getRule and check that they were correctly saved var getRuleToSave = _index.GetRuleAsync(ruleToSave.ObjectID); var getRuleToSave2 = _index.GetRuleAsync(ruleToSave2.ObjectID); var getRuleToSave3 = _index.GetRuleAsync(ruleToSave3.ObjectID); var getRuleToSave4 = _index.GetRuleAsync(ruleToSave4.ObjectID); Rule[] tasks = await Task.WhenAll(getRuleToSave, getRuleToSave2, getRuleToSave3, getRuleToSave4); Assert.True(TestHelper.AreObjectsEqual(ruleToSave, tasks[0])); Assert.True(TestHelper.AreObjectsEqual(ruleToSave2, tasks[1])); Assert.True(TestHelper.AreObjectsEqual(ruleToSave3, tasks[2])); Assert.True(TestHelper.AreObjectsEqual(ruleToSave4, tasks[3])); var searchWithContext = await _index.SearchAsync <MobilePhone>(new Query { RuleContexts = new List <string> { "summer" } }); Assert.That(searchWithContext.Hits, Has.Exactly(1).Items); SearchResponse <Rule> searchRules = await _index.SearchRuleAsync(new RuleQuery()); Assert.That(searchRules.Hits, Has.Exactly(4).Items); Assert.True(TestHelper.AreObjectsEqual(ruleToSave, searchRules.Hits.Find(r => r.ObjectID.Equals(ruleToSave.ObjectID)))); Assert.True(TestHelper.AreObjectsEqual(ruleToSave2, searchRules.Hits.Find(r => r.ObjectID.Equals(ruleToSave2.ObjectID)))); // Iterate over all the rules using ruleIterator and check that they were correctly saved List <Rule> rulesFromIterator = new RulesIterator(_index).ToList(); Assert.True(TestHelper.AreObjectsEqual(ruleToSave, rulesFromIterator.Find(r => r.ObjectID.Equals(ruleToSave.ObjectID)))); Assert.True(TestHelper.AreObjectsEqual(ruleToSave2, rulesFromIterator.Find(r => r.ObjectID.Equals(ruleToSave2.ObjectID)))); Assert.True(TestHelper.AreObjectsEqual(ruleToSave3, rulesFromIterator.Find(r => r.ObjectID.Equals(ruleToSave3.ObjectID)))); Assert.True(TestHelper.AreObjectsEqual(ruleToSave4, rulesFromIterator.Find(r => r.ObjectID.Equals(ruleToSave4.ObjectID)))); // Delete the first rule using deleteRule and check that it was correctly deleted var deleteRule = await _index.DeleteRuleAsync(ruleToSave.ObjectID); deleteRule.Wait(); SearchResponse <Rule> searchRulesAfterDelete = await _index.SearchRuleAsync(new RuleQuery()); Assert.That(searchRulesAfterDelete.Hits, Has.Exactly(3).Items); Assert.IsFalse(searchRulesAfterDelete.Hits.Exists(r => r.ObjectID.Equals(ruleToSave.ObjectID))); // Clear all the remaining rules using clearRules and check that all rules have been correctly removed var clearRule = await _index.ClearRulesAsync(); clearRule.Wait(); SearchResponse <Rule> searchRulesAfterClear = await _index.SearchRuleAsync(new RuleQuery()); Assert.That(searchRulesAfterClear.Hits, Is.Empty); }
/// <inheritdoc /> public async Task <MultiResponse> CopyIndexAsync <T>(ISearchIndex sourceIndex, ISearchIndex destinationIndex, RequestOptions requestOptions = null, CancellationToken ct = default) where T : class { if (sourceIndex.Config.AppId.Equals(destinationIndex.Config.AppId)) { throw new AlgoliaException("Source and Destination indices should not be on the same application."); } // TODO: improve this section try { IndexSettings destinationSettings = await destinationIndex.GetSettingsAsync(ct : ct).ConfigureAwait(false); if (destinationSettings != null) { throw new AlgoliaException( "Destination index already exists. Please delete it before copying index across applications."); } } catch (AlgoliaApiException ex) { // We want to catch an non existing index exception (404) and continue // Otherwise, we want to throw if it's another Http exception if (ex.HttpErrorCode != 404) { throw; } } MultiResponse ret = new MultiResponse { Responses = new List <IAlgoliaWaitableResponse>() }; // Save settings IndexSettings sourceSettings = await sourceIndex.GetSettingsAsync(ct : ct).ConfigureAwait(false); SetSettingsResponse destinationSettingsResp = await destinationIndex .SetSettingsAsync(sourceSettings, requestOptions, ct) .ConfigureAwait(false); ret.Responses.Add(destinationSettingsResp); // Save synonyms SynonymsIterator sourceSynonyms = new SynonymsIterator(sourceIndex); SaveSynonymResponse destinationSynonymResponse = await destinationIndex .SaveSynonymsAsync(sourceSynonyms, requestOptions : requestOptions, ct : ct) .ConfigureAwait(false); ret.Responses.Add(destinationSynonymResponse); // Save rules RulesIterator sourceRules = new RulesIterator(sourceIndex); BatchResponse destinationRuleResponse = await destinationIndex .SaveRulesAsync(sourceRules, requestOptions : requestOptions, ct : ct) .ConfigureAwait(false); ret.Responses.Add(destinationRuleResponse); // Save objects (batched) IndexIterator <T> indexIterator = sourceIndex.Browse <T>(new BrowseIndexQuery()); BatchIndexingResponse saveObject = await destinationIndex .SaveObjectsAsync(indexIterator, requestOptions, ct) .ConfigureAwait(false); ret.Responses.Add(saveObject); return(ret); }