Upgrading to jsqlparser 4.9

Closes #1799
This commit is contained in:
Jens Schauder
2024-05-31 16:47:57 +02:00
parent f1cbdd868e
commit abd0c85629
6 changed files with 26 additions and 46 deletions

View File

@@ -20,6 +20,7 @@
<properties>
<java-module-name>spring.data.relational</java-module-name>
<project.root>${basedir}/..</project.root>
<jsqlparser>4.9</jsqlparser>
</properties>
<dependencies>
@@ -100,7 +101,7 @@
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.6</version>
<version>${jsqlparser}</version>
<scope>test</scope>
</dependency>

View File

@@ -16,7 +16,6 @@
package org.springframework.data.relational.core.sqlgeneration;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem;
/**
@@ -24,19 +23,14 @@ import net.sf.jsqlparser.statement.select.SelectItem;
*
* @param pattern for the expression to match
* @param alias to match
*
* @author Jens Schauder
*/
record AliasedPattern (SelectItemPattern pattern, String alias) implements SelectItemPattern {
record AliasedPattern(SelectItemPattern pattern, String alias) implements SelectItemPattern {
@Override
public boolean matches(SelectItem selectItem) {
if (selectItem instanceof SelectExpressionItem sei) {
return pattern.matches(sei) && sei.getAlias() != null && sei.getAlias().getName().equals(alias);
}
return false;
return pattern.matches(selectItem) && selectItem.getAlias() != null
&& selectItem.getAlias().getName().equals(alias);
}
@Override

View File

@@ -18,7 +18,6 @@ package org.springframework.data.relational.core.sqlgeneration;
import net.sf.jsqlparser.expression.AnalyticExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem;
import java.util.List;
@@ -44,19 +43,17 @@ public class AnalyticFunctionPattern extends TypedExpressionPattern<AnalyticExpr
@Override
public boolean matches(SelectItem selectItem) {
if (selectItem instanceof SelectExpressionItem sei) {
Expression expression = sei.getExpression();
if (expression instanceof AnalyticExpression analyticExpression) {
return matches(analyticExpression);
}
Expression expression = selectItem.getExpression();
if (expression instanceof AnalyticExpression analyticExpression) {
return matches(analyticExpression);
}
return false;
}
@Override
boolean matches(AnalyticExpression analyticExpression) {
return analyticExpression.getName().toLowerCase().equals(functionName)
&& partitionByMatches(analyticExpression);
return analyticExpression.getName().toLowerCase().equals(functionName) && partitionByMatches(analyticExpression);
}
private boolean partitionByMatches(AnalyticExpression analyticExpression) {

View File

@@ -17,7 +17,6 @@
package org.springframework.data.relational.core.sqlgeneration;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem;
/**
@@ -30,7 +29,7 @@ record LiteralPattern(Object value) implements SelectItemPattern, ExpressionPatt
@Override
public boolean matches(SelectItem selectItem) {
return selectItem instanceof SelectExpressionItem sei && matches(sei.getExpression());
return matches(selectItem.getExpression());
}
@Override

View File

@@ -27,8 +27,6 @@ import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectItem;
import net.sf.jsqlparser.statement.select.SpecialSubSelect;
import net.sf.jsqlparser.statement.select.SubSelect;
import java.util.ArrayList;
import java.util.Arrays;
@@ -84,10 +82,11 @@ class SqlAssert extends AbstractAssert<SqlAssert, PlainSelect> {
return new AnalyticFunctionPattern("count", partitionBy);
}
static FunctionPattern func(String name, ExpressionPattern ... params) {
static FunctionPattern func(String name, ExpressionPattern... params) {
return new FunctionPattern(name, params);
}
static FunctionPattern func(String name, String ... params) {
static FunctionPattern func(String name, String... params) {
return new FunctionPattern(name, Arrays.stream(params).map(p -> col(p)).collect(Collectors.toList()));
}
@@ -104,7 +103,7 @@ class SqlAssert extends AbstractAssert<SqlAssert, PlainSelect> {
SqlAssert hasExactlyColumns(SelectItemPattern... columns) {
List<SelectItem> actualSelectItems = actual.getSelectItems();
List<SelectItem<?>> actualSelectItems = actual.getSelectItems();
List<SelectItemPattern> unmatchedPatterns = new ArrayList<>(Arrays.asList(columns));
List<SelectItem> unmatchedSelectItems = new ArrayList<>();
@@ -169,15 +168,18 @@ class SqlAssert extends AbstractAssert<SqlAssert, PlainSelect> {
Expression where = actual.getWhere();
return new StringAssert(where == null ? "" : where.toString());
}
public JoinAssert hasJoin() {
List<Join> joins = actual.getJoins();
if (joins == null || joins.size() < 1) {
throw failureWithActualExpected(actual, "select with a join", "Expected %s to contain a join but it doesn't.", actual);
throw failureWithActualExpected(actual, "select with a join", "Expected %s to contain a join but it doesn't.",
actual);
}
return new JoinAssert(joins.get(0));
}
private String prepare(SelectItemPattern[] columns) {
return Arrays.toString(columns);
}
@@ -185,7 +187,7 @@ class SqlAssert extends AbstractAssert<SqlAssert, PlainSelect> {
SqlAssert hasInlineViewSelectingFrom(String tableName) {
Optional<PlainSelect> matchingSelect = getSubSelects(actual)
.filter(ps -> (ps.getFromItem()instanceof Table t) && t.getName().equals(tableName)).findFirst();
.filter(ps -> (ps.getFromItem() instanceof Table t) && t.getName().equals(tableName)).findFirst();
if (matchingSelect.isEmpty()) {
throw failureWithActualExpected(actual, "Subselect from " + tableName,
@@ -195,13 +197,11 @@ class SqlAssert extends AbstractAssert<SqlAssert, PlainSelect> {
return new SqlAssert(matchingSelect.get());
}
public SqlAssert hasInlineView() {
Optional<PlainSelect> matchingSelect = getSubSelects(actual).findFirst();
if (matchingSelect.isEmpty()) {
throw failureWithActualExpected(actual, "Subselect",
"%s is expected to contain a subselect", actual);
throw failureWithActualExpected(actual, "Subselect", "%s is expected to contain a subselect", actual);
}
return new SqlAssert(matchingSelect.get());
@@ -227,15 +227,8 @@ class SqlAssert extends AbstractAssert<SqlAssert, PlainSelect> {
}
private static Stream<PlainSelect> subSelects(FromItem fromItem) {
Stream<PlainSelect> fromStream;
if (fromItem instanceof SubSelect ss) {
fromStream = Stream.of((PlainSelect) ss.getSelectBody());
} else if (fromItem instanceof SpecialSubSelect ss) {
fromStream = Stream.of((PlainSelect) ss.getSubSelect().getSelectBody());
} else {
fromStream = Stream.empty();
}
return fromStream;
return fromItem instanceof Select ss ? Stream.of(ss.getPlainSelect()) : Stream.empty();
}
public StringAssert extractOrderBy() {

View File

@@ -17,7 +17,6 @@
package org.springframework.data.relational.core.sqlgeneration;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem;
/**
@@ -33,15 +32,12 @@ abstract class TypedExpressionPattern<T> implements SelectItemPattern, Expressio
this.type = type;
}
@Override
public boolean matches(SelectItem selectItem) {
if (selectItem instanceof SelectExpressionItem sei) {
Expression expression = sei.getExpression();
return matches(expression);
}
return false;
Expression expression = selectItem.getExpression();
return matches(expression);
}
@Override