public QueryComposerQueryInterrogator(DTO.QueryComposer.QueryComposerQueryDTO query)
        {
            _query = query;
            if (_query.Select == null)
            {
                _query.Select = new DTO.QueryComposer.QueryComposerSelectDTO
                {
                    Fields = Enumerable.Empty <DTO.QueryComposer.QueryComposerFieldDTO>()
                };
            }

            if (_query.Select.Fields == null)
            {
                _query.Select.Fields = Enumerable.Empty <DTO.QueryComposer.QueryComposerFieldDTO>();
            }

            _selectFields = _query.Select.Fields;

            if (_query.Where.Criteria == null)
            {
                _query.Where.Criteria = Enumerable.Empty <DTO.QueryComposer.QueryComposerCriteriaDTO>();
            }

            _primaryCriteria = _query.Where.Criteria.FirstOrDefault();
            if (_primaryCriteria != null)
            {
                _primaryObservationPeriodTerm = _primaryCriteria.Terms.FirstOrDefault(t => t.Type == ModelTermsFactory.ObservationPeriodID);
            }
        }
예제 #2
0
        protected override SummaryRequestModel ConvertToModel(DTO.QueryComposer.QueryComposerQueryDTO query)
        {
            var criteria = query.Where.Criteria.First();

            SummaryRequestModel model = new SummaryRequestModel();
            var observationPeriodTerm = GetAllCriteriaTerms(criteria, ModelTermsFactory.YearID).FirstOrDefault();

            if (observationPeriodTerm != null)
            {
                model.StartPeriod = observationPeriodTerm.GetStringValue("StartYear");
                model.EndPeriod   = observationPeriodTerm.GetStringValue("EndYear");
                model.Period      = string.Join(",", QueryAdapter.ExpandYears(model).Select(y => "'" + y + "'"));//used in query
            }

            DTO.Enums.Coverages coverage;
            var cov = GetAllCriteriaTerms(criteria, ModelTermsFactory.CoverageID).FirstOrDefault();

            if (cov.GetEnumValue("Coverage", out coverage))
            {
                model.Coverage = coverage;
            }

            //These values are pulled from the stratification section of the request json
            var ageStratification = GetAgeField(query.Select.Fields.Where(f => f.Type == ModelTermsFactory.AgeRangeID));

            if (ageStratification != null)
            {
                QueryAdapter.SetAgeStratification(model, ageStratification);
            }

            var sexStratification = GetAllCriteriaTerms(criteria, ModelTermsFactory.SexID).FirstOrDefault();

            if (sexStratification != null)
            {
                QueryAdapter.SetSexStratification(model, sexStratification);
            }

            model.Codes          = null; //not applicable to this query
            model.CodeNames      = null; //not applicable to this query
            model.Setting        = null; //not applicable to this query
            model.MetricType     = "0";  //not applicable to this query
            model.OutputCriteria = "0";  //not applicable to this query
            model.StartQuarter   = null; //not applicable to this query
            model.EndQuarter     = null; //not applicable to this query
            model.SubtypeId      = 0;    //value never gets set in ui of v5 summary query composer

            return(model);
        }
