Commit 85a8278d authored by Tres Seaver's avatar Tres Seaver

LP #143655: allow path index to be used for sorting.

parent 721e595d
...@@ -31,6 +31,7 @@ from zope.interface import implements ...@@ -31,6 +31,7 @@ from zope.interface import implements
from Products.PluginIndexes.common import safe_callable from Products.PluginIndexes.common import safe_callable
from Products.PluginIndexes.common.util import parseIndexRequest from Products.PluginIndexes.common.util import parseIndexRequest
from Products.PluginIndexes.interfaces import IPathIndex from Products.PluginIndexes.interfaces import IPathIndex
from Products.PluginIndexes.interfaces import ISortIndex
from Products.PluginIndexes.interfaces import IUniqueValueIndex from Products.PluginIndexes.interfaces import IUniqueValueIndex
LOG = getLogger('Zope.PathIndex') LOG = getLogger('Zope.PathIndex')
...@@ -51,7 +52,7 @@ class PathIndex(Persistent, SimpleItem): ...@@ -51,7 +52,7 @@ class PathIndex(Persistent, SimpleItem):
- the value is a mapping 'level of the path component' to - the value is a mapping 'level of the path component' to
'all docids with this path component on this level' 'all docids with this path component on this level'
""" """
implements(IPathIndex, IUniqueValueIndex) implements(IPathIndex, IUniqueValueIndex, ISortIndex)
meta_type="PathIndex" meta_type="PathIndex"
query_options = ('query', 'level', 'operator') query_options = ('query', 'level', 'operator')
...@@ -213,6 +214,18 @@ class PathIndex(Persistent, SimpleItem): ...@@ -213,6 +214,18 @@ class PathIndex(Persistent, SimpleItem):
for key in self._index.keys(): for key in self._index.keys():
yield key yield key
# ISortIndex implementation
def keyForDocument(self, documentId):
""" See ISortIndex.
"""
return self._unindex.get(documentId)
def documentToKeyMap(self):
""" See ISortIndex.
"""
return self._unindex
# Helper methods # Helper methods
def _insertEntry(self, comp, id, level): def _insertEntry(self, comp, id, level):
......
...@@ -83,6 +83,16 @@ class PathIndexTests(unittest.TestCase): ...@@ -83,6 +83,16 @@ class PathIndexTests(unittest.TestCase):
from zope.interface.verify import verifyObject from zope.interface.verify import verifyObject
verifyObject(IUniqueValueIndex, self._makeOne()) verifyObject(IUniqueValueIndex, self._makeOne())
def test_class_conforms_to_ISortIndex(self):
from Products.PluginIndexes.interfaces import ISortIndex
from zope.interface.verify import verifyClass
verifyClass(ISortIndex, self._getTargetClass())
def test_instance_conforms_to_ISortIndex(self):
from Products.PluginIndexes.interfaces import ISortIndex
from zope.interface.verify import verifyObject
verifyObject(ISortIndex, self._makeOne())
def test_class_conforms_to_IPathIndex(self): def test_class_conforms_to_IPathIndex(self):
from Products.PluginIndexes.interfaces import IPathIndex from Products.PluginIndexes.interfaces import IPathIndex
from zope.interface.verify import verifyClass from zope.interface.verify import verifyClass
...@@ -427,6 +437,25 @@ class PathIndexTests(unittest.TestCase): ...@@ -427,6 +437,25 @@ class PathIndexTests(unittest.TestCase):
self.assertEqual(results['cc'], self.assertEqual(results['cc'],
len([x for x in DUMMIES.values() if 'cc' in x.path])) len([x for x in DUMMIES.values() if 'cc' in x.path]))
def test_keyForDocument_miss(self):
index = self._makeOne()
self.assertEqual(index.keyForDocument(1), None)
def test_keyForDocument_hit(self):
index = self._makeOne()
_populateIndex(index)
self.assertEqual(index.keyForDocument(1), DUMMIES[1].path)
def test_documentToKeyMap_empty(self):
index = self._makeOne()
self.assertEqual(dict(index.documentToKeyMap()), {})
def test_documentToKeyMap_filled(self):
index = self._makeOne()
_populateIndex(index)
self.assertEqual(dict(index.documentToKeyMap()),
dict([(k, v.path) for k, v in DUMMIES.items()]))
def test__search_empty_index_string_query(self): def test__search_empty_index_string_query(self):
index = self._makeOne() index = self._makeOne()
self.assertEqual(list(index._search('/xxx')), []) self.assertEqual(list(index._search('/xxx')), [])
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment