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。建议的解决方案

我们可以通过添加由 {{ }} 分隔符,其中前一层定义变为:

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

在这种情况下,表达式解析是在 msEvalExpression() 而不必进入系统regex或解析器。

三。实施细节

对代码的修改相当简单:

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

  • 新建表达式类型 MS_LIST 在MpServer中

  • 支持在中查找给定列表中的属性值 msEvalExpression() 在MaMUTIL C中

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

第四章。限制

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

  • 不支持在列表中引用和转义,即属性值不包含 '", 字符。

4。向后兼容性问题

无,新功能

5。性能影响

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

7。投票历史

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