/// <summary>
        /// Подсчёт количества событий
        /// </summary>
        public static int CountEvents
        (
            [NotNull] List <ReaderInfo> readers,
            DateTime fromDay,
            DateTime toDay,
            [NotNull] string department,
            bool visit
        )
        {
            if (ReferenceEquals(readers, null))
            {
                throw new ArgumentNullException("readers");
            }
            if (string.IsNullOrEmpty(department))
            {
                throw new ArgumentNullException("department");
            }

            string fromDayString =
                new IrbisDate(fromDay).Text;
            string toDayString = new IrbisDate(toDay).Text;
            int    result      = readers
                                 .SelectMany(r => r.Visits)
                                 .Count(v => (v.DateGivenString.SafeCompare(fromDayString) >= 0) &&
                                        (v.DateGivenString.SafeCompare(toDayString) <= 0) &&
                                        v.Department.SameString(department) &&
                                        (v.IsVisit == visit));

            return(result);
        }
Exemple #2
0
        public void IrbisDate_ToString_1()
        {
            const string expected = "20170225";
            IrbisDate    date     = expected;

            Assert.AreEqual(expected, date.ToString());
        }
Exemple #3
0
        public void IrbisDateConvertStringToDate_3()
        {
            DateTime actual   = IrbisDate.ConvertStringToDate("201702251015");
            DateTime expected = new DateTime(2017, 2, 25);

            Assert.AreEqual(expected, actual);
        }
Exemple #4
0
        public void IrbisDate_Constructor_4()
        {
            DateTime  date1 = new DateTime(2017, 2, 25);
            IrbisDate date2 = new IrbisDate(date1);

            Assert.AreEqual("20170225", date2.Text);
        }
Exemple #5
0
        public void IrbisDate_Operator_IrbisDate_1()
        {
            DateTime  date1 = new DateTime(2017, 2, 25);
            IrbisDate date2 = date1;

            Assert.AreEqual(date1, date2.Date);
        }
Exemple #6
0
        public void IrbisDate_Constructor_3()
        {
            string    date1 = "20160101";
            IrbisDate date2 = date1;
            string    date3 = date2;

            Assert.AreEqual(date1, date3);
        }
Exemple #7
0
        public void IrbisDate_Operator_DateTime_2()
        {
            DateTime  expected = new DateTime(2017, 2, 25);
            IrbisDate date     = expected;
            DateTime  actual   = date;

            Assert.AreEqual(expected, actual);
        }
Exemple #8
0
        public void IrbisDate_ConvertStringToTime_4()
        {
            TimeSpan time = IrbisDate.ConvertStringToTime("101112");

            Assert.AreEqual(10, time.Hours);
            Assert.AreEqual(11, time.Minutes);
            Assert.AreEqual(12, time.Seconds);
        }
Exemple #9
0
        public void IrbisDate_Constructor_2()
        {
            IrbisDate date1 = new IrbisDate("20170225");
            DateTime  date2 = date1.Date;

            Assert.AreEqual(2017, date2.Year);
            Assert.AreEqual(2, date2.Month);
            Assert.AreEqual(25, date2.Day);
        }
Exemple #10
0
        public void IrbisDate_Operator_DateTime_1()
        {
            IrbisDate date1 = "20170225";
            DateTime  date2 = date1;

            Assert.AreEqual(2017, date2.Year);
            Assert.AreEqual(2, date2.Month);
            Assert.AreEqual(25, date2.Day);
        }
Exemple #11
0
        public void IrbisDate_Constructor_1()
        {
            DateTime  today = DateTime.Today;
            IrbisDate date  = new IrbisDate();

            Assert.AreEqual
            (
                today.ToString("yyyyMMdd"),
                date.Text
            );
        }
Exemple #12
0
        private void _TestSerialization
        (
            IrbisDate first
        )
        {
            byte[] bytes = first.SaveToMemory();

            IrbisDate second = bytes
                               .RestoreObjectFromMemory <IrbisDate>();

            Assert.AreEqual(first.Text, second.Text);
            Assert.AreEqual(first.Date, second.Date);
        }
