Skip to content

Commit

Permalink
DATAJDBC-1953 Introduced DialectCriteriaCondition
Browse files Browse the repository at this point in the history
Signed-off-by: mipo256 <[email protected]>
  • Loading branch information
mipo256 committed Feb 7, 2025
1 parent 8c017fc commit 1f54016
Show file tree
Hide file tree
Showing 7 changed files with 225 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.Test;

import org.springframework.data.relational.core.dialect.condition.Postgres;
import org.springframework.data.relational.core.query.Criteria;
import org.springframework.data.relational.core.sql.SqlIdentifier;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
* An SQL dialect for Oracle.
*
* @author Jens Schauder
* @author Mikahil Polivakha
* @author Mikhail Polivakha
* @since 2.1
*/
public class OracleDialect extends AnsiDialect {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.springframework.data.relational.core.dialect.condition;

import org.springframework.data.relational.core.query.Criteria;

/**
* This interface represents dialect specific conditions used in WHERE causes built by {@link Criteria}.
*
* @author Mikhail Polivakha
*/
public interface DialectCriteriaCondition {

/**
* Render a vendor-specific part of the SQL condition.
*
* @return the rendered part of the SQL statement
*/
String render();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package org.springframework.data.relational.core.dialect.condition;

import org.springframework.data.relational.core.dialect.PostgresDialect;

/**
* {@link DialectCriteriaCondition DialectCriteriaConditions} that are specific to {@link PostgresDialect PostgreSQL Dialect}
*
* @author Mikhail Polivakha
*/
public class Postgres {

/**
* Creates a condition that checks that the assumed column of an {@link java.sql.Array} type
* contains an array of any values
*
* @param values array that assumed column should contain
* @return crafted {@link DialectCriteriaCondition}
*/
public static DialectCriteriaCondition arrayContains(Object... values) {
return () -> "@> ARRAY[%s]".formatted(toLiterals(false, values));
}

/**
* Creates a condition that checks that the assumed column of an {@link java.sql.Array} type
* contains an array of {@link String} values.
*
* @param values array of {@link String String} that assumed column should contain
* @return crafted {@link DialectCriteriaCondition}
*/
public static DialectCriteriaCondition arrayContains(String... values) {
return () -> "@> ARRAY[%s]::text[]".formatted(toLiterals(true, values));
}

/**
* Creates a condition that checks that the assumed column of an {@link java.sql.Array} type
* contains an array of a single {@link String} value.
*
* @param value array of {@link String String} that assumed value should contain
* @return crafted {@link DialectCriteriaCondition}
*/
public static DialectCriteriaCondition arrayContains(String value) {
return arrayContains(new String[]{value});
}

@SafeVarargs
private static <T> String toLiterals(boolean quoted, T... values) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < values.length; i++) {
T value = values[i];

if (value != null) {
if (quoted) {
result.append('\'').append(value).append('\'');
} else {
result.append(value);
}
} else {
result.append("NULL");
}

if (i != values.length - 1) {
result.append(",");
}
}
return result.toString();
}
}
Loading

0 comments on commit 1f54016

Please sign in to comment.