public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
 {
     var concepts = base.GetConcepts(concept, reader, keyMaster).ToList();
      if (concepts.Count > 0)
      {
     var baseConcept = concepts[0];
     var died = reader.GetInt(Died);
     if (died.HasValue && died.Value == 1)
     {
        yield return new Death((Entity) baseConcept) {Primary = true};
     }
     else //Medical claim diagnostic code indicating death
     {
         if (Concepts.Count() > 1)
         {
             for (int i = 1; i < Concepts.Count(); i++)
             {
                 foreach (var entity in PopulateDeath(reader, Concepts[i], baseConcept)) yield return entity;
             }
         }
         else
         {
             foreach (var entity in PopulateDeath(reader, Concepts[0], baseConcept)) yield return entity;
         }
     }
      }
 }
Exemple #2
0
        private static void UpdateOffset(KeyMasterOffset offset)
        {
            var visitOffset = 0;
             if (offset.VisitOccurrenceIdChanged)
            visitOffset = offset.VisitOccurrenceId;

             var periodOffset = 0;
             if (offset.PayerPlanPeriodIdChanged)
            periodOffset = offset.PayerPlanPeriodId;

             var drugOffset = 0;
             if (offset.DrugExposureIdChanged)
            drugOffset = offset.DrugExposureId;

             var procedureOffset = 0;
             if (offset.ProcedureOccurrenceIdChanged)
            procedureOffset = offset.ProcedureOccurrenceId;

             var dbKeyOffset = new DbKeyOffset(Settings.Current.Building.BuilderConnectionString);
             foreach (var reader in dbKeyOffset.Update(Settings.Current.Building.Id.Value, visitOffset, periodOffset, drugOffset, procedureOffset))
             {
            offset.VisitOccurrenceOffset = reader.GetLong("VisitOccurrence").Value - visitOffset;
            offset.PayerPlanPeriodOffset = reader.GetLong("PayerPlanPeriod").Value - periodOffset;
            offset.DrugExposureOffset = reader.GetLong("DrugExposure").Value - drugOffset;
            offset.ProcedureOccurrenceOffset = reader.GetLong("ProcedureOccurrence").Value - procedureOffset;
             }
        }
