diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt index df82950726..8f71ed92b4 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt @@ -572,6 +572,7 @@ term = | ( 'UPPER' | 'UCASE' ) '(' field ')' | 'VAR_POP' '(' field ')' [ over ] | 'VAR_SAMP' '(' field ')' [ over ] +| 'WIDTH_BUCKET' '(' field, field, field, field ')' | binaryLiteral | 'YEAR' '(' field ')' | unsignedNumericLiteral diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 1d74e922d6..833acfb639 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -20289,6 +20289,20 @@ public class DSL { return new CurrentSchema(); } + @Support + public static Field widthBucket(Field field, T low, T high, int buckets) { + return widthBucket(field, Tools.field(low, field.getDataType()), Tools.field(high, field.getDataType()), Tools.field(buckets)); + } + + @Support + public static Field widthBucket(Field field, Field low, Field high, Field buckets) { + return new WidthBucket(field, low, high, buckets); + } + + // ------------------------------------------------------------------------- + // XXX utility API + // ------------------------------------------------------------------------- + /** * Get the default data type for the {@link DSLContext}'s underlying * {@link SQLDialect} and a given Java type. diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 731ffe155f..4c784e043b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -3098,6 +3098,14 @@ class ParserImpl implements Parser { break; + case 'w': + case 'W': + if (N.is(type)) + if ((field = parseFieldWidthBucketIf(ctx)) != null) + return field; + + break; + case 'x': case 'X': if (X.is(type)) @@ -3311,6 +3319,23 @@ class ParserImpl implements Parser { return null; } + private static final Field parseFieldWidthBucketIf(ParserContext ctx) { + if (parseFunctionNameIf(ctx, "WIDTH_BUCKET")) { + parse(ctx, '('); + Field f1 = parseField(ctx, N); + parse(ctx, ','); + Field f2 = parseField(ctx, N); + parse(ctx, ','); + Field f3 = parseField(ctx, N); + parse(ctx, ','); + Field f4 = parseField(ctx, N); + parse(ctx, ')'); + return DSL.widthBucket((Field) f1, (Field) f2, (Field) f3, (Field) f4); + } + + return null; + } + private static final Field parseFieldLeastIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "LEAST")) { parse(ctx, '('); diff --git a/jOOQ/src/main/java/org/jooq/impl/WidthBucket.java b/jOOQ/src/main/java/org/jooq/impl/WidthBucket.java new file mode 100644 index 0000000000..19acce038e --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/WidthBucket.java @@ -0,0 +1,86 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.impl; + +import static org.jooq.impl.DSL.one; +import static org.jooq.impl.DSL.zero; + +import org.jooq.Context; +import org.jooq.Field; + +/** + * @author Lukas Eder + */ +final class WidthBucket extends AbstractField { + + /** + * Generated UID + */ + private static final long serialVersionUID = -4866100604361006859L; + private final Field field; + private final Field low; + private final Field high; + private final Field buckets; + + WidthBucket(Field field, Field low, Field high, Field buckets) { + super(DSL.name("width_bucket"), field.getDataType()); + + this.field = field; + this.low = low; + this.high = high; + this.buckets = buckets; + } + + @SuppressWarnings({ "unchecked" }) + @Override + public void accept(Context ctx) { + switch (ctx.family()) { + + + + + + + default: + ctx.visit( + DSL.when(field.lt(low), zero()) + .when(field.ge(high), buckets.add(one())) + .otherwise((Field) DSL.floor(field.sub(low).mul(buckets).div(high.sub(low))).add(one())) + ); + break; + } + } + +}