46
46
import java .util .Set ;
47
47
import java .util .regex .Pattern ;
48
48
49
- import com .alibaba .fastjson .JSON ;
50
49
import com .alibaba .fastjson .JSONArray ;
51
50
import com .alibaba .fastjson .JSONObject ;
52
51
import com .alibaba .fastjson .annotation .JSONField ;
53
52
53
+ import zuo .biao .apijson .JSON ;
54
54
import zuo .biao .apijson .Log ;
55
55
import zuo .biao .apijson .RequestMethod ;
56
56
import zuo .biao .apijson .RequestRole ;
@@ -1080,15 +1080,18 @@ private String getWhereItem(String key, Object value
1080
1080
if (key .endsWith ("$" )) {
1081
1081
keyType = 1 ;
1082
1082
}
1083
- else if (key .endsWith ("?" )) {
1084
- keyType = 2 ;
1083
+ else if (key .endsWith ("~" ) || key . endsWith ( " ?" )) { //TODO ?可能以后会被废弃,全用 ~ 和 *~ 替代,更接近 PostgreSQL 语法
1084
+ keyType = key . charAt ( key . length () - 2 ) == '*' ? - 2 : 2 ; //FIXME StringIndexOutOfBoundsException
1085
1085
}
1086
- else if (key .endsWith ("{} " )) {
1086
+ else if (key .endsWith ("% " )) {
1087
1087
keyType = 3 ;
1088
1088
}
1089
- else if (key .endsWith ("<> " )) {
1089
+ else if (key .endsWith ("{} " )) {
1090
1090
keyType = 4 ;
1091
1091
}
1092
+ else if (key .endsWith ("<>" )) {
1093
+ keyType = 5 ;
1094
+ }
1092
1095
else { //else绝对不能省,避免再次踩坑! keyType = 0; 写在for循环外面都没注意!
1093
1096
keyType = 0 ;
1094
1097
}
@@ -1097,11 +1100,14 @@ else if (key.endsWith("<>")) {
1097
1100
switch (keyType ) {
1098
1101
case 1 :
1099
1102
return getSearchString (key , value );
1103
+ case -2 :
1100
1104
case 2 :
1101
- return getRegExpString (key , value );
1105
+ return getRegExpString (key , value , keyType < 0 );
1102
1106
case 3 :
1103
- return getRangeString (key , value );
1107
+ return getBetweenString (key , value );
1104
1108
case 4 :
1109
+ return getRangeString (key , value );
1110
+ case 5 :
1105
1111
return getContainString (key , value );
1106
1112
default : //TODO MySQL JSON类型的字段对比 key='[]' 会无结果! key LIKE '[1, 2, 3]' //TODO MySQL , 后面有空格!
1107
1113
return getEqualString (key , value );
@@ -1111,7 +1117,14 @@ else if (key.endsWith("<>")) {
1111
1117
1112
1118
@ JSONField (serialize = false )
1113
1119
public String getEqualString (String key , Object value ) {
1114
- return getKey (key ) + "=" + getValue (value );
1120
+ boolean not = key .endsWith ("!" ); // & | 没有任何意义,写法多了不好控制
1121
+ if (not ) {
1122
+ key = key .substring (0 , key .length () - 1 );
1123
+ }
1124
+ if (StringUtil .isName (key ) == false ) {
1125
+ throw new IllegalArgumentException ("\" " + key + "\" :value 中key不合法!不支持 ! 以外的逻辑符 !" );
1126
+ }
1127
+ return getKey (key ) + (not ? "!=" : "=" ) + getValue (value );
1115
1128
}
1116
1129
1117
1130
public String getKey (String key ) {
@@ -1198,14 +1211,16 @@ public String getLikeString(String key, Object value) {
1198
1211
1199
1212
1200
1213
1201
- //$ search <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1202
- /**search key match RegExps value
1203
- * @param in
1204
- * @return {@link #getRegExpString(String, Object[], int)}
1214
+ //~ regexp <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1215
+ /**search key match RegExp values
1216
+ * @param key
1217
+ * @param value
1218
+ * @param ignoreCase
1219
+ * @return {@link #getRegExpString(String, Object[], int, boolean)}
1205
1220
* @throws IllegalArgumentException
1206
1221
*/
1207
1222
@ JSONField (serialize = false )
1208
- public String getRegExpString (String key , Object value ) throws IllegalArgumentException {
1223
+ public String getRegExpString (String key , Object value , boolean ignoreCase ) throws IllegalArgumentException {
1209
1224
if (value == null ) {
1210
1225
return "" ;
1211
1226
}
@@ -1218,15 +1233,18 @@ public String getRegExpString(String key, Object value) throws IllegalArgumentEx
1218
1233
if (arr .isEmpty ()) {
1219
1234
return "" ;
1220
1235
}
1221
- return getRegExpString (key , arr .toArray (), logic .getType ());
1236
+ return getRegExpString (key , arr .toArray (), logic .getType (), ignoreCase );
1222
1237
}
1223
1238
/**search key match RegExp values
1224
- * @param in
1239
+ * @param key
1240
+ * @param values
1241
+ * @param type
1242
+ * @param ignoreCase
1225
1243
* @return LOGIC [ key REGEXP 'values[i]' ]
1226
1244
* @throws IllegalArgumentException
1227
1245
*/
1228
1246
@ JSONField (serialize = false )
1229
- public String getRegExpString (String key , Object [] values , int type ) throws IllegalArgumentException {
1247
+ public String getRegExpString (String key , Object [] values , int type , boolean ignoreCase ) throws IllegalArgumentException {
1230
1248
if (values == null || values .length <= 0 ) {
1231
1249
return "" ;
1232
1250
}
@@ -1236,7 +1254,7 @@ public String getRegExpString(String key, Object[] values, int type) throws Ille
1236
1254
if (values [i ] instanceof String == false ) {
1237
1255
throw new IllegalArgumentException (key + "$\" :value 中value的类型只能为String或String[]!" );
1238
1256
}
1239
- condition += (i <= 0 ? "" : (Logic .isAnd (type ) ? AND : OR )) + getRegExpString (key , (String ) values [i ]);
1257
+ condition += (i <= 0 ? "" : (Logic .isAnd (type ) ? AND : OR )) + getRegExpString (key , (String ) values [i ], ignoreCase );
1240
1258
}
1241
1259
1242
1260
return getCondition (Logic .isNot (type ), condition );
@@ -1245,13 +1263,65 @@ public String getRegExpString(String key, Object[] values, int type) throws Ille
1245
1263
/**WHERE key REGEXP 'value'
1246
1264
* @param key
1247
1265
* @param value
1266
+ * @param ignoreCase
1248
1267
* @return key REGEXP 'value'
1249
1268
*/
1250
1269
@ JSONField (serialize = false )
1251
- public String getRegExpString (String key , String value ) {
1252
- return getKey (key ) + " REGEXP " + getValue (value );
1270
+ public String getRegExpString (String key , String value , boolean ignoreCase ) {
1271
+ return getKey (key ) + " REGEXP " + ( ignoreCase ? "" : "BINARY " ) + getValue (value );
1253
1272
}
1254
- //$ search >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1273
+ //~ regexp >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1274
+
1275
+
1276
+
1277
+ //% between <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1278
+
1279
+ /**WHERE key BETWEEN 'value0' AND 'value1'
1280
+ * @param key
1281
+ * @param value
1282
+ * @return key BETWEEN 'value0' AND 'value1'
1283
+ */
1284
+ @ JSONField (serialize = false )
1285
+ public String getBetweenString (String key , Object value ) {
1286
+ boolean not = key .endsWith ("!" ); //不能用 new Logic(key) 因为默认是 | ,而 BETWEEN 只能接 AND
1287
+ if (not ) {
1288
+ key = key .substring (0 , key .length () - 1 );
1289
+ }
1290
+ if (StringUtil .isName (key ) == false ) {
1291
+ throw new IllegalArgumentException (key + "%\" :value 中key不合法!不支持 ! 以外的逻辑符 !" );
1292
+ }
1293
+
1294
+ Object [] vs ;
1295
+ if (value instanceof String ) {
1296
+ vs = StringUtil .split ((String ) value );
1297
+ // int index = ((String) value).indexOf(",");
1298
+ // if (index < 0) {
1299
+ // throw new IllegalArgumentException(key + "%\":value 中value的类型为 String 时必须包括逗号 , !前面缺省为 min(key) ,后面缺省为 max(key)");
1300
+ // }
1301
+ // if (index == 0) {
1302
+ // start = "(SELECT min(key) FROM getSQLTable())"
1303
+ // }
1304
+ }
1305
+ else if (value instanceof Collection <?>) {
1306
+ vs = ((Collection <?>) value ).toArray ();
1307
+ }
1308
+ else {
1309
+ throw new IllegalArgumentException (key + "%\" :value 中value不合法!类型只能为 1个逗号分隔的String 或者 只有Boolean[2]或Number[2]或String[2] !" );
1310
+ }
1311
+
1312
+ if (vs == null || vs .length != 2 ) {
1313
+ throw new IllegalArgumentException (key + "%\" :value 中value不合法!类型为 String 时必须包括1个逗号 , 且左右两侧都有值!类型为 JSONArray 时只能是 Boolean[2]或Number[2]或String[2] !" );
1314
+ }
1315
+
1316
+ Object start = vs [0 ];
1317
+ Object end = vs [1 ];
1318
+ if (JSON .isBooleanOrNumberOrString (start ) == false || JSON .isBooleanOrNumberOrString (end ) == false ) {
1319
+ throw new IllegalArgumentException (key + "%\" :value 中value不合法!类型为 String 时必须包括1个逗号 , 且左右两侧都有值!类型为 JSONArray 时只能是 Boolean[2]或Number[2]或String[2] !" );
1320
+ }
1321
+
1322
+ return getKey (key ) + (not ? NOT : "" ) + " BETWEEN " + getValue (start ) + AND + getValue (end );
1323
+ }
1324
+ //% between >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1255
1325
1256
1326
1257
1327
@@ -1997,7 +2067,13 @@ public static String getRealKey(RequestMethod method, String originKey
1997
2067
if (key .endsWith ("$" )) {//搜索,查询时处理
1998
2068
key = key .substring (0 , key .length () - 1 );
1999
2069
}
2000
- else if (key .endsWith ("?" )) {//匹配正则表达式,查询时处理
2070
+ else if (key .endsWith ("~" ) || key .endsWith ("?" )) {//匹配正则表达式,查询时处理 TODO ?可能以后会被废弃,全用 ~ 和 *~ 替代,更接近 PostgreSQL 语法
2071
+ key = key .substring (0 , key .length () - 1 );
2072
+ if (key .endsWith ("*" )) {//忽略大小写
2073
+ key = key .substring (0 , key .length () - 1 );
2074
+ }
2075
+ }
2076
+ else if (key .endsWith ("%" )) {//数字、文本、日期范围,BETWEEN AND
2001
2077
key = key .substring (0 , key .length () - 1 );
2002
2078
}
2003
2079
else if (key .endsWith ("{}" )) {//被包含,或者说key对应值处于value的范围内。查询时处理
0 commit comments