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"); }
/// <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); }
/// <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); }
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); }
/// <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; }