Zope catalog index for paths
Project description
Introduction
This is an Zope Catalog index to query treeish structures in the ZODB by path. It supports depth limiting, and has the ability to build a structure usable for navtrees and sitemaps. The actual navtree implementations are not (and should not) be in this package. This is the index implementation only.
Assumptions
EPI makes an assumption about the catalog and index being in the same container as all the content. This makes a lot of sense in a Plone setting, but might not work as expected in other scenarios.
A query like /plonesite/folder, level=0 is transformed internally to /folder, level=1. This avoids touching the rather large plonesite set which contains reference to all content in your site.
Features
Can construct a site map with a single catalog query
Can construct a navigation tree with a single catalog query
Configuration
In a GenericSetup profile, provide th following snippet to create an index:
<index meta_type="ExtendedPathIndex" name="my_path"> <extra name="indexed_attrs" value="my_path" /> </index>
For multi valued paths, provide an extra (switches off an breaking optimization not needed for this cases):
<index meta_type="ExtendedPathIndex" name="my_path"> <extra name="indexed_attrs" value="my_path" /> <extra name="multi_valued" value="True" /> </index>
An example for an index with multiple values per path element: Imagine to index multilingual content. Every item is translated and all translated items share a common unique identifier (this is how plone.app.multilingual works). Now create an indexer returing this unique identifier instead of the items ID as a path element. With this it is possible to query all elements of all languages in a folder in one go (for an advanced usage of this pattern look at plone.app.multilingualindexes).
Usage
- catalog(path='some/path')
search for all objects below some/path (recursive, equivalent to depth = -1)
- catalog(path=dict(query='some/path', depth=0))
search for the object with the given path. For multi valued paths, multiple objects are returned.
- catalog(path=dict(query='some/path', depth=2))
search for all objects below some/path but only down to a depth of 2
- catalog(path=dict(query='some/path', navtree=True))
search for all objects below some/path for rendering a navigation tree. This includes all objects below some/path up to a depth of 1 and all parent objects.
- catalog(path=dict(query='some/path', navtree=True, depth=0))
search for all objects below some/path for rendering a breadcrumb trail. This includes only the parent objects themselves.
- catalog(path=dict(query='some/path', navtree=True, navtree_start=1))
search for all objects below some/path for rendering a partial navigation tree. This includes all objects below the path but stops 1 level above the root. The given path is included, even if it is at a shorter path in the portal than the level parameter would allow.
- catalog(path=dict(query='some/path', navtree=True, depth=0, navtree_start=1))
search for all objects below some/path for rendering a partial breadcrumb trail. This includes all parents below the path but stops 1 level above the root. The given path is included, even if it is at a lower level in the portal than the start parameter would allow.
- catalog(path=dict(query='some/path', level=2))
search for all objects whose path contains some/path at level 2. This includes paths like /foo/bar/some/path and /spam/eggs/some/path, plus all children of those paths.
- catalog(path=dict(query='some/path', level=-1, depth=0))
search for all objects whose path contains some/path at any level. This includes paths like /spam/some/path as well as /foo/bar/baz/some/path, but only those exact matches are included in the result because depth is set to 0.
- catalog(path=dict(query=(('foo/bar', 2), ('bar/baz'), 1), depth=0))
search for multiple paths, each at different levels (foo/bar at level 2, and bar/baz at level 1), and return exact matches only.
Credits
Zope Corporation for the initial PathIndex code
Helge Tesdal and Martijn Pieters from Jarn for the ExtendedPathIndex implementation
Alec Mitchell for the navtree and listing optimizations
License
This software is released under the GPLv2 license.
Changelog
4.0.1 (2020-09-28)
Bug fixes:
unpin zc.buildout
pin versions to Zope 4 (otherwise Python 2.7 version cannot be built anymore)
update tox.ini to align with setup classifiers
add Products.ZCatalog to setup.py’s install_requires, as it is no longer part of Zope core (#17)
4.0.0 (2020-05-06)
Breaking changes:
Drop compatibility for ZCatalog < 4 [jensens] (#15)
Bug fixes:
Fix IRO of EPI. [jensens] (#15)
3.4.2 (2019-05-01)
Bug fixes:
Avoid a deprecation warning. [gforcada] (#10)
3.4.1 (2018-12-14)
Bug fixes:
Rerelease without changes to update the changelog properly. (#7)
3.4.0 (2018-12-14)
New features:
Support allow multi value results for “virtual” paths. [jensens] (#7)
3.3.1 (2018-09-23)
Bug fixes:
Fix dependencies defined in setup.py. [gforcada]
3.3.0 (2018-01-17)
New features:
Add compatibility with Python 3.
3.2.0 (2017-08-27)
New features:
Add forward compatibility with ZCatalog 4’s IQueryIndex interface.
3.1.1 (2016-07-29)
Bug Fixes:
Use zope.interface decorator. [gforcada]
3.1 (2013-01-01)
The behavior is inconsistent, because as long as the input path length is shorter or equal to the longest indexed path, there is no requirement that the entire path is indexed already. [bosim]
3.0.1 - 2012-06-30
Fixed depth limited searches, when the path index wasn’t the first index in the query plan. Thx to Peter Mathis for reporting the problem. [hannosch]
3.0 - 2012-04-26
Fixed TypeError on insert when parent_path is not in the index_parents. [maurits]
Better protection against corrupted internal data in _index_parents. [hannosch]
Slightly optimize reindexing an object by passing in information from the index to the unindex method and avoiding another unindex scan. [hannosch]
Avoid an extra unindex scan for determining length changes in index_object. [hannosch]
Declared support for new ILimitedResultIndex interface and require at least Zope 2.13.0a3. [hannosch]
Merge in optimizations from experimental.catalogqueryplan. [hannosch]
PEP8 cleanup and minor optimizations in un/index code. [hannosch]
Specify distribution dependencies. [hannosch]
2.9 - 2010-07-18
Update license to GPL version 2 only. [hannosch]
2.8 - 2010-05-01
No longer depend directly on test internals of PathIndex. [hannosch]
2.7 - 2009-11-13
Added AccessControl import to tests to avoid cyclic import issue in Zope 2.12. [davisagli]
2.6 - 2009-05-18
Clarified license to be only GPL. [hannosch]
Declare package dependencies and fixed deprecation warnings for use of Globals. [hannosch]
2.5 - December 19, 2008
Cleaned out tests: removing ZTC cruft, turning them into proper unit tests and removing tests that tested other non-index components. [mj]
Fixed level handling for queries where a (path, level) tuple is passed in instead of using the general level parameter. [mj]
Refactored and documented the index codebase. Several bugs were discovered and solved in the process. Missing functionality was also added, all search options should now work across all scenarios. [mj]
2.4.1 - September 28, 2008
Fix typo in setup.py which broke installation of the egg [ree]
2.4 - September 11, 2006
Relaxed a check for path only allowing strings so far. Now we except all basestrings. This closes http://dev.plone.org/plone/ticket/5617. [hannosch]
Converted log infrastructure to use Python’s logging module instead zLOG. [hannosch]
2.3 - December 18, 2005
Added some extra debug information when an improper path is cataloged. [sidnei]
2.2 - October 7, 2005
Add seperate index structures on the parent path and the full path of all objects. This significantly improves scaling for navtrees, breadcrumbs, and listings. [alecm]
Assume that EPI is used inside same container as content and use relative search instead of absolute - basically transforming / plonesite search to / search with startlevel set to 1 instead of 0. [tesdal]
2.1 - May 20, 2005
Implement ‘indexed_attrs’ support for ExtendedPathIndex.
Prevent navigation tree queries from stopping prematurely if the queried-for path does not actually exist in the index, but its parents do.
1.0
Path index capable of generating a navigation tree structure from cataloged data.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file Products.ExtendedPathIndex-4.0.1.tar.gz
.
File metadata
- Download URL: Products.ExtendedPathIndex-4.0.1.tar.gz
- Upload date:
- Size: 23.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/2.7.17
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5049bff145379d7db4a247dbf3661d1ab7cff2eeb02830a37e5a53c6d0863c63 |
|
MD5 | 32c62092a0939c6375f37e05a0f11305 |
|
BLAKE2b-256 | b7408d98b61ee6b4545a6d5ed8354bccd506fa301a0e51feccccf8707f28164b |
File details
Details for the file Products.ExtendedPathIndex-4.0.1-py2.py3-none-any.whl
.
File metadata
- Download URL: Products.ExtendedPathIndex-4.0.1-py2.py3-none-any.whl
- Upload date:
- Size: 15.4 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/2.7.17
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 92f826b7b129f9dcf8fb662f8c7504d07a5ff64fc38f3ecdc85376298bf726bd |
|
MD5 | f905ad296fa05d973b25f5fcaa850f2d |
|
BLAKE2b-256 | c9b8d2a05d27a9a36e2202005a6323670ee0166f60670aaeefd9cfcb65dcd84e |