All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.javaer.jany.jooq.PGDSL Maven / Gradle / Ivy

package cn.javaer.jany.jooq;

import cn.javaer.jany.jackson.Json;
import cn.javaer.jany.jooq.condition.ContainedInCondition;
import cn.javaer.jany.jooq.field.JsonbField;
import cn.javaer.jany.type.Geometry;
import org.jooq.Condition;
import org.jooq.Converter;
import org.jooq.DataType;
import org.jooq.Field;
import org.jooq.JSONB;
import org.jooq.Record;
import org.jooq.SQLDialect;
import org.jooq.Support;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.util.postgres.PostgresDSL;

import java.util.Arrays;
import java.util.Collections;

/**
 * @author cn-src
 */
@SuppressWarnings("AlibabaClassNamingShouldBeCamel")
public class PGDSL extends PostgresDSL {
    public static final String JSONB_SQL_TYPE = "jsonb";

    @SuppressWarnings({"unchecked", "rawtypes"})
    public static DataType GEOMETRY_TYPE =
        SQLDataType.OTHER.asConvertedDataType((Converter) PostGISGeometryConverter.INSTANCE);

    protected PGDSL() {
    }

    @Support(SQLDialect.POSTGRES)
    public static  Condition contains(final Field field, final T value) {
        if (JSONB_SQL_TYPE.equals(field.getDataType().getTypeName())) {
            return DSL.condition("{0} @> {1}::jsonb", field,
                DSL.val(Json.DEFAULT.write(value), field.getDataType()));
        }
        return field.contains(value);
    }

    /**
     * 被包含,操作符: <@
     */
    @Support(SQLDialect.POSTGRES)
    public static  Condition containedIn(final Field field, final T value) {
        return new ContainedInCondition<>(field, value);
    }

    @Support(SQLDialect.POSTGRES)
    public static Condition jsonbContains(final Field jsonField, final String jsonKey,
                                          final Object jsonValue) {
        final String json = Json.DEFAULT.write(Collections.singletonMap(jsonKey, jsonValue));
        return DSL.condition("{0} @> {1}::jsonb", jsonField,
            DSL.val(json, jsonField.getDataType()));
    }

    @Support(SQLDialect.POSTGRES)
    public static JsonbField jsonbObjectAgg(final Field[] keyFields,
                                                           final char keySeparator,
                                                           final Field valueField) {

        final Field field =
            Arrays.stream(keyFields).reduce((f1, f2) -> f1.concat(DSL.inline(keySeparator),
                f2)).orElse(null);
        return new JsonbField<>("jsonb_object_agg", SQLDataType.JSONB, field, valueField);
    }

    /**
     * 自定义聚合函数: first, 取每组中第一个元素.
     * 

* * CREATE OR REPLACE FUNCTION public.first_agg (anyelement, anyelement) * RETURNS anyelement * LANGUAGE sql IMMUTABLE STRICT AS * 'SELECT $1;' * * CREATE AGGREGATE public.first(anyelement) ( * SFUNC = public.first_agg, * STYPE = anyelement * ); * * * @param field field * @param field type * * @return field */ @Support(SQLDialect.POSTGRES) public static Field first(final Field field) { return DSL.function("first", field.getDataType(), field); } @Support(SQLDialect.POSTGRES) public static Field stContains(final Field geomA, final Field geomB) { return DSL.function("ST_Contains", SQLDataType.BOOLEAN, geomA, geomB); } @Support(SQLDialect.POSTGRES) public static Field stAsGeoJson(final Field geom) { return DSL.function("ST_AsGeoJSON", SQLDataType.LONGVARCHAR, geom); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy