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
+