예제 #3
0
        protected override SummaryRequestModel ConvertToModel(DTO.QueryComposer.QueryComposerQueryDTO query)
        {
            var criteria = query.Where.Criteria.First();

            SummaryRequestModel model = new SummaryRequestModel();
            var observationPeriodTerm = GetAllCriteriaTerms(criteria, ModelTermsFactory.YearID).FirstOrDefault();

            if (observationPeriodTerm != null)
            {
                model.StartPeriod = observationPeriodTerm.GetStringValue("StartYear");
                model.EndPeriod   = observationPeriodTerm.GetStringValue("EndYear");
                model.Period      = string.Join(",", QueryAdapter.ExpandYears(model).Select(y => "'" + y + "'"));//used in query
            }

            var codeTerms = criteria.Criteria.SelectMany(c => c.Terms.Where(t => t.Type == ModelTermsFactory.HCPCSProcedureCodesID)).Concat(criteria.Terms.Where(t => t.Type == ModelTermsFactory.HCPCSProcedureCodesID));
            IEnumerable <string> codeTermValues = from t in codeTerms
                                                  from v in t.GetCodeStringCollection()
                                                  where !string.IsNullOrWhiteSpace(v)
                                                  select v.Trim();

            model.Codes = string.Join(",", codeTermValues.Distinct());

            IEnumerable <string> codeNameValues = from t in codeTerms
                                                  from v in t.GetCodeNameStringCollection()
                                                  where !string.IsNullOrWhiteSpace(v)
                                                  select v.Trim();

            model.CodeNames = codeNameValues.Distinct().ToArray();

            DTO.Enums.Settings settingValue;
            var setting = GetAllCriteriaTerms(criteria, ModelTermsFactory.SettingID).FirstOrDefault();

            if (setting.GetEnumValue("Setting", out settingValue))
            {
                model.Setting = settingValue.ToString();
            }

            //These values are pulled from the stratification section of the request json
            var ageStratification = GetAgeField(query.Select.Fields.Where(f => f.Type == ModelTermsFactory.AgeRangeID));

            if (ageStratification != null)
            {
                QueryAdapter.SetAgeStratification(model, ageStratification);
            }

            var sexStratification = GetAllCriteriaTerms(criteria, ModelTermsFactory.SexID).FirstOrDefault();

            if (sexStratification != null)
            {
                QueryAdapter.SetSexStratification(model, sexStratification);
            }

            model.Coverage       = null; //not applicable to this query
            model.MetricType     = "0";  //not applicable to this query
            model.OutputCriteria = "0";  //not applicable to this query
            model.StartQuarter   = null; //not applicable to this query
            model.EndQuarter     = null; //not applicable to this query
            model.SubtypeId      = 0;    //value never gets set in ui of v5 summary query composer

            return(model);
        }
예제 #4
0
        QueryComposer.IModelAdapter GetModelAdapter(DTO.QueryComposer.QueryComposerQueryDTO query, bool requireRequestDTO = false)
        {
            if (IsFileDistributionRequest)
            {
                return(new QueryComposer.Adapters.ModularProgram.ModularProgramModelAdapter(_requestMetadata));
            }

            if (IsDistributedRegressionRequest)
            {
                return(new QueryComposer.Adapters.DistributedRegression.DistributedRegressionModelAdapter(_requestMetadata));
            }

            if (ModelID == QueryComposerModelMetadata.SummaryTableModelID)
            {
                if ((requireRequestDTO == false) && (_request == null || query == null))
                {
                    return(new QueryComposer.Adapters.SummaryQuery.DummyModelAdapter(_requestMetadata));
                }

                if (!query.Header.QueryType.HasValue)
                {
                    throw new Exception($"Unable to determine the Summary Query Type supported by the adapter required by query \"{ query.Header.Name }\". Invalid request JSON.");
                }

                switch (query.Header.QueryType.Value)
                {
                case Dns.DTO.Enums.QueryComposerQueryTypes.SummaryTable_Incidence:
                    return(new QueryComposer.Adapters.SummaryQuery.IncidenceModelAdapter(_requestMetadata));

                case Dns.DTO.Enums.QueryComposerQueryTypes.SummaryTable_MFU:
                    return(new QueryComposer.Adapters.SummaryQuery.MostFrequentlyUsedQueriesModelAdapter(_requestMetadata));

                case Dns.DTO.Enums.QueryComposerQueryTypes.SummaryTable_Prevalence:
                    return(new QueryComposer.Adapters.SummaryQuery.PrevalenceModelAdapter(_requestMetadata));

                case DTO.Enums.QueryComposerQueryTypes.Sql:
                    return(new QueryComposer.Adapters.SummaryQuery.SqlDistributionAdapter(_requestMetadata));

                default:
                    throw new Exception($"Cannot determine model query adapter:{ query.Header.QueryType.Value} for query \"{ query.Header.Name }\".");
                }
            }


            var adaptersTypes = (from a in AppDomain.CurrentDomain.GetAssemblies()
                                 from t in GetLoadableTypes(a).Where(i => i.FullName.StartsWith("System.") == false)
                                 let interfaces = t.GetInterfaces().DefaultIfEmpty()
                                                  where interfaces.Any(i => i == typeof(QueryComposer.IModelAdapter)) &&
                                                  !t.IsInterface
                                                  select t).ToArray();

            foreach (Type type in adaptersTypes.Where(t => t.GetConstructor(Type.EmptyTypes) != null))
            {
                var adapter = (QueryComposer.IModelAdapter)Activator.CreateInstance(type);

                if (adapter.ModelID == ModelID)
                {
                    return(adapter);
                }
            }

            foreach (Type type in adaptersTypes.Where(t => t.GetConstructor(new[] { typeof(RequestMetadata) }) != null))
            {
                var adapter = (QueryComposer.IModelAdapter)Activator.CreateInstance(type, _requestMetadata);

                if (adapter.ModelID == ModelID)
                {
                    return(adapter);
                }
            }

            throw new Exception("Model adapter for modelID: " + ModelID + " not found.");
        }
