Skip to content

Commit 4da097b

Browse files
committed
重构了SQL构建器中处理LIKE、PREFIX_LIKE和SUFFIX_LIKE操作的代码,增加对多个值的处理逻辑
1 parent 984d16e commit 4da097b

File tree

1 file changed

+32
-10
lines changed
  • data-providers/data-provider-base/src/main/java/datart/data/provider/calcite

1 file changed

+32
-10
lines changed

data-providers/data-provider-base/src/main/java/datart/data/provider/calcite/SqlBuilder.java

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import org.springframework.util.CollectionUtils;
3535

3636
import java.util.*;
37+
import java.util.function.Function;
38+
import java.util.function.UnaryOperator;
3739
import java.util.stream.Collectors;
3840

3941

@@ -292,7 +294,7 @@ private SqlNode filterSqlNode(FilterOperator operator) {
292294

293295
SqlNode[] sqlNodes = null;
294296

295-
org.apache.calcite.sql.SqlOperator sqlOp = null;
297+
SqlOperator sqlOp = null;
296298
switch (operator.getSqlOperator()) {
297299
case IN:
298300
sqlOp = SqlStdOperatorTable.IN;
@@ -327,19 +329,31 @@ private SqlNode filterSqlNode(FilterOperator operator) {
327329
sqlNodes = new SqlNode[]{column, nodes.get(0)};
328330
break;
329331
case LIKE:
330-
operator.getValues()[0].setValue("%" + operator.getValues()[0].getValue() + "%");
331-
sqlOp = SqlStdOperatorTable.LIKE;
332-
sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])};
332+
if (operator.getValues().length == 1) {
333+
sqlOp = SqlStdOperatorTable.LIKE;
334+
sqlNodes = getOperands(column, operator.getValues()[0], v -> "%" + v + "%");
335+
} else if (operator.getValues().length > 1) {
336+
sqlOp = SqlStdOperatorTable.OR;
337+
sqlNodes = Arrays.stream(operator.getValues()).map(newSqlBasicCall(column, v -> "%" + v + "%")).toArray(SqlNode[]::new);
338+
}
333339
break;
334340
case PREFIX_LIKE:
335-
operator.getValues()[0].setValue(operator.getValues()[0].getValue() + "%");
336-
sqlOp = SqlStdOperatorTable.LIKE;
337-
sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])};
341+
if (operator.getValues().length == 1) {
342+
sqlOp = SqlStdOperatorTable.LIKE;
343+
sqlNodes = getOperands(column, operator.getValues()[0], v -> v + "%");
344+
} else if (operator.getValues().length > 1) {
345+
sqlOp = SqlStdOperatorTable.OR;
346+
sqlNodes = Arrays.stream(operator.getValues()).map(newSqlBasicCall(column, v -> v + "%")).toArray(SqlNode[]::new);
347+
}
338348
break;
339349
case SUFFIX_LIKE:
340-
operator.getValues()[0].setValue("%" + operator.getValues()[0].getValue());
341-
sqlOp = SqlStdOperatorTable.LIKE;
342-
sqlNodes = new SqlNode[]{column, convertTypedValue(operator.getValues()[0])};
350+
if (operator.getValues().length == 1) {
351+
sqlOp = SqlStdOperatorTable.LIKE;
352+
sqlNodes = getOperands(column, operator.getValues()[0], v -> "%" + v);
353+
} else if (operator.getValues().length > 1) {
354+
sqlOp = SqlStdOperatorTable.OR;
355+
sqlNodes = Arrays.stream(operator.getValues()).map(newSqlBasicCall(column, v -> "%" + v)).toArray(SqlNode[]::new);
356+
}
343357
break;
344358
case NOT_LIKE:
345359
operator.getValues()[0].setValue("%" + operator.getValues()[0].getValue() + "%");
@@ -384,6 +398,14 @@ private SqlNode filterSqlNode(FilterOperator operator) {
384398
return new SqlBasicCall(sqlOp, sqlNodes, SqlParserPos.ZERO);
385399
}
386400

401+
private Function<SingleTypedValue, SqlBasicCall> newSqlBasicCall(SqlNode column, UnaryOperator<Object> formater) {
402+
return value -> new SqlBasicCall(SqlStdOperatorTable.LIKE, getOperands(column, value, formater), SqlParserPos.ZERO);
403+
}
404+
405+
private SqlNode[] getOperands(SqlNode column, SingleTypedValue value, UnaryOperator<Object> formater) {
406+
return new SqlNode[]{column, convertTypedValue(new SingleTypedValue(formater.apply(value.getValue()), value.getValueType()))};
407+
}
408+
387409
/**
388410
* parse function column ,and register the column functions
389411
*

0 commit comments

Comments
 (0)