/// <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); }
/// <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); }
public async Task <DatasetCompilerContext> GetCompilerContextAsync(DatasetExecutionRequest request) { var hydrator = GetHydrator(request); var context = await hydrator(request); return(context); }
/// <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); }
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 }); }
Hydrator GetHydrator(DatasetExecutionRequest request) { if (request.DatasetRef.UseUniversalId()) { if (request.QueryRef.UseUniversalId()) { return(ByDatasetUIdQueryUId); } return(ByDatasetUIdQueryId); } if (request.QueryRef.UseUniversalId()) { return(ByDatasetIdQueryUId); } return(ByDatasetIdQueryId); }
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) }); }
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)); } }
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; } }