Commit 76ac887d authored by Tres Seaver's avatar Tres Seaver

Forward-port fix for LP #143655 from the 2.12 branch.

parent 19bc59f3
...@@ -153,6 +153,8 @@ Features Added ...@@ -153,6 +153,8 @@ Features Added
Bugs Fixed Bugs Fixed
++++++++++ ++++++++++
- LP #143655: don't prevent sorting using a path index.
- LP #142478: normalize terms passed to ``PLexicon.queryLexicon`` using - LP #142478: normalize terms passed to ``PLexicon.queryLexicon`` using
the lexicon's pipeline (e.g., case flattening, stop word removal, etc.) the lexicon's pipeline (e.g., case flattening, stop word removal, etc.)
......
...@@ -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):
......
...@@ -63,15 +63,15 @@ class PathIndexTests(unittest.TestCase): ...@@ -63,15 +63,15 @@ class PathIndexTests(unittest.TestCase):
return self._getTargetClass()(id, caller) return self._getTargetClass()(id, caller)
return self._getTargetClass()(id) return self._getTargetClass()(id)
def test_class_conforms_to_IPathIndex(self): def test_class_conforms_to_IPluggableIndex(self):
from Products.PluginIndexes.interfaces import IPathIndex from Products.PluginIndexes.interfaces import IPluggableIndex
from zope.interface.verify import verifyClass from zope.interface.verify import verifyClass
verifyClass(IPathIndex, self._getTargetClass()) verifyClass(IPluggableIndex, self._getTargetClass())
def test_instance_conforms_to_IPathIndex(self): def test_instance_conforms_to_IPluggableIndex(self):
from Products.PluginIndexes.interfaces import IPathIndex from Products.PluginIndexes.interfaces import IPluggableIndex
from zope.interface.verify import verifyObject from zope.interface.verify import verifyObject
verifyObject(IPathIndex, self._makeOne()) verifyObject(IPluggableIndex, self._makeOne())
def test_class_conforms_to_IUniqueValueIndex(self): def test_class_conforms_to_IUniqueValueIndex(self):
from Products.PluginIndexes.interfaces import IUniqueValueIndex from Products.PluginIndexes.interfaces import IUniqueValueIndex
...@@ -83,6 +83,26 @@ class PathIndexTests(unittest.TestCase): ...@@ -83,6 +83,26 @@ 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):
from Products.PluginIndexes.interfaces import IPathIndex
from zope.interface.verify import verifyClass
verifyClass(IPathIndex, self._getTargetClass())
def test_instance_conforms_to_IPathIndex(self):
from Products.PluginIndexes.interfaces import IPathIndex
from zope.interface.verify import verifyObject
verifyObject(IPathIndex, self._makeOne())
def test_ctor(self): def test_ctor(self):
index = self._makeOne() index = self._makeOne()
self.assertEqual(index.id, 'path') self.assertEqual(index.id, 'path')
...@@ -417,6 +437,25 @@ class PathIndexTests(unittest.TestCase): ...@@ -417,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