Skip to content

Add Where Utility Methods to Accept Pre-Built Lists of Criteria #462

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Mar 7, 2022
Merged
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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

This log will detail notable changes to MyBatis Dynamic SQL. Full details are available on the GitHub milestone pages.

## Release 1.4.1 - Unreleased

GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.4.1+](https://github.com/mybatis/mybatis-dynamic-sql/issues?q=milestone%3A1.4.1+)

1. Added support for criteria groups without an initial criteria. This makes it possible to create an independent list
of pre-created criteria and then add the list to a where clause. See the tests in the related pull request for
usage examples. ([#462](https://github.com/mybatis/mybatis-dynamic-sql/pull/462))

## Release 1.4.0 - March 3, 2022

The release includes new functionality in the Where Clause DSL to support arbitrary grouping of conditions, and also use
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/org/mybatis/dynamic/sql/CriteriaGroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
package org.mybatis.dynamic.sql;

import java.util.Objects;
import java.util.Optional;

/**
* This class represents a criteria group without an AND or an OR connector. This is useful
Expand All @@ -30,11 +30,11 @@ public class CriteriaGroup extends SqlCriterion {

protected CriteriaGroup(AbstractGroupBuilder<?> builder) {
super(builder);
initialCriterion = Objects.requireNonNull(builder.initialCriterion);
initialCriterion = builder.initialCriterion;
}

public SqlCriterion initialCriterion() {
return initialCriterion;
public Optional<SqlCriterion> initialCriterion() {
return Optional.ofNullable(initialCriterion);
}

@Override
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,12 @@ static CriteriaGroup group(SqlCriterion initialCriterion, List<AndOrCriteriaGrou
.build();
}

static CriteriaGroup group(List<AndOrCriteriaGroup> subCriteria) {
return new CriteriaGroup.Builder()
.withSubCriteria(subCriteria)
.build();
}

static <T> NotCriterion not(BindableColumn<T> column, VisitableCondition<T> condition,
AndOrCriteriaGroup...subCriteria) {
return not(column, condition, Arrays.asList(subCriteria));
Expand Down Expand Up @@ -302,6 +308,12 @@ static NotCriterion not(SqlCriterion initialCriterion, List<AndOrCriteriaGroup>
.build();
}

static NotCriterion not(List<AndOrCriteriaGroup> subCriteria) {
return new NotCriterion.Builder()
.withSubCriteria(subCriteria)
.build();
}

static <T> AndOrCriteriaGroup or(BindableColumn<T> column, VisitableCondition<T> condition,
AndOrCriteriaGroup...subCriteria) {
return new AndOrCriteriaGroup.Builder()
Expand Down Expand Up @@ -330,6 +342,13 @@ static AndOrCriteriaGroup or(SqlCriterion initialCriterion, AndOrCriteriaGroup..
.build();
}

static AndOrCriteriaGroup or(List<AndOrCriteriaGroup> subCriteria) {
return new AndOrCriteriaGroup.Builder()
.withConnector("or") //$NON-NLS-1$
.withSubCriteria(subCriteria)
.build();
}

static <T> AndOrCriteriaGroup and(BindableColumn<T> column, VisitableCondition<T> condition,
AndOrCriteriaGroup...subCriteria) {
return new AndOrCriteriaGroup.Builder()
Expand Down Expand Up @@ -358,6 +377,13 @@ static AndOrCriteriaGroup and(SqlCriterion initialCriterion, AndOrCriteriaGroup.
.build();
}

static AndOrCriteriaGroup and(List<AndOrCriteriaGroup> subCriteria) {
return new AndOrCriteriaGroup.Builder()
.withConnector("and") //$NON-NLS-1$
.withSubCriteria(subCriteria)
.build();
}

// join support
static JoinCriterion and(BasicColumn joinColumn, JoinCondition joinCondition) {
return new JoinCriterion.Builder()
Expand Down
69 changes: 43 additions & 26 deletions src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,10 @@ public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition,
@NotNull
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition,
List<AndOrCriteriaGroup> subCriteria) {
initialCriterion = buildCriterion(column, condition, subCriteria);
initialCriterion = ColumnAndConditionCriterion.withColumn(column)
.withCondition(condition)
.withSubCriteria(subCriteria)
.build();
return getThis();
}

Expand All @@ -53,7 +56,8 @@ public T where(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria

@NotNull
public T where(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
initialCriterion = buildCriterion(existsPredicate, subCriteria);
initialCriterion = new ExistsCriterion.Builder()
.withExistsPredicate(existsPredicate).withSubCriteria(subCriteria).build();
return getThis();
}

Expand All @@ -64,7 +68,18 @@ public T where(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria)

@NotNull
public T where(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
this.initialCriterion = buildCriterion(initialCriterion, subCriteria);
this.initialCriterion = new CriteriaGroup.Builder()
.withInitialCriterion(initialCriterion)
.withSubCriteria(subCriteria)
.build();
return getThis();
}

@NotNull
public T where(List<AndOrCriteriaGroup> criteria) {
initialCriterion = new CriteriaGroup.Builder()
.withSubCriteria(criteria)
.build();
return getThis();
}

Expand All @@ -83,7 +98,7 @@ public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
@NotNull
public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition,
List<AndOrCriteriaGroup> subCriteria) {
addSubCriteria("and", buildCriterion(column, condition), subCriteria);
addSubCriteria("and", buildCriterion(column, condition), subCriteria); //$NON-NLS-1$
return getThis();
}

Expand All @@ -94,7 +109,7 @@ public T and(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria)

@NotNull
public T and(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
addSubCriteria("and", buildCriterion(existsPredicate), subCriteria);
addSubCriteria("and", buildCriterion(existsPredicate), subCriteria); //$NON-NLS-1$
return getThis();
}

Expand All @@ -105,7 +120,13 @@ public T and(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {

@NotNull
public T and(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
addSubCriteria("and", buildCriterion(initialCriterion), subCriteria);
addSubCriteria("and", buildCriterion(initialCriterion), subCriteria); //$NON-NLS-1$
return getThis();
}

@NotNull
public T and(List<AndOrCriteriaGroup> criteria) {
addSubCriteria("and", criteria); //$NON-NLS-1$
return getThis();
}

Expand All @@ -118,7 +139,7 @@ public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
@NotNull
public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition,
List<AndOrCriteriaGroup> subCriteria) {
addSubCriteria("or", buildCriterion(column, condition), subCriteria);
addSubCriteria("or", buildCriterion(column, condition), subCriteria); //$NON-NLS-1$
return getThis();
}

Expand All @@ -129,7 +150,7 @@ public T or(ExistsPredicate existsPredicate, AndOrCriteriaGroup...subCriteria) {

@NotNull
public T or(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
addSubCriteria("or", buildCriterion(existsPredicate), subCriteria);
addSubCriteria("or", buildCriterion(existsPredicate), subCriteria); //$NON-NLS-1$
return getThis();
}

Expand All @@ -140,7 +161,13 @@ public T or(SqlCriterion initialCriterion, AndOrCriteriaGroup...subCriteria) {

@NotNull
public T or(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
addSubCriteria("or", buildCriterion(initialCriterion), subCriteria);
addSubCriteria("or", buildCriterion(initialCriterion), subCriteria); //$NON-NLS-1$
return getThis();
}

@NotNull
public T or(List<AndOrCriteriaGroup> criteria) {
addSubCriteria("or", criteria); //$NON-NLS-1$
return getThis();
}

Expand All @@ -152,31 +179,14 @@ private <R> SqlCriterion buildCriterion(BindableColumn<R> column, VisitableCondi
return ColumnAndConditionCriterion.withColumn(column).withCondition(condition).build();
}

private <R> SqlCriterion buildCriterion(BindableColumn<R> column, VisitableCondition<R> condition,
List<AndOrCriteriaGroup> subCriteria) {
return ColumnAndConditionCriterion.withColumn(column)
.withCondition(condition)
.withSubCriteria(subCriteria)
.build();
}

private SqlCriterion buildCriterion(ExistsPredicate existsPredicate) {
return new ExistsCriterion.Builder().withExistsPredicate(existsPredicate).build();
}

private SqlCriterion buildCriterion(ExistsPredicate existsPredicate,
List<AndOrCriteriaGroup> subCriteria) {
return new ExistsCriterion.Builder().withExistsPredicate(existsPredicate).withSubCriteria(subCriteria).build();
}

private SqlCriterion buildCriterion(SqlCriterion initialCriterion) {
return new CriteriaGroup.Builder().withInitialCriterion(initialCriterion).build();
}

private SqlCriterion buildCriterion(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
return new CriteriaGroup.Builder().withInitialCriterion(initialCriterion).withSubCriteria(subCriteria).build();
}

private void addSubCriteria(String connector, SqlCriterion initialCriterion,
List<AndOrCriteriaGroup> subCriteria) {
this.subCriteria.add(new AndOrCriteriaGroup.Builder()
Expand All @@ -186,5 +196,12 @@ private void addSubCriteria(String connector, SqlCriterion initialCriterion,
.build());
}

private void addSubCriteria(String connector, List<AndOrCriteriaGroup> criteria) {
this.subCriteria.add(new AndOrCriteriaGroup.Builder()
.withConnector(connector)
.withSubCriteria(criteria)
.build());
}

protected abstract T getThis();
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ public W where(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriter
return apply(w -> w.where(initialCriterion, subCriteria));
}

public W where(List<AndOrCriteriaGroup> subCriteria) {
return apply(w -> w.where(subCriteria));
}

public W applyWhere(WhereApplier whereApplier) {
return apply(w -> w.applyWhere(whereApplier));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,18 @@ public Optional<RenderedCriterion> visit(ExistsCriterion criterion) {

@Override
public Optional<RenderedCriterion> visit(CriteriaGroup criterion) {
return render(criterion.initialCriterion(), criterion.subCriteria(), this::calculateFragment);
return renderCriteriaGroup(criterion, this::calculateFragment);
}

@Override
public Optional<RenderedCriterion> visit(NotCriterion criterion) {
return render(criterion.initialCriterion(), criterion.subCriteria(), this::calculateNotFragment);
return renderCriteriaGroup(criterion, this::calculateNotFragment);
}

private Optional<RenderedCriterion> renderCriteriaGroup(CriteriaGroup criterion,
Function<FragmentCollector, String> fragmentCalculator) {
return criterion.initialCriterion().map(ic -> render(ic, criterion.subCriteria(), fragmentCalculator))
.orElseGet(() -> render(criterion.subCriteria(), fragmentCalculator));
}

public Optional<RenderedCriterion> render(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

import org.mybatis.dynamic.sql.SqlCriterion;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
import org.mybatis.dynamic.sql.util.FragmentCollector;
Expand All @@ -41,15 +42,22 @@ private WhereRenderer(Builder builder) {
}

public Optional<WhereClauseProvider> render() {
return whereModel.initialCriterion().map(ic ->
criterionRenderer.render(ic, whereModel.subCriteria(), this::calculateWhereClause))
.orElseGet(() -> criterionRenderer.render(whereModel.subCriteria(), this::calculateWhereClause))
return whereModel.initialCriterion().map(this::renderWithInitialCriterion)
.orElseGet(this::renderWithoutInitialCriterion)
.map(rc -> WhereClauseProvider.withWhereClause(rc.fragmentAndParameters().fragment())
.withParameters(rc.fragmentAndParameters().parameters())
.build()
);
}

private Optional<RenderedCriterion> renderWithInitialCriterion(SqlCriterion initialCriterion) {
return criterionRenderer.render(initialCriterion, whereModel.subCriteria(), this::calculateWhereClause);
}

private Optional<RenderedCriterion> renderWithoutInitialCriterion() {
return criterionRenderer.render(whereModel.subCriteria(), this::calculateWhereClause);
}

private String calculateWhereClause(FragmentCollector collector) {
return collector.fragments()
.collect(Collectors.joining(" ", "where ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
Expand Down
Loading