Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
<version>1.1.0.DATAJDBC-410-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Spring Data Relational Parent</name>
Expand Down
2 changes: 1 addition & 1 deletion spring-data-jdbc-distribution/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
<version>1.1.0.DATAJDBC-410-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
4 changes: 2 additions & 2 deletions spring-data-jdbc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>

<artifactId>spring-data-jdbc</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
<version>1.1.0.DATAJDBC-410-SNAPSHOT</version>

<name>Spring Data JDBC</name>
<description>Spring Data module for JDBC repositories.</description>
Expand All @@ -14,7 +14,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
<version>1.1.0.DATAJDBC-410-SNAPSHOT</version>
</parent>

<properties>
Expand Down
4 changes: 2 additions & 2 deletions spring-data-relational/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
<modelVersion>4.0.0</modelVersion>

<artifactId>spring-data-relational</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
<version>1.1.0.DATAJDBC-410-SNAPSHOT</version>

<name>Spring Data Relational</name>
<description>Spring Data Relational support</description>

<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
<version>1.1.0.DATAJDBC-410-SNAPSHOT</version>
</parent>

<properties>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,26 @@ public In in(Select subselect) {
return Conditions.in(this, subselect);
}

/**
* Creates a new {@code not} {@link In} {@link Condition} given right {@link Expression}s.
*
* @param expression right side of the comparison.
* @return the {@link In} condition.
*/
public In notIn(Expression... expression) {
return Conditions.notIn(this, expression);
}

/**
* Creates a new {@code not} {@link In} {@link Condition} given a subselects.
*
* @param subselect right side of the comparison.
* @return the {@link In} condition.
*/
public In notIn(Select subselect) {
return Conditions.notIn(this, subselect);
}

/**
* Creates a {@code IS NULL} condition.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,66 @@ public static In in(Column column, Select subselect) {
return in(column, new SubselectExpression(subselect));
}

/**
* Creates a {@code NOT IN} {@link Condition clause}.
*
* @param columnOrExpression left side of the comparison.
* @param arg IN argument.
* @return the {@link In} condition.
*/
public static In notIn(Expression columnOrExpression, Expression arg) {

Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(arg, "Expression argument must not be null");

return In.create(columnOrExpression, arg);
}

/**
* Creates a new {@code NOT IN} {@link Condition} given left and right {@link Expression}s.
*
* @param columnOrExpression left hand side of the {@link Condition} must not be {@literal null}.
* @param expressions right hand side (collection {@link Expression}) must not be {@literal null}.
* @return the {@link In} {@link Condition}.
*/
public static Condition notIn(Expression columnOrExpression, Collection<? extends Expression> expressions) {

Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(expressions, "Expression argument must not be null");

return In.createNotIn(columnOrExpression, new ArrayList<>(expressions));
}

/**
* Creates a new {@code NOT IN} {@link Condition} given left and right {@link Expression}s.
*
* @param columnOrExpression left hand side of the {@link Condition} must not be {@literal null}.
* @param expressions right hand side (collection {@link Expression}) must not be {@literal null}.
* @return the {@link In} {@link Condition}.
*/
public static In notIn(Expression columnOrExpression, Expression... expressions) {

Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(expressions, "Expression argument must not be null");

return In.createNotIn(columnOrExpression, Arrays.asList(expressions));
}

/**
* Creates a {@code NOT IN} {@link Condition clause} for a {@link Select subselect}.
*
* @param column the column to compare.
* @param subselect the subselect.
* @return the {@link In} condition.
*/
public static In notIn(Column column, Select subselect) {

Assert.notNull(column, "Column must not be null");
Assert.notNull(subselect, "Subselect must not be null");

return notIn(column, new SubselectExpression(subselect));
}

