예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
 /// <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);
         }
     }
 }
예제 #4
0
 /// <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);
         }
     }
 }
예제 #5
0
        /// <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));
            }
        }