| | 154 | // Test sort functor with some empty values. |
| | 155 | DEFINE_TESTCASE(sortfunctor3, backend && !remote && valuestats) { |
| | 156 | Xapian::Database db(get_database("apitest_sortrel")); |
| | 157 | Xapian::Enquire enquire(db); |
| | 158 | enquire.set_query(Xapian::Query("woman")); |
| | 159 | |
| | 160 | // Value 10 is set to 'a' for 1, 3, 4, 5, 8, 9, and not set otherwise. |
| | 161 | { |
| | 162 | // Test default sort order - missing values come first. |
| | 163 | Xapian::MultiValueKeyMaker sorter; |
| | 164 | sorter.add_value(10); |
| | 165 | |
| | 166 | enquire.set_sort_by_key(&sorter, false); |
| | 167 | Xapian::MSet mset = enquire.get_mset(0, 10); |
| | 168 | mset_expect_order(mset, 2, 6, 7, 1, 3, 4, 5, 8, 9); |
| | 169 | } |
| | 170 | |
| | 171 | { |
| | 172 | // Use a default value to put the missing values to the end. |
| | 173 | Xapian::MultiValueKeyMaker sorter; |
| | 174 | sorter.add_value(10, false, db.get_value_upper_bound(10) + '\xff'); |
| | 175 | |
| | 176 | enquire.set_sort_by_key(&sorter, false); |
| | 177 | Xapian::MSet mset = enquire.get_mset(0, 10); |
| | 178 | mset_expect_order(mset, 1, 3, 4, 5, 8, 9, 2, 6, 7); |
| | 179 | } |
| | 180 | |
| | 181 | { |
| | 182 | // Test using a default value and sorting in reverse order |
| | 183 | Xapian::MultiValueKeyMaker sorter; |
| | 184 | sorter.add_value(10, false, db.get_value_upper_bound(10) + '\xff'); |
| | 185 | |
| | 186 | enquire.set_sort_by_key(&sorter, true); |
| | 187 | Xapian::MSet mset = enquire.get_mset(0, 10); |
| | 188 | mset_expect_order(mset, 2, 6, 7, 1, 3, 4, 5, 8, 9); |
| | 189 | } |
| | 190 | |
| | 191 | { |
| | 192 | // Test using a default value and generating reverse order keys |
| | 193 | Xapian::MultiValueKeyMaker sorter; |
| | 194 | sorter.add_value(10, true, db.get_value_upper_bound(10) + '\xff'); |
| | 195 | |
| | 196 | enquire.set_sort_by_key(&sorter, false); |
| | 197 | Xapian::MSet mset = enquire.get_mset(0, 10); |
| | 198 | mset_expect_order(mset, 2, 6, 7, 1, 3, 4, 5, 8, 9); |
| | 199 | } |
| | 200 | |
| | 201 | { |
| | 202 | // Test using a default value, generating reverse order keys, and |
| | 203 | // sorting in reverse order |
| | 204 | Xapian::MultiValueKeyMaker sorter; |
| | 205 | sorter.add_value(10, true, db.get_value_upper_bound(10) + '\xff'); |
| | 206 | |
| | 207 | enquire.set_sort_by_key(&sorter, true); |
| | 208 | Xapian::MSet mset = enquire.get_mset(0, 10); |
| | 209 | mset_expect_order(mset, 1, 3, 4, 5, 8, 9, 2, 6, 7); |
| | 210 | } |
| | 211 | |
| | 212 | return true; |
| | 213 | } |
| | 214 | |
| | 287 | // An empty slot at the end, in ascending order, has no effect |
| | 288 | sorter.add_value(0); |
| | 289 | TEST_EQUAL(sorter(doc), string("\0\0f\0\xffo\0\0\0\0xyz\0\0\xff\xff", 17)); |
| | 290 | |
| | 291 | // An empty slot at the end, with a default value |
| | 292 | sorter.add_value(0, false, "hi"); |
| | 293 | TEST_EQUAL(sorter(doc), string("\0\0f\0\xffo\0\0\0\0xyz\0\0\xff\xff\0\0hi", |
| | 294 | 21)); |
| | 295 | |
| | 296 | // An empty slot at the end, with a default value, in reverse sort order |
| | 297 | sorter.add_value(0, true, "hi"); |
| | 298 | TEST_EQUAL(sorter(doc), string("\0\0f\0\xffo\0\0\0\0xyz\0\0\xff\xff\0\0hi" |
| | 299 | "\0\0\x97\x96\xff\xff", 27)); |
| | 300 | |