diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index c8d7ae8b8b..b93ca672a0 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -2027,6 +2027,19 @@ public abstract class AbstractDatabase implements Database { .withIncludeTypes("_daterange") .withPriority(Integer.MIN_VALUE) ); + + getConfiguredForcedTypes().add(new ForcedType() + .withUserType("org.jooq.postgres.extensions.types.LocalDateTimeRange") + .withBinding("org.jooq.postgres.extensions.bindings.LocalDateTimeRangeBinding") + .withIncludeTypes("tsrange") + .withPriority(Integer.MIN_VALUE) + ); + getConfiguredForcedTypes().add(new ForcedType() + .withUserType("org.jooq.postgres.extensions.types.LocalDateTimeRange[]") + .withBinding("org.jooq.postgres.extensions.bindings.LocalDateTimeRangeArrayBinding") + .withIncludeTypes("_tsrange") + .withPriority(Integer.MIN_VALUE) + ); } else { getConfiguredForcedTypes().add(new ForcedType() @@ -2041,7 +2054,33 @@ public abstract class AbstractDatabase implements Database { .withIncludeTypes("_daterange") .withPriority(Integer.MIN_VALUE) ); + + getConfiguredForcedTypes().add(new ForcedType() + .withUserType("org.jooq.postgres.extensions.types.TimestampRange") + .withBinding("org.jooq.postgres.extensions.bindings.TimestampRangeBinding") + .withIncludeTypes("tsrange") + .withPriority(Integer.MIN_VALUE) + ); + getConfiguredForcedTypes().add(new ForcedType() + .withUserType("org.jooq.postgres.extensions.types.TimestampRange[]") + .withBinding("org.jooq.postgres.extensions.bindings.TimestampRangeArrayBinding") + .withIncludeTypes("_tsrange") + .withPriority(Integer.MIN_VALUE) + ); } + + getConfiguredForcedTypes().add(new ForcedType() + .withUserType("org.jooq.postgres.extensions.types.OffsetDateTimeRange") + .withBinding("org.jooq.postgres.extensions.bindings.OffsetDateTimeRangeBinding") + .withIncludeTypes("tstzrange") + .withPriority(Integer.MIN_VALUE) + ); + getConfiguredForcedTypes().add(new ForcedType() + .withUserType("org.jooq.postgres.extensions.types.OffsetDateTimeRange[]") + .withBinding("org.jooq.postgres.extensions.bindings.OffsetDateTimeRangeArrayBinding") + .withIncludeTypes("_tstzrange") + .withPriority(Integer.MIN_VALUE) + ); } catch (ClassNotFoundException ignore) { log.debug("Built in data types", "org.jooq.postgres.extensions.types.Hstore not found on classpath, ignoring built in data type extensions"); diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractInetBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractInetBinding.java index 572632a6f6..9e2c9e4d42 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractInetBinding.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractInetBinding.java @@ -44,10 +44,7 @@ import org.jooq.BindingGetResultSetContext; import org.jooq.BindingGetStatementContext; import org.jooq.BindingRegisterContext; import org.jooq.BindingSetStatementContext; -import org.jooq.Converter; -import org.jooq.postgres.extensions.converters.InetConverter; import org.jooq.postgres.extensions.types.AbstractInet; -import org.jooq.postgres.extensions.types.Inet; /** * A binding for the PostgreSQL inet or cidr data diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractPostgresArrayBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractPostgresArrayBinding.java index c295937495..ce8d34cc74 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractPostgresArrayBinding.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/AbstractPostgresArrayBinding.java @@ -39,17 +39,12 @@ package org.jooq.postgres.extensions.bindings; import java.sql.Array; import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; import java.sql.Types; import org.jooq.BindingGetResultSetContext; -import org.jooq.BindingGetSQLInputContext; import org.jooq.BindingGetStatementContext; import org.jooq.BindingRegisterContext; -import org.jooq.BindingSQLContext; -import org.jooq.BindingSetSQLOutputContext; import org.jooq.BindingSetStatementContext; -import org.jooq.impl.AbstractBinding; /** * A common base class for bindings in this module. diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/LocalDateTimeRangeArrayBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/LocalDateTimeRangeArrayBinding.java new file mode 100644 index 0000000000..fa9afd6636 --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/LocalDateTimeRangeArrayBinding.java @@ -0,0 +1,62 @@ +/* + * 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.postgres.extensions.bindings; + +import org.jooq.Converter; +import org.jooq.postgres.extensions.converters.LocalDateTimeRangeConverter; +import org.jooq.postgres.extensions.types.LocalDateTimeRange; + +/** + * A binding for the PostgreSQL tsrange[] data type. + * + * @author Lukas Eder + */ +public class LocalDateTimeRangeArrayBinding extends AbstractPostgresArrayBinding { + + private static final Converter CONVERTER = new LocalDateTimeRangeConverter().forArrays(); + + @Override + public Converter converter() { + return CONVERTER; + } + + @Override + protected String castType() { + return "tsrange[]"; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/LocalDateTimeRangeBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/LocalDateTimeRangeBinding.java new file mode 100644 index 0000000000..a0b0e23286 --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/LocalDateTimeRangeBinding.java @@ -0,0 +1,62 @@ +/* + * 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.postgres.extensions.bindings; + +import org.jooq.Converter; +import org.jooq.postgres.extensions.converters.LocalDateTimeRangeConverter; +import org.jooq.postgres.extensions.types.LocalDateTimeRange; + +/** + * A binding for the PostgreSQL tsrange data type. + * + * @author Lukas Eder + */ +public class LocalDateTimeRangeBinding extends AbstractRangeBinding { + + private static final Converter CONVERTER = new LocalDateTimeRangeConverter(); + + @Override + public Converter converter() { + return CONVERTER; + } + + @Override + protected String castType() { + return "tsrange"; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/OffsetDateTimeRangeArrayBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/OffsetDateTimeRangeArrayBinding.java new file mode 100644 index 0000000000..df2e84dbba --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/OffsetDateTimeRangeArrayBinding.java @@ -0,0 +1,62 @@ +/* + * 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.postgres.extensions.bindings; + +import org.jooq.Converter; +import org.jooq.postgres.extensions.converters.OffsetDateTimeRangeConverter; +import org.jooq.postgres.extensions.types.OffsetDateTimeRange; + +/** + * A binding for the PostgreSQL tstzrange[] data type. + * + * @author Lukas Eder + */ +public class OffsetDateTimeRangeArrayBinding extends AbstractPostgresArrayBinding { + + private static final Converter CONVERTER = new OffsetDateTimeRangeConverter().forArrays(); + + @Override + public Converter converter() { + return CONVERTER; + } + + @Override + protected String castType() { + return "tstzrange[]"; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/OffsetDateTimeRangeBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/OffsetDateTimeRangeBinding.java new file mode 100644 index 0000000000..07a2e96e4c --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/OffsetDateTimeRangeBinding.java @@ -0,0 +1,62 @@ +/* + * 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.postgres.extensions.bindings; + +import org.jooq.Converter; +import org.jooq.postgres.extensions.converters.OffsetDateTimeRangeConverter; +import org.jooq.postgres.extensions.types.OffsetDateTimeRange; + +/** + * A binding for the PostgreSQL tstzrange data type. + * + * @author Lukas Eder + */ +public class OffsetDateTimeRangeBinding extends AbstractRangeBinding { + + private static final Converter CONVERTER = new OffsetDateTimeRangeConverter(); + + @Override + public Converter converter() { + return CONVERTER; + } + + @Override + protected String castType() { + return "tstzrange"; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/TimestampRangeArrayBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/TimestampRangeArrayBinding.java new file mode 100644 index 0000000000..444fb6ba6b --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/TimestampRangeArrayBinding.java @@ -0,0 +1,62 @@ +/* + * 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.postgres.extensions.bindings; + +import org.jooq.Converter; +import org.jooq.postgres.extensions.converters.TimestampRangeConverter; +import org.jooq.postgres.extensions.types.TimestampRange; + +/** + * A binding for the PostgreSQL tsrange[] data type. + * + * @author Lukas Eder + */ +public class TimestampRangeArrayBinding extends AbstractPostgresArrayBinding { + + private static final Converter CONVERTER = new TimestampRangeConverter().forArrays(); + + @Override + public Converter converter() { + return CONVERTER; + } + + @Override + protected String castType() { + return "tsrange[]"; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/TimestampRangeBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/TimestampRangeBinding.java new file mode 100644 index 0000000000..938de9a39c --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/TimestampRangeBinding.java @@ -0,0 +1,62 @@ +/* + * 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.postgres.extensions.bindings; + +import org.jooq.Converter; +import org.jooq.postgres.extensions.converters.TimestampRangeConverter; +import org.jooq.postgres.extensions.types.TimestampRange; + +/** + * A binding for the PostgreSQL tsrange data type. + * + * @author Lukas Eder + */ +public class TimestampRangeBinding extends AbstractRangeBinding { + + private static final Converter CONVERTER = new TimestampRangeConverter(); + + @Override + public Converter converter() { + return CONVERTER; + } + + @Override + protected String castType() { + return "tsrange"; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/AbstractRangeConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/AbstractRangeConverter.java index 651920a9e4..c3750d04da 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/AbstractRangeConverter.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/AbstractRangeConverter.java @@ -70,9 +70,13 @@ abstract class AbstractRangeConverter> extends Abs String s1 = a[1]; String lower = s0.substring(1); + if (lower.startsWith("\"")) + lower = lower.substring(1, lower.length() - 1); boolean lowerIncluding = s0.charAt(0) == '['; int l = s1.length() - 1; String upper = s1.substring(0, l); + if (upper.startsWith("\"")) + upper = upper.substring(1, upper.length() - 1); boolean upperIncluding = s1.charAt(l) == ']'; return construct( diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/DateRangeConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/DateRangeConverter.java index 2dedf059b9..1f3d78757c 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/DateRangeConverter.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/DateRangeConverter.java @@ -38,17 +38,13 @@ package org.jooq.postgres.extensions.converters; import static org.jooq.postgres.extensions.types.DateRange.dateRange; -import static org.jooq.postgres.extensions.types.LocalDateRange.localDateRange; import java.sql.Date; -import java.time.LocalDate; import org.jooq.postgres.extensions.types.DateRange; -import org.jooq.postgres.extensions.types.IntegerRange; -import org.jooq.postgres.extensions.types.LocalDateRange; /** - * A converter for {@link IntegerRange}. + * A converter for {@link DateRange}. * * @author Lukas Eder */ diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LocalDateRangeConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LocalDateRangeConverter.java index 4d21631dbc..e736396019 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LocalDateRangeConverter.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LocalDateRangeConverter.java @@ -37,18 +37,14 @@ */ package org.jooq.postgres.extensions.converters; -import static org.jooq.postgres.extensions.types.DateRange.dateRange; import static org.jooq.postgres.extensions.types.LocalDateRange.localDateRange; -import java.sql.Date; import java.time.LocalDate; -import org.jooq.postgres.extensions.types.DateRange; -import org.jooq.postgres.extensions.types.IntegerRange; import org.jooq.postgres.extensions.types.LocalDateRange; /** - * A converter for {@link IntegerRange}. + * A converter for {@link LocalDateRange}. * * @author Lukas Eder */ diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LocalDateTimeRangeConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LocalDateTimeRangeConverter.java new file mode 100644 index 0000000000..1a92634fe3 --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LocalDateTimeRangeConverter.java @@ -0,0 +1,78 @@ +/* + * 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.postgres.extensions.converters; + +import static org.jooq.postgres.extensions.types.LocalDateTimeRange.localDateTimeRange; + +import java.sql.Timestamp; +import java.time.LocalDateTime; + +import org.jooq.Converter; +import org.jooq.impl.DefaultConverterProvider; +import org.jooq.postgres.extensions.types.LocalDateTimeRange; + +/** + * A converter for {@link LocalDateTimeRange}. + * + * @author Lukas Eder + */ +public class LocalDateTimeRangeConverter extends AbstractRangeConverter { + + private static final LocalDateTime EPOCH = LocalDateTime.parse("1970-01-01T00:00:00"); + private static final LocalDateTimeRange EMPTY = localDateTimeRange(EPOCH, EPOCH); + private static final Converter CONVERTER = new DefaultConverterProvider().provide(String.class, LocalDateTime.class); + + public LocalDateTimeRangeConverter() { + super(LocalDateTimeRange.class); + } + + @Override + final LocalDateTimeRange construct(String lower, boolean lowerIncluding, String upper, boolean upperIncluding) { + return localDateTimeRange( + CONVERTER.from(lower), + lowerIncluding, + CONVERTER.from(upper), + upperIncluding + ); + } + + @Override + final LocalDateTimeRange empty() { + return EMPTY; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LongRangeConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LongRangeConverter.java index 5437f6d919..ecef6d1df4 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LongRangeConverter.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/LongRangeConverter.java @@ -37,14 +37,12 @@ */ package org.jooq.postgres.extensions.converters; -import static org.jooq.postgres.extensions.types.IntegerRange.integerRange; import static org.jooq.postgres.extensions.types.LongRange.longRange; -import org.jooq.postgres.extensions.types.IntegerRange; import org.jooq.postgres.extensions.types.LongRange; /** - * A converter for {@link IntegerRange}. + * A converter for {@link LongRange}. * * @author Lukas Eder */ diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/OffsetDateTimeRangeConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/OffsetDateTimeRangeConverter.java new file mode 100644 index 0000000000..e698f9f90f --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/OffsetDateTimeRangeConverter.java @@ -0,0 +1,78 @@ +/* + * 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.postgres.extensions.converters; + +import static org.jooq.postgres.extensions.types.OffsetDateTimeRange.offsetDateTimeRange; + +import java.time.LocalDateTime; +import java.time.OffsetDateTime; + +import org.jooq.Converter; +import org.jooq.impl.DefaultConverterProvider; +import org.jooq.postgres.extensions.types.OffsetDateTimeRange; + +/** + * A converter for {@link OffsetDateTimeRange}. + * + * @author Lukas Eder + */ +public class OffsetDateTimeRangeConverter extends AbstractRangeConverter { + + private static final OffsetDateTime EPOCH = OffsetDateTime.parse("1970-01-01T00:00:00Z"); + private static final OffsetDateTimeRange EMPTY = offsetDateTimeRange(EPOCH, EPOCH); + private static final Converter CONVERTER = new DefaultConverterProvider().provide(String.class, OffsetDateTime.class); + + public OffsetDateTimeRangeConverter() { + super(OffsetDateTimeRange.class); + } + + @Override + final OffsetDateTimeRange construct(String lower, boolean lowerIncluding, String upper, boolean upperIncluding) { + return offsetDateTimeRange( + CONVERTER.from(lower), + lowerIncluding, + CONVERTER.from(upper), + upperIncluding + ); + } + + @Override + final OffsetDateTimeRange empty() { + return EMPTY; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/TimestampRangeConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/TimestampRangeConverter.java new file mode 100644 index 0000000000..d6f3ba8d43 --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/TimestampRangeConverter.java @@ -0,0 +1,77 @@ +/* + * 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.postgres.extensions.converters; + +import static org.jooq.postgres.extensions.types.TimestampRange.timestampRange; + +import java.sql.Timestamp; + +import org.jooq.Converter; +import org.jooq.impl.DefaultConverterProvider; +import org.jooq.postgres.extensions.types.TimestampRange; + +/** + * A converter for {@link TimestampRange}. + * + * @author Lukas Eder + */ +public class TimestampRangeConverter extends AbstractRangeConverter { + + private static final Timestamp EPOCH = Timestamp.valueOf("1970-01-01 00:00:00"); + private static final TimestampRange EMPTY = timestampRange(EPOCH, EPOCH); + private static final Converter CONVERTER = new DefaultConverterProvider().provide(String.class, Timestamp.class); + + public TimestampRangeConverter() { + super(TimestampRange.class); + } + + @Override + final TimestampRange construct(String lower, boolean lowerIncluding, String upper, boolean upperIncluding) { + return timestampRange( + CONVERTER.from(lower), + lowerIncluding, + CONVERTER.from(upper), + upperIncluding + ); + } + + @Override + final TimestampRange empty() { + return EMPTY; + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractDiscreteRange.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractDiscreteRange.java index e46d8e01cc..8c5bc89084 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractDiscreteRange.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractDiscreteRange.java @@ -72,7 +72,8 @@ abstract class AbstractDiscreteRange> e abstract R construct(T lower, T upper); final boolean isCanonical() { - return lowerIncluding() && !upperIncluding(); + return (lower() == null || lowerIncluding()) + && (upper() == null || !upperIncluding()); } @SuppressWarnings("unchecked") diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractRange.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractRange.java index a7eafb272d..74b2a1dae7 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractRange.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/AbstractRange.java @@ -50,15 +50,17 @@ import org.jetbrains.annotations.Nullable; public abstract class AbstractRange implements Serializable { private final T lower; - private final boolean lowerIncluding; private final T upper; + private final boolean lowerIncluding; private final boolean upperIncluding; AbstractRange(T lower, boolean lowerIncluding, T upper, boolean upperIncluding) { this.lower = lower; - this.lowerIncluding = lowerIncluding; this.upper = upper; - this.upperIncluding = upperIncluding; + + // In PostgreSQL, there is no [,] range, only (,) + this.lowerIncluding = lower != null && lowerIncluding; + this.upperIncluding = upper != null && upperIncluding; } /** diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/LocalDateTimeRange.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/LocalDateTimeRange.java new file mode 100644 index 0000000000..95237f43bf --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/LocalDateTimeRange.java @@ -0,0 +1,67 @@ +/* + * 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.postgres.extensions.types; + +import java.time.LocalDateTime; + +/** + * A data type representing the PostgreSQL tsrange type. + * + * @author Lukas Eder + */ +public final class LocalDateTimeRange extends AbstractRange { + + private LocalDateTimeRange(LocalDateTime lower, boolean lowerIncluding, LocalDateTime upper, boolean upperIncluding) { + super(lower, lowerIncluding, upper, upperIncluding); + } + + /** + * Create a new {@link LocalDateTimeRange} with a inclusive lower bound and an + * exclusive upper bound. + */ + public static final LocalDateTimeRange localDateTimeRange(LocalDateTime lower, LocalDateTime upper) { + return new LocalDateTimeRange(lower, true, upper, false); + } + + /** + * Create a new {@link LocalDateTimeRange}. + */ + public static final LocalDateTimeRange localDateTimeRange(LocalDateTime lower, boolean lowerIncluding, LocalDateTime upper, boolean upperIncluding) { + return new LocalDateTimeRange(lower, lowerIncluding, upper, upperIncluding); + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/OffsetDateTimeRange.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/OffsetDateTimeRange.java new file mode 100644 index 0000000000..30ca0b34ed --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/OffsetDateTimeRange.java @@ -0,0 +1,67 @@ +/* + * 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.postgres.extensions.types; + +import java.time.OffsetDateTime; + +/** + * A data type representing the PostgreSQL tsrange type. + * + * @author Lukas Eder + */ +public final class OffsetDateTimeRange extends AbstractRange { + + private OffsetDateTimeRange(OffsetDateTime lower, boolean lowerIncluding, OffsetDateTime upper, boolean upperIncluding) { + super(lower, lowerIncluding, upper, upperIncluding); + } + + /** + * Create a new {@link OffsetDateTimeRange} with a inclusive lower bound and an + * exclusive upper bound. + */ + public static final OffsetDateTimeRange offsetDateTimeRange(OffsetDateTime lower, OffsetDateTime upper) { + return new OffsetDateTimeRange(lower, true, upper, false); + } + + /** + * Create a new {@link OffsetDateTimeRange}. + */ + public static final OffsetDateTimeRange offsetDateTimeRange(OffsetDateTime lower, boolean lowerIncluding, OffsetDateTime upper, boolean upperIncluding) { + return new OffsetDateTimeRange(lower, lowerIncluding, upper, upperIncluding); + } +} diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/TimestampRange.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/TimestampRange.java new file mode 100644 index 0000000000..362f24065e --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/TimestampRange.java @@ -0,0 +1,67 @@ +/* + * 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.postgres.extensions.types; + +import java.sql.Timestamp; + +/** + * A data type representing the PostgreSQL tsrange type. + * + * @author Lukas Eder + */ +public final class TimestampRange extends AbstractRange { + + private TimestampRange(Timestamp lower, boolean lowerIncluding, Timestamp upper, boolean upperIncluding) { + super(lower, lowerIncluding, upper, upperIncluding); + } + + /** + * Create a new {@link TimestampRange} with a inclusive lower bound and an + * exclusive upper bound. + */ + public static final TimestampRange timestampRange(Timestamp lower, Timestamp upper) { + return new TimestampRange(lower, true, upper, false); + } + + /** + * Create a new {@link TimestampRange}. + */ + public static final TimestampRange timestampRange(Timestamp lower, boolean lowerIncluding, Timestamp upper, boolean upperIncluding) { + return new TimestampRange(lower, lowerIncluding, upper, upperIncluding); + } +}