Exemple #3
0
        public ChunkData(int chunkId, int subChunkId)
        {
            ChunkId    = chunkId;
            SubChunkId = subChunkId;

            KeyMasterOffset = new KeyMasterOffset();

            Persons              = new ConcurrentQueue <Person>();
            Deaths               = new ConcurrentQueue <Death>();
            ObservationPeriods   = new ConcurrentQueue <ObservationPeriod>();
            PayerPlanPeriods     = new ConcurrentQueue <PayerPlanPeriod>();
            ConditionOccurrences = new ConcurrentQueue <ConditionOccurrence>();
            DrugExposures        = new ConcurrentQueue <DrugExposure>();
            ProcedureOccurrences = new ConcurrentQueue <ProcedureOccurrence>();
            Observations         = new ConcurrentQueue <Observation>();
            Measurements         = new ConcurrentQueue <Measurement>();
            VisitOccurrences     = new ConcurrentQueue <VisitOccurrence>();
            VisitCost            = new ConcurrentQueue <VisitCost>();
            DrugCost             = new ConcurrentQueue <DrugCost>();
            ProcedureCost        = new ConcurrentQueue <ProcedureCost>();
            ConditionEra         = new ConcurrentQueue <EraEntity>();
            DrugEra              = new ConcurrentQueue <EraEntity>();
            Cohort               = new ConcurrentQueue <Cohort>();
            DeviceExposure       = new ConcurrentQueue <DeviceExposure>();
            DeviceCost           = new ConcurrentQueue <DeviceCost>();
            Cost = new ConcurrentQueue <Cost>();
            Note = new ConcurrentQueue <Note>();
        }
 public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
 {
     var id = string.IsNullOrEmpty(Id) ? KeyMaster.GetLocationId() : int.Parse(reader[Id].ToString());
      yield return new Location
      {
     Id = id,
     State = reader.GetString(State),
     SourceValue = reader.GetString(SourceValue)
      };
 }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            long? relevantConditionConceptId = 0;
             DateTime? endDate = null;

             if(Concepts.Length == 2)
             {
            var relevantConcepts = Concepts[1].GetValues(Vocabulary, Concepts[1].Fields[0], reader);

            if (relevantConcepts.Count > 0)
                relevantConditionConceptId = relevantConcepts.Min(c => c.ConceptId);
             }

             foreach (var c in base.GetConcepts(concept, reader, keyMaster))
             {
            var e = (Entity) c;

            var calculatedDaysSupply = GetDaysSupply(reader, e);
            if (!string.IsNullOrEmpty(EndDate))
            {
               if (calculatedDaysSupply > 0 && calculatedDaysSupply <= 365)
                  endDate = e.StartDate.AddDays(calculatedDaysSupply - 1);
               else
                  endDate = reader.GetDateTime(EndDate);
            }

            var refillString = reader.GetString(Refill);

            int? refill = null;

            if (!string.IsNullOrEmpty(refillString))
            {
               int refillValue;

               // in Optum Refill looks like: 01, 02...
               int.TryParse(refillString, out refillValue);

               refill = refillValue;
            }

            yield return new DrugExposure(e)
                            {
                               Id = keyMaster.DrugExposureId,
                               Refills = refill,
                               DaysSupply = reader.GetInt(DaysSupply),
                               CalculatedDaysSupply = calculatedDaysSupply,
                               Quantity = GetQuantity(reader),
                               RelevantConditionConceptId = relevantConditionConceptId,
                               EndDate = endDate == DateTime.MinValue ? null : endDate,
                               GetEraConceptIdsCall = Vocabulary.LookupIngredientLevel
                            };

             }
        }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var id = string.IsNullOrEmpty(Id) ? KeyMaster.GetCareSiteId() : int.Parse(reader[Id].ToString());

             yield return new CareSite
                         {
                            Id = id,
                            LocationId = reader.GetLong(LocationId).Value,
                            PlaceOfSvcSourceValue = reader.GetString(PlaceOfSvcSourceValue),
                            SourceValue = id.ToString()
                         };
        }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var conceptField = Concepts[0].Fields[0];
             var id = string.IsNullOrEmpty(Id) ? KeyMaster.GetOrganizationId() : int.Parse(reader[Id].ToString());

             yield return new Organization
                         {
                            Id = id,
                            ConceptId = conceptField.DefaultConceptId.HasValue ? conceptField.DefaultConceptId.Value : 0,
                            LocationId = 0,
                            SourceValue = reader[conceptField.Key].ToString().Trim(),
                            PlaceOfSvcSourceValue = string.IsNullOrEmpty(PlaceOfService) ? "" : reader[PlaceOfService].ToString()
                         };
        }
