@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user