コード例 #1
0
        public void TestGetData()
        {
            Configuration config = new Configuration()
            {
                DesiredData = new List <DataUnit>()
                {
                    new DataUnit()
                    {
                        Name = "name", OntologicName = "http://localhost/test#TestName"
                    },
                    new DataUnit()
                    {
                        Name = "surname", OntologicName = "http://localhost/test#TestSurname"
                    }
                },
                Sources = new List <SourceIdentifier>()
                {
                    new SourceIdentifier()
                    {
                        SourceName = "vivaport", InternalId = new Guid()
                    }
                }
            };
            PhrPluginVivaport ppV  = new PhrPluginVivaport("../../Fixtures/mapping.xml", "../../Fixtures/Documents", "../../Fixtures/Patients.xml");
            PhrData           data = ppV.GetData(new PatientIdentifier()
            {
                InternalId = new Guid(PGuid)
            }, config);

            Assert.IsTrue((string)data.Data.Find(du => du.Name == "name").Value == "TestName");
            Assert.IsTrue((DateTime)data.Data.Find(du => du.Name == "name").Datetime == DateTime.Parse("1901-01-01"));
            Assert.IsTrue((string)data.Data.Find(du => du.Name == "surname").Value == "TestSurname");
            Assert.IsTrue((DateTime)data.Data.Find(du => du.Name == "surname").Datetime == DateTime.Parse("1900-01-01"));
            Assert.IsTrue(data.Data.Find(du => du.Name == "surname").OntologicType == "strong");
        }
コード例 #2
0
        /// <summary>
        /// Unifies data
        /// </summary>
        /// <param name="datum">data to unify</param>
        /// <returns>Unified data</returns>
        public List <PhrData> Unify(List <PhrData> datum)
        {
            var patients = datum.Select(p => p.Patient).Distinct();
            var sources  = datum.Select(s => s.Source).Distinct();


            List <PhrData> data = new List <PhrData>();

            foreach (PatientIdentifier patient in patients)
            {
                PhrData patientData = new PhrData()
                {
                    Patient = patient,
                    Source  = this._sourceId,
                    Data    = new List <DataUnit>()
                };
                foreach (SourceIdentifier source in sources)
                {
                    foreach (PhrData phrd in datum.Where(pd => pd.Source == source && pd.Patient == patient))
                    {
                        foreach (DataUnit du in phrd.Data)
                        {
                            if (patientData.Data.Exists(d => d.Identifier == du.Identifier))
                            {
                                //resolve conflict.
                                var existing         = patientData.Data.Where(d => d.Identifier == du.Identifier).First();
                                var rule_conflicting = this.GetUnificationRules().SourcePriority.Where(sp => sp.Source.InternalId == source.InternalId).FirstOrDefault();
                                var rule_existing    = this.GetUnificationRules().SourcePriority.Where(sp => sp.Source.InternalId == existing.Source.InternalId).FirstOrDefault();
                                if (existing.Value == du.Value)
                                {
                                    continue;
                                }

                                if (rule_conflicting == null || rule_existing == null)
                                {
                                    if (existing.Datetime < du.Datetime)
                                    {
                                        existing.Value  = du.Value;
                                        existing.Source = source;
                                        continue;
                                    }
                                }
                                else
                                {
                                    if (rule_conflicting == null)
                                    {
                                        continue; //not defined - no priority
                                    }

                                    if (rule_existing == null) // undefined priority for existing? overwrite!
                                    {
                                        existing.Value  = du.Value;
                                        existing.Source = source;
                                        continue;
                                    }
                                    // existing record source priority is lower than conflicting and the existing record is not newer
                                    if (rule_existing.Priority >= rule_conflicting.Priority && existing.Datetime >= du.Datetime)
                                    {
                                        existing.Value  = du.Value;
                                        existing.Source = source;
                                        continue;
                                    }

                                    // existing record is older and existing record source time priority is lower
                                    if (rule_existing.NewerRecordPriority >= rule_conflicting.NewerRecordPriority && existing.Datetime < du.Datetime)
                                    {
                                        existing.Value  = du.Value;
                                        existing.Source = source;
                                        continue;
                                    }
                                }
                            }
                            else
                            {
                                du.Source = source;
                                patientData.Data.Add(du);
                            }
                        }
                    }
                }
                data.Add(patientData);
            }

            return(data);
        }