Exemple #8
0
 public ChunkData()
 {
     KeyMasterOffset      = new KeyMasterOffset();
     Persons              = new ConcurrentStack <Person>();
     Deaths               = new ConcurrentStack <Death>();
     ObservationPeriods   = new ConcurrentStack <ObservationPeriod>();
     PayerPlanPeriods     = new ConcurrentStack <PayerPlanPeriod>();
     ConditionOccurrences = new ConcurrentStack <ConditionOccurrence>();
     DrugExposures        = new ConcurrentStack <DrugExposure>();
     ProcedureOccurrences = new ConcurrentStack <ProcedureOccurrence>();
     Observations         = new ConcurrentStack <Observation>();
     VisitOccurrences     = new ConcurrentStack <VisitOccurrence>();
     DrugCost             = new ConcurrentStack <DrugCost>();
     ProcedureCost        = new ConcurrentStack <ProcedureCost>();
     ConditionEra         = new ConcurrentStack <EraEntity>();
     DrugEra              = new ConcurrentStack <EraEntity>();
     Cohort               = new ConcurrentStack <Cohort>();
 }
 public ChunkData()
 {
     KeyMasterOffset = new KeyMasterOffset();
      Persons = new ConcurrentStack<Person>();
      Deaths = new ConcurrentStack<Death>();
      ObservationPeriods = new ConcurrentStack<ObservationPeriod>();
      PayerPlanPeriods = new ConcurrentStack<PayerPlanPeriod>();
      ConditionOccurrences = new ConcurrentStack<ConditionOccurrence>();
      DrugExposures = new ConcurrentStack<DrugExposure>();
      ProcedureOccurrences = new ConcurrentStack<ProcedureOccurrence>();
      Observations = new ConcurrentStack<Observation>();
      VisitOccurrences = new ConcurrentStack<VisitOccurrence>();
      DrugCost = new ConcurrentStack<DrugCost>();
      ProcedureCost = new ConcurrentStack<ProcedureCost>();
      ConditionEra = new ConcurrentStack<EraEntity>();
      DrugEra = new ConcurrentStack<EraEntity>();
      Cohort = new ConcurrentStack<Cohort>();
 }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            long? relevantConditionConceptId = null;
             if (Concepts.Length == 2)
             {
            var relevantConcepts = Concepts[1].GetValues(Vocabulary, Concepts[1].Fields[0], reader);

            if (relevantConcepts.Count > 0)
               relevantConditionConceptId = relevantConcepts.Min(c => c.ConceptId);
             }

             foreach (var e in base.GetConcepts(concept, reader, keyMaster))
             {
            yield return
               new ProcedureOccurrence((Entity) e)
                  {
                     Id = keyMaster.ProcedureOccurrenceId,
                     ReleventConditionConceptId = relevantConditionConceptId
                  };
             }
        }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var visitOccurrences = base.GetConcepts(concept, reader, keyMaster).ToList();

             if(visitOccurrences.Count > 0)
             {
            var id = reader.GetLong(Id);
            var visitOccurrence = new VisitOccurrence((Entity) visitOccurrences[0])
                                     {
                                        CareSiteId = reader.GetInt(CareSiteId) ?? 0
                                     };
            if(id.HasValue)
            {
               visitOccurrence.Id = id.Value;
            }
            else
            {
               visitOccurrence.IdUndefined = true;
            }

            yield return visitOccurrence;
             }
        }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var personId = reader.GetLong(PersonId);

             var startDate = reader.GetDateTime(StartDate);
             var endDate = reader.GetDateTime(EndDate);

             if (personId.HasValue)
             {
            Dictionary<string, string> additionalFields = null;
            if (AdditionalFields != null)
            {
               additionalFields = new Dictionary<string, string>(AdditionalFields.Length);
               foreach (var additionalField in AdditionalFields)
               {
                  additionalFields.Add(additionalField.ToLower(), reader.GetString(additionalField));
               }
            }

            var payerSourceValue = reader.GetString(PayerSource);
            if (string.IsNullOrWhiteSpace(payerSourceValue))
               payerSourceValue = null;

            yield return new PayerPlanPeriod
                            {
                               PersonId = personId.Value,
                               StartDate = startDate,
                               EndDate = endDate,
                               PayerSourceValue = payerSourceValue,
                               PlanSourceValue = reader.GetString(PlanSource),
                               FamilySourceValue = reader.GetString(FamilySource),
                               VisitOccurrenceId = reader.GetLong(VisitOccurrenceId),
                               AdditionalFields = additionalFields
                            };
             }
        }
 // A custom DataReader is implemented to prevent the need for the HashSet to be transformed to a DataTable for loading by SqlBulkCopy
 public PayerPlanPeriodDataReader(List<PayerPlanPeriod> batch, KeyMasterOffset offset)
 {
     enumerator = batch.GetEnumerator();
      this.offset = offset;
 }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            long id;
             var idUndefined = false;
             if (string.IsNullOrEmpty(Id))
             {
            id = KeyMaster.GetProviderId();
            idUndefined = true;
             }
             else
             {
            id = reader.GetLong(Id).Value;
             }

             if (concept == null)
             {
            yield return new Provider
               {
                  Id = id,
                  CareSiteId = reader.GetInt(CareSiteId) ?? 0,
                  ProviderSourceValue = reader.GetString(ProviderSourceValue),
                  SourceValue = reader.GetString(SpecialtySourceValue)
               };
             }
             else
             {
            var conceptField = concept.Fields[0];

            var source = reader.GetString(conceptField.Key) ?? reader.GetString(conceptField.SourceKey);

            if (source != null && source.Length == 0)
               source = null;

            var specialtyConceptIds = concept.GetValues(Vocabulary, conceptField, reader).ToList();
            long? specialtyConcept = null;

            //(Unknown Physician Specialty)
            long defaultConceptId = 38004514;

            if (conceptField.DefaultConceptId.HasValue)
            {
               defaultConceptId = conceptField.DefaultConceptId.Value;
            }

            if (specialtyConceptIds.Count > 0)
            {
               specialtyConcept = specialtyConceptIds[0].ConceptId;
            }

            yield return new Provider
               {
                  Id = id,
                  IdUndefined = idUndefined,
                  CareSiteId = reader.GetInt(CareSiteId) ?? 0,
                  ConceptId = specialtyConcept.HasValue ? specialtyConcept.Value : defaultConceptId,
                  ProviderSourceValue = reader.GetString(ProviderSourceValue),
                  SourceValue =
                     string.IsNullOrEmpty(conceptField.SourceKey) ? source : reader.GetString(conceptField.SourceKey)
               };
             }
        }
 // A custom DataReader is implemented to prevent the need for the HashSet to be transformed to a DataTable for loading by SqlBulkCopy
 public ConditionOccurrenceDataReader(List<ConditionOccurrence> batch, KeyMasterOffset offset)
 {
     conditionEnumerator = batch.GetEnumerator();
      this.offset = offset;
 }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var locationSourceValue = reader.GetString(Location);
             int? locationId = null;
             if (!string.IsNullOrEmpty(Location))
             {
            locationId = Vocabulary.LookupLocation(locationSourceValue);
             }

             var observationPeriodGap = 32;
             if(!string.IsNullOrEmpty(ObservationPeriodGap))
             {
            observationPeriodGap = int.Parse(ObservationPeriodGap);
             }

             var genderSource = reader.GetString(Gender);
             var genderConceptId = Vocabulary.LookupGender(genderSource);

             var personId = reader.GetLong(PersonId);
             if(personId.HasValue)
             {
            yield return new Person
                            {
                               ObservationPeriodGap = observationPeriodGap,
                               PersonId = personId.Value,
                               StartDate = reader.GetDateTime(StartDate),
                               EndDate = reader.GetDateTime(EndDate),
                               PersonSourceValue = reader.GetString(PersonSourceValue),
                               GenderSourceValue = genderSource,
                               GenderConceptId = genderConceptId,
                               LocationId = locationId,
                               YearOfBirth = reader.GetInt(YearOfBirth),
                               MonthOfBirth = reader.GetInt(MonthOfBirth),
                               DayOfBirth = reader.GetInt(DayOfBirth),
                               LocationSourceValue = locationSourceValue,
                               CareSiteId = reader.GetInt(CareSiteId),
                               EthnicitySourceValue = reader.GetString(Ethnicity),
                               EthnicityConceptId = reader.GetInt(EthnicityConceptId) ?? 0,
                               RaceSourceValue = reader.GetString(Race),
                               RaceConceptId = reader.GetInt(RaceConceptId) ?? 0,
                               ProviderId = reader.GetInt(ProviderId)
                            };
             }
        }
        public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var obsConcepts = base.GetConcepts(concept, reader, keyMaster).ToList();

             if (obsConcepts.Count > 0)
             {
            var unitConcept = GetUnitConcept(reader);
            long? relevantConditionConceptId = null;

            if (Concepts.Length == 3)
            {
               var relevantConditionConcepts = Concepts[2].GetValues(Vocabulary, Concepts[2].Fields[0], reader);

               if(relevantConditionConcepts.Count > 0)
                   relevantConditionConceptId = relevantConditionConcepts.Min(c => c.ConceptId);
            }

            var createObservation = new Func<Observation>(() => new Observation((Entity)obsConcepts[0])
                                                                   {
                                                                      SourceValue = string.IsNullOrWhiteSpace(obsConcepts[0].SourceValue) ? null : obsConcepts[0].SourceValue,
                                                                      RangeLow = reader.GetDecimal(RangeLow),
                                                                      RangeHigh = reader.GetDecimal(RangeHigh),
                                                                      UnitsConceptId = unitConcept.Key ?? 0,
                                                                      UnitsSourceValue = string.IsNullOrWhiteSpace(unitConcept.Value) ? null : unitConcept.Value,
                                                                      ValueAsConceptId = reader.GetInt(ValueAsConceptId) ?? 0,
                                                                      RelevantConditionConceptId = relevantConditionConceptId ?? 0
                                                                   });

            if (ValuesAsNumber != null && ValuesAsNumber.Length > 1)
            {
               foreach (var valueAsNumber in ValuesAsNumber)
               {
                  var value = reader.GetDecimal(valueAsNumber);
                  if (value != null)
                  {
                     var observation = createObservation();

                     observation.ValueAsNumber = Math.Round(value.Value, 3);
                     observation.SourceValue = observation.ValueAsNumber.ToString();
                     observation.TypeConceptId = 38000277;
                     yield return observation;
                  }
               }
            }
            else if (ValuesAsString != null && ValuesAsString.Length > 1)
            {
               foreach (var valueAsString in ValuesAsString)
               {
                  var value = reader.GetString(valueAsString);
                  if (!string.IsNullOrEmpty(value) && value != "-" && value != "9") //TMP
                  {
                     var observation = createObservation();
                     observation.ValueAsString = reader.GetString(valueAsString);
                     observation.SourceValue = valueAsString;
                     observation.TypeConceptId = 38000278;
                     yield return observation;
                  }
               }
            }
            else if (!string.IsNullOrEmpty(obsConcepts[0].SourceValue))
            {
               var observation = createObservation();
               if (ValuesAsNumber != null && ValuesAsNumber.Length > 0)
               {
                  observation.ValueAsNumber = reader.GetDecimal(ValuesAsNumber[0]);
                  if (observation.ValueAsNumber.HasValue)
                  {
                     observation.ValueAsNumber = Math.Round(observation.ValueAsNumber.Value, 3);
                  }
               }
               if (ValuesAsString != null && ValuesAsString.Length > 0)
               {
                  observation.ValueAsString = reader.GetString(ValuesAsString[0]);

                  // Workaround, map ValueAsString (usind SourceLookup) and reset SourceValue to original value
                  if (observation.AdditionalFields != null && observation.AdditionalFields.ContainsKey("original_source"))
                  {
                     observation.ValueAsString = observation.SourceValue;
                     observation.SourceValue = observation.AdditionalFields["original_source"];
                  }
               }

               yield return observation;
            }
             }
        }
 // A custom DataReader is implemented to prevent the need for the HashSet to be transformed to a DataTable for loading by SqlBulkCopy
 public ProcedureCostDataReader(List<ProcedureCost> batch, KeyMasterOffset offset)
 {
     enumerator = batch.GetEnumerator();
      this.offset = offset;
 }
