// Получает набор едениц перевода для заданного языка в заданной статье public RawTranslationUnit[] GetTranslationUnits(string articleName, string translationLanguageCode) { List <RawTranslationUnit> units = new List <RawTranslationUnit>(); ExecuteSQLQuery ( $"SELECT t1.{Tables.TranslationUnits.originalPhraseIndexes}, t1.{Tables.TranslationUnits.translatedPhrase}, " + $"t2.{Tables.TranslationsInInfinitive.originalPhrase}, t2.{Tables.TranslationsInInfinitive.translatedPhrase} " + $"FROM {Tables.translationUnits} t1 " + $"LEFT JOIN {Tables.translationsInInfinitive} t2 " + $"ON t1.{Tables.TranslationUnits.infinitiveTranslationId} = t2.{Tables.TranslationsInInfinitive.id} " + $"WHERE t1.{Tables.TranslationUnits.articleId} = {ArticleIdByNameSubquery(articleName)} and " + $"t1.{Tables.TranslationUnits.translationLanguageCode} = {SQLStringLiteral(translationLanguageCode)};", (reader) => { if (reader.HasRows) { while (reader.Read()) { RawTranslationUnit unit = new RawTranslationUnit(); unit.originalPhraseIndexes = reader.GetString(0); unit.translatedPhrase = reader.GetString(1); // Проверяем значения в инфинитиве на null. Потому как они могут быть не заданы и в этом случае будут null. // Если они null, то и в выходных данных оставляем дефолтный null if (!reader.IsDBNull(2)) { unit.infinitiveOriginalPhrase = reader.GetString(2); unit.infinitiveTranslatedPhrase = reader.GetString(3); } units.Add(unit); } } } ); return(units.ToArray()); }
// Получает набор едениц перевода для заданного языка в заданной статье public RawTranslationUnit[] GetTranslationUnits(string articleName, string translationLanguageCode) { List<RawTranslationUnit> units = new List<RawTranslationUnit>(); ExecuteSQLQuery ( $"SELECT t1.{Tables.TranslationUnits.originalPhraseIndexes}, t1.{Tables.TranslationUnits.translatedPhrase}, " + $"t2.{Tables.TranslationsInInfinitive.originalPhrase}, t2.{Tables.TranslationsInInfinitive.translatedPhrase} " + $"FROM {Tables.translationUnits} t1 " + $"LEFT JOIN {Tables.translationsInInfinitive} t2 " + $"ON t1.{Tables.TranslationUnits.infinitiveTranslationId} = t2.{Tables.TranslationsInInfinitive.id} " + $"WHERE t1.{Tables.TranslationUnits.articleId} = {ArticleIdByNameSubquery(articleName)} and " + $"t1.{Tables.TranslationUnits.translationLanguageCode} = {SQLStringLiteral(translationLanguageCode)};", (reader) => { if (reader.HasRows) { while (reader.Read()) { RawTranslationUnit unit = new RawTranslationUnit(); unit.originalPhraseIndexes = reader.GetString(0); unit.translatedPhrase = reader.GetString(1); // Проверяем значения в инфинитиве на null. Потому как они могут быть не заданы и в этом случае будут null. // Если они null, то и в выходных данных оставляем дефолтный null if (!reader.IsDBNull(2)) { unit.infinitiveOriginalPhrase = reader.GetString(2); unit.infinitiveTranslatedPhrase = reader.GetString(3); } units.Add(unit); } } } ); return units.ToArray(); }
// Добавляет еденицу перевода. Если слово в инфинитиве не существует в словаре, то оно также добавляется в этот словарь public void AddOrChangeTranslationUnit(string articleName, string translationLanguageCode, RawTranslationUnit translationUnit) { Debug.Assert(articleName != null && translationLanguageCode != null && translationUnit.originalPhraseIndexes != null && translationUnit.translatedPhrase != null); // Если задан перевод в инфинитиве, получаем его Id (при этом либо добавится новый перевод либо возьмется уже существующий) int translationInInfinitiveId = -1; if (translationUnit.infinitiveOriginalPhrase != null && translationUnit.infinitiveTranslatedPhrase != null) { translationInInfinitiveId = GetOrAddTranslationInInfinitive(translationUnit.infinitiveOriginalPhrase, translationLanguageCode, translationUnit.infinitiveTranslatedPhrase); } // Запрашиваем Id оригинальной фразы (ее индексы слов), дабы узнать есть ли уже такая еденица перевода в БД int translationUnitId = -1; ExecuteSQLQuery ( $"SELECT {Tables.TranslationUnits.id} FROM {Tables.translationUnits} " + $"WHERE {Tables.TranslationUnits.articleId} = {ArticleIdByNameSubquery(articleName)} and " + $"{Tables.TranslationUnits.translationLanguageCode} = {SQLStringLiteral(translationLanguageCode)} and " + $"{Tables.TranslationUnits.originalPhraseIndexes} = {SQLStringLiteral(translationUnit.originalPhraseIndexes)} LIMIT 1;", (reader) => { if (reader.HasRows) { reader.Read(); translationUnitId = reader.GetInt32(0); } } ); // Если такая еденица перевода уже есть - модифицируем ее, иначе добавляем новую string translationInInfinitiveIdAsString = translationInInfinitiveId == -1 ? "NULL" : translationInInfinitiveId.ToString(); if (translationUnitId == -1) { // Если нужно добавлять новую еденицу перевода // Формируем строку со значениями string insertionData = SQLStringLiteral(translationUnit.originalPhraseIndexes) + ", " + SQLStringLiteral(translationLanguageCode) + ", " + SQLStringLiteral(translationUnit.translatedPhrase) + ", " + translationInInfinitiveIdAsString; // Добавляем еденицу перевода ExecuteSQLQuery($"INSERT INTO {Tables.translationUnits} {ArticleIdByNameSubquery(articleName, "NULL", insertionData)};"); } else { // Если нужно изменить уже существующую еденицу перевода ExecuteSQLQuery ( $"UPDATE {Tables.translationUnits} SET " + $"{Tables.TranslationUnits.translatedPhrase} = {SQLStringLiteral(translationUnit.translatedPhrase)}, " + $"{Tables.TranslationUnits.infinitiveTranslationId} = {translationInInfinitiveIdAsString} " + $"WHERE {Tables.TranslationUnits.articleId} = {ArticleIdByNameSubquery(articleName)} and " + $"{Tables.TranslationUnits.translationLanguageCode} = {SQLStringLiteral(translationLanguageCode)} and " + $"{Tables.TranslationUnits.originalPhraseIndexes} = {SQLStringLiteral(translationUnit.originalPhraseIndexes)};" ); } }
// Добавляет еденицу перевода. Если слово в инфинитиве не существует в словаре, то оно также добавляется в этот словарь public void AddOrChangeTranslationUnit(string articleName, string translationLanguageCode, RawTranslationUnit translationUnit) { Debug.Assert(articleName != null && translationLanguageCode != null && translationUnit.originalPhraseIndexes != null && translationUnit.translatedPhrase != null); // Если задан перевод в инфинитиве, получаем его Id (при этом либо добавится новый перевод либо возьмется уже существующий) int translationInInfinitiveId = -1; if (translationUnit.infinitiveOriginalPhrase != null && translationUnit.infinitiveTranslatedPhrase != null) translationInInfinitiveId = GetOrAddTranslationInInfinitive(translationUnit.infinitiveOriginalPhrase, translationLanguageCode, translationUnit.infinitiveTranslatedPhrase); // Запрашиваем Id оригинальной фразы (ее индексы слов), дабы узнать есть ли уже такая еденица перевода в БД int translationUnitId = -1; ExecuteSQLQuery ( $"SELECT {Tables.TranslationUnits.id} FROM {Tables.translationUnits} " + $"WHERE {Tables.TranslationUnits.articleId} = {ArticleIdByNameSubquery(articleName)} and " + $"{Tables.TranslationUnits.translationLanguageCode} = {SQLStringLiteral(translationLanguageCode)} and " + $"{Tables.TranslationUnits.originalPhraseIndexes} = {SQLStringLiteral(translationUnit.originalPhraseIndexes)} LIMIT 1;", (reader) => { if (reader.HasRows) { reader.Read(); translationUnitId = reader.GetInt32(0); } } ); // Если такая еденица перевода уже есть - модифицируем ее, иначе добавляем новую string translationInInfinitiveIdAsString = translationInInfinitiveId == -1 ? "NULL" : translationInInfinitiveId.ToString(); if (translationUnitId == -1) { // Если нужно добавлять новую еденицу перевода // Формируем строку со значениями string insertionData = SQLStringLiteral(translationUnit.originalPhraseIndexes) + ", " + SQLStringLiteral(translationLanguageCode) + ", " + SQLStringLiteral(translationUnit.translatedPhrase) + ", " + translationInInfinitiveIdAsString; // Добавляем еденицу перевода ExecuteSQLQuery($"INSERT INTO {Tables.translationUnits} {ArticleIdByNameSubquery(articleName, "NULL", insertionData)};"); } else { // Если нужно изменить уже существующую еденицу перевода ExecuteSQLQuery ( $"UPDATE {Tables.translationUnits} SET " + $"{Tables.TranslationUnits.translatedPhrase} = {SQLStringLiteral(translationUnit.translatedPhrase)}, " + $"{Tables.TranslationUnits.infinitiveTranslationId} = {translationInInfinitiveIdAsString} " + $"WHERE {Tables.TranslationUnits.articleId} = {ArticleIdByNameSubquery(articleName)} and " + $"{Tables.TranslationUnits.translationLanguageCode} = {SQLStringLiteral(translationLanguageCode)} and " + $"{Tables.TranslationUnits.originalPhraseIndexes} = {SQLStringLiteral(translationUnit.originalPhraseIndexes)};" ); } }