diff --git a/jOOQ-kotlin/src/main/kotlin/org/jooq/kotlin/Extensions.kt b/jOOQ-kotlin/src/main/kotlin/org/jooq/kotlin/Extensions.kt index 564b5ba1fc..e4e67a8ccf 100644 --- a/jOOQ-kotlin/src/main/kotlin/org/jooq/kotlin/Extensions.kt +++ b/jOOQ-kotlin/src/main/kotlin/org/jooq/kotlin/Extensions.kt @@ -2,6 +2,7 @@ package org.jooq.kotlin import org.jetbrains.annotations.Blocking import org.jooq.* +import org.jooq.SQLDialect.* import org.jooq.conf.* import org.jooq.impl.DSL.* import org.jooq.migrations.xml.jaxb.* @@ -304,6 +305,21 @@ operator fun Field?>.get(index: Int) = arrayGet(this, index) @Support operator fun Field?>.get(index: Field) = arrayGet(this, index) +@Support +fun Field?>.filter(predicate: (Field) -> Condition) = arrayFilter(this, predicate) + +@Support +fun Field?>.map(mapper: (Field) -> Field) = arrayMap(this, mapper) + +@Support +fun Field?>.allMatch(predicate: (Field) -> Condition) = arrayAllMatch(this, predicate) + +@Support +fun Field?>.anyMatch(predicate: (Field) -> Condition) = arrayAnyMatch(this, predicate) + +@Support +fun Field?>.noneMatch(predicate: (Field) -> Condition) = arrayNoneMatch(this, predicate) + // ---------------------------------------------------------------------------- // Extensions to make Field and Field aware of its being JSON // ---------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java b/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java index d490b0775c..e117921350 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java @@ -65,7 +65,7 @@ import java.util.stream.*; @SuppressWarnings({ "rawtypes", "unchecked", "unused" }) final class ArrayMap extends - AbstractField + AbstractField implements QOM.ArrayMap { diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 479a64ca7c..2662180146 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -22471,7 +22471,7 @@ public class DSL { */ @NotNull @Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) - public static Field arrayMap(T[] array, Function1, ? extends Field> mapper) { + public static Field arrayMap(T[] array, Function1, ? extends Field> mapper) { return new ArrayMap<>(Tools.field(array), DSL.lambda(array, mapper)); } @@ -22482,7 +22482,7 @@ public class DSL { */ @NotNull @Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) - public static Field arrayMap(T[] array, Lambda1, Field> mapper) { + public static Field arrayMap(T[] array, Lambda1, Field> mapper) { return new ArrayMap<>(Tools.field(array), mapper); } @@ -22493,7 +22493,7 @@ public class DSL { */ @NotNull @Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) - public static Field arrayMap(Field array, Function1, ? extends Field> mapper) { + public static Field arrayMap(Field array, Function1, ? extends Field> mapper) { return new ArrayMap<>(array, DSL.lambda(array, mapper)); } @@ -22504,7 +22504,7 @@ public class DSL { */ @NotNull @Support({ CLICKHOUSE, DUCKDB, H2, HSQLDB, POSTGRES, TRINO, YUGABYTEDB }) - public static Field arrayMap(Field array, Lambda1, Field> mapper) { + public static Field arrayMap(Field array, Lambda1, Field> mapper) { return new ArrayMap<>(array, mapper); } diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index c331893778..7301ef4f4f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -8748,10 +8748,18 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return parseFunctionArgs2((f1, f2) -> arrayConcat(f1, f2)); else if (parseFunctionNameIf("ARRAY_GET", "arrayElement")) return parseFunctionArgs2((f1, f2) -> arrayGet(f1, f2)); - else if ((field = parseFieldArrayFilterIf()) != null) - return field; - else if ((field = parseFieldArrayMapIf()) != null) - return field; + else if (parseFunctionNameIf("ARRAY_FILTER", "arrayFilter")) + return parseArrayLambdaFunction(DSL::arrayFilter); + else if (parseFunctionNameIf("ARRAY_MAP", "arrayMap", "ARRAY_TRANSFORM")) + return parseArrayLambdaFunction(DSL::arrayMap); + else if (parseFunctionNameIf("ARRAY_ALL_MATCH", "arrayAll", "ALL_MATCH")) + return parseArrayLambdaFunction(DSL::arrayAllMatch); + else if (parseFunctionNameIf("ARRAY_ANY_MATCH", "arrayExists", "ANY_MATCH")) + return parseArrayLambdaFunction(DSL::arrayAnyMatch); + else if (parseFunctionNameIf("ARRAY_NONE_MATCH")) + return parseArrayLambdaFunction(DSL::arrayNoneMatch); + else if (parseFunctionNameIf("ARRAY_MAP", "arrayMap", "ARRAY_TRANSFORM")) + return parseArrayLambdaFunction(DSL::arrayMap); else if (parseFunctionNameIf("ARRAY_OVERLAP", "ARRAYS_OVERLAP")) return parseFunctionArgs2((f1, f2) -> arrayOverlap((Field) f1, (Field) f2)); else if (parseFunctionNameIf("ARRAY_PREPEND")) @@ -9199,6 +9207,8 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } else if (parseFunctionNameIf("NEG", "NEGATE")) return parseFunctionArgs1(DSL::neg); + else if (parseFunctionNameIf("NONE_MATCH")) + return parseArrayLambdaFunction(DSL::arrayNoneMatch); break; @@ -9561,8 +9571,8 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return field; else if ((field = parseFieldCastIf()) != null) return field; - else if ((field = parseFieldArrayMapIf()) != null) - return field; + else if (parseFunctionNameIf("TRANSFORM")) + return parseArrayLambdaFunction(DSL::arrayMap); break; @@ -10417,26 +10427,22 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return null; } - private final Field parseFieldArrayFilterIf() { - if (parseFunctionNameIf("ARRAY_FILTER", "arrayFilter")) { - parse('('); - Field f; - Lambda1 l = parseLambdaIf(c -> c.parseCondition()); + private final Field parseArrayLambdaFunction(Function2 function) { + parse('('); + Field f; + Lambda1 l = parseLambdaIf(c -> c.parseField()); - if (l != null && parse(',')) { - f = parseField(); - } - else { - f = parseField(); - parse(','); - l = parseLambda(c -> c.parseCondition()); - } - - parse(')'); - return arrayFilter(f, l); + if (l != null && parse(',')) { + f = parseField(); + } + else { + f = parseField(); + parse(','); + l = parseLambda(c -> c.parseField()); } - return null; + parse(')'); + return function.apply(f, l); } private final Lambda1 parseLambda(Function> field) { @@ -10460,28 +10466,6 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return null; } - private final Field parseFieldArrayMapIf() { - if (parseFunctionNameIf("ARRAY_MAP", "arrayMap", "ARRAY_TRANSFORM", "TRANSFORM")) { - parse('('); - Field f; - Lambda1 l = parseLambdaIf(c -> c.parseField()); - - if (l != null && parse(',')) { - f = parseField(); - } - else { - f = parseField(); - parse(','); - l = parseLambda(c -> c.parseField()); - } - - parse(')'); - return arrayMap(f, l); - } - - return null; - } - private final Field parseFieldArrayConstructIf() { boolean absentOnNull = false; diff --git a/jOOQ/src/main/java/org/jooq/impl/QOM.java b/jOOQ/src/main/java/org/jooq/impl/QOM.java index 1c85b830ca..2c8a0c755c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QOM.java +++ b/jOOQ/src/main/java/org/jooq/impl/QOM.java @@ -6360,7 +6360,7 @@ public final class QOM { public /*sealed*/ interface ArrayMap extends UOperator2, Lambda1, Field>, ArrayMap>, - org.jooq.Field + org.jooq.Field //permits // ArrayMap {