0719501ef961bb73afa7755cceb2571885a57783
01.\345\274\200\345\217\221\346\211\213\345\206\214/03.\346\250\241\345\236\213\345\274\200\345\217\221\350\257\264\346\230\216/10.Filter\350\277\207\346\273\244\346\235\241\344\273\266.md
| ... | ... | @@ -1,159 +1,159 @@ |
| 1 | ----
|
|
| 2 | -title: Filter过滤条件
|
|
| 3 | -date: 2023-09-25 17:31:35
|
|
| 4 | -permalink: /pages/107af7/
|
|
| 5 | ----
|
|
| 6 | -### Filter过滤条件
|
|
| 7 | -
|
|
| 8 | -------
|
|
| 9 | -
|
|
| 10 | -#### 1. filter表达式
|
|
| 11 | -
|
|
| 12 | -filter表达式:通常用来筛选数据记录。它们使用波兰表示法语法,以便于将它们解析后生成对应的SQL WHERE数据库筛选语句。
|
|
| 13 | -filter通常为一个数组,数组元素为过滤条件,每个条件是一个三元表达式,例如:`["&",["state","=","confirm"],["user_id","in",[1,2,3]]]`
|
|
| 14 | -filter多个条件的逻辑运算使用了“波兰表示法”,波兰表示法的特定是操作符置于操作数前,运算顺序为:从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。
|
|
| 15 | -
|
|
| 16 | -
|
|
| 17 | -
|
|
| 18 | -#### 2. filter的写法
|
|
| 19 | -
|
|
| 20 | -filter表达式是一个条件列表,每个条件是一个形如`["field_name", "operator", value]`的数组。
|
|
| 21 | -
|
|
| 22 | -> filed_name 是需要筛选的字段,它可以使用点(.)来访问关系模块的字段。
|
|
| 23 | -> value 是一个表达式的值。它可以使用字符值,比如:字符串,数字,布尔值,或则列表、某个字段。
|
|
| 24 | -> operator 可以为:
|
|
| 25 | -> 常用的操作符:<,>,<=,>=,=,!=。
|
|
| 26 | -> "like"匹配一个"%value%"的字符串。"ilike"与此类似但不区分大小写。"not like"和"not ilike"也可以使用
|
|
| 27 | -> "child_of","parent_of"在层级关系中,筛选子集
|
|
| 28 | -> "in"和"not in"筛选是否在一个列表里面,所以,给的值应该是个list。当在"to-many"的关系字段中,"in"的作用和contains的作用一样
|
|
| 29 | -
|
|
| 30 | -示例:
|
|
| 31 | -
|
|
| 32 | -```json
|
|
| 33 | -[
|
|
| 34 | - "|",
|
|
| 35 | - [
|
|
| 36 | - "message_follower_ids",
|
|
| 37 | - "in",
|
|
| 38 | - [
|
|
| 39 | - "1",
|
|
| 40 | - "2",
|
|
| 41 | - "3"
|
|
| 42 | - ]
|
|
| 43 | - ],
|
|
| 44 | - "|",
|
|
| 45 | - [
|
|
| 46 | - "user_id",
|
|
| 47 | - "=",
|
|
| 48 | - "1000"
|
|
| 49 | - ],
|
|
| 50 | - [
|
|
| 51 | - "user_id",
|
|
| 52 | - "=",
|
|
| 53 | - false
|
|
| 54 | - ]
|
|
| 55 | -]
|
|
| 56 | -```
|
|
| 57 | -
|
|
| 58 | -
|
|
| 59 | -
|
|
| 60 | -#### 3. Filter的操作符
|
|
| 61 | -
|
|
| 62 | -比较运算符:条件的操作符主要有如下类型
|
|
| 63 | -
|
|
| 64 | -| 操作符 | 说明 |
|
|
| 65 | -| :------------- | :----------------------------------------------------------- |
|
|
| 66 | -| =,!=,>,>=,<,<= | 比较运算,等于,不等于,大于,大于等于,小于,小于等于 |
|
|
| 67 | -| like | 模糊匹配,可以使用通配符,,百分号“%”匹配零或者多个字符 |
|
|
| 68 | -| ilike | 类似like,不区分大小写 |
|
|
| 69 | -| not like | 模糊不匹配的 |
|
|
| 70 | -| in | 包含,判断值是否在元素的列表里面 |
|
|
| 71 | -| not in | 不包含,判断值是否不在元素的列表里面 |
|
|
| 72 | -| child_of | 判断是否value的子记录 |
|
|
| 73 | -| parent_of | 用于有 父子关系的模型,13版本开始使用。 在旧版本使用 parent_left, parent_right |
|
|
| 74 | -| | |
|
|
| 75 | -
|
|
| 76 | -逻辑运算符,主要用于多个条件处理,逻辑运算符链接。逻辑运算符作为前缀放置于条件前面。:
|
|
| 77 | -"|”(or)
|
|
| 78 | -"&" (and)
|
|
| 79 | -"!"(no)“
|
|
| 80 | -默认逻辑运算符为“&”
|
|
| 81 | -
|
|
| 82 | -
|
|
| 83 | -
|
|
| 84 | -#### 4. Filter使用的算法是波兰表达式
|
|
| 85 | -
|
|
| 86 | -计算的核心思想:运算波兰表达式时,无需记住运算的层次,只需要直接寻找第一个运算的操作符。以二元运算为例,从左至右读入表达式,
|
|
| 87 | -遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。
|
|
| 88 | -简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。
|
|
| 89 | -
|
|
| 90 | -举例:
|
|
| 91 | -
|
|
| 92 | -["|","&","|",a,b,c,"&",d,e]
|
|
| 93 | -
|
|
| 94 | -其中a,b,c,e,f,g分别是不带逻辑运算符的表达式,表达式的运算顺序:
|
|
| 95 | -
|
|
| 96 | -["|","&","|",a,b,c,"&",d,e]
|
|
| 97 | -
|
|
| 98 | -["|","&",[a| b],c,"&",d,e]
|
|
| 99 | -
|
|
| 100 | -["|",[[a | b] & c],"&",d,e]
|
|
| 101 | -
|
|
| 102 | -["|",[[a |b] & c],[d& e]]
|
|
| 103 | -
|
|
| 104 | -[[[[a| b] |c]| [d & e]]]
|
|
| 105 | -
|
|
| 106 | -逻辑运算符包括
|
|
| 107 | -
|
|
| 108 | -符号说明
|
|
| 109 | -
|
|
| 110 | -丨[or]或,二元运算
|
|
| 111 | -
|
|
| 112 | -&[and]与,二元运算
|
|
| 113 | -
|
|
| 114 | -![no]非,单目运算
|
|
| 115 | -
|
|
| 116 | -逻辑运算符默认是"与","与"运算符可以不写。
|
|
| 117 | -
|
|
| 118 | -实例
|
|
| 119 | -
|
|
| 120 | -“名字为 ABC”,就是一个最简单的单条件Domain。
|
|
| 121 | -
|
|
| 122 | -[["name","=","ABC"]]
|
|
| 123 | -
|
|
| 124 | -“名字为 ABC 而且 语言编码不为en_US”,Domain里条件默认逻辑关系就是and,所以如下。
|
|
| 125 | -
|
|
| 126 | -[["name","=","ABC"],
|
|
| 127 | -
|
|
| 128 | -["language.code","!=","en_US"]]
|
|
| 129 | -
|
|
| 130 | -“名字为 ABC 而且语言编码不为 en_US 而且国家的编码为 be 或者 de”。
|
|
| 131 | -
|
|
| 132 | -[["name","=","ABC"],
|
|
| 133 | -
|
|
| 134 | -["language.code","!=","en_US"],
|
|
| 135 | -
|
|
| 136 | -"|",["country_id.code","=","be"],
|
|
| 137 | -
|
|
| 138 | -["country_id.code","=","de"]]
|
|
| 139 | -
|
|
| 140 | -如果我们要做到这个效果
|
|
| 141 | -
|
|
| 142 | -A and (B or C)and D and E
|
|
| 143 | -
|
|
| 144 | -先从里面开始,把or提前
|
|
| 145 | -
|
|
| 146 | -A and (orB C) and D and E
|
|
| 147 | -
|
|
| 148 | -把里面的and提前,去掉括号
|
|
| 149 | -
|
|
| 150 | -and A or B C and D E
|
|
| 151 | -
|
|
| 152 | -所以最后的filter可以这样写
|
|
| 153 | -
|
|
| 154 | -A,"|", B,C,D,E
|
|
| 155 | -
|
|
| 156 | -当然了,我们为什么不写得让自己也容易看一点呢,如下:
|
|
| 157 | -
|
|
| 158 | -A,D,E,"|", B,C
|
|
| 159 | -
|
|
| 1 | +--- |
|
| 2 | +title: Filter过滤条件 |
|
| 3 | +date: 2023-09-25 17:31:35 |
|
| 4 | +permalink: /pages/107af7/ |
|
| 5 | +--- |
|
| 6 | +### Filter过滤条件 |
|
| 7 | + |
|
| 8 | +------ |
|
| 9 | + |
|
| 10 | +#### 1. filter表达式 |
|
| 11 | + |
|
| 12 | +filter表达式:通常用来筛选数据记录。它们使用波兰表示法语法,以便于将它们解析后生成对应的SQL WHERE数据库筛选语句。 |
|
| 13 | +filter通常为一个数组,数组元素为过滤条件,每个条件是一个三元表达式,例如:`["&",["state","=","confirm"],["user_id","in",[1,2,3]]]` |
|
| 14 | +filter多个条件的逻辑运算使用了“波兰表示法”,波兰表示法的特定是操作符置于操作数前,运算顺序为:从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。 |
|
| 15 | + |
|
| 16 | + |
|
| 17 | + |
|
| 18 | +#### 2. filter的写法 |
|
| 19 | + |
|
| 20 | +filter表达式是一个条件列表,每个条件是一个形如`["field_name", "operator", value]`的数组。 |
|
| 21 | + |
|
| 22 | +> filed_name 是需要筛选的字段,它可以使用点(.)来访问关系模块的字段。 |
|
| 23 | +> value 是一个表达式的值。它可以使用字符值,比如:字符串,数字,布尔值,或则列表、某个字段。 |
|
| 24 | +> operator 可以为: |
|
| 25 | +> 常用的操作符:<,>,<=,>=,=,!=。 |
|
| 26 | +> "like"匹配一个"%value%"的字符串。"ilike"与此类似但不区分大小写。"not like"和"not ilike"也可以使用 |
|
| 27 | +> "child_of","parent_of"在层级关系中,筛选子集 |
|
| 28 | +> "in"和"not in"筛选是否在一个列表里面,所以,给的值应该是个list。当在"to-many"的关系字段中,"in"的作用和contains的作用一样 |
|
| 29 | + |
|
| 30 | +示例: |
|
| 31 | + |
|
| 32 | +```json |
|
| 33 | +[ |
|
| 34 | + "&", |
|
| 35 | + [ |
|
| 36 | + "message_follower_ids", |
|
| 37 | + "in", |
|
| 38 | + [ |
|
| 39 | + "1", |
|
| 40 | + "2", |
|
| 41 | + "3" |
|
| 42 | + ] |
|
| 43 | + ], |
|
| 44 | + "|", |
|
| 45 | + [ |
|
| 46 | + "user_id", |
|
| 47 | + "=", |
|
| 48 | + "1000" |
|
| 49 | + ], |
|
| 50 | + [ |
|
| 51 | + "user_id", |
|
| 52 | + "=", |
|
| 53 | + false |
|
| 54 | + ] |
|
| 55 | +] |
|
| 56 | +``` |
|
| 57 | + |
|
| 58 | + |
|
| 59 | + |
|
| 60 | +#### 3. Filter的操作符 |
|
| 61 | + |
|
| 62 | +比较运算符:条件的操作符主要有如下类型 |
|
| 63 | + |
|
| 64 | +| 操作符 | 说明 | |
|
| 65 | +| :------------- | :----------------------------------------------------------- | |
|
| 66 | +| =,!=,>,>=,<,<= | 比较运算,等于,不等于,大于,大于等于,小于,小于等于 | |
|
| 67 | +| like | 模糊匹配,可以使用通配符,,百分号“%”匹配零或者多个字符 | |
|
| 68 | +| ilike | 类似like,不区分大小写 | |
|
| 69 | +| not like | 模糊不匹配的 | |
|
| 70 | +| in | 包含,判断值是否在元素的列表里面 | |
|
| 71 | +| not in | 不包含,判断值是否不在元素的列表里面 | |
|
| 72 | +| child_of | 判断是否value的子记录 | |
|
| 73 | +| parent_of | 用于有 父子关系的模型,13版本开始使用。 在旧版本使用 parent_left, parent_right | |
|
| 74 | +| | | |
|
| 75 | + |
|
| 76 | +逻辑运算符,主要用于多个条件处理,逻辑运算符链接。逻辑运算符作为前缀放置于条件前面。: |
|
| 77 | +"|”(or) |
|
| 78 | +"&" (and) |
|
| 79 | +"!"(no)“ |
|
| 80 | +默认逻辑运算符为“&” |
|
| 81 | + |
|
| 82 | + |
|
| 83 | + |
|
| 84 | +#### 4. Filter使用的算法是波兰表达式 |
|
| 85 | + |
|
| 86 | +计算的核心思想:运算波兰表达式时,无需记住运算的层次,只需要直接寻找第一个运算的操作符。以二元运算为例,从左至右读入表达式, |
|
| 87 | +遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。 |
|
| 88 | +简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。 |
|
| 89 | + |
|
| 90 | +举例: |
|
| 91 | + |
|
| 92 | +["|","&","|",a,b,c,"&",d,e] |
|
| 93 | + |
|
| 94 | +其中a,b,c,e,f,g分别是不带逻辑运算符的表达式,表达式的运算顺序: |
|
| 95 | + |
|
| 96 | +["|","&","|",a,b,c,"&",d,e] |
|
| 97 | + |
|
| 98 | +["|","&",[a| b],c,"&",d,e] |
|
| 99 | + |
|
| 100 | +["|",[[a | b] & c],"&",d,e] |
|
| 101 | + |
|
| 102 | +["|",[[a |b] & c],[d& e]] |
|
| 103 | + |
|
| 104 | +[[[[a| b] |c]| [d & e]]] |
|
| 105 | + |
|
| 106 | +逻辑运算符包括 |
|
| 107 | + |
|
| 108 | +符号说明 |
|
| 109 | + |
|
| 110 | +丨[or]或,二元运算 |
|
| 111 | + |
|
| 112 | +&[and]与,二元运算 |
|
| 113 | + |
|
| 114 | +![no]非,单目运算 |
|
| 115 | + |
|
| 116 | +逻辑运算符默认是"与","与"运算符可以不写。 |
|
| 117 | + |
|
| 118 | +实例 |
|
| 119 | + |
|
| 120 | +“名字为 ABC”,就是一个最简单的单条件Domain。 |
|
| 121 | + |
|
| 122 | +[["name","=","ABC"]] |
|
| 123 | + |
|
| 124 | +“名字为 ABC 而且 语言编码不为en_US”,Domain里条件默认逻辑关系就是and,所以如下。 |
|
| 125 | + |
|
| 126 | +[["name","=","ABC"], |
|
| 127 | + |
|
| 128 | +["language.code","!=","en_US"]] |
|
| 129 | + |
|
| 130 | +“名字为 ABC 而且语言编码不为 en_US 而且国家的编码为 be 或者 de”。 |
|
| 131 | + |
|
| 132 | +[["name","=","ABC"], |
|
| 133 | + |
|
| 134 | +["language.code","!=","en_US"], |
|
| 135 | + |
|
| 136 | +"|",["country_id.code","=","be"], |
|
| 137 | + |
|
| 138 | +["country_id.code","=","de"]] |
|
| 139 | + |
|
| 140 | +如果我们要做到这个效果 |
|
| 141 | + |
|
| 142 | +A and (B or C)and D and E |
|
| 143 | + |
|
| 144 | +先从里面开始,把or提前 |
|
| 145 | + |
|
| 146 | +A and (orB C) and D and E |
|
| 147 | + |
|
| 148 | +把里面的and提前,去掉括号 |
|
| 149 | + |
|
| 150 | +and A or B C and D E |
|
| 151 | + |
|
| 152 | +所以最后的filter可以这样写 |
|
| 153 | + |
|
| 154 | +A,"|", B,C,D,E |
|
| 155 | + |
|
| 156 | +当然了,我们为什么不写得让自己也容易看一点呢,如下: |
|
| 157 | + |
|
| 158 | +A,D,E,"|", B,C |
|
| 159 | + |