MS RFC 95:支持表达式分析器中的列表

日期

2013/04/04

作者

托马斯堡

联系

thomas.bonfort@gmail.com

状态

采用

版本

MAPServer 6.4

1。概述

在进行类过滤时,与表达式相关的挂起性能加速相对较低。上下文关系到何时需要应用给定的 CLASS 到多个属性值。

目前,若要将单个类应用于属性的多个值,可以使用正则表达式,也可以使用 IN 操作员,如下所示:

LAYER
  ...
  CLASSITEM "type"
  CLASS
    EXPRESSION /primary|secondary|tertiary/ #regular expression on CLASSITEM
    EXPRESSION ("[type]" IN "primary,secondary,tertiary") #"complex" parser expression
    ...
  END
END

这两种方法都需要相当大的开销,要么在regex系统调用中,要么在执行in-parser操作时使用相当多的malloc。

2。建议的解决方案

我们可以通过添加“List”表达式类型来减少这一开销,由 {{ }} 分隔符,其中先前的层定义变为:

LAYER
  ...
  CLASSITEM "type"
  CLASS
    EXPRESSION {primary,secondary,tertiary}
    ...
  END
END

在这种情况下,表达式解析是内部的简单字符串查找 msEvalExpression() 而不必进入系统正则表达式或解析器。

三。实施细节

对代码的修改相当简单:

  • 支持lexer(maplexer.l)中的分隔符

  • 新建表达式类型 MS_LIST 在mapserver.h中

  • 支持在的给定列表中查找属性值 msEvalExpression() 在maputil.c中

  • 在mapfile.c和mapcopy.c中加载、保存和复制表达式

第四章。限制

  • 最初不会为MapScript添加setter和getter(使用 classObj.updateFromString("EXPRESSION {{foo,bar,baz}}")

  • 不支持在列表内引用和转义,即属性值不能包含 '", 人物。

4。向后兼容性问题

无,新功能

5。性能影响

表达式解析器已经在6.0中通过使用预编译表达式加快了速度,对于给定的 CLASS 应匹配多个属性值

6。臭虫识别码

https://github.com/MapServer/MapServer/issues/4648

7。投票历史

+1:米克斯、汤克、丹尼尔、史蒂文、托马斯布