Alima777 commented on a change in pull request #825: [IOTDB-499] Add query 
engine decument
URL: https://github.com/apache/incubator-iotdb/pull/825#discussion_r381263891
 
 

 ##########
 File path: docs/Documentation-CHN/SystemDesign/2-QueryEngine/2-Planner.md
 ##########
 @@ -50,14 +68,193 @@ mvn clean compile 
之后生成代码位置:server/target/generated-sources/ant
        谓词去非优化器,将谓词逻辑中的非操作符去掉。
 
 * org.apache.iotdb.db.qp.strategy.optimizer.DnfFilterOptimizer
-       
+
        将谓词转化为析取范式。
-       
+
 * org.apache.iotdb.db.qp.strategy.optimizer.MergeSingleFilterOptimizer
 
        将相同路径的谓词逻辑合并。
-       
+
+### ConcatPathOptimizer
+
+ConcatPathOptimizer 使用其中的 transform() 方法将给定查询中 SELECT 子句、FROM 子句和 WHERE 
子句中的路径进行合并。该方法的申明如下:
+
+    Operator transform(Operator operator)
+    输入:待转化的 SFWOperator 
+    输出:路径经过连接处理后的 SFWOperator
+
+
+该方法的主要步骤如下:
+
+1. 取出 FROM 子句和 SELECT 子句中的路径,前者称为前缀路径,后者称为后缀路径。进入步骤2.
+2. 判断该查询是否包含 ALIGN BY DEVICE 子句。如果不包含,则可进入步骤3;否则,进入步骤4.
+3. 则调用 concatSelect() 方法将前缀路径和后缀路径合并补全(包括带 * 的路径),形成全路径。如果查询中包含 SLIMIT 子句,则对 
SELECT 子句中的路径做相应的筛选。进入步骤5.
+4. 对每一条 FROM 子句中的路径分析其设备名,如果不为空则抛出异常。进入步骤5.
+5. 对 WHERE 子句中过滤条件里包含的路径做补全。此时,SELECT 子句和 WHERE 子句中的路径都是完整的路径。
+
+### RemoveNotOptimizer
+
+RemoveNotOptimizer 类中的 removeNot() 和 reverseFilter() 
方法共同实现了删去NOT关键字的功能。removeNot() 方法的申明如下:
+
+    FilterOperator removeNot(FilterOperator filter)
+    输入:待优化的可能含有 NOT 关键字的谓词
+    输出:优化后,不包含 NOT 关键字的谓词
+
+该方法的输入为待优化的谓词,并且递归地优化该谓词中的每个子部分。将输入的谓词看作一棵二叉树,其中叶子节点是 BasicFunctionOperator (如 
s0 > 10),非叶子节点是“与”、“或”、“非”操作符。 方法的逻辑如下:
+
+1. 判断该节点是否为叶子节点。如果是叶子节点则返回该节点。如果不是叶子节点则进入步骤2.
+2. 判断关系类型。如果是“与”、“或”关系,则进入步骤3;如果是“非”关系,则进入步骤4;如果不是“与”、“或”、“非”关系,则抛出异常。
+3. 此时的“与”、“或”关系一定包含2个孩子节点。对左右孩子递归调用 removeNot() 方法,去除左右子树中的 NOT 关键词,再将该节点返回。
+4. 对该节点调用 reverseFilter() 方法,取反,并且去除 NOT 关键字。
+
+reverseFilter() 方法的申明如下:
+
+    FilterOperator reverseFilter(FilterOperator filter)
+    输入:待取反的节点
+    输出:该节点取反后的结果
+
+reverseFilter() 方法的逻辑如下:
+
+1. 判断节点是否为叶子节点,如果是,则调用该节点自身的 reverseFunc() 方法取反。其中,reverseFunc() 
方法只用设定的Map来对关键字取反,如将 < 映射为 >= ,将 AND 映射为 OR。如果不是叶子节点,则进入步骤2.
 
 Review comment:
   ```suggestion
   1. 判断节点是否为叶子节点,如果是,则调用该节点自身的 reverseFunc() 方法取反。其中,reverseFunc() 方法只用设定的 Map 
来对关键字取反,如将 < 映射为 >= ,将 AND 映射为 OR。如果不是叶子节点,则进入步骤2.
   ```

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to