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