Question

Je suis en train d'optimiser ma demande en réduisant les allers-retours à ma base de données. Dans le cadre de cet effort, j'ai déplaçais quelques-unes des tables dans la mémoire, les stocker sous forme Boost.MultiIndex conteneurs.

Comme un effet secondaire de ce processus, j'ai perdu la capacité de faire de la correspondance wild-card sur mes cordes. Par exemple, lorsque la table est stockée dans MySQL, je pourrais faire ceci:

SELECT * FROM m_table WHERE myString LIKE "foo%"

Cependant, comme j'utilise maintenant un conteneur Boost.MultiIndex avec une clé de myString, il semble que je l'ai perdu cette capacité.

De toute évidence, je peux utiliser la fonction equal_range () afin de trouver toutes les entrées qui correspondent à une chaîne spécifique exactement:

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;
}

Mais il semble que la seule façon de faire un match wild-card est de marcher toute la structure et comparer chaque clé d'un boost :: regex avec boost :: regex_match ().

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;
}

Y at-il une meilleure façon?

Était-ce utile?

La solution

Eh bien, vous n'avez pas vraiment d'utiliser un boost :: regex, si le caractère générique est assez simple, vous pouvez vous en roulant vous possédez opérateur unaire. Je note que Boost.Regex est l'un des rares partie de la bibliothèque qui exige effectivement être lié (non-tête uniquement).

En ce qui concerne le problème de la marche toute la structure, je suis désolé, mais il n'y a pas grand-chose qu'on peut faire ici vous ... si vous ne connaissez pas les recherches des avances.

Si vous connaissez les paramètres que vous rechercheraient à l'avance, vous pouvez créer une vue particulière du conteneur multi-index adapté pour effectuer cette tâche avec un comparateur / Hasher dédié (par exemple, celui qui ne prend en compte les 3 premiers caractères).

Si vous espériez plus, s'il vous plaît fournir plus d'informations sur le type de caractères génériques que vous souhaitez utiliser et les circonstances.

Autres conseils

Dans votre cas, vous pouvez faire un lower_bound ( « foo »), puis marcher en avant la recherche de matches, jusqu'à ce que vous touchez quelque chose qui ne correspond pas à atteindre ou la fin du récipient. Je ne pense pas qu'il y ait une façon générale de faire cette recherche cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top