public static void AppendOrUpdatePsalmLink(this Kathisma kathisma, PsalmLink psalmLink) { var lastSlava = kathisma.SlavaElements.LastOrDefault(); if (lastSlava == null) { lastSlava = kathisma.AppendNewSlava(); } //ищем существующую PsalmLink var found = lastSlava.PsalmLinks.FirstOrDefault(c => c.Psalm.Number == psalmLink.Psalm.Number); if (found != null) { //обновляем found.StartStihos = psalmLink.StartStihos; found.EndStihos = psalmLink.EndStihos; } else { //добавялем lastSlava.PsalmLinks.Add(psalmLink); } }
/// <summary> /// Осуществляет миграцию Кафизм на основании текстовых документов, а также существующих в БД псалмов /// </summary> /// <param name="reader"></param> /// <param name="typiconEntity"></param> /// <exception cref="ResourceNotFoundException">В случае отсутствия Псалмов в БД</exception> public void MigrateKathismas(IPsalterReader reader, TypiconEntity typiconEntity) { if (reader == null) { throw new ArgumentNullException("IPsalterReader in MigrateKathismas"); } if (typiconEntity == null) { throw new ArgumentNullException("TypiconEntity in MigrateKathismas"); } DeleteAllKathismas(typiconEntity); Kathisma kathisma = null; PsalmLink psalmLink = null; IPsalterElement currentElement = null; while (reader.Read()) { switch (reader.ElementType) { case PsalterElementKind.Kathisma: currentElement = reader.Element; kathisma = typiconEntity.AppendKathisma(reader.Element as Kathisma); break; case PsalterElementKind.Psalm: //если до этого читали Псалом, то добавляем его, очищая ссылки на стихи if (currentElement is PsalmLink p) { ClearStihosIndexes(p); kathisma?.AppendPsalmLink(p); } currentElement = reader.Element; psalmLink = CreatePsalmLink((reader.Element as Psalm).Number); break; case PsalterElementKind.PsalmAnnotation: //не нужна- ничего не делаем break; case PsalterElementKind.PsalmText: if (currentElement == null) { //значит пришли сюда после чтения "Славы" //создаем новую ссылку на Псалом (17 кафизма) psalmLink = CreatePsalmLink(psalmLink); } psalmLink?.AppendStihos(reader.Element as BookStihos); currentElement = psalmLink; break; case PsalterElementKind.Slava: kathisma?.AppendNewSlava(); if (currentElement is PsalmLink pl) { kathisma?.AppendPsalmLink(pl); } currentElement = null; break; } } }
/// <summary> /// Осуществляет миграцию Кафизм на основании текстовых документов, а также существующих в БД псалмов /// </summary> /// <param name="reader"></param> /// <param name="typiconEntity"></param> /// <param name="migrateOnlyKathismaName">Только лишь обновляет/добавляет имена у кафизм для заданного языка</param> /// <exception cref="ResourceNotFoundException">В случае отсутствия Псалмов в БД</exception> public void MigrateKathismas(IPsalterReader reader, TypiconVersion typiconEntity, bool migrateOnlyKathismaName = false) { if (reader == null) { throw new ArgumentNullException("IPsalterReader in MigrateKathismas"); } if (typiconEntity == null) { throw new ArgumentNullException("TypiconVersion in MigrateKathismas"); } //Удаляем все кафизмы, если установлен флаг //if (clearBeforeMigration) //{ // DeleteAllKathismas(typiconEntity); //} Kathisma kathisma = null; PsalmLink psalmLink = null; IPsalterElement currentElement = null; while (reader.Read()) { switch (reader.ElementType) { case PsalterElementKind.Kathisma: { currentElement = reader.Element; kathisma = typiconEntity.AppendOrUpdateKathisma(reader.Element as Kathisma); psalmLink = null; } break; case PsalterElementKind.Psalm: { if (!migrateOnlyKathismaName) { //если до этого читали Псалом, то добавляем его, очищая ссылки на стихи if (psalmLink != null) { AppendAndClearPsalmLink(kathisma, psalmLink); } currentElement = reader.Element; psalmLink = CreatePsalmLink((reader.Element as Psalm).Number); } } break; case PsalterElementKind.PsalmAnnotation: //не нужна- ничего не делаем break; case PsalterElementKind.PsalmText: { if (!migrateOnlyKathismaName) { if (currentElement == null) { //значит пришли сюда после чтения "Славы" //добавляем сформированную Ссылку //и создаем новую ссылку на Псалом (17 кафизма) if (psalmLink != null) { kathisma.AppendOrUpdatePsalmLink(psalmLink); } psalmLink = CreatePsalmLink(psalmLink); } psalmLink.AppendStihos(reader.Element as BookStihos); currentElement = psalmLink; } } break; case PsalterElementKind.Slava: { if (!migrateOnlyKathismaName) { //Добавляем новую Славу kathisma.AppendNewSlava(); //добавляем Ссылку if (currentElement is PsalmLink p) { if (kathisma.SlavaElements.Count >= 3) { kathisma.AppendOrUpdatePsalmLink(p); } } currentElement = null; } } break; } } void AppendAndClearPsalmLink(Kathisma k, PsalmLink p) { //Пока убираем, потому как в текст Псалма будут входить и аннотации //ClearStihosIndexes(p); k.AppendOrUpdatePsalmLink(p); } }