Exemple #19
0
 public static List<PayerPlanPeriod> GetPayerPlanPeriods(PayerPlanPeriod[] entities, Func<PayerPlanPeriod, PayerPlanPeriod, bool> canBeCombined, KeyMasterOffset keyMaster)
 {
     return GetPayerPlanPeriods(entities, 32, canBeCombined, keyMaster);
 }
 // A custom DataReader is implemented to prevent the need for the HashSet to be transformed to a DataTable for loading by SqlBulkCopy
 public VisitOccurrenceDataReader(List<VisitOccurrence> batch, KeyMasterOffset offset)
 {
     visitEnumerator = batch.GetEnumerator();
      this.offset = offset;
 }
 // A custom DataReader is implemented to prevent the need for the HashSet to be transformed to a DataTable for loading by SqlBulkCopy
 public DrugExposureDataReader(List<DrugExposure> batch, KeyMasterOffset offset)
 {
     exposureEnumerator = batch.GetEnumerator();
      this.offset = offset;
 }
 // A custom DataReader is implemented to prevent the need for the HashSet to be transformed to a DataTable for loading by SqlBulkCopy
 public ProcedureOccurrenceDataReader(List<ProcedureOccurrence> batch, KeyMasterOffset offset)
 {
     procedureEnumerator = batch.GetEnumerator();
      this.offset = offset;
 }
