存储库中的筛选器

pycsw 有能力执行服务器端存储库或数据库筛选功能,以覆盖所有的CSW请求,目的是查询元数据存储库中的一个特定子集,从而需部署多个 pycsw 实例,通过 repository.filter 配置选项,以不同的方式指向同一个数据库。

存储库中的筛选器是一种便捷方式,是为了创建子数据库,以免去创建适当数据库视图的服务器级别的步骤。 对于大型数据库而言,它可能比创建数据库级别的子集要更好一些。

场景 ︰ 一个数据库,很多种视角

想象一下,现在要记录数据库示例表(下面以子集做为简称):

标识 母标识符 标题 摘要
1 33 foo1 bar1
2 33 foo2 bar2
3 55 foo3 bar3
4 55 foo1 bar1
5 21 foo5 bar5
5 21 foo6 bar6

若没有 repository.filters 选项,pycsw默认是始终处理整个表的CSW请求。CSW GetRecords 过滤如:

<ogc:Filter>
    <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>apiso:Title</ogc:PropertyName>
        <ogc:Literal>foo1</ogc:Literal>
    </ogc:PropertyIsEqualTo>
</ogc:Filter>

...将返回:

标识 母标识符 标题 摘要
1 33 foo1 bar1
4 55 foo1 bar1

假设你要部署其他pycsw应用实例,此实例来自同一个数据库的元数据,但它只能来自一个特定子集。在这里,我们设置了 repository.filter 选项:

[repository]
database=sqlite:///records.db
filter=pycsw:ParentIdentifier = '33'

依上述所说,同一CSW GetRecords 过滤器将得到以下结果:

标识 母标识符 标题 摘要
1 33 foo1 bar1

另一个例子:

[repository]
database=sqlite:///records.db
filter=pycsw:ParentIdentifier != '33'

依上述所说,同一CSW GetRecords 过滤器将得到以下结果:

标识 母标识符 标题 摘要
4 55 foo1 bar1

repository.filter 选项功能是在pycsw核心模式中接收所有核心查询设置(见``pycsw.config.StaticContext.md_core_model`` 的完整列表)。