データベースへの往復を減らして、アプリケーションを最適化しようとしています。その取り組みの一環として、いくつかのテーブルをメモリに移動し、Boost.MultiIndexコンテナーとして格納しました。
このプロセスの副作用として、文字列に対してワイルドカード マッチングを実行できなくなりました。たとえば、テーブルが MySQL に保存されている場合、次のようにできます。
SELECT * FROM m_table WHERE myString LIKE "foo%"
しかし、現在は myString のキーを持つ Boost.MultiIndex コンテナを使用しているため、その能力を失ったようです。
明らかに、equal_range() 関数を使用して、特定の文字列に正確に一致するすべてのエントリを見つけることができます。
std::pair< typename T::template index<by_name>::type::iterator,
typename T::template index<by_name>::type::iterator > p
= m_table.get<by_name>().equal_range(myString);
while (p.first != p.second )
{
// do something with the EXACT matching entry
++p.first;
}
しかし、ワイルドカード マッチを行う唯一の方法は、構造全体を調べて、boost::regex_match() を使用して各キーを boost::regex と比較することです。
std::pair< typename T::template index<by_name>::type::iterator,
typename T::template index<by_name>::type::iterator > p
= std::make_pair(m_table.get<by_name>().begin(),m_table.get<by_name>().end());
while (p.first != p.second )
{
boost::regex e(myRegex);
if ( boost::regex_match(p.first->myString, e ) )
{
// Do something with the REGEX matching entry
}
++p.first;
}
より良い方法はありますか?