LCOV - code coverage report
Current view: top level - languages - stem.cc (source / functions) Hit Total Coverage
Test: Test Coverage for xapian-core r Lines: 103 104 99.0 %
Date: 2011-08-21 Functions: 9 14 64.3 %
Branches: 121 236 51.3 %

           Branch data     Line data    Source code
       1                 :            : /** @file stem.cc
       2                 :            :  *  @brief Implementation of Xapian::Stem API class.
       3                 :            :  */
       4                 :            : /* Copyright (C) 2007,2008,2010 Olly Betts
       5                 :            :  * Copyright (C) 2010 Evgeny Sizikov
       6                 :            :  *
       7                 :            :  * This program is free software; you can redistribute it and/or
       8                 :            :  * modify it under the terms of the GNU General Public License as
       9                 :            :  * published by the Free Software Foundation; either version 2 of the
      10                 :            :  * License, or (at your option) any later version.
      11                 :            :  *
      12                 :            :  * This program is distributed in the hope that it will be useful,
      13                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      14                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15                 :            :  * GNU General Public License for more details.
      16                 :            :  *
      17                 :            :  * You should have received a copy of the GNU General Public License
      18                 :            :  * along with this program; if not, write to the Free Software
      19                 :            :  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
      20                 :            :  */
      21                 :            : 
      22                 :            : #include <config.h>
      23                 :            : 
      24                 :            : #include <xapian/stem.h>
      25                 :            : 
      26                 :            : #include <xapian/error.h>
      27                 :            : 
      28                 :            : #include "steminternal.h"
      29                 :            : 
      30                 :            : #include "allsnowballheaders.h"
      31                 :            : 
      32                 :            : #include <string>
      33                 :            : 
      34                 :            : using namespace std;
      35                 :            : 
      36                 :            : namespace Xapian {
      37                 :            : 
      38                 :          1 : Stem::Stem(const Stem & o) : internal(o.internal) { }
      39                 :            : 
      40                 :            : void
      41                 :         48 : Stem::operator=(const Stem & o)
      42                 :            : {
      43                 :         48 :     internal = o.internal;
      44                 :         48 : }
      45                 :            : 
      46                 :         88 : Stem::Stem() : internal(0) { }
      47                 :            : 
      48                 :      33202 : Stem::Stem(const std::string &language) : internal(0) {
      49   [ +  +  #  # ]:      33202 :     if (language.empty()) return;
      50 [ +  +  +  +  + :      33200 :     switch (language[0]) {
          +  +  +  +  +  
             +  +  +  + ]
         [ #  #  #  #  # 
          #  #  #  #  #  
             #  #  #  # ]
      51                 :            :         case 'd':
      52 [ +  + ][ +  + ]:          7 :             if (language == "da" || language == "danish") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
      53                 :          3 :                 internal = new InternalStemDanish;
      54                 :          3 :                 return;
      55                 :            :             }
      56 [ +  + ][ #  # ]:          4 :             if (language == "dutch") {
      57                 :          2 :                 internal = new InternalStemDutch;
      58                 :          2 :                 return;
      59                 :            :             }
      60 [ +  + ][ #  # ]:          2 :             if (language == "de") {
      61                 :          1 :                 internal = new InternalStemGerman;
      62                 :          1 :                 return;
      63                 :            :             }
      64                 :          1 :             break;
      65                 :            :         case 'e':
      66 [ +  + ][ +  + ]:      32891 :             if (language == "en" || language == "english") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
      67                 :      32889 :                 internal = new InternalStemEnglish;
      68                 :      32889 :                 return;
      69                 :            :             }
      70 [ +  + ][ #  # ]:          2 :             if (language == "es") {
      71                 :          1 :                 internal = new InternalStemSpanish;
      72                 :          1 :                 return;
      73                 :            :             }
      74                 :          1 :             break;
      75                 :            :         case 'f':
      76 [ +  + ][ +  + ]:          7 :             if (language == "fi" || language == "finnish") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
      77                 :          3 :                 internal = new InternalStemFinnish;
      78                 :          3 :                 return;
      79                 :            :             }
      80 [ +  + ][ +  + ]:          4 :             if (language == "fr" || language == "french") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
      81                 :          3 :                 internal = new InternalStemFrench;
      82                 :          3 :                 return;
      83                 :            :             }
      84                 :          1 :             break;
      85                 :            :         case 'g':
      86 [ +  + ][ #  # ]:          5 :             if (language == "german") {
      87                 :          2 :                 internal = new InternalStemGerman;
      88                 :          2 :                 return;
      89                 :            :             }
      90 [ +  + ][ #  # ]:          3 :             if (language == "german2") {
      91                 :          2 :                 internal = new InternalStemGerman2;
      92                 :          2 :                 return;
      93                 :            :             }
      94                 :          1 :             break;
      95                 :            :         case 'h':
      96 [ +  + ][ +  + ]:          4 :             if (language == "hu" || language == "hungarian") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
      97                 :          3 :                 internal = new InternalStemHungarian;
      98                 :          3 :                 return;
      99                 :            :             }
     100                 :          1 :             break;
     101                 :            :         case 'i':
     102 [ +  + ][ +  + ]:          4 :             if (language == "it" || language == "italian") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
     103                 :          3 :                 internal = new InternalStemItalian;
     104                 :          3 :                 return;
     105                 :            :             }
     106                 :          1 :             break;
     107                 :            :         case 'k':
     108 [ +  + ][ #  # ]:          3 :             if (language == "kraaij_pohlmann") {
     109                 :          2 :                 internal = new InternalStemKraaij_pohlmann;
     110                 :          2 :                 return;
     111                 :            :             }
     112                 :          1 :             break;
     113                 :            :         case 'l':
     114 [ +  + ][ #  # ]:          3 :             if (language == "lovins") {
     115                 :          2 :                 internal = new InternalStemLovins;
     116                 :          2 :                 return;
     117                 :            :             }
     118                 :          1 :             break;
     119                 :            :         case 'n':
     120 [ +  + ][ #  # ]:         10 :             if (language == "nl") {
     121                 :          1 :                 internal = new InternalStemDutch;
     122                 :          1 :                 return;
     123                 :            :             }
     124 [ +  + ][ +  + ]:          9 :             if (language == "no" || language == "nb" || language == "nn" ||
         [ +  + ][ +  + ]
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     125                 :            :                 language == "norwegian") {
     126                 :            :                 // Snowball's "Norwegian" stemmer works for both nb and nn
     127                 :            :                 // according to AlexB on #xapian.
     128                 :          7 :                 internal = new InternalStemNorwegian;
     129                 :          7 :                 return;
     130                 :            :             }
     131 [ +  + ][ #  # ]:          2 :             if (language == "none") {
     132                 :          1 :                 return;
     133                 :            :             }
     134                 :          1 :             break;
     135                 :            :         case 'p':
     136 [ +  + ][ +  + ]:          6 :             if (language == "pt" || language == "portuguese") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
     137                 :          3 :                 internal = new InternalStemPortuguese;
     138                 :          3 :                 return;
     139                 :            :             }
     140 [ +  + ][ #  # ]:          3 :             if (language == "porter") {
     141                 :          2 :                 internal = new InternalStemPorter;
     142                 :          2 :                 return;
     143                 :            :             }
     144                 :          1 :             break;
     145                 :            :         case 'r':
     146 [ +  + ][ +  + ]:          7 :             if (language == "ru" || language == "russian") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
     147                 :          3 :                 internal = new InternalStemRussian;
     148                 :          3 :                 return;
     149                 :            :             }
     150 [ +  + ][ +  + ]:          4 :             if (language == "ro" || language == "romanian") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
     151                 :          3 :                 internal = new InternalStemRomanian;
     152                 :          3 :                 return;
     153                 :            :             }
     154                 :          1 :             break;
     155                 :            :         case 's':
     156 [ +  + ][ #  # ]:          6 :             if (language == "spanish") {
     157                 :          2 :                 internal = new InternalStemSpanish;
     158                 :          2 :                 return;
     159                 :            :             }
     160 [ +  + ][ +  + ]:          4 :             if (language == "sv" || language == "swedish") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
     161                 :          3 :                 internal = new InternalStemSwedish;
     162                 :          3 :                 return;
     163                 :            :             }
     164                 :          1 :             break;
     165                 :            :         case 't':
     166 [ +  + ][ +  + ]:          4 :             if (language == "tr" || language == "turkish") {
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
     167                 :          3 :                 internal = new InternalStemTurkish;
     168                 :          3 :                 return;
     169                 :            :             }
     170                 :            :             break;
     171                 :            :     }
     172                 :        256 :     throw Xapian::InvalidArgumentError("Language code " + language + " unknown");
     173                 :      33202 : }
     174                 :            : 
     175                 :          1 : Stem::Stem(StemImplementation * p) : internal(p) { }
     176                 :            : 
     177                 :      33036 : Stem::~Stem() { }
     178                 :            : 
     179                 :            : string
     180                 :    3437712 : Stem::operator()(const std::string &word) const
     181                 :            : {
     182 [ +  - ][ +  + ]:    3437712 :     if (!internal.get() || word.empty()) return word;
                 [ +  + ]
     183                 :    3437712 :     return internal->operator()(word);
     184                 :            : }
     185                 :            : 
     186                 :            : string
     187                 :         31 : Stem::get_description() const
     188                 :            : {
     189                 :         31 :     string desc = "Xapian::Stem(";
     190         [ +  + ]:         31 :     if (internal.get()) {
     191                 :         27 :         desc += internal->get_description();
     192                 :         27 :         desc += ')';
     193                 :            :     } else {
     194                 :         31 :         desc += "none)";
     195                 :            :     }
     196                 :          0 :     return desc;
     197                 :            : }
     198                 :            : 
     199                 :            : string
     200                 :          2 : Stem::get_available_languages()
     201                 :            : {
     202                 :          2 :     return LANGSTRING;
     203                 :            : }
     204                 :            : 
     205                 :            : }

Generated by: LCOV version 1.8