コード例 #3
0
        /// <summary>
        /// Implementation of GetData method outlined in interface
        /// </summary>
        /// <param name="p">patient identifier</param>
        /// <param name="config">configuration parameters</param>
        /// <returns>PHR data</returns>
        public PhrData GetData(PatientIdentifier p, Configuration config)
        {
            PhrData retData = new PhrData();

            retData.Patient = p;
            retData.Source  = this._sourceId;
            retData.Data    = new List <DataUnit>();
            if (getPatientId(p.InternalId) == null)
            {
                return(retData);
            }

            if (!Documents.ContainsKey(getPatientId(p.InternalId)))
            {
                return(retData);
            }

            foreach (DataUnit du in config.DesiredData)
            {
                if (!this.DataMap.ContainsKey(du.OntologicName))
                {
                    continue;
                }

                foreach (XmlDocument x in (List <XmlDocument>)Documents[getPatientId(p.InternalId)])
                {
                    XDocument xd  = XDocument.Parse(x.OuterXml);
                    var       val = (IEnumerable)xd.XPathEvaluate(this.DataMap[du.OntologicName].ToString());
                    DateTime  dt  = new DateTime();
                    if (DateMap.ContainsKey(du.OntologicName))
                    {
                        var dateVal = (IEnumerable)xd.XPathEvaluate(this.DateMap[du.OntologicName].ToString());
                        if (dateVal.Cast <XText>().FirstOrDefault() != null)
                        {
                            var date = dateVal.Cast <XText>().FirstOrDefault().Value;
                            if (!DateTime.TryParse(date, out dt))
                            {
                                dt = DateTime.Parse("1900-01-01");
                            }
                        }
                        else
                        {
                            dt = DateTime.Parse("1900-01-01");
                        }
                    }
                    string type = "string";
                    if (TypeMap.ContainsKey(du.OntologicName))
                    {
                        type = TypeMap[du.OntologicName].ToString();
                    }
                    if (val.Cast <XText>().FirstOrDefault() == null)
                    {
                        continue;
                    }
                    var value = val.Cast <XText>().FirstOrDefault().Value;
                    retData.Data.Add(new DataUnit()
                    {
                        OntologicName = du.OntologicName, Value = value, Name = du.Name, Identifier = this._sourceId.SourceName, Datetime = dt, OntologicType = type
                    });
                }
            }
            return(retData);
        }
