带有可查询记录的Zope 2容器
项目描述
概述
cornerstone.soup 提供了一个用于持久记录的容器,这些记录是可查询的。它是一个用于隔离容器中大量数据的通用存储。轻量级记录存储在 IOBTree 中。使用 Zope-Tool-Kit 目录来索引感兴趣的值。cornerstone.soup 不是即用型包。它针对需要解决存储大量数据中的小实体问题的开发者,在这些情况下,重量级架构或 dexterity 过于费力且速度过慢。例如,如果您需要一个用于非CMS内容(如投票、调查数据、网店的订单、测量数据等)的容器。
更新
在包的早期版本中,我们认为将汤数据持久化存储在本地组件中是个不错的主意。但这至少在Plone环境中是一个大错误,因为GenericSetup在应用基本配置文件时会清除本地组件 - 虽然你通常不会这么做,但经验表明这种情况确实会发生;)。因此,我们将存储位置更改为可获取的、ISoupAnnotatable提供上下文的注释。
此外,汤API被设计为工具,这基本上是个好主意,但在存储更改后查找SoupData时引起了麻烦。我们使用getSiteManager来访问获取上下文,并在Plone中遇到了来自不同站点管理员的获取上下文的不一致性。
第二个问题迫使我们在很大程度上放弃了工具模式,汤对象本身现在充当上下文的适配器,并通过getSoup而不是工具查找来查找。更新后,当尝试访问作为工具提供和查找的汤时,您将得到NoLongerSupported错误。您必须更改代码以使用getSoup,并从您的GS配置文件中删除汤本地组件注册。
>>> from cornerstone.soup import getSoup >>> soup = getSoup(context, 'mysoup')
新包包含数据迁移。更新后,请在Plone中调用soup-controlpanel,运行存储迁移,并删除每个汤的持久化本地组件。在运行存储迁移之前,现有的汤数据将不可访问。
由于汤最初是持久化到ZOBD的,它仍然继承自SimpleItem。这将在3.0版本中更改。请注意,3.0将破坏未清理干净的数据库的安装。
使用方法
SoupData对象作为注释存储在提供ISoupAnnotatable接口的对象上。
为了在Plone中使用,请通过ZCML在plone站点对象上使用five.implements提供ISoupAnnotatable。
<five:implements class="Products.CMFPlone.Portal.PloneSite" interface="cornerstone.soup.interfaces.ISoupAnnotatable" />
SoupData通过id在给定上下文中进行查找。该上下文获取其父对象,直到找到ISoupAnnotatable,此时通过id注释SoupData。请使用getSoup函数进行此操作。
>>> from cornerstone.soup import getSoup >>> soup = getSoup(context, 'my_soup_id') >>> soup <Soup at my_soup_id>
如果找不到给定id的SoupData,则创建一个新的并注释到ISoupAnnotatable。
我们必须为每个汤提供一个ICatalogFactory实现,并将其注册为具有与SoupData注释相同id的工具。
确保在每次调用目录工厂时重新创建目录。这对于正确的记录重新索引是必要的。
>>> from zope.interface import implements >>> from zope.catalog.catalog import Catalog >>> from zope.catalog.field import FieldIndex >>> from cornerstone.soup.interfaces import ICatalogFactory >>> class MyCatalogFactory(object): ... implements(ICatalogFactory) ... ... def __call__(self): ... catalog = Catalog() ... catalog[u'name'] = FieldIndex(field_name='name', ... field_callable=False) ... return catalog
ZCML。
<utility name="my_soup_id" factory=".mymodule.MyCatalogFactory" provides="cornerstone.soup.interfaces.ICatalogFactory" />
汤只能包含Records。记录是一个简单的持久化对象,它在初始化时接受任何关键字参数。这些参数用作记录属性。
创建一个记录并将其添加到汤中。
>>> from cornerstone.soup import Record >>> record = Record(user='user1') >>> id = soup.add(record)
检查查询。
>>> [r for r in soup.query(user='user1')] [<Record at ...>] >>> [r for r in soup.query(user='nonexist')] []
添加更多记录。
>>> id = soup.add(Record(user='user1')) >>> id = soup.add(Record(user='user2')) >>> u1records = [r for r in soup.query(user='user1')] >>> u1records [<Record at ...>, <Record at ...>]
更改一个记录的用户属性。
>>> u1records[0].data['user'] = 'user2'
查询仍然返回旧的结果。记录必须重新索引。
>>> [r for r in soup.query(user='user1')] [<Record at ...>, <Record at ...>] >>> soup.reindex([u1records[0]]) >>> u1 = [r for r in soup.query(user='user1')] >>> u1 [<Record at ...>] >>> u2 = [r for r in soup.query(user='user2')] >>> u2 [<Record at ...>, <Record at ...>]
您可以一次性重新索引汤中的所有记录。
>>> all = [r for r in soup.data.values()] >>> all = sorted(all, key=lambda x: x.user) >>> all [<Record at ...>, <Record at ...>, <Record at ...>] >>> all[-1].data['user'] = 'user3' >>> soup.reindex() >>> [r for r in soup.query(user='user3')] [<Record at ...>]
您还可以重新构建目录。在这种情况下,将再次调用目录工厂,并使用新目录。
在目录工厂源中添加具有键名的索引。
>>> from zope.catalog.field import FieldIndex >>> catalog[u'name'] = FieldIndex(field_name='name', ... field_callable=False)
在某个记录数据上设置名称属性,重新构建汤并检查结果。
>>> all[0].data['name'] = 'name' >>> all[1].data['name'] = 'name' >>> all[2].data['name'] = 'name' >>> soup.rebuild() >>> [r for r in soup.query(name='name')] [<Record at ...>, <Record at ...>, <Record at ...>]
删除记录。
>>> del soup[all[0]] >>> [r for r in soup.query(name='name')] [<Record at ...>, <Record at ...>]
对于预期的大量结果,我们可以查询LazyRecords。它们在调用时返回实际的记录。
>>> lazy = [l for l in soup.lazy(name='name')] >>> lazy [<cornerstone.soup.soup.LazyRecord object at ...>, <cornerstone.soup.soup.LazyRecord object at ...>] >>> lazy[0]() <Record at ...>
Text Index NG 3 支持
本软件包提供了一个 zope3 索引包装器用于 textindexng3。它位于 cornerstone.soup.ting.TingIndex。
您可以使用 textindexng3 一次索引记录的多个字段,并对该索引进行复杂查询。有关更多信息,请参阅 Products.TextIndexNG3。
如果您想使用 textindexng3 与 cornerstone.soup,请确保已安装包 zopyx.txng3.core 并加载了它的 ZCML。 zopyx.txng3.core 不是 cornerstone.soup 的硬依赖。
TingIndex 只期望字段名为空格分隔的字符串,或为可迭代对象。使用 TingIndex 的目录工厂看起来像这样。
>>> class TingCatalogFactory(object): ... implements(ICatalogFactory) ... ... def __call__(self): ... catalog = Catalog() ... catalog[u'ting'] = TingIndex(field_name=('foo', 'bar', 'baz'), ... field_callable=False) ... return catalog
将此目录工厂注册为实用工具,本例中我们使用 tingsoup。
使用 soup 查询 textindexng3。
>>> soup = getSoup(site, 'tingsoup') >>> soup <Soup at tingsoup>
索引一些记录。
>>> id = soup.add(Record(foo='foo', bar='bar', baz='baz')) >>> id = soup.add(Record(foo='foobar', bar='barbaz', baz='bazfoo')) >>> id = soup.add(Record(foo='aaa', bar='barrrr', baz='ccc'))
并对它们进行查询。
>>> query = { ... 'query': u'bar::and(bar*)', ... 'search_all_fields': True, ... } >>> [r.bar for r in soup.query(ting=query)] ['bar', 'barbaz', 'barrrr']
贡献者
Robert Niederreiter <rnix@squarewave.at>
Jens Klein <jens@bluedynamics.com>
Sven Plage
变更
2.4.1.1
解决包装问题 2012-10-11 - jensens
2.4.1
在 clear 中修复了请求缓存中的错误 2012-10-11 - jensens
通过删除多余的检查修复了定位器中的奇怪错误。2012-10-11 - jensens
2.4
添加 GenericSetup 配置文件并注册 soup-controlpanel 作为配置工具。只有在安装 Products.CMFPlone 时才进行配置。2011-01-12 - rnix
创建浏览器软件包并将与浏览器相关的代码移至其中。2011-01-12 - rnix
在某个地方采用文档。2010-12-17 - rnix
添加了一些排序测试。2010-12-17 - rnix
2.3.2
将 txng 包装器的搜索结果作为 IFSet 返回。2010-12-17 - rnix
如果查询的键不已经是元组,则仅修改 FieldIndex 的查询。2010-12-17 - rnix
2.3.1
不导入 ting 接口,以便 cornerstone.soup 在不使用 textindexng3 的情况下工作。2010-12-16 - rnix
2.3
修复了如果空 soup 被移动时移动代码的错误。2010-12-16 - rnix
实现了 clear 函数。2010-12-16 - rnix
添加 text index NG3 支持。2010-12-16 - rnix
2.2
添加了将 soups 指向具有现有 soup 的路径的机制,因此可以从多个站点使用挂载点。同时重写了控制面板的用户界面并添加了更多有关挂载或移动时发生的事情的信息。2010-11-16 - jensens
2.1
添加了工作移动机制。2010-09-09 - jensens, rnix
添加了深度复制支持。2010-09-09 - jensens
为使用 BTree 的 Length 添加了 SoupData 的长度支持。2010-09-08 - jensens
重写了控制面板的用户界面。2010-09-08 - jensens
修复了查询错误。仅当搜索键引用 FieldIndex 实例时,将单个值转换为 2-tuple。2010-07-20 - rnix
将 sort_index、limit 和 reverse 作为查询关键字参数。2010-07-20 - rnix
2.0
更改 API。2010-06-18 - rnix
更改存储策略。2010-06-18 - rnix
1.0
完成测试。2009-12-02 - rnix
移除 IIntIds 和 INameChooser 依赖。2009-12-02 - rnix, jensens
1.0b2
更改记录的名称选择。使用 uuid.uuid4()。2009-10-01 - rnix
添加用于查询大量结果的 lazy 函数。2009-10-01 - rnix
生成查询结果而不是在列表中收集。2009-09-29 - rnix
1.0b1
初始工作。rnix, jensens
许可证
版权所有 (c) 2008-2010,BlueDynamics Alliance,奥地利。保留所有权利。
在满足以下条件的情况下,允许重新分配和使用源代码和二进制形式,无论是否修改:
源代码的重新分配必须保留上述版权声明、本许可列表和以下免责声明。
二进制形式的重新分配必须在使用或重新分配的文档和/或其他材料中复制上述版权声明、本许可列表和以下免责声明。
未经蓝动联盟或其贡献者事先书面许可,不得使用蓝动联盟的名称或其贡献者的名称来推广或认可源自本软件的产品。
本软件由蓝动联盟“按原样”提供,并放弃任何明示或暗示的保证,包括但不限于适销性和特定用途的适用性保证。在任何情况下,蓝动联盟均不对因使用本软件而产生的任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论此类损害是由何种原因引起的,无论是在合同、严格责任还是侵权(包括疏忽或其他)下产生,即使已告知此类损害的可能性。
项目详情
cornerstone.soup-2.4.1.1.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 5e3009c5d5f05ae8a4f97febdb91df5f4ba0ec05741220509d98c453a4aa8f48 |
|
MD5 | 3ebea6ff904fa3183ef7090268279ced |
|
BLAKE2b-256 | 5fb157bb5f09157f699056f98e593cb6265ae9b1cd0efbd7ed94b380b1d4b46e |