MS RFC 65-6.0的单次查询更改

日期

2010/11/18

作者

史蒂夫·莱姆

联系

com.net上的石灰

最后编辑

2010-11-18

状态

采用

概述

这是一个通过单通道查询支持来理顺5.6中引入的问题的建议。事后看来,我们可能引入了比必要的更多的变化。此RFC表示对C和MapScript API的简化。

单通查询实际上是一个误称。pre-5.6我们将执行一个初始查询(按点、bbox或其他方式)来标识候选形状,然后执行n个小查询来检索每个结果。在某些情况下,这显然非常缓慢,特别是在RDBMS驱动程序中。在5.6中,我们切换到基本上保存一个结果集,打开post查询并保留结果集的索引值。我们仍然会通过两次结果,但这比以前更有效。

最初,我们将结果集ID固定在结果的shapeindex属性(resultcachemberobj类型)中。此索引稍后用于检索功能。长话短说,在纽约斯普林特,我们发现一些司机的做法有所不同。对于Oracle,结果集ID正在tileindex中传递,而shapeindex包含全局形状ID。这是一件合理的事情,在sprint中更改了postgis驱动程序,使其行为相同。因此,shapeindex包含整体记录索引,tileindex包含与查询结果集相关的索引。tileindex的这种重用利用了一个属性,否则它将不被使用,从而避免了进一步复杂化的事情。使用tile索引的层总是基于文件的,并且(通常)不会受到性能问题的影响,而这些问题首先是由性能问题引起的。

实现MSlayerResultsGetShape()的驱动程序

  • Oracle Spatial作为MSoraclesPatiallayerResultGetShape()。

  • postgis作为mspostgislayerresultsgetshape()。

  • ogr as msoglayerresultgetshape()(与msoglayergetshape()相同)

拟议技术变更

清除代码的查询结果部分。

  1. 删除层API函数mslayerResultsGetShape(),而不是mslayerGetShape()。

  2. 为支持结果集索引(现在作为tile index值传递)的驱动程序编辑mslayergetshape(),以查找tile索引以及现有结果集的工作(如果存在)。如果没有,则使用全局ID。也就是说,将mslayerResultsGetShape()和mslayerGetShape()合并到新的mslayerGetShape()中。

  3. 从mapscript中移除resultsgetshape()和getfeature()方法。

  4. 将getshape()mapscript方法重构为a)返回与getfeature()类似的shapeobj*;b)将resultcacheMemberobj作为输入,而不是shape和tile索引。这简化了推断并抽象了索引,以便我们能够更灵活地向前推进。此时,我们不必更改驱动程序实现来获取resultcacheMemberObj,这可以在稍后完成。

重构的getshape()签名希望如此(在layer.i for swig中):

%newobject getShape;
shapeObj *getShape(resultCacheMemberObj *r)

我还想考虑向mapscript添加另一个查询保存函数,比如saveQueryFeatures()。此函数将编写一个5.6之前的查询文件,该文件由一系列形状和平铺索引组成。我们不会为未平铺的层(例如,没有TileIndex的层)编写平铺索引。这将恢复5.6更改后删除的一些有用功能。

  1. 向两种类型的查询文件(查询参数和查询结果)添加签名。这将允许我们编写一个加载程序函数并提高安全性。

  2. 在mapscript的save query()方法中添加一个可选标志,以保存实际的查询结果(例如,所有resultcacheMemberObj),而不仅仅是查询参数。

发布RFC后,mapscript中的查询操作如下所示:

...
my $rect = new mapscript::rectObj(420000, 5120000, 582000, 5200000);
$layer->queryByRect($map, $rect); # layer is left open after this operation

for(my $i=0; $i<$layer->getNumResults(); $i++) {
       my $shape = $layer->getShape($layer->getResult($)); # much simpler
       ...
}

# save query
$map->saveQuery('myquery.qy'); # new style (query parameters)
$map->saveQuery('myquery.qy', 1); # old style (query feature indexes)

技术上的变化相对温和。mapscript中的更改很大,因为处理查询结果的脚本需要更新。最后,我认为这是值得的,而且这对用户来说更直观。

臭虫识别码

α3647

投票历史

通过了Steve L.、Tom、Jeff、Steve W.、Perry的+1。