1
1
# GödelScript 查询语言
2
2
3
+ ## 目录
4
+
5
+ - [ GödelScript 基本概念和语法] ( #gödelscript-基本概念和语法 )
6
+ - [ 简介] ( #简介 )
7
+ - [ 基本程序构成] ( #基本程序构成 )
8
+ - [ 基础类型和编译器内建函数] ( #基础类型和编译器内建函数 )
9
+ - [ 函数] ( #函数 )
10
+ - [ 语句] ( #语句 )
11
+ - [ Schema] ( #schema )
12
+ - [ 数据库] ( #数据库 )
13
+ - [ Trait] ( #trait )
14
+ - [ Import] ( #import )
15
+ - [ Query] ( #query )
16
+ - [ Ungrounded Error: 未赋值/未绑定错误] ( #ungrounded-error-未赋值未绑定错误 )
17
+ - [ 查询示例] ( #查询示例 )
18
+ - [ Java] ( #java )
19
+ - [ Python] ( #python )
20
+ - [ JavaScript] ( #javascript )
21
+ - [ XML] ( #xml )
22
+ - [ Go] ( #go )
23
+ - [ 查询调试和优化技巧] ( #查询调试和优化技巧 )
24
+ - [ Schema 传参导致笛卡尔积过大] ( #schema-传参导致笛卡尔积过大 )
25
+ - [ 多层 for 导致笛卡尔积过大] ( #多层-for-导致笛卡尔积过大 )
26
+ - [ 不要滥用` @inline ` ] ( #不要滥用inline必须用inline的优化策略 )
27
+ - [ 在本机使用查询脚本流程] ( #在本机使用查询脚本流程 )
28
+
3
29
## GödelScript 基本概念和语法
4
30
5
31
### 简介
@@ -30,13 +56,13 @@ GödelScript 编译器主要应用场景为:
30
56
31
57
GödelScript 程序可能包含:
32
58
33
- - 模块和符号 [ 引用语句 ] ( #import )
34
- - Schema [ 类型声明] ( #schema )
35
- - 数据库 [ 类型声明 ] ( #数据库 )
36
- - Trait [ 声明] ( #trait )
37
- - [ 方法实现] ( #方法实现 )
38
- - 函数 [ 声明和实现 ] ( #函数 )
39
- - Query [ 声明] ( #query )
59
+ - [ 模块和符号引用 ] ( #import )
60
+ - [ Schema 类型声明] ( #schema )
61
+ - [ 数据库类型声明 ] ( #数据库 )
62
+ - [ Trait 声明] ( #trait )
63
+ - [ Schema 方法实现] ( #方法实现 )
64
+ - [ 函数声明和实现 ] ( #函数 )
65
+ - [ Query 声明] ( #query )
40
66
41
67
包含以上所有组成内容的样例:
42
68
@@ -99,15 +125,14 @@ GödelScript 采用类 C 语言的注释方式。
99
125
/*
100
126
* 1. 多行注释
101
127
* 2. 多行注释
102
- * 3. 多行注释
103
128
*/
104
129
```
105
130
106
131
#### ` main ` 函数
107
132
108
133
GödelScript 查询脚本可以包含` main ` 函数,该函数无返回值。在不实现` main ` 函数,且没有写 query 声明的情况下,程序不会输出。
109
134
110
- 更多详细内容请看 [ ` main ` 函数] ( #gödelscript-main-函数 ) 。
135
+ 更多详细内容请看 [ main 函数] ( #gödelscript-main-函数 ) 。
111
136
112
137
``` rust
113
138
fn main () {
@@ -496,9 +521,9 @@ fn a() -> int {
496
521
}
497
522
498
523
fn b() -> * int {
499
- yield 1
500
- yield 2
501
- yield 3
524
+ yield 1
525
+ yield 2
526
+ yield 3
502
527
}
503
528
```
504
529
@@ -536,9 +561,9 @@ GödelScript 使用如下方式来声明和实现`schema`的相关方法:
536
561
impl File {
537
562
// 静态方法
538
563
fn f1() -> ... {... }
539
- // 成员方法,第一个参数必须为 self
540
- fn f2(self ) -> ... {... }
541
- ...
564
+ // 成员方法,第一个参数必须为 self
565
+ fn f2(self ) -> ... {... }
566
+ ...
542
567
}
543
568
```
544
569
##### 静态方法
@@ -678,7 +703,7 @@ schema File {
678
703
impl File {
679
704
@ data_constraint
680
705
fn __all__() -> * File {... }
681
- fn getId(self ) -> int {... }
706
+ fn getId(self ) -> int {... }
682
707
fn staticMethod() -> string {return "File "}
683
708
}
684
709
@@ -947,11 +972,11 @@ database MyDB {
947
972
948
973
```rust
949
974
query example from
950
- coref :: java :: Location loc in coref :: java :: Location (coref :: java :: JavaDB :: load("... "))
975
+ coref :: java :: Location loc in coref :: java :: Location (coref :: java :: JavaDB :: load("... "))
951
976
where
952
- ...
977
+ ...
953
978
select
954
- ...
979
+ ...
955
980
```
956
981
957
982
- schema 静态方法调用
@@ -971,12 +996,12 @@ Query 用于进行一些简单的查询,编写的 query 一定会被输出,
971
996
972
997
```rust
973
998
query 名字 from
974
- 变量名 in 初始值,
999
+ 变量名 in 初始值,
975
1000
变量名 in 初始值,
976
1001
变量名 in 初始值
977
1002
where 条件
978
1003
select 值 as 输出的列名
979
- 值 as 输出的列名,
1004
+ 值 as 输出的列名,
980
1005
值 as 输出的列名,
981
1006
值 as 输出的列名
982
1007
```
@@ -987,7 +1012,7 @@ from 列表中的变量声明无需加上类型标注,编译器会进行自动
987
1012
988
1013
```rust
989
1014
query hello_world from
990
- info in "hello world"
1015
+ info in "hello world"
991
1016
select info as greeting
992
1017
```
993
1018
@@ -1063,14 +1088,14 @@ fn class_method(className: string, methodName: string, methodSignature: string)
1063
1088
G ödelScript 会将未与数据绑定的符号判定为`ungrounded(未赋值/ 未绑定)`。基本判定规则为:
1064
1089
1065
1090
- 未初始化的/ 未被使用的/ 未与集合绑定的符号
1066
- - 未被绑定的`int``string`参数
1091
+ - 未被绑定的`int` `string`参数
1067
1092
- 未被使用的 database 类型的参数
1068
1093
- 函数体有语句,但是没有任何返回语句
1069
1094
- 在取非运算块中进行绑定的符号
1070
1095
- 例如 `! (__tmp = 1)`,`__tmp`会被认为是未绑定的
1071
1096
- 在取非运算块中调用 inline 函数或数据构造函数
1072
1097
1073
- #### 未使用的 database/ 基础类型参数
1098
+ #### 1 . 未使用的 database/ 基础类型参数
1074
1099
1075
1100
函数代码块中,如果有一个语句分支没有使用参数中的`database`或者基础类型参数,则一定会导致`ungrounded`:
1076
1101
@@ -1091,7 +1116,7 @@ impl XXX {
1091
1116
if (self . hasAttribute(attributeName)) {
1092
1117
return self . getValueByAttributeName(attributeName)
1093
1118
}
1094
- if (! self . hasAttribute(attributeName) {
1119
+ if (! self . hasAttribute(attributeName)) {
1095
1120
return "null"
1096
1121
}
1097
1122
}
@@ -1104,7 +1129,7 @@ fn xxx() -> xx {
1104
1129
}
1105
1130
```
1106
1131
1107
- #### 函数体有语句的情况下无返回语句
1132
+ #### 2 . 函数体有语句的情况下无返回语句
1108
1133
1109
1134
G ödelScript 允许一个函数体不包含任何语句,即空函数体。但是如果函数体中有其他语句,则 G ödelScript 会要求必须有至少一个返回语句,否则就会出现 ungrounded error。
1110
1135
@@ -1118,7 +1143,7 @@ fn test() -> int {
1118
1143
}
1119
1144
```
1120
1145
1121
- #### 取非运算块中使用 inline 函数或数据构造函数
1146
+ #### 3 . 取非运算块中使用 inline 函数或数据构造函数
1122
1147
1123
1148
上文提到了可以通过`@ inline`注解来规避 ungrounded error。但是如果在取非运算中使用了含有该注解的函数,则必然会导致 ungrounded error。
1124
1149
@@ -1142,7 +1167,7 @@ if (!check(for_test())) {
1142
1167
}
1143
1168
```
1144
1169
1145
- #### 对链式调用的取非运算
1170
+ #### 4 . 对链式调用的取非运算
1146
1171
1147
1172
G ödelScript 未对该情况执行`ungrounded`检测,但是该写法会导致在 Souffl é 中报`ungrounded`错误:
1148
1173
@@ -1226,7 +1251,7 @@ fn main() {
1226
1251
use coref :: java :: *
1227
1252
1228
1253
fn default_java_db() -> JavaDB {
1229
- return JavaDB :: load("coref_java_src. db")
1254
+ return JavaDB :: load("coref_java_src. db")
1230
1255
}
1231
1256
1232
1257
/**
@@ -1243,7 +1268,7 @@ fn class_hierarchy(className : string, superClassName : string) -> bool {
1243
1268
}
1244
1269
1245
1270
fn main() {
1246
- output(class_hierarchy())
1271
+ output(class_hierarchy())
1247
1272
}
1248
1273
```
1249
1274
@@ -1254,7 +1279,7 @@ fn main() {
1254
1279
use coref :: java :: *
1255
1280
1256
1281
fn default_java_db() -> JavaDB {
1257
- return JavaDB :: load("coref_java_src. db")
1282
+ return JavaDB :: load("coref_java_src. db")
1258
1283
}
1259
1284
1260
1285
// Find all methods of the class
@@ -1268,7 +1293,7 @@ fn methods(className : string, methodName : string) -> bool {
1268
1293
}
1269
1294
1270
1295
fn main() {
1271
- output(methods())
1296
+ output(methods())
1272
1297
}
1273
1298
```
1274
1299
@@ -2191,7 +2216,7 @@ fn getByIndex(self) -> Expression {
2191
2216
return e
2192
2217
}
2193
2218
}
2194
- }
2219
+ }
2195
2220
}
2196
2221
```
2197
2222
0 commit comments