public async Task <int> Extract(DbExtract extract, DbProtocol dbProtocol)
        {
            int batch = 500;

            var list = new List <TempPatientAdverseEventExtract>();

            int count  = 0;
            int loaded = 0;

            using (var rdr = await _reader.ExecuteReader(dbProtocol, extract))
            {
                while (rdr.Read())
                {
                    count++;

                    // AutoMapper profiles
                    var extractRecord = Mapper.Map <IDataRecord, TempPatientAdverseEventExtract>(rdr);
                    extractRecord.Id = LiveGuid.NewGuid();
                    if (extractRecord.HasData())
                    {
                        loaded++;
                        list.Add(extractRecord);
                    }

                    if (count == batch)
                    {
                        _extractRepository.BatchInsert(list);

                        count = 0;


                        DomainEvents.Dispatch(
                            new ExtractActivityNotification(extract.Id, new DwhProgress(
                                                                nameof(PatientAdverseEventExtract),
                                                                nameof(ExtractStatus.Finding),
                                                                loaded, 0, 0, 0, 0)));
                        list = new List <TempPatientAdverseEventExtract>();
                    }
                }

                if (count > 0)
                {
                    // save remaining list;
                    _extractRepository.BatchInsert(list);
                }
                _extractRepository.CloseConnection();
            }

            // TODO: Notify Completed;
            DomainEvents.Dispatch(
                new ExtractActivityNotification(extract.Id, new DwhProgress(
                                                    nameof(PatientAdverseEventExtract),
                                                    nameof(ExtractStatus.Found),
                                                    loaded, 0, 0, 0, 0)));

            return(loaded);
        }
        public void should_Execute_Reader(string name)
        {
            var extract = _extracts.First(x => x.Name.IsSameAs(name));
            var reader  = _reader.ExecuteReader(_protocol, extract).Result;

            Assert.NotNull(reader);
            reader.Read();
            Assert.NotNull(reader[0]);
            reader.Close();
        }
        public void should_Execute_Reader(string name)
        {
            var extract = _extracts.First(x => x.Name.IsSameAs(name));
            var reader  = _reader.ExecuteReader(_protocol, extract).Result;

            Assert.NotNull(reader);
            reader.Read();
            Assert.NotNull(reader[0]);
            Assert.False((reader.GetDateTime(reader.GetOrdinal(nameof(PatientExtract.Date_Created))) as DateTime?).IsNullOrEmpty());
            Assert.False((reader.GetDateTime(reader.GetOrdinal(nameof(PatientExtract.Date_Last_Modified))) as DateTime?).IsNullOrEmpty());
            reader.Close();
        }