Ejemplo n.º 1
0
        public void PostProcess(string requestId)
        {
            if (_currentResponse == null)
            {
                return;
            }

            using (QueryComposer.IModelAdapter adapter = GetModelAdapter(true))
            {
                adapter.Initialize(Settings, requestId);

                adapter.PostProcess(_currentResponse);

                if (_currentResponse.RequestID == Guid.Empty)
                {
                    Guid id;
                    if (Guid.TryParse(requestId, out id))
                    {
                        _currentResponse.RequestID = id;
                    }
                }

                ////replace the current response with the post-processed response.
                _responseDocuments.Clear();
                _responseDocuments.AddRange(adapter.OutputDocuments());

                status.Code    = RequestStatus.StatusCode.Complete;
                status.Message = string.Empty;
            }
        }
Ejemplo n.º 2
0
        public void Start(string requestId, bool viewSQL = false)
        {
            if (_request == null)
            {
                throw new NullReferenceException("The deserialized request is null, please make sure that RequestDocument is called first and that the request document is not null.");
            }

            using (QueryComposer.IModelAdapter adapter = GetModelAdapter(true))
            {
                adapter.Initialize(Settings);


                if (viewSQL && !adapter.CanViewSQL)
                {
                    throw new Exception("The adapter does not support providing the SQL of the query.");
                }

                _currentResponse = adapter.Execute(_request, viewSQL);

                Guid requestID;
                if (Guid.TryParse(requestId, out requestID))
                {
                    _currentResponse.RequestID = requestID;
                }

                string serializedResponse = Newtonsoft.Json.JsonConvert.SerializeObject(_currentResponse, Newtonsoft.Json.Formatting.None);
                byte[] resultContent      = System.Text.Encoding.UTF8.GetBytes(serializedResponse);

                Guid     documentID     = Guid.NewGuid();
                Document resultDocument = new Document(documentID.ToString("D"), "application/json", "response.json");
                resultDocument.Size       = resultContent.Length;
                resultDocument.IsViewable = true;

                if (viewSQL)
                {
                    resultDocument.DocumentID = SqlResponseDocumentID.ToString("D");
                    _SqlResponseDocument      = new DocumentEx {
                        ID = SqlResponseDocumentID, Document = resultDocument, Content = resultContent
                    };
                }
                else
                {
                    _SqlResponseDocument = null;
                    _responseDocuments.Clear();
                    _responseDocuments.Add(new DocumentEx {
                        ID = documentID, Document = resultDocument, Content = resultContent
                    });
                }

                string message = string.Empty;
                status.PostProcess = !viewSQL && adapter.CanPostProcess(_currentResponse, out message);
                status.Message     = message;
                status.Code        = (_currentResponse.Errors != null && _currentResponse.Errors.Any()) ? RequestStatus.StatusCode.Error : string.IsNullOrWhiteSpace(status.Message) ? RequestStatus.StatusCode.Complete : RequestStatus.StatusCode.CompleteWithMessage;
            }
        }
Ejemplo n.º 3
0
        void IPatientIdentifierProcessor.GenerateLists(Guid requestID, NetworkConnectionMetadata network, RequestMetadata md, IDictionary <Guid, string> outputPaths, string format)
        {
            using (QueryComposer.IModelAdapter adapter = GetModelAdapter(_request.Queries.First(), true))
            {
                if (Settings.ContainsKey("MSRequestID"))
                {
                    Settings["MSRequestID"] = md.MSRequestID;
                }
                else
                {
                    Settings.Add("MSRequestID", md.MSRequestID);
                }

                adapter.Initialize(Settings, requestID.ToString());
                adapter.GeneratePatientIdentifierLists(_request, outputPaths, format);
            }
        }
