Revision: 605
Author: boulton.rj
Date: Mon Feb 22 16:17:45 2010
Log: xappy/searchconnection.py,xappy/unittests/sort.py: Sort document
with missing values in the slots to the end.
http://code.google.com/p/xappy/source/detail?r=605
Modified:
/trunk/ChangeLog
/trunk/xappy/searchconnection.py
/trunk/xappy/unittests/sort.py
=======================================
--- /trunk/ChangeLog Mon Feb 22 15:38:46 2010
+++ /trunk/ChangeLog Mon Feb 22 16:17:45 2010
@@ -1,3 +1,8 @@
+Tue Feb 23 00:17:14 GMT 2010 Richard Boulton <
ric...@tartarus.org>
+
+ * xappy/searchconnection.py,xappy/unittests/sort.py: Sort document
+ with missing values in the slots to the end.
+
Mon Feb 22 23:38:17 GMT 2010 Richard Boulton <
ric...@tartarus.org>
* xappy/mset_search_results.py: Support both the old and new xapian
=======================================
--- /trunk/xappy/searchconnection.py Mon Feb 1 03:19:59 2010
+++ /trunk/xappy/searchconnection.py Mon Feb 22 16:17:45 2010
@@ -1921,7 +1921,16 @@
# words, it considers "ascending" to mean return results in
# descending order. See xapian bug #311
# (
http://trac.xapian.org/ticket/311)
- return slotnum, not asc
+ result = [slotnum, not asc]
+
+ if asc:
+ # Add default value
+ try:
+ ubound = self._index.get_value_upper_bound(slotnum)
+ '\xff'
+ except xapian.UnimplementedError:
+ ubound = '\xff' * 256
+ result.append(ubound)
+ return result
class SortByGeolocation(object):
def __init__(self, fieldname, centre):
@@ -2047,9 +2056,12 @@
def _apply_sort_parameters(self, enq, sortby):
if isinstance(sortby, basestring):
- enq.set_sort_by_value_then_relevance(
- *self._get_sort_slot_and_dir(sortby))
- elif isinstance(sortby, self.SortByGeolocation):
+ params = self._get_sort_slot_and_dir(sortby)
+ if len(params) == 2:
+ enq.set_sort_by_value_then_relevance(*params)
+ return
+ sortby = [sortby]
+ if isinstance(sortby, self.SortByGeolocation):
# Get the slot
try:
slot =
self._field_mappings.get_slot(sortby.fieldname, 'loc')
@@ -2073,7 +2085,13 @@
else:
keymaker = xapian.MultiValueKeyMaker()
for field in sortby:
- keymaker.add_value(*self._get_sort_slot_and_dir(field))
+ params = self._get_sort_slot_and_dir(field)
+ try:
+ keymaker.add_value(*params)
+ except TypeError:
+ # backwards compatibility
+ params = params[:2]
+ keymaker.add_value(*params)
enq.set_sort_by_key_then_relevance(keymaker, False)
enq._keymaker = keymaker
=======================================
--- /trunk/xappy/unittests/sort.py Tue Nov 18 14:00:14 2008
+++ /trunk/xappy/unittests/sort.py Mon Feb 22 16:17:45 2010
@@ -1,6 +1,7 @@
# vim: set fileencoding=utf-8 :
#
# Copyright (C) 2008 Michael Elsdörfer
+# Copyright (C) 2010 Richard Boulton
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -25,10 +26,11 @@
iconn.add_field_action('name', xappy.FieldActions.INDEX_FREETEXT)
iconn.add_field_action('name', xappy.FieldActions.SORTABLE)
iconn.add_field_action('date', xappy.FieldActions.SORTABLE,
type='date')
+ iconn.add_field_action('d2', xappy.FieldActions.SORTABLE,
type='date')
data =\
- [{'name': 'a', 'date': date(2008, 1, 1)},
- {'name': 'c', 'date': date(2008, 6, 1)},
+ [{'name': 'a', 'date': date(2008, 1, 1), 'd2': date(2008, 1,
1)},
+ {'name': 'c', 'date': date(2008, 6, 1), 'd2': date(2008, 6,
1)},
{'name': 'b', 'date': date(2008, 6, 1)}]
for row in data:
doc = xappy.UnprocessedDocument()
@@ -68,5 +70,12 @@
self.assertEqual(self._search(('-date', '+name')), [2,1,0])
self.assertEqual(self._search(('-date', '-name')), [1,2,0])
+ def test_missing(self):
+ """Test that sorting always puts missing values to the end.
+
+ """
+ self.assertEqual(self._search('d2'), [0,1,2])
+ self.assertEqual(self._search('-d2'), [1,0,2])
+
if __name__ == '__main__':
main()