Exemple #13
0
        static void AnalyzeTerms()
        {
            TermParameters parameters = new TermParameters
            {
                Database      = connection.Database,
                StartTerm     = "RD=",
                NumberOfTerms = 10000
            };

            TermInfo[] terms = connection.ReadTerms(parameters);
            terms = terms.Where(ti => ti.Text.SafeStarts("RD=201"))
                    .ToArray();
            terms = TermInfo.TrimPrefix(terms, "RD=");
            foreach (TermInfo term in terms)
            {
                DateTime date = IrbisDate.ConvertStringToDate(term.Text);
                Console.WriteLine("{0:yyyy-MM-dd}\t{1}", date, term.Count);
            }
        }
        public static VisitInfo[] GetEvents
        (
            [NotNull] this VisitInfo[] events,
            DateTime day
        )
        {
            if (ReferenceEquals(events, null))
            {
                throw new ArgumentNullException("events");
            }

            string dayString = IrbisDate.ConvertDateToString(day);

            VisitInfo[] result = events
                                 .AsParallel()
                                 .Where(v => v.DateGivenString.SameString(dayString))
                                 .ToArray();
            return(result);
        }
        public static VisitInfo[] GetEvents
        (
            [NotNull] this VisitInfo[] events,
            DateTime fromDay,
            DateTime toDay
        )
        {
            if (ReferenceEquals(events, null))
            {
                throw new ArgumentNullException("events");
            }

            string fromDayString = IrbisDate.ConvertDateToString(fromDay);
            string toDayString   = IrbisDate.ConvertDateToString(toDay);

            VisitInfo[] result = events
                                 .AsParallel()
                                 .Where(v => (v.DateGivenString.SafeCompare(fromDayString) >= 0) &&
                                        (v.DateGivenString.SafeCompare(toDayString) <= 0))
                                 .ToArray();
            return(result);
        }
        /// <summary>
        /// Подсчёт количества событий.
        /// </summary>
        public static int CountEvents
        (
            [NotNull] List <ReaderInfo> readers,
            DateTime fromDay,
            DateTime toDay,
            bool visit
        )
        {
            if (ReferenceEquals(readers, null))
            {
                throw new ArgumentNullException("readers");
            }

            string fromDayString = IrbisDate.ConvertDateToString(fromDay);
            string toDayString   = IrbisDate.ConvertDateToString(toDay);
            int    result        = readers
                                   .SelectMany(r => r.Visits)
                                   .Count(v => (v.DateGivenString.SafeCompare(fromDayString) >= 0) &&
                                          (v.DateGivenString.SafeCompare(toDayString) <= 0) &&
                                          (v.IsVisit == visit));

            return(result);
        }
