root / tags / 1.0.8 / xapian-core / tests / api_sorting.cc

Revision 10567, 5.0 kB (checked in by olly, 8 months ago)

Backport change from trunk:
api/omenquire.cc: Reset the internal sorter pointer to NULL when
changing to a sort by value. Fixes #256.
tests/api_sorting.cc: Add regression test.

Line 
1/** @file api_sorting.cc
2 * @brief tests of MSet sorting
3 */
4/* Copyright (C) 2007 Olly Betts
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19 */
20
21#include <config.h>
22
23#include "api_sorting.h"
24
25#include <xapian.h>
26
27#include "apitest.h"
28#include "testutils.h"
29
30using namespace std;
31
32DEFINE_TESTCASE(sortfunctor1,backend && !remote) {
33    Xapian::Enquire enquire(get_database("apitest_sortrel"));
34    enquire.set_query(Xapian::Query("woman"));
35
36    {
37        const int keys[] = { 3, 1 };
38        Xapian::MultiValueSorter sorter(keys, keys + 2);
39
40        enquire.set_sort_by_key(&sorter);
41        Xapian::MSet mset = enquire.get_mset(0, 10);
42        mset_expect_order(mset, 2, 6, 7, 1, 3, 4, 5, 8, 9);
43    }
44
45    {
46        Xapian::MultiValueSorter sorter;
47        sorter.add(3);
48        sorter.add(1, false);
49
50        enquire.set_sort_by_key(&sorter);
51        Xapian::MSet mset = enquire.get_mset(0, 10);
52        mset_expect_order(mset, 7, 6, 2, 8, 9, 4, 5, 1, 3);
53    }
54
55    {
56        Xapian::MultiValueSorter sorter;
57        sorter.add(13); // Value 13 isn't set.
58        sorter.add(3);
59        sorter.add(1, false);
60
61        enquire.set_sort_by_key(&sorter);
62        Xapian::MSet mset = enquire.get_mset(0, 10);
63        mset_expect_order(mset, 7, 6, 2, 8, 9, 4, 5, 1, 3);
64    }
65
66    {
67        Xapian::MultiValueSorter sorter;
68        sorter.add(10); // Value 10 isn't always set.
69        sorter.add(1, false);
70
71        enquire.set_sort_by_key(&sorter);
72        Xapian::MSet mset = enquire.get_mset(0, 10);
73        mset_expect_order(mset, 8, 9, 4, 5, 1, 3, 7, 6, 2);
74    }
75
76    return true;
77}
78
79/// Test reverse sort functor.
80DEFINE_TESTCASE(sortfunctor2,writable && !remote) {
81    Xapian::WritableDatabase db = get_writable_database();
82    Xapian::Document doc;
83    doc.add_term("foo");
84    doc.add_value(0, "ABB");
85    db.add_document(doc);
86    doc.add_value(0, "ABC");
87    db.add_document(doc);
88    doc.add_value(0, string("ABC", 4));
89    db.add_document(doc);
90    doc.add_value(0, "ABCD");
91    db.add_document(doc);
92    doc.add_value(0, "ABC\xff");
93    db.add_document(doc);
94
95    Xapian::Enquire enquire(db);
96    enquire.set_query(Xapian::Query("foo"));
97
98    {
99        Xapian::MultiValueSorter sorter;
100        sorter.add(0);
101        enquire.set_sort_by_key(&sorter);
102        Xapian::MSet mset = enquire.get_mset(0, 10);
103        mset_expect_order(mset, 5, 4, 3, 2, 1);
104    }
105
106    {
107        Xapian::MultiValueSorter sorter;
108        sorter.add(0, false);
109        enquire.set_sort_by_key(&sorter);
110        Xapian::MSet mset = enquire.get_mset(0, 10);
111        mset_expect_order(mset, 1, 2, 3, 4, 5);
112    }
113
114    {
115        Xapian::MultiValueSorter sorter;
116        sorter.add(0);
117        sorter.add(1);
118        enquire.set_sort_by_key(&sorter);
119        Xapian::MSet mset = enquire.get_mset(0, 10);
120        mset_expect_order(mset, 5, 4, 3, 2, 1);
121    }
122
123    {
124        Xapian::MultiValueSorter sorter;
125        sorter.add(0, false);
126        sorter.add(1);
127        enquire.set_sort_by_key(&sorter);
128        Xapian::MSet mset = enquire.get_mset(0, 10);
129        mset_expect_order(mset, 1, 2, 3, 4, 5);
130    }
131
132    {
133        Xapian::MultiValueSorter sorter;
134        sorter.add(0);
135        sorter.add(1, false);
136        enquire.set_sort_by_key(&sorter);
137        Xapian::MSet mset = enquire.get_mset(0, 10);
138        mset_expect_order(mset, 5, 4, 3, 2, 1);
139    }
140
141    {
142        Xapian::MultiValueSorter sorter;
143        sorter.add(0, false);
144        sorter.add(1, false);
145        enquire.set_sort_by_key(&sorter);
146        Xapian::MSet mset = enquire.get_mset(0, 10);
147        mset_expect_order(mset, 1, 2, 3, 4, 5);
148    }
149
150    return true;
151}
152
153class NeverUseMeSorter : public Xapian::Sorter {
154  public:
155    std::string operator() (const Xapian::Document &) const
156    {
157        FAIL_TEST("NeverUseMeSorter was called");
158    }
159};
160
161// Regression test for changing away from a sorter.
162DEFINE_TESTCASE(changesorter1, backend) {
163    Xapian::Enquire enquire(get_database("apitest_simpledata"));
164    enquire.set_query(Xapian::Query("word"));
165    NeverUseMeSorter sorter;
166
167    enquire.set_sort_by_key(&sorter);
168    enquire.set_sort_by_value(0);
169    Xapian::MSet mset = enquire.get_mset(0, 25);
170    TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
171
172    enquire.set_sort_by_key(&sorter);
173    enquire.set_sort_by_value_then_relevance(0);
174    mset = enquire.get_mset(0, 25);
175    TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
176
177    enquire.set_sort_by_key(&sorter);
178    enquire.set_sort_by_relevance_then_value(0);
179    mset = enquire.get_mset(0, 25);
180    TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
181
182    enquire.set_sort_by_key(&sorter);
183    enquire.set_sort_by_relevance();
184    mset = enquire.get_mset(0, 25);
185    TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
186
187    return true;
188}
Note: See TracBrowser for help on using the browser.