Exemple #23
0
        public static List<PayerPlanPeriod> GetPayerPlanPeriods(PayerPlanPeriod[] entities, int gap, Func<PayerPlanPeriod, PayerPlanPeriod, bool> canBeCombined, KeyMasterOffset keyMaster)
        {
            var result = new List<PayerPlanPeriod>();
            if (entities.Length == 0) return result;

            var ordered =
               entities.OrderBy(e => e.StartDate).ToList();
            var payerPlanPeriod = ordered[0];
            var list = new List<PayerPlanPeriod>();

            foreach (var entity in ordered)
            {
                if (canBeCombined(entity, payerPlanPeriod))
                {
                    list.Add(entity);
                    continue;
                }

                result.AddRange(GetEras(list, gap, -1).Select(i => new PayerPlanPeriod
                                                                             {
                                                                                 Id = keyMaster.PayerPlanPeriodId,
                                                                                 PersonId = i.PersonId,
                                                                                 StartDate = i.StartDate,
                                                                                 EndDate = i.EndDate,
                                                                                 PayerSourceValue =
                                                                                    payerPlanPeriod.PayerSourceValue,
                                                                                 FamilySourceValue =
                                                                                    payerPlanPeriod.FamilySourceValue,
                                                                                 PlanSourceValue =
                                                                                    payerPlanPeriod.PlanSourceValue
                                                                             }));

                list.Clear();
                payerPlanPeriod = entity;
                list.Add(entity);
            }

            result.AddRange(GetEras(list, gap, -1).Select(i => new PayerPlanPeriod
                                                                         {
                                                                             Id = keyMaster.PayerPlanPeriodId,
                                                                             PersonId = i.PersonId,
                                                                             StartDate = i.StartDate,
                                                                             EndDate = i.EndDate,
                                                                             PayerSourceValue =
                                                                                payerPlanPeriod.PayerSourceValue,
                                                                             FamilySourceValue =
                                                                                payerPlanPeriod.FamilySourceValue,
                                                                             PlanSourceValue =
                                                                                payerPlanPeriod.PlanSourceValue
                                                                         }));

            return result;
        }
 // A custom DataReader is implemented to prevent the need for the HashSet to be transformed to a DataTable for loading by SqlBulkCopy
 public ObservationDataReader(List<Observation> batch, KeyMasterOffset offset)
 {
     observationEnumerator = batch.GetEnumerator();
      this.offset = offset;
 }
 public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
 {
     return base.GetConcepts(concept, reader, keyMaster).Select(e => new ConditionOccurrence((Entity)e));
 }
 public override IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
 {
     throw new NotImplementedException();
 }
        public virtual IEnumerable<IEntity> GetConcepts(Concept concept, IDataReader reader, KeyMasterOffset keyMaster)
        {
            var personId = reader.GetLong(PersonId);

             if (personId.HasValue)
             {
            var startDate = reader.GetDateTime(StartDate);
            var endDate = startDate;
            if (!string.IsNullOrEmpty(EndDate))
               endDate = reader.GetDateTime(EndDate);

            Dictionary<string, string> additionalFields = null;
            if (AdditionalFields != null)
            {
               additionalFields = new Dictionary<string, string>(AdditionalFields.Length);
               foreach (var additionalField in AdditionalFields)
               {
                  additionalFields.Add(additionalField.ToLower(), reader.GetString(additionalField));
               }
            }

            foreach (var field in concept.Fields)
            {
               var sourceValue = field.DefaultSource;
               if (string.IsNullOrEmpty(sourceValue))
                  sourceValue = reader.GetString(field.Key);

               if (!field.IsNullable && string.IsNullOrEmpty(sourceValue) && field.DefaultConceptId == null && field.ConceptId == null)
                  continue;

               // Used when: field.Key used for conceptId mapping and
               // field.SourceKey used for SourceValue (by default field.Key and field.SourceKey are identical)
               if (!string.IsNullOrEmpty(field.SourceKey))
                  sourceValue = reader.GetString(field.SourceKey);

               if(!string.IsNullOrEmpty(concept.SourceLookup))
               {
                  var source = Vocabulary.LookupSource(sourceValue, concept.SourceLookup);
                  if (!string.IsNullOrEmpty(source))
                     sourceValue = source;
               }

               foreach (var lookupValue in concept.GetValues(Vocabulary, field, reader))
               {
                  var cId = lookupValue.ConceptId;
                  if (!cId.HasValue && field.DefaultConceptId.HasValue)
                     cId = field.DefaultConceptId;

                  if (!concept.IdRequired || cId.HasValue)
                  {
                     yield return new Entity
                     {
                        IsUnique = IsUnique,
                        PersonId = personId.Value,
                        SourceValue = sourceValue,
                        ConceptId = cId.HasValue ? cId.Value : 0,
                        TypeConceptId = concept.GetTypeId(field, reader),
                        StartDate = startDate,
                        EndDate = endDate == DateTime.MinValue ? (DateTime?) null : endDate,
                        ProviderId = reader.GetInt(ProviderId),
                        ProviderKey = reader.GetString(ProviderIdKey),
                        VisitOccurrenceId = reader.GetLong(VisitOccurrenceId),
                        AdditionalFields = additionalFields,
                        ValidStartDate = lookupValue.ValidStartDate,
                        ValidEndDate = lookupValue.ValidEndDate
                     };
                  }
               }
            }
             }
        }