예제 #5
0
        protected override SummaryRequestModel ConvertToModel(DTO.QueryComposer.QueryComposerQueryDTO query)
        {
            var criteria = query.Where.Criteria.First();

            SummaryRequestModel model = new SummaryRequestModel();
            var observationPeriodTerm = GetAllCriteriaTerms(criteria, ModelTermsFactory.QuarterYearID).FirstOrDefault();

            if (observationPeriodTerm != null)
            {
                model.StartPeriod = observationPeriodTerm.GetStringValue("StartYear");
                model.EndPeriod   = observationPeriodTerm.GetStringValue("EndYear");

                if (string.Equals(observationPeriodTerm.GetStringValue("ByYearsOrQuarters"), "ByQuarters", StringComparison.OrdinalIgnoreCase))
                {
                    model.StartQuarter = observationPeriodTerm.GetStringValue("StartQuarter");
                    model.EndQuarter   = observationPeriodTerm.GetStringValue("EndQuarter");
                    model.Period       = string.Join(",", QueryAdapter.ExpandYearsWithQuarters(Convert.ToInt32(model.StartPeriod), Convert.ToInt32(model.StartQuarter[1].ToString()), Convert.ToInt32(model.EndPeriod), Convert.ToInt32(model.EndQuarter[1].ToString())).Select(y => "'" + y + "'"));//used in query
                }
                else
                {
                    model.StartQuarter = null;
                    model.EndQuarter   = null;
                    model.Period       = string.Join(",", QueryAdapter.ExpandYears(model).Select(y => "'" + y + "'"));//used in query
                }
            }

            var codeTerms = criteria.FlattenCriteriaToTerms().Where(t => t.Type == ModelTermsFactory.DrugNameID || t.Type == ModelTermsFactory.DrugClassID);

            if (codeTerms.Any(t => t.Type == ModelTermsFactory.DrugNameID))
            {
                _queryType = IncidencePharmaDispensingQueryType.DrugName;
            }
            else if (codeTerms.Any(t => t.Type == ModelTermsFactory.DrugClassID))
            {
                _queryType = IncidencePharmaDispensingQueryType.DrugClass;
            }
            else
            {
                throw new InvalidOperationException("Either a Drug Name term or a Drug Class term is required for the query.");
            }

            var codeTermValues = (from t in codeTerms
                                  let v = t.GetCodeSelectorValues()
                                          from c in v
                                          where c != null && !string.IsNullOrWhiteSpace(c.Code)
                                          select c).GroupBy(k => k.Code.Trim()).Select(k => new { Code = k.Key, Name = k.Select(c => c.Name).FirstOrDefault() ?? k.Key }).ToArray();

            model.Codes     = string.Join(",", codeTermValues.Select(c => System.Net.WebUtility.HtmlEncode(c.Code).Replace(",", "&#44;")));
            model.CodeNames = codeTermValues.Select(c => c.Name).ToArray();

            //These values are pulled from the stratification section of the request json
            var ageStratification = GetAgeField(query.Select.Fields.Where(f => f.Type == ModelTermsFactory.AgeRangeID));

            if (ageStratification != null)
            {
                QueryAdapter.SetAgeStratification(model, ageStratification);
            }
            var sexStratification = GetAllCriteriaTerms(criteria, ModelTermsFactory.SexID).FirstOrDefault();

            if (sexStratification != null)
            {
                QueryAdapter.SetSexStratification(model, sexStratification);
            }

            model.Setting        = null; //not applicable to this query
            model.Coverage       = null; //not applicable to this query
            model.MetricType     = "0";  //not applicable to this query
            model.OutputCriteria = "0";  //not applicable to this query
            model.SubtypeId      = 0;    //value never gets set in ui of v5 summary query composer

            return(model);
        }
예제 #6
0
 public abstract IEnumerable <DTO.QueryComposer.QueryComposerResponseQueryResultDTO> Execute(DTO.QueryComposer.QueryComposerQueryDTO query, bool viewSQL);
