/// <summary> /// Returns the results of the query as a lazy collection. /// </summary> internal IEnumerable <TResult> ExecuteList <TResult>( PageQueryParameters parameters, Func <PageData, TResult> selector, Dictionary <string, QueryTypeProperties> pageProperties) { HttpQueryParameter primaryQueryContinue = null; var revisions = parameters.PropQueryParametersCollection.SingleOrDefault(p => p.PropName == "revisions"); int limit = (revisions == null || revisions.OnlyFirst) ? -1 : 1; var pagesCollection = parameters.PagesCollection; do { var currentParameters = pagesCollection.GetNextPage(limit).ToArray(); var processedParameters = ProcessParameters( parameters.PropQueryParametersCollection, currentParameters, pageProperties); var generatorParameter = (HttpQueryParameter)currentParameters.SingleOrDefault(p => p.Name == "generator"); var generator = generatorParameter == null ? null : generatorParameter.Value; var downloaded = QueryProcessor.Download(m_wiki, processedParameters, primaryQueryContinue); var queryContinues = QueryProcessor.GetQueryContinues(downloaded); HttpQueryParameter newPrimaryQueryContinue = null; if (generator != null) { queryContinues.TryGetValue(generator, out newPrimaryQueryContinue); queryContinues.Remove(generator); } var pagingManager = new PagingManager( m_wiki, generator, parameters.PropQueryParametersCollection, currentParameters, pageProperties, primaryQueryContinue, queryContinues); var queryElement = downloaded.Element("query"); if (queryElement != null) { var partPageData = queryElement.Element("pages").Elements("page") .Select(e => new PageData(m_wiki, e, pageProperties, pagingManager)).ToArray(); pagingManager.SetPages(partPageData); var part = partPageData.Select(selector); foreach (var item in part) { yield return(item); } } primaryQueryContinue = newPrimaryQueryContinue; } while (pagesCollection.HasMorePages(primaryQueryContinue)); }
public PagingManager( WikiInfo wiki, string generator, IEnumerable <PropQueryParameters> propQueryParametersCollection, IEnumerable <HttpQueryParameterBase> currentParameters, Dictionary <string, QueryTypeProperties> pageProperties, HttpQueryParameter primaryQueryContinue, Dictionary <string, HttpQueryParameter> secondaryQueryContinues) { m_wiki = wiki; m_generator = generator; m_propQueryParametersCollection = propQueryParametersCollection; m_currentParameters = currentParameters; m_pageProperties = pageProperties; m_primaryQueryContinue = primaryQueryContinue; m_secondaryQueryContinues = secondaryQueryContinues; }
/// <summary> /// Initialize sync state. /// </summary> /// <param name="link"></param> /// <param name="typeOfToken"></param> private void Initialize(string link, TokenType typeOfToken) { string token = this.GetTokenTypeKey(typeOfToken); Uri deltaUri = new Uri(link); HttpQueryParameter queryParams = new HttpQueryParameter(deltaUri.Query); if (!queryParams.ContainsKey(token)) { throw new ArgumentException($"Link doesn't contain delta token: '{token}'."); } this.rawToken = (string)queryParams[token]; this.tokenType = typeOfToken; }
public void Test_HttpQueryParameter() { string query = "?$top=10&$skip=12&$customParam=abcd122"; HttpQueryParameter queryParameter = new HttpQueryParameter(query); Assert.IsTrue(queryParameter.Count == 3); Assert.IsTrue(queryParameter.ContainsKey("$top")); Assert.IsTrue(queryParameter.ContainsKey("$skip")); Assert.IsTrue(queryParameter.ContainsKey("$customParam")); Assert.AreEqual( queryParameter["$top"], "10"); Assert.AreEqual( queryParameter["$skip"], "12"); Assert.AreEqual( queryParameter["$customParam"], "abcd122"); queryParameter.Add( "$prop", 17); Assert.IsTrue(queryParameter.ContainsKey("$prop")); Assert.AreEqual( queryParameter["$prop"], 17); Assert.IsTrue(queryParameter.Count == 4); Assert.AreEqual( "$top=10&$skip=12&$customParam=abcd122&$prop=17", queryParameter.ToQueryString()); Assert.IsTrue(queryParameter.Remove("$skip")); Assert.AreEqual( queryParameter.Count, 3); Assert.AreEqual( "$top=10&$customParam=abcd122&$prop=17", queryParameter.ToQueryString()); }
/// <summary> /// Executes a query based on the <paramref name="parameters"/> and returns a lazy collection of results. /// </summary> public IEnumerable <TResult> ExecuteList <TResult>(QueryParameters <T, TResult> parameters) { var processedParameters = ProcessParameters(parameters, true).ToArray(); HttpQueryParameter queryContinue = null; do { var downloaded = Download(processedParameters, queryContinue); var part = GetListItems(parameters.Selector, downloaded); foreach (var item in part) { yield return(item); } queryContinue = GetQueryContinue(downloaded, m_queryTypeProperties.ModuleName); } while (queryContinue != null); }
public bool HasMorePages(HttpQueryParameter primaryQueryContinue) { MoveIfNecessary(); return(m_iterating); }
/// <summary> /// Executes query based on the given parameters and returns the results as an XML element. /// </summary> private XElement Download( IEnumerable <HttpQueryParameterBase> processedParameters, HttpQueryParameter queryContinue = null) { return(Download(m_wiki, processedParameters, queryContinue)); }
public bool HasMorePages(HttpQueryParameter primaryQueryContinue) { return(primaryQueryContinue != null); }