Merge pull request #134 from JiaRG/3.0.x

TermExpressionParser增加对带空格字符串的支持
This commit is contained in:
老周
2019-08-07 14:39:37 +08:00
committed by GitHub
3 changed files with 63 additions and 10 deletions

View File

@@ -19,19 +19,37 @@ public class TermExpressionParser {
NestConditional<?> nest = null;
// 字符容器
char[] buf = new char[128];
// 记录词项的长度, Arrays.copyOf使用
byte len = 0;
// 空格数量?
byte spaceLen = 0;
// 当前列
char[] currentColumn = null;
String currentTermType = null;
// 当前列对应的值
char[] currentValue = null;
char[] all = expression.toCharArray();
// 当前条件类型 eq btw in ...
String currentTermType = null;
// 当前链接类型 and / or
String currentType = "and";
// 是否是引号, 单引号 / 双引号
byte quotationMarks = 0;
// 表达式字符数组
char[] all = expression.toCharArray();
for (char c : all) {
if (c == '(') {
if (c == '\'' || c == '"') {
if (quotationMarks != 0) {
// 碰到(结束的)单/双引号, 标志归零, 跳过
quotationMarks = 0;
continue;
}
// 碰到(开始的)单/双引号, 做记录, 跳过
quotationMarks++;
continue;
} else if (c == '(') {
nest = (nest == null ?
(currentType.equals("or") ? conditional.orNest() : conditional.nest()) :
(currentType.equals("or") ? nest.orNest() : nest.nest()));
@@ -70,6 +88,11 @@ public class TermExpressionParser {
if (len == 0) {
continue;
}
if (quotationMarks != 0) {
// 如果当前字符是空格,并且前面迭代时碰到过单/双引号, 不处理并且添加到buf中
buf[len++] = c;
continue;
}
spaceLen++;
if (currentColumn == null && (spaceLen == 1 || spaceLen % 5 == 0)) {
currentColumn = Arrays.copyOf(buf, len);
@@ -117,6 +140,10 @@ public class TermExpressionParser {
len = 0;
spaceLen++;
}
} else {
currentColumn = Arrays.copyOf(buf, len);
len = 0;
spaceLen++;
}
continue;
}

View File

@@ -51,7 +51,31 @@ public class TermExpressionParserTest {
Assert.assertEquals(terms.get(2).getValue(), "test2");
Assert.assertEquals(terms.get(2).getTermType(), "like");
}
/**
* 测试日期字符串空格解析,'2019-07-26 12:00:00'
*/
@Test
public void testDateSpace() {
String expression = "(name=测试 or age=10) and (birth btw \"2019-07-26 12:00:00, 2019-08-04 12:00:00\" or startTime <= '2019-08-04 12:00:00') and finishTime >= '2019-08-01 00:00:00'";
List<Term> terms = TermExpressionParser.parse(expression);
System.out.println(JSON.toJSONString(terms, SerializerFeature.PrettyFormat));
Assert.assertEquals(terms.size(), 3);
Assert.assertEquals(terms.get(0).getTerms().size(), 2);
Assert.assertEquals(terms.get(1).getTerms().get(0).getColumn(), "birth");
Assert.assertEquals(terms.get(1).getTerms().get(0).getTermType(), "btw");
Assert.assertEquals(terms.get(1).getTerms().get(0).getValue(), "2019-07-26 12:00:00, 2019-08-04 12:00:00");
Assert.assertEquals(terms.get(1).getTerms().get(1).getColumn(), "startTime");
Assert.assertEquals(terms.get(1).getTerms().get(1).getTermType(), "lte");
Assert.assertEquals(terms.get(1).getTerms().get(1).getValue(), "2019-08-04 12:00:00");
Assert.assertEquals(terms.get(1).getTerms().get(1).getType(), Term.Type.or);
Assert.assertEquals(terms.get(2).getColumn(), "finishTime");
Assert.assertEquals(terms.get(2).getValue(), "2019-08-01 00:00:00");
Assert.assertEquals(terms.get(2).getTermType(), "gte");
}
}

View File

@@ -15,11 +15,13 @@ hsweb:
hsweb:
cors:
enable: true
allowed-headers: "*"
allowed-methods: "*"
allowed-origins: "*"
allow-credentials: true
max-age: 14400
configs:
- /**:
allowed-headers: "*"
allowed-methods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]
allowed-origins: ["http://xxx.example.com"]
allow-credentials: true
maxAge: 1800
```
# json序列化配置