// Ищем в справочнике набор тегов, заданный списком tags. При необходимости // вносим в БД новую запись. Возвращается ID найденной или созданной записи. int TagSets::Register( const lem::MCollect< std::pair<int,int> > &tags ) { if( tags.empty() ) { return 0; } #if defined LEM_THREADS lem::Process::CritSecLocker lock(&cs); #endif // Для устранения вариантов записи одного и того же набора тегов отсортируем элементы по id_tag. lem::MCollect< std::pair<int,int> > *sorted_tags = new lem::MCollect< std::pair<int,int> >(tags); std::sort( sorted_tags->begin(), sorted_tags->end(), tags_sorter ); // Такой кортеж есть? const int i = tag_ptr.find(*sorted_tags); if( i==UNKNOWN ) { // Нет. // Поищем в БД. lem::UFString s; if( tags.size()==1 ) { s = lem::format_str( L"%d %d", tags.front().first, tags.front().second ); } else if( tags.size()==2 ) { s = lem::format_str( L"%d %d %d %d", sorted_tags->get(0).first, sorted_tags->get(0).second, sorted_tags->get(1).first, sorted_tags->get(1).second ); } else { for( lem::Container::size_type i=0; i<sorted_tags->size(); ++i ) { if(i>0) s += L' '; s += lem::format_str( L"%d %d", sorted_tags->get(i).first, sorted_tags->get(i).second ); } } const int id = db->AddTagSet(s); id2tags.insert( std::make_pair(id,sorted_tags) ); tag_ptr.push_back( sorted_tags ); tagset_id.push_back(id); return id; } else { delete sorted_tags; return tagset_id[i]; } }
static bool x_contains_any_of_y( const lem::MCollect<int> &x, const lem::MCollect<int> &y ) { if( y.size()==1 ) return x.find(y.front())!=UNKNOWN; else if( y.size()==2 ) return x.find(y.front())!=UNKNOWN || x.find(y.back())!=UNKNOWN; else { for( lem::Container::size_type i=0; i<y.size(); ++i ) if( x.find(y[i])!=UNKNOWN ) return true; return false; } }
void TreeMatchingExperience::AddKBCheckerMatching( int id_facts, const lem::MCollect< const Solarix::Word_Form * > & arg_values, const KB_CheckingResult & res ) { LEM_CHECKIT_Z( id_facts!=UNKNOWN ); LEM_CHECKIT_Z( arg_values.size()>0 ); TME_KBChecker * y = new TME_KBChecker( arg_values, res ); kbid2item.insert( std::make_pair( std::make_pair(id_facts,arg_values.front()), y ) ); return; }
bool TreeMatchingExperience::FindKBCheckerMatching( int id_facts, const lem::MCollect< const Solarix::Word_Form * > & arg_values, KB_CheckingResult * res ) const { LEM_CHECKIT_Z( id_facts!=UNKNOWN ); LEM_CHECKIT_Z( arg_values.size()>0 ); typedef KBID2ITEM::const_iterator IT; std::pair<IT,IT> pit = kbid2item.equal_range( std::make_pair( id_facts, arg_values.front() ) ); for( IT it=pit.first; it!=pit.second; ++it ) { if( arg_values == it->second->arg_values ) { *res = it->second->res; return true; } } return false; }