static class ConstantCondition extends AbstractSegment implements Condition {

private final String condition;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@ public class In extends AbstractSegment implements Condition {

private final Expression left;
private final Collection<Expression> expressions;
private final boolean notIn;

private In(Expression left, Collection<Expression> expressions) {
private In(Expression left, Collection<Expression> expressions, boolean notIn) {

super(toArray(left, expressions));

this.left = left;
this.expressions = expressions;
this.notIn = notIn;
}

private static Segment[] toArray(Expression expression, Collection<Expression> expressions) {
Expand Down Expand Up @@ -69,7 +71,7 @@ public static In create(Expression columnOrExpression, Expression arg) {
Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(arg, "Expression argument must not be null");

return new In(columnOrExpression, Collections.singletonList(arg));
return new In(columnOrExpression, Collections.singletonList(arg), false);
}

/**
Expand All @@ -84,7 +86,7 @@ public static In create(Expression columnOrExpression, Collection<? extends Expr
Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(expressions, "Expression argument must not be null");

return new In(columnOrExpression, new ArrayList<>(expressions));
return new In(columnOrExpression, new ArrayList<>(expressions), false);
}

/**
Expand All @@ -99,7 +101,58 @@ public static In create(Expression columnOrExpression, Expression... expressions
Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(expressions, "Expression argument must not be null");

return new In(columnOrExpression, Arrays.asList(expressions));
return new In(columnOrExpression, Arrays.asList(expressions), false);
}

/**
* Creates a new {@link In} {@link Condition} given left and right {@link Expression}s.
*
* @param columnOrExpression left hand side of the {@link Condition} must not be {@literal null}.
* @param arg right hand side (collection {@link Expression}) must not be {@literal null}.
* @return the {@link In} {@link Condition}.
*/
public static In createNotIn(Expression columnOrExpression, Expression arg) {

Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(arg, "Expression argument must not be null");

return new In(columnOrExpression, Collections.singletonList(arg), true);
}

/**
* Creates a new {@link In} {@link Condition} given left and right {@link Expression}s.
*
* @param columnOrExpression left hand side of the {@link Condition} must not be {@literal null}.
* @param expressions right hand side (collection {@link Expression}) must not be {@literal null}.
* @return the {@link In} {@link Condition}.
*/
public static In createNotIn(Expression columnOrExpression, Collection<? extends Expression> expressions) {

Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(expressions, "Expression argument must not be null");

return new In(columnOrExpression, new ArrayList<>(expressions), true);
}

/**
* Creates a new {@link In} {@link Condition} given left and right {@link Expression}s.
*
* @param columnOrExpression left hand side of the {@link Condition} must not be {@literal null}.
* @param expressions right hand side (collection {@link Expression}) must not be {@literal null}.
* @return the {@link In} {@link Condition}.
*/
public static In createNotIn(Expression columnOrExpression, Expression... expressions) {

Assert.notNull(columnOrExpression, "Comparison column or expression must not be null");
Assert.notNull(expressions, "Expression argument must not be null");

return new In(columnOrExpression, Arrays.asList(expressions), true);
}

@Override
public Condition not() {

return new In(left, expressions, !notIn);
}

/*
Expand All @@ -108,6 +161,10 @@ public static In create(Expression columnOrExpression, Expression... expressions
*/
@Override
public String toString() {
return left + " IN (" + StringUtils.collectionToDelimitedString(expressions, ", ") + ")";
return left + (notIn ? " NOT" : "") + " IN (" + StringUtils.collectionToDelimitedString(expressions, ", ") + ")";
}

public boolean isNotIn() {
return notIn;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class InVisitor extends TypedSingleConditionRenderSupport<In> {
private final RenderTarget target;
private final StringBuilder part = new StringBuilder();
private boolean needsComma = false;
private boolean notIn = false;

InVisitor(RenderContext context, RenderTarget target) {
super(context);
Expand All @@ -52,6 +53,9 @@ Delegation leaveNested(Visitable segment) {

if (part.length() == 0) {
part.append(renderedPart);
if (notIn) {
part.append(" NOT");
}
part.append(" IN (");
} else {
part.append(renderedPart);
Expand All @@ -62,6 +66,14 @@ Delegation leaveNested(Visitable segment) {
return super.leaveNested(segment);
}

@Override
Delegation enterMatched(In segment) {

notIn = segment.isNotIn();

return super.enterMatched(segment);
}

/*
* (non-Javadoc)
* @see org.springframework.data.relational.core.sql.render.TypedSubtreeVisitor#leaveMatched(org.springframework.data.relational.core.sql.Visitable)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,16 @@ public void shouldRenderIsNotNull() {

assertThat(sql).endsWith("WHERE my_table.left IS NOT NULL");
}

@Test // DATAJDBC-410
public void shouldRenderNotIn() {

String sql = SqlRenderer.toString(StatementBuilder.select(left).from(table).where(left.in(right).not()).build());

assertThat(sql).endsWith("WHERE my_table.left NOT IN (my_table.right)");

sql = SqlRenderer.toString(StatementBuilder.select(left).from(table).where(left.notIn(right)).build());

assertThat(sql).endsWith("WHERE my_table.left NOT IN (my_table.right)");
}
}