private void AddIssueOrPullRequest(GitHubEventRepository repository, GitHubEventIssueOrPullRequest issueOrPullRequest)
            {
                var index = _indexService.Index;

                if (index is null)
                {
                    return;
                }

                var crawledRepo = index.Repos.SingleOrDefault(r => r.Id == repository.Id);

                if (crawledRepo is null)
                {
                    return;
                }

                var crawledIssue = new CrawledIssue();

                crawledIssue.Id            = issueOrPullRequest.Id;
                crawledIssue.Repo          = crawledRepo;
                crawledIssue.Number        = issueOrPullRequest.Number;
                crawledIssue.CreatedAt     = issueOrPullRequest.CreatedAt;
                crawledIssue.CreatedBy     = issueOrPullRequest.User.Login;
                crawledIssue.IsPullRequest = issueOrPullRequest is GitHubEventPullRequest;

                UpdateIssueOrPullRequest(repository, issueOrPullRequest, crawledIssue);

                crawledRepo.Issues[crawledIssue.Number] = crawledIssue;

                AddTrieTerms(crawledIssue, crawledIssue.GetTrieTerms());

                _indexService.NotifyIndexChanged();
            }
            private void RemoveIssue(CrawledRepo crawledRepo, CrawledIssue crawledIssue)
            {
                var oldTrieTerms = crawledIssue.GetTrieTerms();

                crawledRepo.Issues.Remove(crawledIssue.Number);

                RemoveTrieTerms(crawledIssue, oldTrieTerms);
            }
            private void UpdateTrie(CrawledIssue issue, IEnumerable <string> oldTerms)
            {
                var trie = _indexService.Index?.Trie;

                if (trie is null)
                {
                    return;
                }

                var newTerms = issue.GetTrieTerms();

                var removedTerms = oldTerms.Where(t => !newTerms.Contains(t));
                var addedTerms   = newTerms.Where(t => !oldTerms.Contains(t));

                RemoveTrieTerms(issue, removedTerms);
                AddTrieTerms(issue, addedTerms);
            }