示例#1
0
        /// <summary>
        /// Retrieve multiple query results from the cache.
        /// </summary>
        /// <param name="queryCache">The cache.</param>
        /// <param name="keys">The query keys.</param>
        /// <param name="queryParameters">The array of query parameters matching <paramref name="keys"/>.</param>
        /// <param name="returnTypes">The array of query result row types matching <paramref name="keys"/>.</param>
        /// <param name="spaces">The array of query spaces matching <paramref name="keys"/>.</param>
        /// <param name="session">The session for which the queries are executed.</param>
        /// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param>
        /// <returns>The cached query results, matching each key of <paramref name="keys"/> respectively. For each
        /// missed key, it will contain a <see langword="null" />.</returns>
        public static async Task <IList[]> GetManyAsync(
            this IQueryCache queryCache,
            QueryKey[] keys,
            QueryParameters[] queryParameters,
            ICacheAssembler[][] returnTypes,
            ISet <string>[] spaces,
            ISessionImplementor session, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            if (queryCache is IBatchableQueryCache batchableQueryCache)
            {
                return(await(batchableQueryCache.GetManyAsync(
                                 keys,
                                 queryParameters,
                                 returnTypes,
                                 spaces,
                                 session, cancellationToken)).ConfigureAwait(false));
            }

            var results = new IList[keys.Length];

            for (var i = 0; i < keys.Length; i++)
            {
                results[i] = await(queryCache.GetAsync(keys[i], queryParameters[i], returnTypes[i], spaces[i], session, cancellationToken)).ConfigureAwait(false);
            }

            return(results);
        }
示例#2
0
        /// <summary>
        /// Get query results from the cache.
        /// </summary>
        /// <param name="queryCache">The cache.</param>
        /// <param name="key">The query key.</param>
        /// <param name="queryParameters">The query parameters.</param>
        /// <param name="returnTypes">The query result row types.</param>
        /// <param name="spaces">The query spaces.</param>
        /// <param name="session">The session for which the query is executed.</param>
        /// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param>
        /// <returns>The query results, if cached.</returns>
        public static async Task <IList> GetAsync(
            this IQueryCache queryCache,
            QueryKey key,
            QueryParameters queryParameters,
            ICacheAssembler[] returnTypes,
            ISet <string> spaces,
            ISessionImplementor session, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            if (queryCache is IBatchableQueryCache batchableQueryCache)
            {
                return(await(batchableQueryCache.GetAsync(
                                 key,
                                 queryParameters,
                                 returnTypes,
                                 spaces,
                                 session, cancellationToken)).ConfigureAwait(false));
            }

            if (!_hasWarnForObsoleteQueryCache)
            {
                _hasWarnForObsoleteQueryCache = true;
                Log.Warn("{0} is obsolete, it should implement {1}", queryCache, nameof(IBatchableQueryCache));
            }

            var persistenceContext = session.PersistenceContext;

            var defaultReadOnlyOrig = persistenceContext.DefaultReadOnly;

            if (queryParameters.IsReadOnlyInitialized)
            {
                persistenceContext.DefaultReadOnly = queryParameters.ReadOnly;
            }
            else
            {
                queryParameters.ReadOnly = persistenceContext.DefaultReadOnly;
            }

            try
            {
#pragma warning disable 618
                return(await(queryCache.GetAsync(
#pragma warning restore 618
                                 key,
                                 returnTypes,
                                 queryParameters.NaturalKeyLookup,
                                 spaces,
                                 session, cancellationToken)).ConfigureAwait(false));
            }
            finally
            {
                persistenceContext.DefaultReadOnly = defaultReadOnlyOrig;
            }
        }
 public async Task <IList> GetResultFromQueryCacheAsync(ISessionImplementor session, QueryParameters queryParameters,
                                                        ISet <string> querySpaces, IQueryCache queryCache, QueryKey key, CancellationToken cancellationToken)
 {
     cancellationToken.ThrowIfCancellationRequested();
     if (!queryParameters.ForceCacheRefresh)
     {
         IList list =
             await(queryCache.GetAsync(key, new ICacheAssembler[] { this }, queryParameters.NaturalKeyLookup, querySpaces, session, cancellationToken)).ConfigureAwait(false);
         //we had to wrap the query results in another list in order to save all
         //the queries in the same bucket, now we need to do it the other way around.
         if (list != null)
         {
             list = (IList)list[0];
         }
         return(list);
     }
     return(null);
 }