コード例 #1
0
        /// <inheritdoc cref="IQueryBatchItem.ProcessResults" />
        public void ProcessResults()
        {
            ThrowIfNotInitialized();

            using (Session.SwitchCacheMode(_cacheMode))
                InitializeEntitiesAndCollections(_reader, _hydratedObjects);

            for (var i = 0; i < _queryInfos.Count; i++)
            {
                var queryInfo = _queryInfos[i];
                if (_subselectResultKeys[i] != null)
                {
                    queryInfo.Loader.CreateSubselects(_subselectResultKeys[i], queryInfo.Parameters, Session);
                }

                if (queryInfo.IsCacheable)
                {
                    if (queryInfo.IsResultFromCache)
                    {
                        var queryCacheBuilder = new QueryCacheResultBuilder(queryInfo.Loader);
                        queryInfo.Result = queryCacheBuilder.GetResultList(queryInfo.Result);
                    }

                    // This transformation must not be applied to ResultToCache.
                    queryInfo.Result =
                        queryInfo.Loader.TransformCacheableResults(
                            queryInfo.Parameters, queryInfo.CacheKey.ResultTransformer, queryInfo.Result);
                }
            }
            AfterLoadCallback?.Invoke(GetResults());
        }
コード例 #2
0
        /// <inheritdoc cref="IQueryBatchItem.ProcessResults" />
        public async Task ProcessResultsAsync(CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfNotInitialized();

            using (Session.SwitchCacheMode(_cacheMode))
                await(InitializeEntitiesAndCollectionsAsync(_reader, _hydratedObjects, cancellationToken)).ConfigureAwait(false);

            for (var i = 0; i < _queryInfos.Count; i++)
            {
                var queryInfo = _queryInfos[i];
                if (_subselectResultKeys[i] != null)
                {
                    queryInfo.Loader.CreateSubselects(_subselectResultKeys[i], queryInfo.Parameters, Session);
                }

                if (queryInfo.IsCacheable)
                {
                    if (queryInfo.IsResultFromCache)
                    {
                        var queryCacheBuilder = new QueryCacheResultBuilder(queryInfo.Loader);
                        queryInfo.Result = queryCacheBuilder.GetResultList(queryInfo.Result);
                    }

                    // This transformation must not be applied to ResultToCache.
                    queryInfo.Result =
                        queryInfo.Loader.TransformCacheableResults(
                            queryInfo.Parameters, queryInfo.CacheKey.ResultTransformer, queryInfo.Result);
                }
            }
            AfterLoadCallback?.Invoke(GetResults());
        }
コード例 #3
0
        /// <inheritdoc />
        public async Task <int> ProcessResultsSetAsync(DbDataReader reader, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfNotInitialized();

            var dialect         = Session.Factory.Dialect;
            var hydratedObjects = new List <object> [_queryInfos.Count];
            var isDebugLog      = Log.IsDebugEnabled();

            using (Session.SwitchCacheMode(_cacheMode))
            {
                var rowCount = 0;
                for (var i = 0; i < _queryInfos.Count; i++)
                {
                    var queryInfo       = _queryInfos[i];
                    var loader          = queryInfo.Loader;
                    var queryParameters = queryInfo.Parameters;

                    //Skip processing for items already loaded from cache
                    if (queryInfo.IsResultFromCache)
                    {
                        continue;
                    }

                    var entitySpan = loader.EntityPersisters.Length;
                    hydratedObjects[i] = entitySpan == 0 ? null : new List <object>(entitySpan);
                    var keys = new EntityKey[entitySpan];

                    var selection        = queryParameters.RowSelection;
                    var createSubselects = loader.IsSubselectLoadingEnabled;

                    _subselectResultKeys[i] = createSubselects ? new List <EntityKey[]>() : null;
                    var maxRows          = Loader.Loader.HasMaxRows(selection) ? selection.MaxRows : int.MaxValue;
                    var advanceSelection = !dialect.SupportsLimitOffset || !loader.UseLimit(selection, dialect);

                    if (advanceSelection)
                    {
                        await(Loader.Loader.AdvanceAsync(reader, selection, cancellationToken)).ConfigureAwait(false);
                    }

                    var forcedResultTransformer = queryInfo.CacheKey?.ResultTransformer;
                    if (queryParameters.HasAutoDiscoverScalarTypes)
                    {
                        loader.AutoDiscoverTypes(reader, queryParameters, forcedResultTransformer);
                    }

                    var lockModeArray     = loader.GetLockModes(queryParameters.LockModes);
                    var optionalObjectKey = Loader.Loader.GetOptionalObjectKey(queryParameters, Session);
                    var tmpResults        = new List <object>();
                    var queryCacheBuilder = new QueryCacheResultBuilder(loader);
                    var cacheBatcher      = queryInfo.CacheBatcher;
                    var ownCacheBatcher   = cacheBatcher == null;
                    if (ownCacheBatcher)
                    {
                        cacheBatcher = new CacheBatcher(Session);
                    }

                    if (isDebugLog)
                    {
                        Log.Debug("processing result set");
                    }

                    int count;
                    for (count = 0; count < maxRows && await(reader.ReadAsync(cancellationToken)).ConfigureAwait(false); count++)
                    {
                        if (isDebugLog)
                        {
                            Log.Debug("result set row: {0}", count);
                        }

                        rowCount++;

                        var o =
                            await(loader.GetRowFromResultSetAsync(
                                      reader,
                                      Session,
                                      queryParameters,
                                      lockModeArray,
                                      optionalObjectKey,
                                      hydratedObjects[i],
                                      keys,
                                      true,
                                      forcedResultTransformer,
                                      queryCacheBuilder,
                                      (persister, data) => cacheBatcher.AddToBatch(persister, data)
                                      , cancellationToken)).ConfigureAwait(false);
                        if (loader.IsSubselectLoadingEnabled)
                        {
                            _subselectResultKeys[i].Add(keys);
                            keys = new EntityKey[entitySpan];                             //can't reuse in this case
                        }

                        tmpResults.Add(o);
                    }

                    if (isDebugLog)
                    {
                        Log.Debug("done processing result set ({0} rows)", count);
                    }

                    queryInfo.Result = tmpResults;
                    if (queryInfo.CanPutToCache)
                    {
                        queryInfo.ResultToCache = queryCacheBuilder.Result;
                    }

                    if (ownCacheBatcher)
                    {
                        await(cacheBatcher.ExecuteBatchAsync(cancellationToken)).ConfigureAwait(false);
                    }

                    await(reader.NextResultAsync(cancellationToken)).ConfigureAwait(false);
                }

                StopLoadingCollections(reader);
                _reader          = reader;
                _hydratedObjects = hydratedObjects;
                return(rowCount);
            }
        }
