public static DatasetDateFilterProvider For(DatasetCompilerContext compilerContext) { switch (compilerContext.Shape) { case Shape.Dynamic: return(new DynamicDatasetDateFilterProvider((compilerContext.DatasetQuery as DynamicDatasetQuery).SqlFieldDate)); case Shape.Observation: return(new ObservationDatasetDateFilterProvider()); case Shape.Encounter: return(new EncounterDatasetDateFilterProvider()); case Shape.Condition: return(new ConditionDatasetDateFilterProvider()); case Shape.Procedure: return(new ProcedureDatasetDateFilterProvider()); case Shape.Immunization: return(new ImmunizationDatasetDateFilterProvider()); case Shape.Allergy: return(new AllergyDatasetDateFilterProvider()); case Shape.MedicationRequest: return(new MedicationRequestDateFilterProvider()); case Shape.MedicationAdministration: return(new MedicationAdministrationDateFilterProvider()); default: throw new ArgumentException($"{compilerContext.Shape} switch branch not implemented"); } }
CompilerContextState GetContextState(DatasetCompilerContext context) { var state = CompilerContextState.Ok; if (!context.QueryContext.Found) { state |= CompilerContextState.QueryNotFound; } if (context.DatasetQuery == null) { state |= CompilerContextState.DatasetNotFound; } if (state != CompilerContextState.Ok) { log.LogWarning("Incomplete dataset compiler context. Context:{@Context}", context); return(state); } if (context.Shape != context.DatasetQuery.Shape) { log.LogWarning("Dataset does not match requested shape. Context:{@Context}", context); return(CompilerContextState.DatasetShapeMismatch); } return(state); }
public DatasetDateFilter GetDateFilter(DatasetCompilerContext compilerContext) { var early = compilerContext.EarlyBound; var late = compilerContext.LateBound; // neither if (!early.HasValue && !late.HasValue) { var now = DateTime.Now; var clause = $"{TargetDateField} <= {lateParamName}"; return(new DatasetDateFilter { Clause = clause, Parameters = new QueryParameter[] { new QueryParameter(lateParamName, now) } }); } // both present if (early.HasValue && late.HasValue) { var clause = $"{TargetDateField} {Dialect.Syntax.BETWEEN} {earlyParamName} {Dialect.Syntax.AND} {lateParamName}"; return(new DatasetDateFilter { Clause = clause, Parameters = new QueryParameter[] { new QueryParameter(earlyParamName, early.Value), new QueryParameter(lateParamName, late.Value) } }); } // early only if (early.HasValue && !late.HasValue) { var now = DateTime.Now; var clause = $"{TargetDateField} {Dialect.Syntax.BETWEEN} {earlyParamName} {Dialect.Syntax.AND} {lateParamName}"; return(new DatasetDateFilter { Clause = clause, Parameters = new QueryParameter[] { new QueryParameter(earlyParamName, early.Value), new QueryParameter(lateParamName, now) } }); } // late only else { var clause = $"{TargetDateField} <= {lateParamName}"; return(new DatasetDateFilter { Clause = clause, Parameters = new QueryParameter[] { new QueryParameter(lateParamName, late.Value) } }); } }
string CteFilterInternals(DatasetCompilerContext compilerContext) { var provider = DatasetDateFilterProvider.For(compilerContext.Shape); var dateFilter = provider.GetDateFilter(compilerContext); executionContext.AddParameters(dateFilter.Parameters); return($"SELECT * FROM dataset WHERE {dateFilter.Clause}"); }
string SelectFromCTE(DatasetCompilerContext ctx) { var query = $"SELECT Salt, filter.* FROM filter INNER JOIN cohort"; if (ctx.JoinToPanel) { return($"{query} ON filter.{DatasetColumns.PersonId} = cohort.{DatasetColumns.PersonId} AND filter.{EncounterColumns.EncounterId} = cohort.{EncounterColumns.EncounterId}"); } return($"{query} ON filter.{DatasetColumns.PersonId} = cohort.{fieldInternalPersonId}"); }
public async Task <Dataset> GetDatasetAsync(DatasetCompilerContext context, CancellationToken token) { var executionCtx = compiler.BuildDatasetSql(context); var dataset = await ExecuteDatasetAsync(executionCtx, token); log.LogInformation("Compiled Dataset Execution Context. Context:{@Context}", executionCtx); return(dataset); }
string CteCohortInternals(DatasetCompilerContext ctx) { executionContext.AddParameter(ShapedDatasetCompilerContext.QueryIdParam, ctx.QueryContext.QueryId); // If joining to a given panel to filter by encounter. if (ctx.JoinToPanel) { return(new DatasetJoinedSqlSet(ctx.Panel, compilerOptions).ToString()); } // Else return standard cached cohort. return($"SELECT {fieldInternalPersonId} = PersonId, Salt FROM {compilerOptions.AppDb}.app.Cohort WHERE QueryId = {ShapedDatasetCompilerContext.QueryIdParam} AND Exported = 1"); }
string CteFilterInternals(DatasetCompilerContext compilerContext) { var provider = DatasetDateFilterProvider.For(compilerContext); // Dynamic datasets may have no datefield if (!provider.CanFilter) { return($"SELECT * FROM dataset"); } var dateFilter = provider.GetDateFilter(compilerContext); executionContext.AddParameters(dateFilter.Parameters); return($"SELECT * FROM dataset WHERE {dateFilter.Clause}"); }
public DatasetExecutionContext BuildDatasetSql(DatasetCompilerContext compilerContext) { executionContext = new DatasetExecutionContext(compilerContext.Shape, compilerContext.QueryContext, compilerContext.DatasetQuery.Id.Value); var cohort = CteCohortInternals(compilerContext.QueryContext); new SqlValidator(Dialect.ILLEGAL_COMMANDS).Validate(compilerContext.DatasetQuery); var dataset = CteDatasetInternals(compilerContext.DatasetQuery); var filter = CteFilterInternals(compilerContext); var select = SelectFromCTE(); executionContext.CompiledQuery = Compose(cohort, dataset, filter, select); return(executionContext); }
public DatasetExecutionContext BuildDatasetSql(DatasetCompilerContext compilerContext) { executionContext = new DatasetExecutionContext(compilerContext.Shape, compilerContext.QueryContext, compilerContext.DatasetQuery.Id.Value); var cohort = CteCohortInternals(compilerContext); new SqlValidator(Dialect.IllegalCommands).Validate(compilerContext.DatasetQuery.SqlStatement); var dataset = CteDatasetInternals(compilerContext.DatasetQuery); var filter = CteFilterInternals(compilerContext); var select = SelectFromCTE(compilerContext); var parameters = compiler.BuildContextParameterSql(); executionContext.DatasetQuery = compilerContext.DatasetQuery; executionContext.CompiledQuery = Compose(parameters, cohort, dataset, filter, select); return(executionContext); }