summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htsearch/OrFuzzyExpander.cc
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htsearch/OrFuzzyExpander.cc')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htsearch/OrFuzzyExpander.cc94
1 files changed, 94 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htsearch/OrFuzzyExpander.cc b/debian/htdig/htdig-3.2.0b6/htsearch/OrFuzzyExpander.cc
new file mode 100644
index 00000000..d288496d
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htsearch/OrFuzzyExpander.cc
@@ -0,0 +1,94 @@
+//
+// OrFuzzyExpander.cc
+//
+// OrFuzzyExpander: a concrete Fuzzy expander that makes a OR with
+// all the results returned by the applicable Fuzzies.
+//
+// Part of the ht://Dig package <http://www.htdig.org/>
+// Copyright (c) 1995-2004 The ht://Dig Group
+// For copyright details, see the file COPYING in your distribution
+// or the GNU Library General Public License (LGPL) version 2 or later
+// <http://www.gnu.org/copyleft/lgpl.html>
+//
+// $Id: OrFuzzyExpander.cc,v 1.4 2004/05/28 13:15:24 lha Exp $
+//
+
+#include "OrFuzzyExpander.h"
+#include "Dictionary.h"
+#include "ExactWordQuery.h"
+#include "OrQuery.h"
+
+extern int debug;
+
+//
+// creates a query with a OrQuery with all the
+// distinct fuzzy results
+//
+// additionally, sets fuzzy scores for used words
+//
+Query *
+OrFuzzyExpander::MakeQuery(const String &word)
+{
+ Query *result = 0;
+ Dictionary exacts;
+
+ // for each configured fuzzy
+ filters.Start_Get();
+ Fuzzy *fuzzy = (Fuzzy *)filters.Get_Next();
+ while(fuzzy)
+ {
+ // for each word expanded by fuzzy
+ List words;
+ String nonconst = word;
+ fuzzy->getWords(nonconst, words);
+ words.Start_Get();
+ String *w = (String *)words.Get_Next();
+ while(w)
+ {
+ // if not yet expanded by another fuzzy
+ // add it to the big Or
+ if(debug) cerr << "fuzzy " << word << "=" << *w << endl;
+ ExactWordQuery *exact = (ExactWordQuery *)exacts[*w];
+ if(!exact)
+ {
+ exact = new ExactWordQuery(*w);
+ exact->SetWeight(fuzzy->getWeight());
+ exacts.Add(*w, exact);
+ }
+ // otherwise, just adjust the weight
+ else
+ {
+ exact->SetWeight(
+ exact->GetWeight() +
+ fuzzy->getWeight());
+ }
+ w = (String *)words.Get_Next();
+ }
+ fuzzy = (Fuzzy *)filters.Get_Next();
+ }
+
+ // return the expanded query
+ // a single word or
+ // a Or with all the expanded words
+ exacts.Start_Get();
+ Query *exact = (Query *)exacts.Get_NextElement();
+ if(exact)
+ {
+ result = exact;
+ exact = (Query *)exacts.Get_NextElement();
+ }
+ if(exact)
+ {
+ Query *tmp = result;
+ result = new OrQuery;
+ result->Add(tmp);
+ while(exact)
+ {
+ result->Add(exact);
+ exact = (Query *)exacts.Get_NextElement();
+ }
+ }
+ exacts.Release();
+
+ return result;
+}