コード例 #4
0
        /// <inheritdoc />
        public int ProcessResultsSet(DbDataReader reader)
        {
            ThrowIfNotInitialized();

            var dialect         = Session.Factory.Dialect;
            var hydratedObjects = new List <object> [_queryInfos.Count];

            using (Session.SwitchCacheMode(_cacheMode))
            {
                var rowCount = 0;
                for (var i = 0; i < _queryInfos.Count; i++)
                {
                    var queryInfo       = _queryInfos[i];
                    var loader          = queryInfo.Loader;
                    var queryParameters = queryInfo.Parameters;

                    //Skip processing for items already loaded from cache
                    if (queryInfo.IsResultFromCache)
                    {
                        continue;
                    }

                    var entitySpan = loader.EntityPersisters.Length;
                    hydratedObjects[i] = entitySpan == 0 ? null : new List <object>(entitySpan);
                    var keys = new EntityKey[entitySpan];

                    var selection        = queryParameters.RowSelection;
                    var createSubselects = loader.IsSubselectLoadingEnabled;

                    _subselectResultKeys[i] = createSubselects ? new List <EntityKey[]>() : null;
                    var maxRows          = Loader.Loader.HasMaxRows(selection) ? selection.MaxRows : int.MaxValue;
                    var advanceSelection = !dialect.SupportsLimitOffset || !loader.UseLimit(selection, dialect);

                    if (advanceSelection)
                    {
                        Loader.Loader.Advance(reader, selection);
                    }

                    var forcedResultTransformer = queryInfo.CacheKey?.ResultTransformer;
                    if (queryParameters.HasAutoDiscoverScalarTypes)
                    {
                        loader.AutoDiscoverTypes(reader, queryParameters, forcedResultTransformer);
                    }

                    var lockModeArray     = loader.GetLockModes(queryParameters.LockModes);
                    var optionalObjectKey = Loader.Loader.GetOptionalObjectKey(queryParameters, Session);
                    var tmpResults        = new List <object>();
                    var queryCacheBuilder = new QueryCacheResultBuilder(loader);
                    var cacheBatcher      = queryInfo.CacheBatcher;
                    var ownCacheBatcher   = cacheBatcher == null;
                    if (ownCacheBatcher)
                    {
                        cacheBatcher = new CacheBatcher(Session);
                    }

                    for (var count = 0; count < maxRows && reader.Read(); count++)
                    {
                        rowCount++;

                        var o =
                            loader.GetRowFromResultSet(
                                reader,
                                Session,
                                queryParameters,
                                lockModeArray,
                                optionalObjectKey,
                                hydratedObjects[i],
                                keys,
                                true,
                                forcedResultTransformer,
                                queryCacheBuilder,
                                (persister, data) => cacheBatcher.AddToBatch(persister, data)
                                );
                        if (loader.IsSubselectLoadingEnabled)
                        {
                            _subselectResultKeys[i].Add(keys);
                            keys = new EntityKey[entitySpan];                             //can't reuse in this case
                        }

                        tmpResults.Add(o);
                    }

                    queryInfo.Result = tmpResults;
                    if (queryInfo.CanPutToCache)
                    {
                        queryInfo.ResultToCache = queryCacheBuilder.Result;
                    }

                    if (ownCacheBatcher)
                    {
                        cacheBatcher.ExecuteBatch();
                    }

                    reader.NextResult();
                }

                InitializeEntitiesAndCollections(reader, hydratedObjects);

                return(rowCount);
            }
        }