Skip to content
This repository has been archived by the owner on Jul 31, 2020. It is now read-only.

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
cn-src committed Apr 7, 2020
1 parent b13a73e commit 6472021
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 37 deletions.
55 changes: 21 additions & 34 deletions src/main/java/cn/javaer/snippets/box/jooq/ConditionBuilder.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
package cn.javaer.snippets.box.jooq;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.jooq.Condition;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
Expand All @@ -20,7 +19,15 @@
* @author cn-src
*/
public class ConditionBuilder {

@FunctionalInterface
public interface Function3<T1, T2, T3>
extends Serializable {
Condition apply(T1 argument1, T2 argument2, T3 argument3);
}

private final List<Condition> conditions = new ArrayList<>();
private final ObjectMapper objectMapper = new ObjectMapper();

public ConditionBuilder append(final Supplier<Condition> supplier) {
this.conditions.add(supplier.get());
Expand All @@ -36,49 +43,29 @@ public <T> ConditionBuilder append(final Function<T, Condition> fun, final T val
return this;
}

@SafeVarargs
public final <T> ConditionBuilder append(final Function<T[], Condition> fun, final T... values) {
if (ObjectUtils.isEmpty(values)) {
public <T1, T2> ConditionBuilder append(final BiFunction<T1, T2, Condition> fun, final T1 t1, final T2 t2) {
if (null == t1 || null == t2) {
return this;
}

//noinspection unchecked
final T[] objects = (T[]) Arrays.stream(values)
.filter(Objects::nonNull)
.toArray();

if (objects.length == 0) {
return this;
}

this.conditions.add(fun.apply(objects));
this.conditions.add(fun.apply(t1, t2));
return this;
}

public ConditionBuilder append(final Function<String[], Condition> fun, final String... values) {
if (ObjectUtils.isEmpty(values)) {
return this;
}

final String[] toArray = Arrays.stream(values)
.filter(StringUtils::hasLength)
.toArray(String[]::new);

if (toArray.length == 0) {
public ConditionBuilder dateTime(final BiFunction<LocalDateTime, LocalDateTime, Condition> fun, final LocalDate start, final LocalDate end) {
if (null == start || null == end) {
return this;
}

this.conditions.add(fun.apply(toArray));
final LocalDateTime startTime = start.atStartOfDay();
final LocalDateTime endTime = end.atTime(LocalTime.MAX);
this.conditions.add(fun.apply(startTime, endTime));
return this;
}

public ConditionBuilder append(final BiFunction<LocalDateTime, LocalDateTime, Condition> fun, final LocalDate start, final LocalDate end) {
if (null == start || null == end) {
public <T1, T2, T3> ConditionBuilder append(final Function3<T1, T2, T3> fun, final T1 t1, final T2 t2, final T3 t3) {
if (t1 == null || t2 == null || t3 == null) {
return this;
}
final LocalDateTime startTime = start.atStartOfDay();
final LocalDateTime endTime = end.atTime(LocalTime.MAX);
this.conditions.add(fun.apply(startTime, endTime));
this.conditions.add(fun.apply(t1, t2, t3));
return this;
}

Expand Down
36 changes: 36 additions & 0 deletions src/main/java/cn/javaer/snippets/box/jooq/Sql.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package cn.javaer.snippets.box.jooq;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jooq.Condition;
import org.jooq.Field;
import org.jooq.JSONB;
import org.jooq.impl.DSL;

import java.util.Collections;

/**
* @author cn-src
*/
public class Sql {

private static final ObjectMapper objectMapper = new ObjectMapper();

private Sql() {}

public static Condition arrayContained(final Field<String[]> arrayField, final String[] arrayValue) {
return DSL.condition("{0} <@ {1}", arrayField,
DSL.val(arrayValue, arrayField.getDataType()));
}

public static Condition jsonbContains(final Field<JSONB> jsonField, final String jsonKey, final Object jsonValue) {
try {
final String json = Sql.objectMapper.writeValueAsString(Collections.singletonMap(jsonKey, jsonValue));
return DSL.condition("{0}::jsonb @> {1}::jsonb", jsonField,
DSL.val(json, jsonField.getDataType()));
}
catch (final JsonProcessingException e) {
throw new IllegalStateException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package cn.javaer.snippets.box.jooq;

import org.jooq.Condition;
import org.jooq.Field;
import org.jooq.JSONB;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.junit.jupiter.api.Test;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
* @author cn-src
*/
Expand All @@ -13,8 +19,22 @@ class ConditionBuilderTest {
void append() {
final Field<String> objectField = DSL.field("object", String.class);
final Field<String[]> arrayField = DSL.field("array", String[].class);
new ConditionBuilder()
.append(objectField::contains, "")
.append(arrayField::contains, "", "");
final Field<JSONB> jsonbField = DSL.field("jsonb", JSONB.class);
final Field<LocalDateTime> dateTimeField = DSL.field("dateTime", LocalDateTime.class);

final Condition condition = new ConditionBuilder()
.append(objectField::contains, "object")
.append(arrayField::contains, new String[]{"str1", "str2"})
.dateTime(dateTimeField::betweenSymmetric, LocalDate.now(), LocalDate.now())
.append(Sql::arrayContained, arrayField, new String[]{"value"})
.append(Sql::jsonbContains, jsonbField, "key", "value")
.build();

final String sql = DSL.using(SQLDialect.POSTGRES)
.select(objectField, arrayField, jsonbField)
.from(DSL.table("demo_table"))
.where(condition)
.getSQL();
System.out.println(sql);
}
}

0 comments on commit 6472021

Please sign in to comment.