コード例 #4
0
        public PhrData GetData(PatientIdentifier p, Configuration c)
        {
            var clientApp = HealthClientApplication.Create(_clientId, _masterId, _shellUri, _platformUri);

            if (clientApp.GetApplicationInfo() == null)
            {
                // Create a new client instance.
                clientApp.StartApplicationCreationProcess();
                return(null);
            }

            var ap = clientApp.ApplicationConnection.GetAuthorizedPeople().ToList();

            var pi = clientApp.ApplicationConnection.GetAuthorizedPeople().FirstOrDefault(k => k.PersonId == p.InternalId);

            if (pi == null)
            {
                clientApp.StartUserAuthorizationProcess();
                return(null);                // not authorized;
            }

            var authConnection = clientApp.CreateAuthorizedConnection(pi.PersonId);
            var access         = new HealthRecordAccessor(authConnection, authConnection.GetPersonInfo().GetSelfRecord().Id);

            var ret = new PhrData {
                Data = new List <DataUnit>(), Patient = p, Source = Source
            };

            ret.Data.Add(new DataUnit {
                Datetime = DateTime.UtcNow, Name = "Name", OntologicName = "rdf:Name", Value = pi.Name
            });
            var b = GetSingleValue <Basic>(Basic.TypeId, access);

            ret.Data.Add(new DataUnit {
                Datetime      = b.EffectiveDate,
                Name          = "Birth date",
                OntologicName = "rdf:BDate",
                Value         = b.BirthYear
            });
            var gender = b.Gender ?? Gender.Unknown;

            ret.Data.Add(new DataUnit {
                Datetime      = b.EffectiveDate,
                Name          = "Gender",
                OntologicName = "rdf:Gender",
                Value         = gender == Gender.Male ? "male" : gender == Gender.Female ? "female" : "unknown"
            });
            ret.Data.Add(new DataUnit {
                Datetime      = b.EffectiveDate,
                Name          = "Country",
                OntologicName = "rdf:Country",
                Value         = b.Country
            });
            var heights = GetValues <Height>(Height.TypeId, access);

            foreach (var h in heights)
            {
                ret.Data.Add(new DataUnit {
                    Datetime      = h.EffectiveDate,
                    Name          = "Height_meters",
                    OntologicName = "rdf:Height",
                    Value         = h.Value.Meters
                });
            }

            var weights = GetValues <Weight>(Weight.TypeId, access);

            foreach (var w in weights)
            {
                ret.Data.Add(new DataUnit {
                    Datetime      = w.EffectiveDate,
                    Name          = "weight_kg",
                    OntologicName = "rdf:Height",
                    Value         = w.Value.Kilograms
                });
            }


            return(ret);
        }
コード例 #5
0
        /// <summary>
        /// Implementation of GetData method outlined in interface
        /// </summary>
        /// <param name="p">patient identifier</param>
        /// <param name="config">configuration parameters</param>
        /// <returns>PHR data</returns>
        public PhrData GetData(PatientIdentifier p, Configuration config)
        {
            PhrData retData = new PhrData();
            retData.Patient = p;
            retData.Source = this._sourceId;
            retData.Data = new List<DataUnit>();
            if (getPatientId(p.InternalId) == null)
            {
                return retData;
            }

            if (!Documents.ContainsKey(getPatientId(p.InternalId)))
            {
                return retData;
            }

            foreach (DataUnit du in config.DesiredData)
            {
                if (!this.DataMap.ContainsKey(du.OntologicName))
                {
                    continue;
                }

                foreach (XmlDocument x in (List<XmlDocument>)Documents[getPatientId(p.InternalId)])
                {
                    XDocument xd = XDocument.Parse(x.OuterXml);
                    var val = (IEnumerable)xd.XPathEvaluate(this.DataMap[du.OntologicName].ToString());
                    DateTime dt = new DateTime();
                    if (DateMap.ContainsKey(du.OntologicName))
                    {
                        var dateVal = (IEnumerable)xd.XPathEvaluate(this.DateMap[du.OntologicName].ToString());
                        if (dateVal.Cast<XText>().FirstOrDefault() != null)
                        {
                            var date = dateVal.Cast<XText>().FirstOrDefault().Value;
                            if (!DateTime.TryParse(date, out dt))
                            {
                                dt = DateTime.Parse("1900-01-01");
                            }
                        }
                        else
                        {
                            dt = DateTime.Parse("1900-01-01");
                        }
                    }
                    string type = "string";
                    if (TypeMap.ContainsKey(du.OntologicName))
                    {
                        type = TypeMap[du.OntologicName].ToString();
                    }
                    if (val.Cast<XText>().FirstOrDefault() == null) { continue; }
                    var value = val.Cast<XText>().FirstOrDefault().Value;
                    retData.Data.Add(new DataUnit() { OntologicName = du.OntologicName, Value = value, Name = du.Name, Identifier = this._sourceId.SourceName, Datetime = dt, OntologicType = type });
                }
            }
            return retData;
        }