in seatunnel-connectors-v2/connector-iceberg/src/main/java/org/apache/seatunnel/connectors/seatunnel/iceberg/utils/ExpressionUtils.java [110:251]
public static Expression convert(
net.sf.jsqlparser.expression.Expression condition, org.apache.iceberg.Schema schema) {
if (condition == null) {
return Expressions.alwaysTrue();
}
if (condition instanceof AndExpression) {
return Expressions.and(
convert(((AndExpression) condition).getLeftExpression(), schema),
convert(((AndExpression) condition).getRightExpression(), schema));
}
if (condition instanceof OrExpression) {
return Expressions.or(
convert(((OrExpression) condition).getLeftExpression(), schema),
convert(((OrExpression) condition).getRightExpression(), schema));
}
if (condition instanceof Parenthesis) {
return convert(((Parenthesis) condition).getExpression(), schema);
}
if (condition instanceof EqualsTo) {
EqualsTo equalsTo = (EqualsTo) condition;
Column column = (Column) equalsTo.getLeftExpression();
Object value =
schema == null
? convertValueExpression(equalsTo.getRightExpression())
: convertValueExpression(
equalsTo.getRightExpression(),
schema.findField(column.getColumnName()));
return Expressions.equal(column.getColumnName(), value);
}
if (condition instanceof NotEqualsTo) {
NotEqualsTo notEqualsTo = (NotEqualsTo) condition;
Column column = (Column) notEqualsTo.getLeftExpression();
Object value =
schema == null
? convertValueExpression(notEqualsTo.getRightExpression())
: convertValueExpression(
notEqualsTo.getRightExpression(),
schema.findField(column.getColumnName()));
return Expressions.notEqual(column.getColumnName(), value);
}
if (condition instanceof NotExpression) {
NotExpression expr = (NotExpression) condition;
return Expressions.not(convert(expr.getExpression(), null));
}
if (condition instanceof GreaterThan) {
GreaterThan greaterThan = (GreaterThan) condition;
Column column = (Column) greaterThan.getLeftExpression();
Object value =
schema == null
? convertValueExpression(greaterThan.getRightExpression())
: convertValueExpression(
greaterThan.getRightExpression(),
schema.findField(column.getColumnName()));
return Expressions.greaterThan(column.getColumnName(), value);
}
if (condition instanceof GreaterThanEquals) {
GreaterThanEquals greaterThanEquals = (GreaterThanEquals) condition;
Column column = (Column) greaterThanEquals.getLeftExpression();
Object value =
schema == null
? convertValueExpression(greaterThanEquals.getRightExpression())
: convertValueExpression(
greaterThanEquals.getRightExpression(),
schema.findField(column.getColumnName()));
return Expressions.greaterThanOrEqual(column.getColumnName(), value);
}
if (condition instanceof MinorThan) {
MinorThan minorThan = (MinorThan) condition;
Column column = (Column) minorThan.getLeftExpression();
Object value =
schema == null
? convertValueExpression(minorThan.getRightExpression())
: convertValueExpression(
minorThan.getRightExpression(),
schema.findField(column.getColumnName()));
return Expressions.lessThan(column.getColumnName(), value);
}
if (condition instanceof MinorThanEquals) {
MinorThanEquals minorThanEquals = (MinorThanEquals) condition;
Column column = (Column) minorThanEquals.getLeftExpression();
Object value =
schema == null
? convertValueExpression(minorThanEquals.getRightExpression())
: convertValueExpression(
minorThanEquals.getRightExpression(),
schema.findField(column.getColumnName()));
return Expressions.lessThanOrEqual(column.getColumnName(), value);
}
if (condition instanceof IsNullExpression) {
IsNullExpression isNullExpression = (IsNullExpression) condition;
Column column = (Column) isNullExpression.getLeftExpression();
if (isNullExpression.isNot()) {
return Expressions.notNull(column.getColumnName());
}
return Expressions.isNull(column.getColumnName());
}
if (condition instanceof InExpression) {
InExpression inExpression = (InExpression) condition;
Column column = (Column) inExpression.getLeftExpression();
ExpressionList<net.sf.jsqlparser.expression.Expression> itemsList =
(ExpressionList) inExpression.getRightExpression();
List<Object> values =
itemsList.getExpressions().stream()
.map(
e ->
schema == null
? convertValueExpression(e)
: convertValueExpression(
e,
schema.findField(
column.getColumnName())))
.collect(Collectors.toList());
if (inExpression.isNot()) {
return Expressions.notIn(column.getColumnName(), values);
}
return Expressions.in(column.getColumnName(), values);
}
if (condition instanceof IsBooleanExpression) {
IsBooleanExpression booleanExpression = (IsBooleanExpression) condition;
Column column = (Column) booleanExpression.getLeftExpression();
if (booleanExpression.isNot()) {
return Expressions.notEqual(column.getColumnName(), booleanExpression.isTrue());
}
return Expressions.equal(column.getColumnName(), booleanExpression.isTrue());
}
if (condition instanceof LikeExpression) {
LikeExpression expr = (LikeExpression) condition;
String columnName = ((Column) expr.getLeftExpression()).getColumnName();
String value = ((StringValue) expr.getRightExpression()).getValue();
LikeExpression.KeyWord keyWord = expr.getLikeKeyWord();
if (keyWord == LikeExpression.KeyWord.LIKE) {
return Expressions.startsWith(columnName, value);
} else {
throw new UnsupportedOperationException("Unsupported like keyword: " + keyWord);
}
}
throw new UnsupportedOperationException(
"Unsupported condition: " + condition.getClass().getName());
}