示例#1
0
        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");
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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) }
                });
            }
        }
示例#4
0
        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}");
        }
示例#5
0
        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}");
        }
示例#6
0
        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);
        }
示例#7
0
        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");
        }
示例#8
0
        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}");
        }
示例#9
0
        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);
        }
示例#10
0
        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);
        }