Skip to content

Commit 94f7f45

Browse files
committed
函数解析器
1 parent d873254 commit 94f7f45

File tree

13 files changed

+987
-358
lines changed

13 files changed

+987
-358
lines changed

APIJSONORM/src/main/java/apijson/StringUtil.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ public static boolean isNotEmpty(String s, boolean trim) {
296296

297297

298298
//判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
299+
public static final Pattern PATTERN_INTEGER;
300+
public static final Pattern PATTERN_FLOAT;
299301

300302
public static final Pattern PATTERN_NUMBER;
301303
public static final Pattern PATTERN_PHONE;
@@ -307,6 +309,8 @@ public static boolean isNotEmpty(String s, boolean trim) {
307309
public static final Pattern PATTERN_ALPHA_BIG;
308310
public static final Pattern PATTERN_ALPHA_SMALL;
309311
static {
312+
PATTERN_INTEGER = Pattern.compile("^-?\\d+$");
313+
PATTERN_FLOAT = Pattern.compile("^(-?\\d+)(\\.\\d+)?$");
310314
PATTERN_NUMBER = Pattern.compile("^[0-9]+$");
311315
PATTERN_ALPHA = Pattern.compile("^[a-zA-Z]+$");
312316
PATTERN_ALPHA_BIG = Pattern.compile("^[A-Z]+$");
@@ -376,7 +380,7 @@ public static boolean isNumer(String s) {
376380
}
377381

378382
currentString = s;
379-
return PATTERN_NUMBER.matcher(s).matches();
383+
return PATTERN_INTEGER.matcher(s).matches()||PATTERN_FLOAT.matcher(s).matches();
380384
}
381385
/**判断是否全是字母
382386
* @param s
@@ -929,6 +933,17 @@ public static String[] getParams(String origin) {
929933

930934

931935
}
936+
public static String getQuoteColumn(String origin, String s) {
937+
return s+origin+s;
938+
}
939+
940+
public static int getAlians(int j, String s) {
941+
int k = j+1;
942+
while (k<s.length()&&Character.isLetter(s.charAt(k))){
943+
k++;
944+
}
945+
return k;
946+
}
932947

933948
//校正(自动补全等)字符串>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
934949

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

Lines changed: 340 additions & 182 deletions
Large diffs are not rendered by default.

Demo/src/main/java/apijson/functionAnalysis/Analize.java

Lines changed: 155 additions & 164 deletions
Large diffs are not rendered by default.

docs/Untitled 1.md

Whitespace-only changes.

docs/Untitled.md

Whitespace-only changes.

docs/其他函数.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
2+
3+
4+
5+
```
6+
//GEO函数
7+
8+
SQL_FUNCTION_MAP.put("greatCircleDistance", ""); //greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
9+
计算地球表面两点之间的距离。
10+
SQL_FUNCTION_MAP.put("geoDistance", ""); //类似于greatCircleDistance,但在WGS-84椭球面而不是球面上计算距离
11+
SQL_FUNCTION_MAP.put("greatCircleAngle", ""); //greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
12+
计算地球表面两点之间的圆心角使用
13+
SQL_FUNCTION_MAP.put("pointInEllipses", ""); //pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)
14+
检查点是否属于至少一个椭圆。
15+
SQL_FUNCTION_MAP.put("pointInPolygon", ""); //pointInPolygon((x, y), [(a, b), (c, d) ...], ...)检查点是否属于平面上的多边形。
16+
17+
SQL_FUNCTION_MAP.put("geohashEncode", "");//将经度和纬度编码为geohash-string,将经度和纬度编码为geohash-string,
18+
SQL_FUNCTION_MAP.put("geohashDecode", ""); //将任何geohash编码的字符串解码为经度和纬度。SELECT geohashDecode('ezs42') AS res
19+
20+
SQL_FUNCTION_MAP.put("geoToH3", ""); //计算指定的分辨率的H3索引(lon, lat)。geoToH3(lon, lat, resolution)
21+
SQL_FUNCTION_MAP.put("geohashesInBox", ""); //计算在指定精度下计算最小包含指定的经纬范围的最小图形的geohash数组。
22+
23+
24+
//hash函数
25+
SQL_FUNCTION_MAP.put("halfMD5", ""); //计算字符串的MD5。然后获取结果的前8个字节并将它们作为UInt64(大端)返回
26+
SQL_FUNCTION_MAP.put("MD5", ""); //计算字符串的MD5并将结果放入FixedString(16)中返回
27+
SQL_FUNCTION_MAP.put("sipHash64", "");//计算字符串的SipHash。
28+
SQL_FUNCTION_MAP.put("sipHash128", "");
29+
SQL_FUNCTION_MAP.put("cityHash64", "");
30+
SQL_FUNCTION_MAP.put("intHash32", "");
31+
SQL_FUNCTION_MAP.put("intHash64", "");
32+
SQL_FUNCTION_MAP.put("URLHash", "");
33+
SQL_FUNCTION_MAP.put("javaHash", ""); //计算字符串的JavaHash。
34+
SQL_FUNCTION_MAP.put("hiveHash", ""); //计算字符串的HiveHash。
35+
SQL_FUNCTION_MAP.put("metroHash64", ""); // 计算字符串的MetroHash。
36+
SQL_FUNCTION_MAP.put("jumpConsistentHash", ""); //计算UInt64的JumpConsistentHash。
37+
SQL_FUNCTION_MAP.put("murmurHash2_32 ""); //计算字符串的MurmurHash2。
38+
39+
40+
//ip地址函数
41+
SQL_FUNCTION_MAP.put("IPv4NumToString", ""); //接受一个UInt32(大端)表示的IPv4的地址,返回相应IPv4的字符串表现形式,格式为A.B.C.D(以点分割的十进制数字)。
42+
SQL_FUNCTION_MAP.put("IPv4StringToNum", ""); //与IPv4NumToString函数相反。如果IPv4地址格式无效,则返回0。
43+
SQL_FUNCTION_MAP.put("IPv4NumToStringClassC", ""); // 与IPv4NumToString类似,但使用xxx替换最后一个字节。
44+
SQL_FUNCTION_MAP.put("IPv6NumToString", ""); //接受FixedString(16)类型的二进制格式的IPv6地址。以文本格式返回此地址的字符串。
45+
SQL_FUNCTION_MAP.put("IPv6StringToNum", ""); //与IPv6NumToString的相反。如果IPv6地址格式无效,则返回空字节字符串。
46+
SQL_FUNCTION_MAP.put("IPv4ToIPv6", ""); // 接受一个UInt32类型的IPv4地址,返回FixedString(16)类型的IPv6地址
47+
SQL_FUNCTION_MAP.put("cutIPv6", ""); //接受一个FixedString(16)类型的IPv6地址,返回一个String,这个String中包含了删除指定位之后的地址的文本格
48+
SQL_FUNCTION_MAP.put("toIPv4", ""); //IPv4StringToNum()的别名,
49+
SQL_FUNCTION_MAP.put("toIPv6", ""); //IPv6StringToNum()的别名
50+
SQL_FUNCTION_MAP.put("isIPAddressInRange", ""); //确定一个IP地址是否包含在以CIDR符号表示的网络中
51+
52+
//Nullable处理函数
53+
SQL_FUNCTION_MAP.put("isNull", ""); //检查参数是否为NULL。
54+
SQL_FUNCTION_MAP.put("isNotNull", ""); //检查参数是否不为 NULL.
55+
56+
SQL_FUNCTION_MAP.put("ifNull", ""); //如果第一个参数为«NULL»,则返回第二个参数的值。
57+
SQL_FUNCTION_MAP.put("assumeNotNull", ""); //将可为空类型的值转换为非Nullable类型的值。
58+
SQL_FUNCTION_MAP.put("toNullable", ""); //将参数的类型转换为Nullable。
59+
60+
//UUID函数
61+
SQL_FUNCTION_MAP.put("generateUUIDv4", ""); // 生成一个UUID
62+
SQL_FUNCTION_MAP.put("toUUID", ""); //toUUID(x) 将String类型的值转换为UUID类型的值。
63+
64+
65+
SQL_FUNCTION_MAP.put("hostName", ""); //hostName()回一个字符串,其中包含执行此函数的主机的名称。
66+
SQL_FUNCTION_MAP.put("getMacro", ""); //从服务器配置的宏部分获取指定值。
67+
SQL_FUNCTION_MAP.put("FQDN", "");//返回完全限定的域名。
68+
SQL_FUNCTION_MAP.put("basename", ""); //提取字符串最后一个斜杠或反斜杠之后的尾随部分
69+
SQL_FUNCTION_MAP.put("currentUser", ""); //返回当前用户的登录。在分布式查询的情况下,将返回用户的登录,即发起的查询
70+
SQL_FUNCTION_MAP.put("version", ""); //以字符串形式返回服务器版本。
71+
SQL_FUNCTION_MAP.put("uptime", "");//以秒为单位返回服务器的正常运行时间。
72+
SQL_FUNCTION_MAP.put("least", ""); //返回a和b中最小的值。
73+
SQL_FUNCTION_MAP.put("greatest", ""); //返回a和b的最大值。
74+
75+
76+
SQL_FUNCTION_MAP.put("abs", "");
77+
SQL_FUNCTION_MAP.put("abs", "");
78+
SQL_FUNCTION_MAP.put("abs", "");
79+
SQL_FUNCTION_MAP.put("abs", "");
80+
SQL_FUNCTION_MAP.put("abs", "");
81+
SQL_FUNCTION_MAP.put("abs", "");
82+
SQL_FUNCTION_MAP.put("abs", "");
83+
SQL_FUNCTION_MAP.put("abs", "");
84+
SQL_FUNCTION_MAP.put("abs", "");
85+
SQL_FUNCTION_MAP.put("abs", "");
86+
SQL_FUNCTION_MAP.put("abs", "");
87+
SQL_FUNCTION_MAP.put("abs", "");
88+
SQL_FUNCTION_MAP.put("abs", "");
89+
SQL_FUNCTION_MAP.put("abs", "");
90+
SQL_FUNCTION_MAP.put("abs", "");
91+
SQL_FUNCTION_MAP.put("abs", "");
92+
SQL_FUNCTION_MAP.put("abs", "");
93+
SQL_FUNCTION_MAP.put("abs", "");
94+
SQL_FUNCTION_MAP.put("abs", "");
95+
SQL_FUNCTION_MAP.put("abs", "");
96+
SQL_FUNCTION_MAP.put("abs", "");
97+
SQL_FUNCTION_MAP.put("abs", "");
98+
SQL_FUNCTION_MAP.put("abs", "");
99+
SQL_FUNCTION_MAP.put("abs", "");
100+
SQL_FUNCTION_MAP.put("abs", "");
101+
SQL_FUNCTION_MAP.put("abs", "");
102+
SQL_FUNCTION_MAP.put("abs", "");
103+
SQL_FUNCTION_MAP.put("abs", "");
104+
SQL_FUNCTION_MAP.put("abs", "");
105+
SQL_FUNCTION_MAP.put("abs", "");
106+
```
107+

docs/字符串函数.md

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,7 @@ SQL_FUNCTION_MAP.put("trimLeft", ""); //trimLeft(s)返回一个字符串,用
6666
SQL_FUNCTION_MAP.put("trimRight", ""); //trimRight(s) 返回一个字符串,用于删除右侧的空白字符。
6767
SQL_FUNCTION_MAP.put("trimBoth", ""); //trimBoth(s),用于删除任一侧的空白字符
6868
69-
SQL_FUNCTION_MAP.put("arrayStringConcat", ""); //arrayStringConcat(arr[,分隔符])使用separator将数组中列出的字符串拼接起来。’separator’是一个可选参数:一个常量字符串,默认情况下设置为空字符串。
70-
SQL_FUNCTION_MAP.put("splitByRegexp", ""); //splitByRegexp(regexp, s) 将字符串分割为由正则表达式分隔的子字符串。它使用正则表达式字符串regexp作为分隔符。
71-
SQL_FUNCTION_MAP.put("splitByWhitespace", ""); //splitByWhitespace(s) 将字符串分割为由空格字符分隔的子字符串。返回选定子字符串的数组
72-
SQL_FUNCTION_MAP.put("splitByNonAlpha", ""); //splitByNonAlpha(s) 将字符串分割为由空格和标点字符分隔的子字符串
73-
SQL_FUNCTION_MAP.put("extractAllGroups", ""); //extractAllGroups(text, regexp) 从正则表达式匹配的非重叠子字符串中提取所有组
74-
SQL_FUNCTION_MAP.put("leftPad", ""); //leftPad('string', 'length'[, 'pad_string']) 用空格或指定的字符串从左边填充当前字符串(如果需要,可以多次),直到得到的字符串达到给定的长度
75-
SQL_FUNCTION_MAP.put("leftPadUTF8", ""); //leftPadUTF8('string','length'[, 'pad_string']) 用空格或指定的字符串从左边填充当前字符串(如果需要,可以多次),直到得到的字符串达到给定的长度
76-
SQL_FUNCTION_MAP.put("rightPad", ""); // rightPad('string', 'length'[, 'pad_string']) 用空格或指定的字符串(如果需要,可以多次)从右边填充当前字符串,直到得到的字符串达到给定的长度
77-
SQL_FUNCTION_MAP.put("rightPadUTF8", "");// rightPadUTF8('string','length'[, 'pad_string']) 用空格或指定的字符串(如果需要,可以多次)从右边填充当前字符串,直到得到的字符串达到给定的长度。
69+
7870
SQL_FUNCTION_MAP.put("CRC32", ""); // 使用CRC-32-IEEE 802.3多项式和初始值0xffffffff (zlib实现)返回字符串的CRC32校验和
7971
SQL_FUNCTION_MAP.put("CRC32IEEE", ""); // 使用CRC-32-IEEE 802.3多项式返回字符串的CRC32校验和
8072
SQL_FUNCTION_MAP.put("CRC64", ""); // 使用CRC-64-ECMA多项式返回字符串的CRC64校验和
@@ -134,6 +126,8 @@ SQL_FUNCTION_MAP.put("alphaTokens", ""); //alphaTokens(s) 从范围a-z和A-Z中
134126
135127
SQL_FUNCTION_MAP.put("splitByChar", ""); //splitByChar(分隔符,s) 将字符串以’separator’拆分成多个子串。’separator’必须为仅包含一个字符的字符串常量。
136128
SQL_FUNCTION_MAP.put("splitByString", ""); // splitByString(分隔符,s) 与上面相同,但它使用多个字符的字符串作为分隔符。 该字符串必须为非空。
129+
SQL_FUNCTION_MAP.put("arrayStringConcat", ""); //arrayStringConcat(arr[,分隔符])使用separator将数组中列出的字符串拼接起来。’separator’是一个可选参数:一个常量字符串,默认情况下设置为空字符串。
130+
SQL_FUNCTION_MAP.put("splitByRegexp", ""); //splitByRegexp(regexp, s) 将字符串分割为由正则表达式分隔的子字符串。它使用正则表达式字符串regexp作为分隔符。
137131
```
138132

139133
永烈

docs/已解决函数.md

Whitespace-only changes.

docs/数组函数.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
```
2+
SQL_FUNCTION_MAP.put("empty", ""); // 对于空数组返回1,对于非空数组返回0
3+
SQL_FUNCTION_MAP.put("notEmpty", ""); //对于空数组返回0,对于非空数组返回1。
4+
SQL_FUNCTION_MAP.put("length", ""); //返回数组中的元素个数。
5+
SQL_FUNCTION_MAP.put("range", ""); //返回从0到N-1的数字数组。
6+
SQL_FUNCTION_MAP.put("array", ""); //使用函数的参数作为数组元素创建一个数组。
7+
SQL_FUNCTION_MAP.put("arrayConcat", "");//合并参数中传递的所有数组。
8+
SQL_FUNCTION_MAP.put("arrayElement", ""); // 从数组arr中获取索引为«n»的元素。 n必须是任何整数类型。
9+
SQL_FUNCTION_MAP.put("has", ""); // 检查’arr’数组是否具有’elem’元素。
10+
SQL_FUNCTION_MAP.put("hasAll", ""); // 检查一个数组是否是另一个数组的子集。
11+
SQL_FUNCTION_MAP.put("hasAny", ""); // 检查两个数组是否存在交集。
12+
SQL_FUNCTION_MAP.put("indexOf", ""); //返回数组中第一个’x’元素的索引(从1开始),如果’x’元素不存在在数组中,则返回0。
13+
SQL_FUNCTION_MAP.put("countEqual", ""); // 返回数组中等于x的元素的个数。相当于arrayCount(elem - > elem = x,arr)。
14+
SQL_FUNCTION_MAP.put("arrayEnumerate", ""); // 返回 Array [1, 2, 3, …, length (arr) ]
15+
SQL_FUNCTION_MAP.put("arrayEnumerateUniq", "");//返回与源数组大小相同的数组,其中每个元素表示与其下标对应的源数组元素在源数组中出现的次数。
16+
SQL_FUNCTION_MAP.put("arrayPopBack", ""); //从数组中删除最后一项。
17+
SQL_FUNCTION_MAP.put("arrayPopFront", ""); //从数组中删除第一项。
18+
SQL_FUNCTION_MAP.put("arrayPushBack", ""); //添加一个元素到数组的末尾。
19+
SQL_FUNCTION_MAP.put("arrayPushFront", ""); //将一个元素添加到数组的开头。
20+
SQL_FUNCTION_MAP.put("arrayResize", ""); // 更改数组的长度。
21+
SQL_FUNCTION_MAP.put("arraySlice", ""); //返回一个子数组,包含从指定位置的指定长度的元素。
22+
SQL_FUNCTION_MAP.put("arraySort", ""); //以升序对arr数组的元素进行排序。如果指定了func函数,则排序顺序由func函数的调用结果决定
23+
SQL_FUNCTION_MAP.put("arrayReverseSort", "");//以降序对arr数组的元素进行排序
24+
SQL_FUNCTION_MAP.put("arrayUniq", ""); //如果传递一个参数,则计算数组中不同元素的数量。
25+
SQL_FUNCTION_MAP.put("arrayJoin", "");
26+
SQL_FUNCTION_MAP.put("arrayDifference", ""); // 返回一个数组,其中包含所有相邻元素对之间的差值。
27+
SQL_FUNCTION_MAP.put("arrayDistinct", ""); // 返回一个包含所有数组中不同元素的数组。
28+
SQL_FUNCTION_MAP.put("arrayIntersect", ""); // 返回所有数组元素的交集
29+
SQL_FUNCTION_MAP.put("arrayReduce", ""); //将聚合函数应用于数组并返回其结果
30+
SQL_FUNCTION_MAP.put("arrayReverse", ""); //返回与源数组大小相同的数组,包含反转源数组的所有元素的结果。
31+
SQL_FUNCTION_MAP.put("abs", "");
32+
```
33+

docs/测试.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,12 @@ format('{1} {0} {1}', 'World', 'Hello')
121121
concat(s1, s2, …)
122122
timestamp_add(date, INTERVAL value unit)
123123
timestamp_add(toDate('2018-01-01'), INTERVAL 3 MONTH);
124-
coun(distinct id,name)
124+
count(distinct id,name)
125125
fun(fun(fun()),fun())
126126
cast(now() as datetime)
127127
concat('dsad','dsa')
128128
count(id) over (userId)
129-
select cast(now() as date):a
129+
cast(now() as date):a
130130
userId:id,comment:c,now():time
131131
fun(fun(a,321,'321')),fun(a b c):c,userId:id,comment:c,now():time,2313,32
132132
a,c,d,e,c:f
@@ -137,3 +137,22 @@ count(DISTINCT id,name)
137137

138138
全文检索:
139139

140+
141+
142+
select count(*) from Fans f where exists(select 1 from Fans d where f.id=d.fid and f.fid = d.id )
143+
144+
select count(*) from Fans where(i)
145+
146+
147+
148+
149+
150+
函数需要的功能:
151+
152+
153+
154+
1. 解析函数 中的所有参数 如果是字符串,不变,如果是关键字 (RAW_MAP)不变, 如果是字段名称,加上引号
155+
156+
2. 解析别名
157+
158+

0 commit comments

Comments
 (0)