示例#1
0
        public ITwitterIterator <IUser, int?> GetSearchUsersIterator(ISearchUsersParameters parameters)
        {
            var pageIterator = _client.Raw.Search.GetSearchUsersIterator(parameters);

            return(new TwitterIteratorProxy <IFilteredTwitterResult <UserDTO[]>, IUser, int?>(pageIterator,
                                                                                              twitterResult => _client.Factories.CreateUsers(twitterResult?.FilteredDTO)));
        }
示例#2
0
        public void Validate(ISearchUsersParameters parameters)
        {
            _searchClientRequiredParametersValidator.Validate(parameters);

            var maxPageSize = _client.Config.Limits.SEARCH_USERS_MAX_PAGE_SIZE;

            if (parameters.PageSize > maxPageSize)
            {
                throw new TwitterArgumentLimitException($"{nameof(parameters.PageSize)}", maxPageSize, nameof(_client.Config.Limits.SEARCH_USERS_MAX_PAGE_SIZE), "page size");
            }
        }
示例#3
0
        public ISearchUsersParameters CloneUserSearchParameters(ISearchUsersParameters searchUsersParameters)
        {
            var clone = new SearchUsersParameters(searchUsersParameters.SearchQuery)
            {
                IncludeEntities        = searchUsersParameters.IncludeEntities,
                Page                   = searchUsersParameters.Page,
                MaximumNumberOfResults = searchUsersParameters.MaximumNumberOfResults
            };

            return(clone);
        }
        public void Validate(ISearchUsersParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            if (parameters.Query == null)
            {
                throw new ArgumentNullException($"{nameof(parameters)}.{nameof(parameters.Query)}");
            }
        }
示例#5
0
        public string GetSearchUsersQuery(ISearchUsersParameters parameters)
        {
            var query = new StringBuilder(Resources.Search_SearchUsers);

            query.AddParameterToQuery("q", parameters.Query);
            query.AddParameterToQuery("page", parameters.Page);
            query.AddParameterToQuery("count", parameters.PageSize);
            query.AddParameterToQuery("include_entities", parameters.IncludeEntities);

            query.AddFormattedParameterToQuery(parameters.FormattedCustomQueryParameters);

            return(query.ToString());
        }
        public SearchUsersParameters(ISearchUsersParameters source) : base(source)
        {
            if (source == null)
            {
                PageSize = TwitterLimits.DEFAULTS.SEARCH_USERS_MAX_PAGE_SIZE;
                return;
            }

            PageSize        = source.PageSize;
            Query           = source.Query;
            IncludeEntities = source.IncludeEntities;
            Page            = source.Page;
        }
示例#7
0
        public string GetSearchUsersQuery(ISearchUsersParameters searchUsersParameters)
        {
            if (!_searchQueryValidator.IsSearchQueryValid(searchUsersParameters.SearchQuery))
            {
                throw new ArgumentException("Search query is not valid.");
            }

            var queryBuilder = new StringBuilder(Resources.Search_SearchUsers);

            queryBuilder.AddParameterToQuery("q", _searchQueryParameterGenerator.GenerateSearchQueryParameter(searchUsersParameters.SearchQuery));
            queryBuilder.AddParameterToQuery("page", searchUsersParameters.Page);
            queryBuilder.Append(_queryParameterGenerator.GenerateCountParameter(searchUsersParameters.MaximumNumberOfResults));
            queryBuilder.Append(_queryParameterGenerator.GenerateIncludeEntitiesParameter(searchUsersParameters.IncludeEntities));

            return(queryBuilder.ToString());
        }
示例#8
0
 public void Validate(ISearchUsersParameters parameters)
 {
     _searchClientParametersValidator.Validate(parameters);
 }
示例#9
0
 public Task <ITwitterResult <UserDTO[]> > SearchUsers(ISearchUsersParameters parameters, ITwitterRequest request)
 {
     request.Query.Url        = _searchQueryGenerator.GetSearchUsersQuery(parameters);
     request.Query.HttpMethod = HttpMethod.GET;
     return(_twitterAccessor.ExecuteRequest <UserDTO[]>(request));
 }
示例#10
0
        public ITwitterPageIterator <IFilteredTwitterResult <UserDTO[]>, int?> GetSearchUsersIterator(ISearchUsersParameters parameters)
        {
            _validator.Validate(parameters);

            var request = TwitterClient.CreateRequest();

            return(_searchController.GetSearchUsersIterator(parameters, request));
        }
示例#11
0
        public async Task <IUser[]> SearchUsers(ISearchUsersParameters parameters)
        {
            var pageIterator = GetSearchUsersIterator(parameters);

            return((await pageIterator.NextPage().ConfigureAwait(false)).ToArray());
        }
