def insertEntry(self, comp, id, level, parent_path=None, object_path=None): """Insert an entry. parent_path is the path of the parent object path is the object path, it is assumed to be unique, i.e. there is a one to one mapping between physical paths and docids. This will be large, and is only used for breadcrumbs. id is the docid """ PathIndex.insertEntry(self, comp, id, level) if parent_path is not None: if not self._index_parents.has_key(parent_path): self._index_parents[parent_path] = IISet() self._index_parents[parent_path].insert(id) # We make the assumption that a full path corresponds one and only # one object. if object_path is not None: self._index_items[object_path] = id
def __init__(self, id, extra=None, caller=None): """ MultiPathIndex supports indexed_attrs """ PathIndex.__init__(self, id, caller) def get(o, k, default): if isinstance(o, dict): return o.get(k, default) else: return getattr(o, k, default) attrs = get(extra, 'indexed_attrs', (id,)) if isinstance(attrs, str): attrs = attrs.split(',') attrs = filter(None, [a.strip() for a in attrs]) self.indexed_attrs = tuple(attrs) or (id,)
def get_catalog(self, createIfNotExists=True): # Create catalog. zmsroot = self.getRootElement() home = zmsroot.getHome() catalog = getattr(home,self.catalog_id,None) if catalog is None: catalog = ZCatalog.ZCatalog(id=self.catalog_id, title=self.meta_id, container=home) home._setObject(catalog.id, catalog) catalog = getattr(home,self.catalog_id,None) # Index names. index_names = self.get_index_names(True) # Add indices. for index_name in index_names: if index_name not in catalog.indexes(): index_type = FieldIndex(index_name) catalog.manage_addIndex(index_name,index_type) index_name = 'path' if index_name not in catalog.indexes(): index_type = PathIndex(index_name) catalog.manage_addIndex(index_name,index_type) # Add columns for index_name in index_names + ['getPath']: if index_name not in catalog.schema(): catalog.manage_addColumn(index_name) return catalog
def setUp(self): from Products.PluginIndexes.PathIndex.PathIndex import PathIndex PlacelessSetup.setUp(self) zcml.load_config('meta.zcml', Products.Five) zcml.load_config('configure.zcml', Products.GenericSetup.PluginIndexes) self._obj = PathIndex('foo_path') self._XML = _PATH_XML
def setUp(self): import Products.GenericSetup.PluginIndexes from Products.PluginIndexes.PathIndex.PathIndex import PathIndex NodeAdapterTestCase.setUp(self) zcml.load_config('configure.zcml', Products.GenericSetup.PluginIndexes) self._obj = PathIndex('foo_path') self._XML = _PATH_XML
def __init__(self, id, extra=None, caller=None): """ ExtendedPathIndex supports indexed_attrs """ PathIndex.__init__(self, id, caller) if isinstance(extra, dict): attrs = extra.get('indexed_attrs', None) else: attrs = getattr(extra, 'indexed_attrs', None) if attrs is None: return if isinstance(attrs, str): attrs = attrs.split(',') attrs = filter(None, [a.strip() for a in attrs]) if attrs: # We only index the first attribute so snip off the rest self.indexed_attrs = tuple(attrs[:1])
def _make_catalog(self): zcat = ZCatalog('catalog') zcat._catalog.addIndex('big', BooleanIndex('big')) zcat._catalog.addIndex('date', DateRangeIndex('date', 'start', 'end')) zcat._catalog.addIndex('num', FieldIndex('num')) zcat._catalog.addIndex('numbers', KeywordIndex('numbers')) zcat._catalog.addIndex('path', PathIndex('getPhysicalPath')) zcat._catalog.addIndex('uuid', UUIDIndex('num')) for i in range(9): obj = Dummy(i) zcat.catalog_object(obj, str(i)) return zcat
def _make_catalog(self): from Products.PluginIndexes.BooleanIndex.BooleanIndex import \ BooleanIndex from Products.PluginIndexes.DateRangeIndex.DateRangeIndex import \ DateRangeIndex from Products.PluginIndexes.FieldIndex.FieldIndex import FieldIndex from Products.PluginIndexes.KeywordIndex.KeywordIndex import \ KeywordIndex from Products.PluginIndexes.PathIndex.PathIndex import PathIndex from Products.PluginIndexes.UUIDIndex.UUIDIndex import UUIDIndex from Products.ZCatalog.ZCatalog import ZCatalog zcat = ZCatalog('catalog') zcat._catalog.addIndex('big', BooleanIndex('big')) zcat._catalog.addIndex('date', DateRangeIndex('date', 'start', 'end')) zcat._catalog.addIndex('num', FieldIndex('num')) zcat._catalog.addIndex('numbers', KeywordIndex('numbers')) zcat._catalog.addIndex('path', PathIndex('getPhysicalPath')) zcat._catalog.addIndex('uuid', UUIDIndex('num')) for i in range(9): obj = dummy(i) zcat.catalog_object(obj, str(i)) return zcat
def setUp(self): self._index = PathIndex( 'path' ) self._values = { 1 : Dummy("/aa/aa/aa/1.html"), 2 : Dummy("/aa/aa/bb/2.html"), 3 : Dummy("/aa/aa/cc/3.html"), 4 : Dummy("/aa/bb/aa/4.html"), 5 : Dummy("/aa/bb/bb/5.html"), 6 : Dummy("/aa/bb/cc/6.html"), 7 : Dummy("/aa/cc/aa/7.html"), 8 : Dummy("/aa/cc/bb/8.html"), 9 : Dummy("/aa/cc/cc/9.html"), 10 : Dummy("/bb/aa/aa/10.html"), 11 : Dummy("/bb/aa/bb/11.html"), 12 : Dummy("/bb/aa/cc/12.html"), 13 : Dummy("/bb/bb/aa/13.html"), 14 : Dummy("/bb/bb/bb/14.html"), 15 : Dummy("/bb/bb/cc/15.html"), 16 : Dummy("/bb/cc/aa/16.html"), 17 : Dummy("/bb/cc/bb/17.html"), 18 : Dummy("/bb/cc/cc/18.html") }
def clear(self): PathIndex.clear(self) self._index_parents = OOBTree() self._index_items = OIBTree()
def setUp(self): from Products.PluginIndexes.PathIndex.PathIndex import PathIndex NodeAdapterTestCase.setUp(self) self._obj = PathIndex('foo_path') self._XML = _PATH_XML
class PathIndexTests(unittest.TestCase): """ Test PathIndex objects """ def setUp(self): self._index = PathIndex( 'path' ) self._values = { 1 : Dummy("/aa/aa/aa/1.html"), 2 : Dummy("/aa/aa/bb/2.html"), 3 : Dummy("/aa/aa/cc/3.html"), 4 : Dummy("/aa/bb/aa/4.html"), 5 : Dummy("/aa/bb/bb/5.html"), 6 : Dummy("/aa/bb/cc/6.html"), 7 : Dummy("/aa/cc/aa/7.html"), 8 : Dummy("/aa/cc/bb/8.html"), 9 : Dummy("/aa/cc/cc/9.html"), 10 : Dummy("/bb/aa/aa/10.html"), 11 : Dummy("/bb/aa/bb/11.html"), 12 : Dummy("/bb/aa/cc/12.html"), 13 : Dummy("/bb/bb/aa/13.html"), 14 : Dummy("/bb/bb/bb/14.html"), 15 : Dummy("/bb/bb/cc/15.html"), 16 : Dummy("/bb/cc/aa/16.html"), 17 : Dummy("/bb/cc/bb/17.html"), 18 : Dummy("/bb/cc/cc/18.html") } def _populateIndex(self): for k, v in self._values.items(): self._index.index_object( k, v ) def test_z3interfaces(self): from Products.PluginIndexes.interfaces import IPathIndex from Products.PluginIndexes.interfaces import IUniqueValueIndex from zope.interface.verify import verifyClass verifyClass(IPathIndex, PathIndex) verifyClass(IUniqueValueIndex, PathIndex) def testEmpty(self): self.assertEqual(self._index.numObjects() ,0) self.assertEqual(self._index.getEntryForObject(1234), None) self._index.unindex_object( 1234 ) # nothrow self.assertEqual(self._index._apply_index({"suxpath":"xxx"}), None) def testUnIndex(self): self._populateIndex() self.assertEqual(self._index.numObjects(), 18) for k in self._values.keys(): self._index.unindex_object(k) self.assertEqual(self._index.numObjects(), 0) self.assertEqual(len(self._index._index), 0) self.assertEqual(len(self._index._unindex), 0) def testReindex(self): self._populateIndex() self.assertEqual(self._index.numObjects(), 18) o = Dummy('/foo/bar') self._index.index_object(19, o) self.assertEqual(self._index.numObjects(), 19) self._index.index_object(19, o) self.assertEqual(self._index.numObjects(), 19) def testUnIndexError(self): self._populateIndex() # this should not raise an error self._index.unindex_object(-1) # nor should this self._index._unindex[1] = "/broken/thing" self._index.unindex_object(1) def testRoot(self): self._populateIndex() tests = ( ("/",0, range(1,19)), ) for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':path,"level":level}}) lst = list(res[0].keys()) self.assertEqual(lst,results) for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':( (path,level),)}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testRoot(self): self._populateIndex() tests = ( ("/",0, range(1,19)), ) for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':path,"level":level}}) lst = list(res[0].keys()) self.assertEqual(lst,results) for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':( (path,level),)}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testSimpleTests(self): self._populateIndex() tests = [ ("aa", 0, [1,2,3,4,5,6,7,8,9]), ("aa", 1, [1,2,3,10,11,12] ), ("bb", 0, [10,11,12,13,14,15,16,17,18]), ("bb", 1, [4,5,6,13,14,15] ), ("bb/cc", 0, [16,17,18] ), ("bb/cc", 1, [6,15] ), ("bb/aa", 0, [10,11,12] ), ("bb/aa", 1, [4,13] ), ("aa/cc", -1, [3,7,8,9,12] ), ("bb/bb", -1, [5,13,14,15] ), ("18.html", 3, [18] ), ("18.html", -1, [18] ), ("cc/18.html", -1, [18] ), ("cc/18.html", 2, [18] ), ] for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':path,"level":level}}) lst = list(res[0].keys()) self.assertEqual(lst,results) for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':( (path,level),)}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testComplexOrTests(self): self._populateIndex() tests = [ (['aa','bb'],1,[1,2,3,4,5,6,10,11,12,13,14,15]), (['aa','bb','xx'],1,[1,2,3,4,5,6,10,11,12,13,14,15]), ([('cc',1),('cc',2)],0,[3,6,7,8,9,12,15,16,17,18]), ] for lst ,level,results in tests: res = self._index._apply_index( {"path":{'query':lst,"level":level,"operator":"or"}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testComplexANDTests(self): self._populateIndex() tests = [ (['aa','bb'],1,[]), ([('aa',0),('bb',1)],0,[4,5,6]), ([('aa',0),('cc',2)],0,[3,6,9]), ] for lst ,level,results in tests: res = self._index._apply_index( {"path":{'query':lst,"level":level,"operator":"and"}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testQueryPathReturnedInResult(self): index = self._index index.index_object(1, Dummy("/ff")) index.index_object(2, Dummy("/ff/gg")) index.index_object(3, Dummy("/ff/gg/3.html")) index.index_object(4, Dummy("/ff/gg/4.html")) res = index._apply_index({'path': {'query': '/ff/gg'}}) lst = list(res[0].keys()) self.assertEqual(lst, [2, 3, 4])
def setUp(self): from Products.PluginIndexes.PathIndex.PathIndex import PathIndex self._obj = PathIndex('foo_path') self._XML = _PATH_XML
class TestCase( unittest.TestCase ): """ Test PathIndex objects """ def setUp(self): self._index = PathIndex( 'path' ) self._values = { 1 : Dummy("/aa/aa/aa/1.html"), 2 : Dummy("/aa/aa/bb/2.html"), 3 : Dummy("/aa/aa/cc/3.html"), 4 : Dummy("/aa/bb/aa/4.html"), 5 : Dummy("/aa/bb/bb/5.html"), 6 : Dummy("/aa/bb/cc/6.html"), 7 : Dummy("/aa/cc/aa/7.html"), 8 : Dummy("/aa/cc/bb/8.html"), 9 : Dummy("/aa/cc/cc/9.html"), 10 : Dummy("/bb/aa/aa/10.html"), 11 : Dummy("/bb/aa/bb/11.html"), 12 : Dummy("/bb/aa/cc/12.html"), 13 : Dummy("/bb/bb/aa/13.html"), 14 : Dummy("/bb/bb/bb/14.html"), 15 : Dummy("/bb/bb/cc/15.html"), 16 : Dummy("/bb/cc/aa/16.html"), 17 : Dummy("/bb/cc/bb/17.html"), 18 : Dummy("/bb/cc/cc/18.html") } def _populateIndex(self): for k, v in self._values.items(): self._index.index_object( k, v ) def testEmpty(self): assert len( self._index ) == 0 assert self._index.getEntryForObject( 1234 ) is None self._index.unindex_object( 1234 ) # nothrow assert self._index._apply_index( {"suxpath":"xxx"} ) is None def testUnIndex(self): self._populateIndex() for k in self._values.keys(): self._index.unindex_object(k) assert len(self._index._index)==0 assert len(self._index._unindex)==0 def testUnIndexError(self): self._populateIndex() # this should not raise an error self._index.unindex_object(-1) # nor should this self._index._unindex[1] = "/broken/thing" self._index.unindex_object(1) def testRoot(self): self._populateIndex() tests = [ ("/",0, range(1,19)), ] for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':path,"level":level}}) lst = list(res[0].keys()) self.assertEqual(lst,results) for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':( (path,level),)}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testSimpleTests(self): self._populateIndex() tests = [ ("aa", 0, [1,2,3,4,5,6,7,8,9]), ("aa", 1, [1,2,3,10,11,12] ), ("bb", 0, [10,11,12,13,14,15,16,17,18]), ("bb", 1, [4,5,6,13,14,15] ), ("bb/cc", 0, [16,17,18] ), ("bb/cc", 1, [6,15] ), ("bb/aa", 0, [10,11,12] ), ("bb/aa", 1, [4,13] ), ("aa/cc", -1, [3,7,8,9,12] ), ("bb/bb", -1, [5,13,14,15] ), ("18.html", 3, [18] ), ("18.html", -1, [18] ), ("cc/18.html", -1, [18] ), ("cc/18.html", 2, [18] ), ] for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':path,"level":level}}) lst = list(res[0].keys()) self.assertEqual(lst,results) for comp,level,results in tests: for path in [comp,"/"+comp,"/"+comp+"/"]: res = self._index._apply_index( {"path":{'query':( (path,level),)}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testComplexOrTests(self): self._populateIndex() tests = [ (['aa','bb'],1,[1,2,3,4,5,6,10,11,12,13,14,15]), (['aa','bb','xx'],1,[1,2,3,4,5,6,10,11,12,13,14,15]), ([('cc',1),('cc',2)],0,[3,6,7,8,9,12,15,16,17,18]), ] for lst ,level,results in tests: res = self._index._apply_index( {"path":{'query':lst,"level":level,"operator":"or"}}) lst = list(res[0].keys()) self.assertEqual(lst,results) def testComplexANDTests(self): self._populateIndex() tests = [ (['aa','bb'],1,[]), ([('aa',0),('bb',1)],0,[4,5,6]), ([('aa',0),('cc',2)],0,[3,6,9]), ] for lst ,level,results in tests: res = self._index._apply_index( {"path":{'query':lst,"level":level,"operator":"and"}}) lst = list(res[0].keys()) self.assertEqual(lst,results)