summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htsearch/NearQuery.cc
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2021-11-05 13:28:23 +0100
committerSlávek Banko <slavek.banko@axis.cz>2021-11-05 13:28:23 +0100
commit8c787c3591c1c885b91a54128835b400858c5cca (patch)
treeeca1b776912a305c4d45b3964038278a2fae1ead /debian/htdig/htdig-3.2.0b6/htsearch/NearQuery.cc
parentfe188b907cdf30dfdfe0eba9412e7f8749fec158 (diff)
downloadextra-dependencies-8c787c3591c1c885b91a54128835b400858c5cca.tar.gz
extra-dependencies-8c787c3591c1c885b91a54128835b400858c5cca.zip
DEB htdig: Added to repository.
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htsearch/NearQuery.cc')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htsearch/NearQuery.cc143
1 files changed, 143 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htsearch/NearQuery.cc b/debian/htdig/htdig-3.2.0b6/htsearch/NearQuery.cc
new file mode 100644
index 00000000..52487fdc
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htsearch/NearQuery.cc
@@ -0,0 +1,143 @@
+//
+// NearQuery.cc
+//
+// NearQuery: An operator query that filters matches by proximity.
+//
+// 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: NearQuery.cc,v 1.4 2004/05/28 13:15:24 lha Exp $
+//
+
+#include "NearQuery.h"
+
+String
+NearQuery::OperatorString() const
+{
+ String s;
+ s << "near/" << distance;
+ return s;
+}
+
+//
+// l r nextTo
+// -----------------------
+// 0 0 0
+// 0 b 0
+// 0 x 0
+// a 0 0
+// a b near(a, b)
+// a x a
+// x 0 0
+// x b b
+// x x x
+//
+ResultList *
+NearQuery::Evaluate()
+{
+ ResultList *result = 0;
+ Query *left = (Query *)operands[0];
+ Query *right = (Query *)operands[1];
+
+ if(left && right)
+ {
+ ResultList *l = left->GetResults();
+ if(l)
+ {
+ ResultList *r = right->GetResults();
+ if(r)
+ {
+ if(l->IsIgnore())
+ {
+ result = new ResultList(*r);
+ }
+ else if(r->IsIgnore())
+ {
+ result = new ResultList(*l);
+ }
+ else
+ {
+ result = Near(*l, *r);
+ }
+ }
+ }
+ }
+ return result;
+}
+
+ResultList *
+NearQuery::Near(const ResultList &l, const ResultList &r)
+{
+ ResultList *result = 0;
+ DictionaryCursor c;
+ l.Start_Get(c);
+ DocMatch *match = (DocMatch *)l.Get_NextElement(c);
+ while(match)
+ {
+ DocMatch *confirm = r.find(match->GetId());
+ if(confirm)
+ {
+ List *locations = MergeLocations(
+ *match->GetLocations(),
+ *confirm->GetLocations());
+ if(locations)
+ {
+ if(!result)
+ {
+ result = new ResultList;
+ }
+ DocMatch *copy = new DocMatch(*match);
+ copy->SetLocations(locations);
+ result->add(copy);
+ }
+ }
+ match = (DocMatch *)l.Get_NextElement(c);
+ }
+ return result;
+}
+
+//
+//: merge match positions in a 'near' operation
+// all combinations are tested; the pairs of positions near enough are kept
+//
+List *
+NearQuery::MergeLocations(const List &p, const List &q)
+{
+ List *result = 0;
+ ListCursor pc;
+ p.Start_Get(pc);
+ const Location *left = (const Location *)p.Get_Next(pc);
+ while(left)
+ {
+ ListCursor qc;
+ q.Start_Get(qc);
+ const Location *right = (const Location *)q.Get_Next(qc);
+ while(right)
+ {
+ int dist = right->from - left->to;
+ if(dist < 1)
+ {
+ dist = left->from - right->to;
+ if(dist < 1)
+ {
+ dist = 0;
+ }
+ }
+ if(unsigned(dist) <= distance)
+ {
+ if(!result)
+ {
+ result = new List;
+ }
+ result->Add(new Location(*left));
+ result->Add(new Location(*right));
+ }
+ right = (const Location *)q.Get_Next(qc);
+ }
+ left = (const Location *)p.Get_Next(pc);
+ }
+ return result;
+}