00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022
00023 #include <xapian/sorter.h>
00024
00025 #include <string>
00026 #include <vector>
00027
00028 using namespace std;
00029
00030 namespace Xapian {
00031
00032 Sorter::~Sorter() { }
00033
00034 string
00035 MultiValueSorter::operator()(const Xapian::Document & doc) const
00036 {
00037 string result;
00038
00039 vector<pair<Xapian::valueno, bool> >::const_iterator i = valnos.begin();
00040
00041 if (rare(i == valnos.end())) return result;
00042
00043 while (true) {
00044
00045
00046
00047
00048 string v = doc.get_value(i->first);
00049 bool reverse_sort = !i->second;
00050
00051 if (++i == valnos.end() && !reverse_sort) {
00052
00053 result += v;
00054 break;
00055 }
00056
00057 if (reverse_sort) {
00058
00059
00060
00061 for (string::const_iterator j = v.begin(); j != v.end(); ++j) {
00062 unsigned char ch(*j);
00063 result += char(255 - ch);
00064 if (ch == 0) result += '\0';
00065 }
00066 result.append("\xff\xff", 2);
00067 if (i == valnos.end()) break;
00068 } else {
00069
00070
00071
00072 string::size_type j = 0, nul;
00073 while ((nul = v.find('\0', j)) != string::npos) {
00074 ++nul;
00075 result.append(v, j, nul - j);
00076 result += '\xff';
00077 j = nul;
00078 }
00079 result.append(v, j, string::npos);
00080 result.append("\0", 2);
00081 }
00082 }
00083 return result;
00084 }
00085
00086 MultiValueSorter::~MultiValueSorter() { }
00087
00088 }