From 0221deb57a03437d33ea5cfd70672353c20cc3ef Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 25 Apr 2024 11:12:44 +0200 Subject: [PATCH] [jOOQ/jOOQ#16071] Support parsing BigQuery ANY_VALUE(x HAVING MAX y) --- .../main/java/org/jooq/impl/ParserImpl.java | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 0bf7e9c140..9ff9ea2dbd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -12192,7 +12192,6 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { - } else if (filter != null && !basic && parseKeywordIf("FILTER")) { parse('('); @@ -12551,12 +12550,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { Field f1 = parseField(); parse(','); Field f2 = parseField(); - - List> sort = null; - - if (parseKeywordIf("ORDER BY")) - sort = parseList(',', c -> c.parseSortField()); - + List> sort = parseAggregateOrderByIf(); parse(')'); OptionallyOrderedAggregateFunction s1 = minBy ? minBy(f1, f2) : maxBy(f1, f2); @@ -12566,17 +12560,31 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return null; } + private final List> parseAggregateOrderBy() { + List> sort = parseAggregateOrderByIf(); + + if (sort == null) + throw expected("ORDER BY"); + + return sort; + } + + private final List> parseAggregateOrderByIf() { + List> sort = null; + + if (parseKeywordIf("ORDER BY")) + sort = parseList(',', c -> c.parseSortField()); + + return sort; + } + private final AggregateFilterStep parseArrayAggFunctionIf() { if (parseKeywordIf("ARRAY_AGG", "groupArray")) { parse('('); boolean distinct = parseSetQuantifier(); Field a1 = parseField(); - List> sort = null; - - if (parseKeywordIf("ORDER BY")) - sort = parseList(',', c -> c.parseSortField()); - + List> sort = parseAggregateOrderByIf(); parse(')'); ArrayAggOrderByStep s1 = distinct @@ -12593,14 +12601,10 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { if (parseKeywordIf("MULTISET_AGG")) { parse('('); parseKeywordIf("ALL"); - List> fields = parseList(',', c -> c.parseField()); - List> sort = null; - - if (parseKeywordIf("ORDER BY")) - sort = parseList(',', c -> c.parseSortField()); - + List> sort = parseAggregateOrderByIf(); parse(')'); + ArrayAggOrderByStep s1 = multisetAgg(fields); return sort == null ? s1 : s1.orderBy(sort); } @@ -12775,6 +12779,22 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { return result; } } + + case ANY_VALUE: { + if (parseKeywordIf("HAVING")) { + boolean min = parseKeywordIf("MIN"); + + if (!min) + parseKeyword("MAX"); + + Field f = parseField(); + List> sort = parseAggregateOrderByIf(); + parse(')'); + + OptionallyOrderedAggregateFunction s1 = min ? minBy(arg, f) : maxBy(arg, f); + return sort == null ? s1 : s1.orderBy(sort); + } + } } parse(')');