Beispiel #1
0
        /// <summary>
        /// Retrieves the specified dataset for patients in the specified query.
        /// </summary>
        /// <returns>A dataset result, which, if the request was valid, contains the dataset.</returns>
        /// <param name="query">Query reference value.</param>
        /// <param name="datasetQuery">Dataset query reference value.</param>
        /// <param name="cancel">Cancelcellation token.</param>
        /// <param name="early">Early time bound.</param>
        /// <param name="late">Late time bound.</param>
        /// <exception cref="LeafPreflightException"/>
        /// <exception cref="LeafDbException"/>
        /// <exception cref="OperationCanceledException"/>
        /// <exception cref="LeafCompilerException"/>
        /// <exception cref="ArgumentNullException"/>
        public async Task <Result> Dataset(QueryRef query, DatasetQueryRef datasetQuery, CancellationToken cancel, long?early = null, long?late = null)
        {
            Ensure.NotNull(query, nameof(query));
            Ensure.NotNull(datasetQuery, nameof(datasetQuery));

            var request = new DatasetExecutionRequest(query, datasetQuery, early, late);
            var result  = new Result();

            var ctx = await queryService.GetQueryCompilerContext(request);

            result.Context = ctx;

            if (ctx.State != CompilerContextState.Ok)
            {
                return(result);
            }

            cancel.ThrowIfCancellationRequested();

            var data = await datasetService.GetDatasetAsync(ctx.Context, cancel);

            result.Dataset = data;

            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// Retrieves the specified dataset for patients in the specified query.
        /// </summary>
        /// <returns>A dataset result, which, if the request was valid, contains the dataset.</returns>
        /// <param name="query">Query reference value.</param>
        /// <param name="datasetQuery">Dataset query reference value.</param>
        /// <param name="cancel">Cancelcellation token.</param>
        /// <param name="early">Early time bound.</param>
        /// <param name="late">Late time bound.</param>
        /// <exception cref="LeafRPCException"/>
        /// <exception cref="OperationCanceledException"/>
        /// <exception cref="LeafCompilerException"/>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="System.Data.Common.DbException"/>
        public async Task <Result> GetDatasetAsync(QueryRef query, DatasetQueryRef datasetQuery, CancellationToken cancel, long?early = null, long?late = null)
        {
            log.LogInformation("Dataset starting. QueryRef:{QueryRef} DatasetRef:{DatasetRef}", query, datasetQuery);
            Ensure.NotNull(query, nameof(query));
            Ensure.NotNull(datasetQuery, nameof(datasetQuery));

            var request = new DatasetExecutionRequest(query, datasetQuery, early, late);
            var result  = new Result();

            log.LogInformation("Dataset execution request. Request:{@Request}", request);
            var validationContext = await contextProvider.GetCompilerContextAsync(request);

            log.LogInformation("Dataset compiler validation context. Context:{@Context}", validationContext);

            result.Context = validationContext;
            if (validationContext.State != CompilerContextState.Ok)
            {
                log.LogError("Dataset compiler context error. State:{State}", validationContext.State);
                return(result);
            }

            cancel.ThrowIfCancellationRequested();

            var exeContext = compiler.BuildDatasetSql(validationContext.Context);

            log.LogInformation("Compiled dataset execution context. Context:{@Context}", exeContext);

            var data = await executor.ExecuteDatasetAsync(exeContext, cancel);

            log.LogInformation("Dataset complete. Patients:{Patients} Records:{Records}", data.Results.Keys.Count, data.Results.Sum(d => d.Value.Count()));

            result.Dataset = data;

            return(result);
        }
Beispiel #3
0
        public async Task <DatasetCompilerContext> GetCompilerContextAsync(DatasetExecutionRequest request)
        {
            var hydrator = GetHydrator(request);
            var context  = await hydrator(request);

            return(context);
        }
Beispiel #4
0
        /// <summary>
        /// Retrieves the specified dataset for patients in the specified query.
        /// </summary>
        /// <returns>A dataset result, which, if the request was valid, contains the dataset.</returns>
        /// <param name="query">Query reference value.</param>
        /// <param name="datasetQuery">Dataset query reference value.</param>
        /// <param name="cancel">Cancelcellation token.</param>
        /// <param name="early">Early time bound.</param>
        /// <param name="late">Late time bound.</param>
        /// <exception cref="LeafPreflightException"/>
        /// <exception cref="LeafRPCException"/>
        /// <exception cref="OperationCanceledException"/>
        /// <exception cref="LeafCompilerException"/>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="System.Data.Common.DbException"/>
        public async Task <Result> GetDatasetAsync(QueryRef query, DatasetQueryRef datasetQuery, CancellationToken cancel, long?early = null, long?late = null)
        {
            Ensure.NotNull(query, nameof(query));
            Ensure.NotNull(datasetQuery, nameof(datasetQuery));

            var request = new DatasetExecutionRequest(query, datasetQuery, early, late);
            var result  = new Result();

            var validationContext = await contextProvider.GetCompilerContextAsync(request);

            result.Context = validationContext;
            if (validationContext.State != CompilerContextState.Ok)
            {
                return(result);
            }

            cancel.ThrowIfCancellationRequested();

            var exeContext = compiler.BuildDatasetSql(validationContext.Context);

            log.LogInformation("Compiled Dataset Execution Context. Context:{@Context}", exeContext);

            var data = await executor.ExecuteDatasetAsync(exeContext, cancel);

            result.Dataset = data;

            return(result);
        }
Beispiel #5
0
        DatasetCompilerContext ReadRequestGrid(SqlMapper.GridReader gridReader, DatasetExecutionRequest request)
        {
            var queryCtx           = gridReader.ReadFirstOrDefault <QueryContext>();
            var datasetQueryRecord = gridReader.ReadFirstOrDefault <DatasetQueryRecord>();
            var datasetQuery       = datasetQueryRecord.DatasetQuery();

            return(new DatasetCompilerContext
            {
                DatasetQuery = datasetQuery,
                QueryContext = queryCtx,
                EarlyBound = request.EarlyBound,
                LateBound = request.LateBound
            });
        }
Beispiel #6
0
 Hydrator GetHydrator(DatasetExecutionRequest request)
 {
     if (request.DatasetRef.UseUniversalId())
     {
         if (request.QueryRef.UseUniversalId())
         {
             return(ByDatasetUIdQueryUId);
         }
         return(ByDatasetUIdQueryId);
     }
     if (request.QueryRef.UseUniversalId())
     {
         return(ByDatasetIdQueryUId);
     }
     return(ByDatasetIdQueryId);
 }
Beispiel #7
0
        DatasetCompilerContext ReadRequestGrid(SqlMapper.GridReader gridReader, DatasetExecutionRequest request)
        {
            var queryCtx           = gridReader.ReadFirstOrDefault <QueryContext>();
            var datasetQueryRecord = request.DatasetRef.Shape == Shape.Dynamic
                ? gridReader.ReadFirstOrDefault <DynamicDatasetQueryRecord>()
                : gridReader.ReadFirstOrDefault <DatasetQueryRecord>();
            var datasetQuery = datasetQueryRecord.DatasetQuery();

            return(new DatasetCompilerContext
            {
                DatasetQuery = datasetQuery,
                QueryContext = queryCtx,
                EarlyBound = request.EarlyBound,
                LateBound = request.LateBound,
                Panel = GetPanel(queryCtx.Definition, request.PanelIndex)
            });
        }
Beispiel #8
0
        async Task <DatasetCompilerContext> ByDatasetIdQueryId(DatasetExecutionRequest request)
        {
            log.LogInformation("Getting DatasetQueryCompilerContext by DatasetId and QueryId");
            var datasetid = request.DatasetRef.Id.Value;
            var queryid   = request.QueryRef.Id.Value;

            using (var cn = new SqlConnection(opts.ConnectionString))
            {
                await cn.OpenAsync();

                var grid = await cn.QueryMultipleAsync(
                    ContextQuery.byDatasetIdQueryId,
                    new { datasetid, queryid, user = user.UUID, groups = GroupMembership.From(user), admin = user.IsAdmin },
                    commandType : CommandType.StoredProcedure,
                    commandTimeout : opts.DefaultTimeout
                    );

                return(ReadRequestGrid(grid, request));
            }
        }
Beispiel #9
0
        public async Task <CompilerValidationContext <DatasetCompilerContext> > GetQueryCompilerContext(DatasetExecutionRequest request)
        {
            log.LogInformation("Getting dataset query compiler context. Request:{@Request}", request);
            var hydrator = GetHydrator(request);

            try
            {
                var context = await hydrator(request);

                var state = GetContextState(context);

                return(new CompilerValidationContext <DatasetCompilerContext>
                {
                    Context = context,
                    State = state
                });
            }
            catch (SqlException se)
            {
                log.LogError("Could not get dataset query context. Context:{@Context} Code:{Code} Error:{Error}", request, se.ErrorCode, se.Message);
                se.MapThrow();
                throw;
            }
        }