예제 #7
0
        public override IEnumerable <DTO.QueryComposer.QueryComposerResponseQueryResultDTO> Execute(DTO.QueryComposer.QueryComposerQueryDTO query, bool viewSQL)
        {
            Guid          termID       = Guid.Empty;
            IQueryAdapter queryAdapter = null;

            if (query.Where.Criteria.First().Terms.Any(t => t.Type == Lpp.QueryComposer.ModelTermsFactory.SqlDistributionID))
            {
                logger.Debug("Sql Distribution term found, creating SummarySqlQueryAdapter.");
                SummarySqlQueryAdapter sql = new SummarySqlQueryAdapter();
                var result = sql.Execute(query, _settings, viewSQL);
                return(new[] { result });
            }

            if (query.Select.Fields.Any(f => CodeQueryTermIDs.Contains(f.Type)))
            {
                if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.HCPCSProcedureCodesID))
                {
                    termID = ModelTermsFactory.HCPCSProcedureCodesID;
                    logger.Debug("HCPCS Procedure Codes selector found, creating MFUCodesQueryAdapter.");
                }
                else if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.ICD9DiagnosisCodes3digitID))
                {
                    termID = ModelTermsFactory.ICD9DiagnosisCodes3digitID;
                    logger.Debug("ICD9 Diagnosis Codes (3 digit) selector found, creating MFUCodesQueryAdapter.");
                }
                else if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.ICD9DiagnosisCodes4digitID))
                {
                    termID = ModelTermsFactory.ICD9DiagnosisCodes4digitID;
                    logger.Debug("ICD9 Diagnosis Codes (4 digit) term found, creating MFUCodesQueryAdapter.");
                }
                else if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.ICD9DiagnosisCodes5digitID))
                {
                    termID = ModelTermsFactory.ICD9DiagnosisCodes5digitID;
                    logger.Debug("ICD9 Diagnosis Codes (5 digit) selector found, creating MFUCodesQueryAdapter.");
                }
                else if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.ICD9ProcedureCodes3digitID))
                {
                    termID = ModelTermsFactory.ICD9ProcedureCodes3digitID;
                    logger.Debug("ICD9 Procedure Codes (3 digit) selector found, creating MFUCodesQueryAdapter.");
                }
                else if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.ICD9ProcedureCodes4digitID))
                {
                    termID = ModelTermsFactory.ICD9ProcedureCodes4digitID;
                    logger.Debug("ICD9 Procedure Codes (4 digit) selector found, creating MFUCodesQueryAdapter.");
                }

                queryAdapter = new MostFrequentlyUsedCodesQueryAdapter(_settings, termID);
            }
            else if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.DrugClassID || f.Type == ModelTermsFactory.DrugNameID))
            {
                if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.DrugClassID))
                {
                    termID = ModelTermsFactory.DrugClassID;
                    logger.Debug("Pharamcy dispensing drug class selector found, creating MFUPharmaQueryAdapter.");
                }
                else if (query.Select.Fields.Any(f => f.Type == ModelTermsFactory.DrugNameID))
                {
                    termID = ModelTermsFactory.DrugNameID;
                    logger.Debug("Pharamcy dispensing generic drug selector found, creating MFUPharmaQueryAdapter.");
                }

                queryAdapter = new MostFrequentlyUsedPharmaDispensingQueryAdapter(_settings, termID);
            }

            if (queryAdapter == null)
            {
                throw new InvalidOperationException("Unable to determine the query adapter to use based on the primary criteria terms.");
            }

            using (queryAdapter)
            {
                var qcResponseDTO = queryAdapter.Execute(query, viewSQL);
                foreach (var r in qcResponseDTO)
                {
                    r.LowCellThrehold = _lowThresholdValue;
                }

                return(qcResponseDTO);
            }
        }
예제 #8
0
 public override IEnumerable <DTO.QueryComposer.QueryComposerResponseQueryResultDTO> Execute(DTO.QueryComposer.QueryComposerQueryDTO query, bool viewSQL)
 {
     //modular program doesn't actually upload anything.
     throw new NotImplementedException();
 }
예제 #9
0
 /// <summary>
 /// Returns all terms from all criteria defined in the query.
 /// </summary>
 /// <param name="query"></param>
 /// <returns></returns>
 public static IEnumerable <DTO.QueryComposer.QueryComposerTermDTO> FlattenToTerms(this DTO.QueryComposer.QueryComposerQueryDTO query)
 {
     foreach (var criteria in query.Where.Criteria)
     {
         //foreach root critiera in each query
         foreach (var term in FlattenCriteriaToTerms(criteria).Where(t => t != null))
         {
             yield return(term);
         }
     }
 }