/// <summary> /// Возвращает семнатическую ветвь из локально БД. Слово и все его непосреджственные потомки. /// </summary> /// <param name="sWord">слово родитель</param> /// <returns>объект семантической ветви</returns> public WordSemanticBranch GetSemanticLinkFromDB(string sWord) { List <RelationItem> children = null; WordSemanticBranch link = null; lock (m_dbHelper) { children = m_dbHelper.GetChildren(sWord); WordItem wordItem = m_dbHelper.GetWord(sWord); if (wordItem == null) { wordItem = m_dbHelper.AddWord(sWord, true); } link = new WordSemanticBranch(); link.ParentWord = new RegistryWord(wordItem); if (children != null) { foreach (RelationItem anItem in children) { link.Children.Add(new WordLink(anItem, m_dbHelper.GetWordById(anItem.ChildId))); } } } return(link); }
/// <summary> /// Возвращает семнатическую ветвь. Слово и все его непосреджственные потомки из словарной статьи. /// </summary> /// <param name="sWord">слово родитель</param> /// <param name="SearchOption">настройки поиска</param> /// <returns>объект семантической ветви</returns> public WordSemanticBranch GetSemanticLink(string sWord, Options SearchOption) { WordSemanticBranch lnk = null; IExplDic curChannel = null; try { lnk = new WordSemanticBranch(); lock (m_dbHelper) { WordItem anWord = m_dbHelper.GetWord(sWord); if (anWord == null) { anWord = m_dbHelper.AddWord(sWord, true); } lnk.ParentWord = new RegistryWord(anWord); } curChannel = CreateChannel(); ExplDictService.nom[] articles = curChannel.ExplGetArticles(sWord, false, false, false, m_LsId); foreach (ExplDictService.nom article in articles) { if (ShouldSkip(article.part)) //существительное { continue; } foreach (ExplDictService.formula Value in article.formula) { if (Value.kind == 0 && //смысл Value.lv == 2) //толкование { string text = Value.interpr; string[] words = text.Split(new char[] { ' ', ',', '.', '!', '?', ';', ':' }); short nGroup = 0; foreach (string word in words) { lnk.Children.AddRange(GetChildren(sWord, word, curChannel, nGroup)); nGroup++; } } } } ((IClientChannel)curChannel).Close(); } catch (Exception ex) { if (curChannel != null) { ((IClientChannel)curChannel).Abort(); } MessageBox.Show(string.Format("{0} {1}", "GetSemanticLink", ex.Message)); } return(lnk); }
/// <summary> /// добавляет связи в БД для данной семантической ветви /// </summary> /// <param name="branch">семантическая ветвь, которую надо добавить в базу данных</param> public void AddDictionaryWord(WordSemanticBranch branch) { lock (m_dbHelper) { m_dbHelper.SetStatus(branch.ParentWord.Word, (DatabaseHelper.WordStatus)branch.ParentWord.Status, branch.ParentWord.Homonym, branch.ParentWord.Reviewed); foreach (WordLink link in branch.Children) { m_dbHelper.AddRelation(branch.ParentWord.Word, link.Child.Word, (RelationType)link.RelationType, link.RelationGroupId); } } }
/// <summary> /// обновляет или добавляет связи в БД для данной семантической ветви /// </summary> /// <param name="aLink">семантическая ветвь, данные о которой надо добавить или обновить</param> public void UpdateRelations(WordSemanticBranch aLink) { foreach (WordLink link in aLink.Children) { RelationItem anItem = m_dbHelper.GetRelationItem(aLink.ParentWord.Word, link.Child.Word); if (anItem == null) { m_dbHelper.AddRelation(aLink.ParentWord.Word, link.Child.Word, (RelationType)link.RelationType, link.RelationGroupId); } else { anItem.RelationType = (short)link.RelationType; anItem.RelationTypeGroup = link.RelationGroupId; m_dbHelper.UpdateRelation(anItem); } } }
/// <summary> /// Обновляет коллекцию семантических ветвей после запроса списка слов из толкового словаря /// </summary> /// <param name="nLowerBound">нижняя граница слов, которые надо получить из толкового словаря</param> /// <param name="collection" out>коллекция которую надо обновить информацией их толкового словаря</param> public void AddDictionaryWords(int nLowerBound, ObservableCollection <WordSemanticBranch> collection) { //for debug purposes //return; IExplDic aDic = null; try { aDic = CreateChannel(); //int nMaxRows = aDic.GetRowCount(string.Empty, false, null, false, m_LsId); int nRequestLowerBound = nLowerBound - ROWS_PER_PAGE / 2; if (nRequestLowerBound < 1) { nRequestLowerBound = 1; } ExplDictService.elList[] page = aDic.SupplyPageOfData(nRequestLowerBound, ROWS_PER_PAGE, true, string.Empty, false, null, false, m_LsId); foreach (ExplDictService.elList elem in page) { WordSemanticBranch newBranch = GetSemanticLinkFromDB(RegistryWord.CreateNameWithHomonym(elem.word, elem.omon)); if (newBranch == null) { newBranch = new WordSemanticBranch(); newBranch.ParentWord = new RegistryWord(elem); } int nIndex = collection.IndexOf(newBranch); if (nIndex < 0) { collection.Add(newBranch); } else { collection[nIndex] = newBranch; } } ((IClientChannel)aDic).Close(); } catch (Exception ex) { if (aDic != null) { ((IClientChannel)aDic).Abort(); } MessageBox.Show(string.Format("{0} {1}", "AddDictionaryWords", ex.Message)); } }