示例#12
0
        public IEnumerable <IUserDTO> SearchUsers(ISearchUsersParameters searchUsersParameters)
        {
            if (searchUsersParameters == null)
            {
                throw new ArgumentNullException("Search parameters cannot be null.");
            }

            if (searchUsersParameters.SearchQuery == null)
            {
                throw new ArgumentNullException("Search query cannot be null.");
            }

            if (searchUsersParameters.SearchQuery == string.Empty)
            {
                throw new ArgumentException("Search query cannot be empty.");
            }

            var maximumNumberOfResults = Math.Min(searchUsersParameters.MaximumNumberOfResults, 1000);
            var searchParameter        = _searchQueryHelper.CloneUserSearchParameters(searchUsersParameters);

            searchParameter.MaximumNumberOfResults = Math.Min(searchParameter.MaximumNumberOfResults, 20);

            string query         = _searchQueryGenerator.GetSearchUsersQuery(searchParameter);
            var    currentResult = _twitterAccessor.ExecuteGETQuery <List <IUserDTO> >(query);

            if (currentResult == null)
            {
                return(null);
            }

            var result      = currentResult.ToDictionary(user => user.Id);
            var totalTweets = result.Count;

            while (totalTweets < maximumNumberOfResults)
            {
                if (currentResult.Count == 0)
                {
                    // If Twitter does not have any result left, stop the search
                    break;
                }

                searchParameter.MaximumNumberOfResults = Math.Min(searchUsersParameters.MaximumNumberOfResults - totalTweets, 20);
                ++searchParameter.Page;
                query         = _searchQueryGenerator.GetSearchUsersQuery(searchParameter);
                currentResult = _twitterAccessor.ExecuteGETQuery <List <IUserDTO> >(query);

                bool searchIsComplete = currentResult == null;

                if (!searchIsComplete)
                {
                    foreach (var userDTO in currentResult)
                    {
                        if (result.ContainsKey(userDTO.Id))
                        {
                            searchIsComplete = true;
                        }
                        else
                        {
                            result.Add(userDTO.Id, userDTO);
                            ++totalTweets;
                        }
                    }
                }

                if (searchIsComplete)
                {
                    break;
                }
            }

            return(result.Values);
        }
示例#13
0
        public ITwitterPageIterator <IFilteredTwitterResult <UserDTO[]>, int?> GetSearchUsersIterator(ISearchUsersParameters parameters, ITwitterRequest request)
        {
            var pageNumber        = parameters.Page ?? 1;
            var previousResultIds = new HashSet <long>();

            return(new TwitterPageIterator <IFilteredTwitterResult <UserDTO[]>, int?>(
                       parameters.Page,
                       async cursor =>
            {
                var cursoredParameters = new SearchUsersParameters(parameters)
                {
                    Page = cursor
                };

                var page = await _searchQueryExecutor.SearchUsersAsync(cursoredParameters, new TwitterRequest(request)).ConfigureAwait(false);
                return new FilteredTwitterResult <UserDTO[]>(page)
                {
                    FilteredDTO = page.Model.Where(x => !previousResultIds.Contains(x.Id)).ToArray()
                };
            },
                       page =>
            {
                if (page.Model.Length == 0)
                {
                    return null;
                }

                return ++pageNumber;
            },
                       page =>
            {
                var requestUserIds = page.Model.Select(x => x.Id).ToArray();
                var newItemIds = requestUserIds.Except(previousResultIds).ToArray();

                foreach (var newItemId in newItemIds)
                {
                    previousResultIds.Add(newItemId);
                }

                return newItemIds.Length == 0 || page.Model.Length == 0;
            }));
        }
示例#14
0
        public IEnumerable <IUser> SearchUsers(ISearchUsersParameters searchUsersParameters)
        {
            var userDTOs = _searchQueryExecutor.SearchUsers(searchUsersParameters);

            return(_userFactory.GenerateUsersFromDTO(userDTOs));
        }
示例#15
0
        public string GetSearchUsersQuery(ISearchUsersParameters searchUsersParameters)
        {
            if (!_searchQueryValidator.IsSearchQueryValid(searchUsersParameters.SearchQuery))
            {
                throw new ArgumentException("Search query is not valid.");
            }

            var queryBuilder = new StringBuilder(Resources.Search_SearchUsers);

            queryBuilder.AddParameterToQuery("q", _searchQueryParameterGenerator.GenerateSearchQueryParameter(searchUsersParameters.SearchQuery));
            queryBuilder.AddParameterToQuery("page", searchUsersParameters.Page);
            queryBuilder.Append(_queryParameterGenerator.GenerateCountParameter(searchUsersParameters.MaximumNumberOfResults));
            queryBuilder.Append(_queryParameterGenerator.GenerateIncludeEntitiesParameter(searchUsersParameters.IncludeEntities));

            return queryBuilder.ToString();
        }