Ejemplo n.º 4
0
        public void PostProcess(string requestId)
        {
            if (_currentResponse == null)
            {
                return;
            }

            using (QueryComposer.IModelAdapter adapter = GetModelAdapter(true))
            {
                adapter.Initialize(Settings);

                adapter.PostProcess(_currentResponse);

                if (_currentResponse.RequestID == Guid.Empty)
                {
                    Guid id;
                    if (Guid.TryParse(requestId, out id))
                    {
                        _currentResponse.RequestID = id;
                    }
                }

                //replace the current response with the post-processed response.
                string serializedResponse = Newtonsoft.Json.JsonConvert.SerializeObject(_currentResponse, Newtonsoft.Json.Formatting.None);
                byte[] resultContent      = System.Text.Encoding.UTF8.GetBytes(serializedResponse);

                Guid     documentID     = Guid.NewGuid();
                Document resultDocument = new Document(documentID.ToString("D"), "application/json", "response.json");
                resultDocument.Size       = resultContent.Length;
                resultDocument.IsViewable = true;
                _responseDocuments.Clear();
                _responseDocuments.Add(new DocumentEx {
                    ID = documentID, Document = resultDocument, Content = resultContent
                });

                status.Code    = RequestStatus.StatusCode.Complete;
                status.Message = string.Empty;
            }
        }
