Пример #1
0
        /// <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));
        }
Пример #2
0
 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;
 }
Пример #3
0
        /// <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;
        }
Пример #4
0
        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());
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
 public bool HasMorePages(HttpQueryParameter primaryQueryContinue)
 {
     MoveIfNecessary();
     return(m_iterating);
 }
Пример #7
0
 /// <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);
 }