Exemple #17
0
        private static void Main()
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            try
            {
                string connectionString = ConfigurationUtility
                                          .GetString("connectionString")
                                          .ThrowIfNull("connectionString not set");
                Threshold = IrbisDate.ConvertStringToDate
                            (
                    ConfigurationUtility
                    .GetString("threshold")
                    .ThrowIfNull("threshold not set")
                            );
                LowerBound = DateTime.MinValue;
                string lowerText = ConfigurationUtility.GetString("lowerBound");
                if (!string.IsNullOrEmpty(lowerText))
                {
                    LowerBound = IrbisDate.ConvertStringToDate(lowerText);
                }

                Console.WriteLine("Loading readers");

                List <ReaderInfo> allReaders = new List <ReaderInfo>();
                OldReaders = new BlockingCollection <ReaderInfo>();

                using (IrbisConnection connection
                           = new IrbisConnection(connectionString))
                {
                    ReaderManager manager = new ReaderManager(connection)
                    {
                        OmitDeletedRecords = true
                    };
                    manager.BatchRead += (obj, ea) => Console.Write(".");

                    string[] databases = ConfigurationUtility.GetString("databases")
                                         .ThrowIfNull("databases not specified")
                                         .Split
                                         (
                        new[] { ' ', ';', ',' },
                        StringSplitOptions.RemoveEmptyEntries
                                         );

                    foreach (string database in databases)
                    {
                        Console.WriteLine
                        (
                            "Database: {0}, records: {1}",
                            database,
                            connection.GetMaxMfn(database) - 1
                        );

                        allReaders.AddRange
                        (
                            manager.GetAllReaders(database)
                        );

                        Console.WriteLine();
                    }
                }

                WriteDelimiter();

                Console.WriteLine("Merging");
                Console.WriteLine("Records before merging: {0}", allReaders.Count);

                allReaders = ReaderManager.MergeReaders(allReaders);

                Console.WriteLine("Records after merging: {0}", allReaders.Count);
                WriteDelimiter();

                Console.WriteLine("Filtering");

                ParallelOptions options = new ParallelOptions
                {
                    MaxDegreeOfParallelism = 4
                };
                Parallel.ForEach(allReaders, options, ProcessReader);

                ReaderInfo[] oldReaders = OldReaders.ToArray();

                WriteDelimiter();

                Console.WriteLine("Sorting");

                oldReaders = oldReaders.OrderBy
                             (
                    reader => reader.FullName
                             )
                             .ToArray();

                WriteDelimiter();

                Console.WriteLine
                (
                    "Create table: {0} lines",
                    oldReaders.Length
                );

                Workbook workbook = new Workbook();
                workbook.CreateNewDocument();
                Worksheet worksheet = workbook.Worksheets[0];

                int row = 0;

                worksheet.Cells[row, 0].Value = "ФИО";
                worksheet.Cells[row, 1].Value = "Билет";
                worksheet.Cells[row, 2].Value = "Регистрация";
                worksheet.Cells[row, 3].Value = "Кол-во";
                worksheet.Cells[row, 4].Value = "Последнее событие";
                worksheet.Cells[row, 5].Value = "Отделы";

                DrawBorders(worksheet, row);

                row++;

                for (int i = 0; i < oldReaders.Length; i++)
                {
                    if (i % 100 == 0)
                    {
                        Console.Write(".");
                    }

                    ReaderInfo reader   = oldReaders[i];
                    string     lastDate = (string)reader.UserData;
                    if (string.IsNullOrEmpty(lastDate))
                    {
                        lastDate = "--";
                    }

                    string departments = StringUtility.Join
                                         (
                        ", ",
                        reader.Registrations
                        .Select(reg => reg.Chair)
                        .Concat
                        (
                            reader.Visits
                            .Select(visit => visit.Department)
                        )
                        .NonEmptyLines()
                        .Distinct()
                                         );

                    worksheet.Cells[row, 0].Value = reader.FullName;
                    worksheet.Cells[row, 1].Value = reader.Ticket;
                    worksheet.Cells[row, 2].Value = reader.RegistrationDate
                                                    .ToShortDateString();
                    worksheet.Cells[row, 3].Value = reader.Visits.Length
                                                    + reader.Registrations.Length;
                    worksheet.Cells[row, 4].Value = lastDate;
                    worksheet.Cells[row, 5].Value = departments;

                    DrawBorders(worksheet, row);

                    row++;
                }

                WriteDelimiter();

                workbook.SaveDocument(OutputFile);

                Console.WriteLine("All done");

                stopwatch.Stop();
                TimeSpan elapsed = stopwatch.Elapsed;
                Console.WriteLine("Elapsed: {0}", elapsed);
                Console.WriteLine("Old readers: {0}", oldReaders.Length);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
Exemple #18
0
        public void IrbisDate_ConvertStringToDate_1()
        {
            DateTime date = IrbisDate.ConvertStringToDate(null);

            Assert.AreEqual(DateTime.MinValue, date);
        }
Exemple #19
0
        public void IrbisDate_Serialization_1()
        {
            IrbisDate date = "20121212";

            _TestSerialization(date);
        }
Exemple #20
0
        static EffectiveStat ProcessBook
        (
            [NotNull] MarcRecord record,
            [NotNull] string ksu
        )
        {
            Code.NotNull(record, "record");

            BookInfo book = new BookInfo(_provider, record);

            ExemplarInfo[] selected = book.Exemplars.Where
                                      (
                ex => ex.KsuNumber1.SameString(ksu)
                                      )
                                      .ToArray();
            Debug.Assert(selected.Length != 0, "exemplars.Length != 0");
            EffectiveStat result = new EffectiveStat
            {
                Description = _outputBooks ? book.Description : string.Empty,
                TitleCount  = 1
            };

            int totalExemplars = 0;

            foreach (ExemplarInfo exemplar in book.Exemplars)
            {
                int amount = exemplar.Amount.SafeToInt32();
                if (amount == 0)
                {
                    amount = 1;
                }

                totalExemplars += amount;
            }

            List <string> siglas = new List <string>();

            foreach (ExemplarInfo exemplar in selected)
            {
                DateTime date = IrbisDate.ConvertStringToDate(exemplar.Date);
                if (date != DateTime.MinValue)
                {
                    if (result.Date == DateTime.MinValue)
                    {
                        result.Date = date;
                    }
                    else if (date < result.Date)
                    {
                        result.Date = date;
                    }
                }

                int amount = exemplar.Amount.SafeToInt32();
                if (amount == 0)
                {
                    amount = 1;
                }

                result.ExemplarCount += amount;

                decimal price = exemplar.Price.SafeToDecimal(0);
                if (price == 0)
                {
                    price = book.Price;
                }

                siglas.Add(exemplar.Place);

                result.TotalCost += amount * price;
            }

            decimal loanCount = book.UsageCount;

            if (result.ExemplarCount != totalExemplars)
            {
                loanCount = loanCount * result.ExemplarCount / totalExemplars;
            }

            result.Bbk = record.FM(621).SafeSubstring(0, 2);

            result.LoanCount = (int)loanCount;
            result.Sigla     = string.Join(" ", siglas.Distinct()
                                           .Where(s => !string.IsNullOrEmpty(s))
                                           .Select(s => s.ToUpperInvariant()));

            return(result);
        }
Exemple #21
0
        private static void ProcessRecord
        (
            int mfn
        )
        {
            connection.Database = MainDatabase;
            MarcRecord mainRecord = connection.ReadRecord(mfn);
            string     linkValue  = mainRecord.FM(LinkTag);

            connection.Database = BackupDatabase;
            MarcRecord backupRecord = connection.SearchReadOneRecord
                                      (
                "\"{0}{1}\"",
                LinkPrefix,
                linkValue
                                      );

            if (ReferenceEquals(backupRecord, null))
            {
                Console.WriteLine
                (
                    "Не нашлось парной записи для MFN={0} ({1}{2})",
                    mfn,
                    LinkPrefix,
                    linkValue
                );
                Console.WriteLine(new string('=', 70));
                return;
            }

            Console.WriteLine("MFN={0}", mfn);
            RevisionInfo[] revisions = RevisionInfo.Parse(mainRecord)
                                       .Where(rev => rev.Name != "avd")
                                       .ToArray();
            if (revisions.Length == 0)
            {
                Console.WriteLine("Запись без ревизий!");
                Console.WriteLine(new string('=', 70));
                return;
            }

            RevisionInfo lastRevision = revisions.Last();
            DateTime     lastEdit     = IrbisDate.ConvertStringToDate(lastRevision.Date);

            Console.WriteLine
            (
                "Последнее редактирование: {0} {1:d}",
                lastRevision.Name,
                lastEdit
            );
            if (lastEdit > ThresholdDate)
            {
                Console.WriteLine("Запись редактировалась, надо восстанавливать вручную");
                Console.WriteLine(new string('=', 70));
                return;
            }

            if (CompareRecords(mainRecord, backupRecord))
            {
                Console.WriteLine("Нет различий между MAIN и BACKUP");
                goto DONE;
            }

            if (DoRestore)
            {
                RecordField[] residuaryFields = mainRecord.Fields
                                                .Where(field => field.Tag.OneOf(ResiduaryTags))
                                                .Select(field => field.Clone())
                                                .ToArray();
                RecordField[] backupFields = backupRecord.Fields
                                             .Where(field => !field.Tag.OneOf(ResiduaryTags))
                                             .Select(field => field.Clone())
                                             .ToArray();
                mainRecord.Fields.Clear();
                mainRecord.Fields.AddRange(backupFields);
                mainRecord.Fields.AddRange(residuaryFields);
                Console.WriteLine
                (
                    "Сформирована новая версия записи: {0} новых и {1} старых полей",
                    residuaryFields.Length,
                    backupFields.Length
                );
                connection.WriteRecord(mainRecord);
            }

DONE:
            Console.WriteLine(new string('=', 70));
            Console.WriteLine();
        }
Exemple #22
0
        public void IrbisDate_ConvertStringToTime_2()
        {
            TimeSpan time = IrbisDate.ConvertStringToTime("1");

            Assert.AreEqual(0, time.Ticks);
        }