Ejemplo n.º 5
0
        public void Start(string requestId, bool viewSQL = false)
        {
            if (_request == null && !IsDistributedRegressionRequest)
            {
                throw new NullReferenceException("The deserialized request is null, please make sure that RequestDocument is called first and that the request document is not null.");
            }

            var queryResults        = new List <DTO.QueryComposer.QueryComposerResponseQueryResultDTO>();
            var queryCanPostProcess = new List <Tuple <Guid, bool, string> >();

            _request.SyncHeaders();

            foreach (var query in _request.Queries)
            {
                using (QueryComposer.IModelAdapter adapter = GetModelAdapter(query))
                {
                    adapter.Initialize(Settings, requestId);

                    if (viewSQL && !adapter.CanViewSQL)
                    {
                        queryResults.Add(
                            new DTO.QueryComposer.QueryComposerResponseQueryResultDTO {
                            ID         = query.Header.ID,
                            QueryStart = DateTimeOffset.UtcNow,
                            QueryEnd   = DateTimeOffset.UtcNow,
                            Errors     = new[] {
                                new DTO.QueryComposer.QueryComposerResponseErrorDTO {
                                    QueryID     = query.Header.ID,
                                    Code        = "-1",
                                    Description = $"The adapter \"{ adapter.GetType().FullName }\" does not support providing the SQL of a query."
                                }
                            }
                        }
                            );

                        queryCanPostProcess.Add(new Tuple <Guid, bool, string>(query.Header.ID, false, string.Empty));

                        continue;
                    }

                    if (IsDistributedRegressionRequest)
                    {
                        var drAdapter   = adapter as QueryComposer.Adapters.DistributedRegression.DistributedRegressionModelAdapter;
                        var queryResult = new DTO.QueryComposer.QueryComposerResponseQueryResultDTO {
                            ID = query.Header.ID, QueryStart = DateTimeOffset.UtcNow
                        };

                        try
                        {
                            DocumentEx[] outputDocuments = drAdapter.StartRequest(_drDocuments).ToArray();
                            if (outputDocuments != null && outputDocuments.Length > 0)
                            {
                                _responseDocuments.AddRange(outputDocuments);
                            }
                        }
                        catch (Exception ex)
                        {
                            queryResult.Errors = new[] {
                                new DTO.QueryComposer.QueryComposerResponseErrorDTO {
                                    QueryID     = query.Header.ID,
                                    Code        = "-1",
                                    Description = QueryComposer.ExceptionHelpers.UnwindException(ex)
                                }
                            };
                        }

                        queryResult.QueryEnd = DateTimeOffset.UtcNow;

                        queryResults.Add(queryResult);
                        queryCanPostProcess.Add(new Tuple <Guid, bool, string>(query.Header.ID, false, string.Empty));

                        continue;
                    }

                    DateTimeOffset queryStart = DateTimeOffset.UtcNow;
                    try
                    {
                        foreach (var result in adapter.Execute(query, viewSQL))
                        {
                            queryResults.Add(result);
                            if (adapter.CanPostProcess(result, out string postProcessMessage))
                            {
                                queryCanPostProcess.Add(new Tuple <Guid, bool, string>(query.Header.ID, true, postProcessMessage));
                            }
                            else
                            {
                                queryCanPostProcess.Add(new Tuple <Guid, bool, string>(query.Header.ID, false, string.Empty));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        queryResults.Add(
                            new DTO.QueryComposer.QueryComposerResponseQueryResultDTO {
                            ID         = query.Header.ID,
                            QueryStart = queryStart,
                            QueryEnd   = DateTimeOffset.UtcNow,
                            Errors     = new[] {
                                new DTO.QueryComposer.QueryComposerResponseErrorDTO {
                                    QueryID     = query.Header.ID,
                                    Code        = "-1",
                                    Description = QueryComposer.ExceptionHelpers.UnwindException(ex)
                                }
                            }
                        }
                            );
                        queryCanPostProcess.Add(new Tuple <Guid, bool, string>(query.Header.ID, false, string.Empty));
                    }
                } //end of adapter using
            }     //end of processing each query


            var response = new DTO.QueryComposer.QueryComposerResponseDTO {
                Header = new DTO.QueryComposer.QueryComposerResponseHeaderDTO {
                    DocumentID = viewSQL ? SqlResponseDocumentID : QueryComposerModelProcessor.NewGuid(),
                    RequestID  = _request.Header.ID
                },
                Queries = queryResults
            };

            response.RefreshQueryDates();
            response.RefreshErrors();

            string serializedResponse = Newtonsoft.Json.JsonConvert.SerializeObject(response, Newtonsoft.Json.Formatting.None);

            byte[] resultContent = System.Text.Encoding.UTF8.GetBytes(serializedResponse);

            Document resultDocument = new Document(response.Header.DocumentID.Value.ToString("D"), "application/json", "response.json");

            resultDocument.Size       = resultContent.Length;
            resultDocument.IsViewable = true;
            resultDocument.Kind       = "MultiQuery.JSON";

            if (viewSQL)
            {
                _SqlResponseDocument = new DocumentEx {
                    ID = SqlResponseDocumentID, Document = resultDocument, Content = resultContent
                };
            }
            else
            {
                _SqlResponseDocument = null;
                _responseDocuments.Clear();
                _responseDocuments.Add(new DocumentEx {
                    ID = response.Header.DocumentID.Value, Document = resultDocument, Content = resultContent
                });
                _currentResponse = response;
            }

            status.PostProcess = queryCanPostProcess.Any(q => q.Item2 == true);
            status.Message     = queryCanPostProcess.Where(q => !string.IsNullOrEmpty(q.Item3)).Any() ? string.Join("\r\n", queryCanPostProcess.Where(q => !string.IsNullOrEmpty(q.Item3)).Select(q => q.Item3).ToArray()) : string.Empty;
            status.Code        = (response.Errors != null && response.Errors.Any()) ? RequestStatus.StatusCode.Error : (string.IsNullOrEmpty(status.Message) ? RequestStatus.StatusCode.Complete : RequestStatus.StatusCode.CompleteWithMessage);
        }
Ejemplo n.º 6
0
        public void Initialize(Guid modelID, Model.DocumentWithStream[] documents)
        {
            ModelID = modelID;
            modelMetadata.SetModel(ModelID);
            if (modelID == QueryComposerModelMetadata.DistributedRegressionID)
            {
                _drDocuments = documents;
                IsDistributedRegressionRequest = true;
                ModelID = QueryComposerModelMetadata.DistributedRegressionID;
            }
            else if (documents != null && documents.Any())
            {
                _requestDocuments = documents.Select(d => d.Document).ToArray();

                IEnumerable <DocumentWithStream> requestDocuments = documents.Where(d => string.Equals(d.Document.Kind, DTO.Enums.DocumentKind.Request, StringComparison.OrdinalIgnoreCase)).ToArray();
                _desiredDocuments = requestDocuments.Select(d => d.Document).ToArray();

                DocumentWithStream requestJson = documents.Where(d => string.Equals(d.Document.Kind, DTO.Enums.DocumentKind.Request, StringComparison.OrdinalIgnoreCase) && string.Equals(d.Document.Filename, "request.json", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
                if (requestJson != null)
                {
                    try
                    {
                        using (StreamReader reader = new StreamReader(requestJson.Stream))
                        {
                            string json = reader.ReadToEnd();
                            log.Debug("Request json:" + Environment.NewLine + json);

                            _request = Lpp.Dns.DTO.QueryComposer.QueryComposerDTOHelpers.DeserializeRequest(json);
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Debug(ex.Message, ex);
                        status.Code    = RequestStatus.StatusCode.Error;
                        status.Message = ex.Message;
                        throw ex;
                    }

                    //inspect for modular or file dist. terms to determine type of request regardless of specified model for datamart
                    var allTerms = Lpp.Dns.DTO.QueryComposer.QueryComposerDTOHelpers.FlattenToTerms(_request).Where(t => t != null && (t.Type == ModelTermsFactory.ModularProgramID || t.Type == ModelTermsFactory.FileUploadID));
                    if (allTerms.Any())
                    {
                        IsFileDistributionRequest = true;
                        ModelID = QueryComposerModelMetadata.ModularProgramModelID;
                    }
                }
                else
                {
                    log.Debug("No request.json found, assuming the request is for Modular Program/File Distribution.");
                    IsFileDistributionRequest = true;
                }
            }
            else
            {
                IsFileDistributionRequest = true;
            }

            //the criteria is only required to determine the sub adapter type based on the query type. The ability to run and view sql is true by default for the model adapters.
            using (QueryComposer.IModelAdapter adapter = GetModelAdapter(null))
            {
                log.Debug(string.Format("Updating processor metadata based on the selected model adapter: CanViewSQL = {0}, CanRunAndUpload = {1}, CanUploadWithoutRun = {2}, AddFiles = {3}", adapter.CanViewSQL, adapter.CanRunAndUpload, adapter.CanUploadWithoutRun, adapter.CanAddResponseFiles));

                modelMetadata.Capabilities["CanViewSQL"]                        = adapter.CanViewSQL;
                modelMetadata.Capabilities["CanRunAndUpload"]                   = adapter.CanRunAndUpload;
                modelMetadata.Capabilities["CanUploadWithoutRun"]               = adapter.CanUploadWithoutRun;
                modelMetadata.Capabilities["AddFiles"]                          = adapter.CanAddResponseFiles;
                modelMetadata.Capabilities["IsFileDistributionRequest"]         = IsFileDistributionRequest;
                modelMetadata.Capabilities["IsDistributedRegressionRequest"]    = IsDistributedRegressionRequest;
                modelMetadata.Capabilities["CanGeneratePatientIdentifierLists"] = adapter.CanGeneratePatientIdentifierLists;
            }
        }
Ejemplo n.º 7
0
        public void Initialize(Guid modelID, Model.DocumentWithStream[] documents)
        {
            ModelID = modelID;
            modelMetadata.SetModel(ModelID);

            if (documents != null && documents.Any())
            {
                _requestDocuments = documents.Select(d => d.Document).ToArray();

                IEnumerable <DocumentWithStream> requestDocuments = documents.Where(d => string.Equals(d.Document.Kind, DTO.Enums.DocumentKind.Request, StringComparison.OrdinalIgnoreCase)).ToArray();
                _desiredDocuments = requestDocuments.Select(d => d.Document).ToArray();

                DocumentWithStream requestJson = documents.Where(d => string.Equals(d.Document.Kind, DTO.Enums.DocumentKind.Request, StringComparison.OrdinalIgnoreCase) && string.Equals(d.Document.Filename, "request.json", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
                if (requestJson != null)
                {
                    try
                    {
                        using (StreamReader reader = new StreamReader(requestJson.Stream))
                        {
                            string query = reader.ReadToEnd();
                            log.Debug("Request json:" + Environment.NewLine + query);

                            Newtonsoft.Json.JsonSerializerSettings jsonSettings = new Newtonsoft.Json.JsonSerializerSettings();
                            jsonSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.IgnoreAndPopulate;

                            _request = Newtonsoft.Json.JsonConvert.DeserializeObject <Lpp.Dns.DTO.QueryComposer.QueryComposerRequestDTO>(query, jsonSettings);
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Debug(ex.Message, ex);
                        status.Code    = RequestStatus.StatusCode.Error;
                        status.Message = ex.Message;
                        throw ex;
                    }

                    //inspect for modular or file dist. terms to determine type of request regardless of specified model for datamart
                    var allTerms = _request.Where.Criteria.SelectMany(c => c.Criteria.SelectMany(cc => cc.Terms.Where(t => t.Type == ModelTermsFactory.ModularProgramID || t.Type == ModelTermsFactory.FileUploadID))).Concat(_request.Where.Criteria.SelectMany(c => c.Terms.Where(t => t.Type == ModelTermsFactory.ModularProgramID || t.Type == ModelTermsFactory.FileUploadID))).ToArray();
                    if (allTerms.Any())
                    {
                        IsFileDistributionRequest = true;
                        ModelID = QueryComposerModelMetadata.ModularProgramModelID;
                    }
                }
                else
                {
                    log.Debug("No request.json found, assuming the request is for Modular Program/File Distribution.");
                    IsFileDistributionRequest = true;
                }
            }

            using (QueryComposer.IModelAdapter adapter = GetModelAdapter())
            {
                log.Debug(string.Format("Updating processor metadata based on the selected model adapter: CanViewSQL = {0}, CanRunAndUpload = {1}, CanUploadWithoutRun = {2}, AddFiles = {3}", adapter.CanViewSQL, adapter.CanRunAndUpload, adapter.CanUploadWithoutRun, adapter.CanAddResponseFiles));

                modelMetadata.Capabilities["CanViewSQL"]          = adapter.CanViewSQL;
                modelMetadata.Capabilities["CanRunAndUpload"]     = adapter.CanRunAndUpload;
                modelMetadata.Capabilities["CanUploadWithoutRun"] = adapter.CanUploadWithoutRun;
                modelMetadata.Capabilities["AddFiles"]            = adapter.CanAddResponseFiles;
            }
        }
        public void Start(string requestId, bool viewSQL = false)
        {
            if (_request == null && !IsDistributedRegressionRequest)
            {
                throw new NullReferenceException("The deserialized request is null, please make sure that RequestDocument is called first and that the request document is not null.");
            }

            using (QueryComposer.IModelAdapter adapter = GetModelAdapter(true))
            {
                adapter.Initialize(Settings);

                if (viewSQL && !adapter.CanViewSQL)
                {
                    throw new Exception("The adapter does not support providing the SQL of the query.");
                }

                if (IsDistributedRegressionRequest)
                {
                    var drAdapter = adapter as QueryComposer.Adapters.DistributedRegression.DistributedRegressionModelAdapter;
                    //DO DR Stuff here
                    try
                    {
                        DocumentEx[] outputDocuments = drAdapter.StartRequest(_drDocuments).ToArray();
                        if (outputDocuments != null && outputDocuments.Length > 0)
                        {
                            _responseDocuments.AddRange(outputDocuments);
                        }

                        //Message may become timeout values reached Error
                        string message = string.Empty;
                        status.PostProcess = false;
                        status.Message     = message;
                        status.Code        = RequestStatus.StatusCode.Complete;
                    }
                    catch (Exception ex)
                    {
                        status.Code    = RequestStatus.StatusCode.Error;
                        status.Message = ex.Message;
                    }
                }
                else
                {
                    var _tempResponse = adapter.Execute(_request, viewSQL);

                    Guid requestID;
                    if (Guid.TryParse(requestId, out requestID))
                    {
                        _tempResponse.RequestID = requestID;
                    }

                    string serializedResponse = Newtonsoft.Json.JsonConvert.SerializeObject(_tempResponse, Newtonsoft.Json.Formatting.None);
                    byte[] resultContent      = System.Text.Encoding.UTF8.GetBytes(serializedResponse);

                    Guid     documentID     = Guid.NewGuid();
                    Document resultDocument = new Document(documentID.ToString("D"), "application/json", "response.json");
                    resultDocument.Size       = resultContent.Length;
                    resultDocument.IsViewable = true;

                    if (viewSQL)
                    {
                        resultDocument.DocumentID = SqlResponseDocumentID.ToString("D");
                        _SqlResponseDocument      = new DocumentEx {
                            ID = SqlResponseDocumentID, Document = resultDocument, Content = resultContent
                        };
                    }
                    else
                    {
                        _SqlResponseDocument = null;
                        _responseDocuments.Clear();
                        _responseDocuments.Add(new DocumentEx {
                            ID = documentID, Document = resultDocument, Content = resultContent
                        });
                        _currentResponse = _tempResponse;
                    }
                    string message = string.Empty;
                    status.PostProcess = !viewSQL && adapter.CanPostProcess(_tempResponse, out message);
                    status.Message     = message;
                    //May have to alter this cause _currentResponse May be empty
                    status.Code = (_tempResponse.Errors != null && _tempResponse.Errors.Any()) ? RequestStatus.StatusCode.Error : string.IsNullOrWhiteSpace(status.Message) ? RequestStatus.StatusCode.Complete : RequestStatus.StatusCode.CompleteWithMessage;
                }
            }
        }
Ejemplo n.º 9
0
        public void Start(string requestId, bool viewSQL = false)
        {
            if (_request == null && !IsDistributedRegressionRequest)
            {
                throw new NullReferenceException("The deserialized request is null, please make sure that RequestDocument is called first and that the request document is not null.");
            }

            using (QueryComposer.IModelAdapter adapter = GetModelAdapter(true))
            {
                adapter.Initialize(Settings, requestId);

                if (viewSQL && !adapter.CanViewSQL)
                {
                    throw new Exception("The adapter does not support providing the SQL of the query.");
                }

                if (IsDistributedRegressionRequest)
                {
                    var drAdapter = adapter as QueryComposer.Adapters.DistributedRegression.DistributedRegressionModelAdapter;
                    //DO DR Stuff here
                    try
                    {
                        DocumentEx[] outputDocuments = drAdapter.StartRequest(_drDocuments).ToArray();
                        if (outputDocuments != null && outputDocuments.Length > 0)
                        {
                            _responseDocuments.AddRange(outputDocuments);
                        }

                        //Message may become timeout values reached Error
                        string message = string.Empty;
                        status.PostProcess = false;
                        status.Message     = message;
                        status.Code        = RequestStatus.StatusCode.Complete;
                    }
                    catch (Exception ex)
                    {
                        status.Code    = RequestStatus.StatusCode.Error;
                        status.Message = ex.Message;
                    }
                }
                else
                {
                    var _tempResponse = adapter.Execute(_request, viewSQL);

                    var outputDocuments = adapter.OutputDocuments();

                    if (viewSQL)
                    {
                        var resultDocument = outputDocuments.First();
                        resultDocument.Document.DocumentID = SqlResponseDocumentID.ToString("D");
                        resultDocument.ID    = SqlResponseDocumentID;
                        _SqlResponseDocument = resultDocument;
                    }
                    else
                    {
                        _SqlResponseDocument = null;
                        _responseDocuments.Clear();
                        _responseDocuments.AddRange(outputDocuments);
                        _currentResponse = _tempResponse;
                    }
                    string message = string.Empty;
                    status.PostProcess = !viewSQL && adapter.CanPostProcess(_tempResponse, out message);
                    status.Message     = message;
                    //May have to alter this cause _currentResponse May be empty
                    if (_tempResponse.Errors != null && _tempResponse.Errors.Any())
                    {
                        status.Code    = RequestStatus.StatusCode.Error;
                        status.Message = string.Join(Environment.NewLine, _tempResponse.Errors.Select(err => err.Description));
                    }
                    else
                    {
                        status.Code = string.IsNullOrWhiteSpace(status.Message) ? RequestStatus.StatusCode.Complete : RequestStatus.StatusCode.CompleteWithMessage;
                    }
                }
            }
        }