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);
        }
Пример #2
0
        /// <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);
        }