Skip to content

Commit

Permalink
Postgres Ranges support (WIP)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alotor committed Jul 26, 2014
1 parent 142908c commit 5e9beb4
Show file tree
Hide file tree
Showing 13 changed files with 502 additions and 1 deletion.
2 changes: 1 addition & 1 deletion grails-app/conf/DataSource.groovy
Expand Up @@ -13,7 +13,7 @@ hibernate {
environments {
development {
dataSource {
dbCreate = "" // one of '', 'create', 'create-drop','update'
dbCreate = "create-drop" // one of '', 'create', 'create-drop','update'
driverClassName = "org.postgresql.Driver"
dialect = "net.kaleidos.hibernate.PostgresqlExtensionsDialect"
url = "jdbc:postgresql://localhost:5432/pg_extensions"
Expand Down
16 changes: 16 additions & 0 deletions grails-app/domain/test/range/TestDateRange.groovy
@@ -0,0 +1,16 @@
package test.range

import net.kaleidos.hibernate.postgresql.range.DateRange
import net.kaleidos.hibernate.usertype.RangeType

class TestDateRange {
DateRange dateRange

static mapping = {
dateRange type:RangeType, params: ["type": DateRange]
}

static constraints = {
dateRange nullable: true
}
}
16 changes: 16 additions & 0 deletions grails-app/domain/test/range/TestIntegerRange.groovy
@@ -0,0 +1,16 @@
package test.range

import net.kaleidos.hibernate.postgresql.range.IntegerRange
import net.kaleidos.hibernate.usertype.RangeType

class TestIntegerRange {
IntegerRange integerRange

static mapping = {
integerRange type:RangeType, params: ["type": IntegerRange]
}

static constraints = {
integerRange nullable: true
}
}
16 changes: 16 additions & 0 deletions grails-app/domain/test/range/TestLongRange.groovy
@@ -0,0 +1,16 @@
package test.range

import net.kaleidos.hibernate.postgresql.range.LongRange
import net.kaleidos.hibernate.usertype.RangeType

class TestLongRange {
LongRange longRange

static mapping = {
longRange type:RangeType, params: ["type": LongRange]
}

static constraints = {
longRange nullable: true
}
}
16 changes: 16 additions & 0 deletions grails-app/domain/test/range/TestTimestampRange.groovy
@@ -0,0 +1,16 @@
package test.range

import net.kaleidos.hibernate.postgresql.range.TimestampRange
import net.kaleidos.hibernate.usertype.RangeType

class TestTimestampRange {
TimestampRange timestampRange

static mapping = {
timestampRange type:RangeType, params: ["type": TimestampRange]
}

static constraints = {
timestampRange nullable: true
}
}
@@ -0,0 +1,21 @@
package net.kaleidos.hibernate.postgresql.range

class DateRange {
ObjectRange range

public DateRange(Date from, Date to) {
range = new ObjectRange(from, to)
}

public Date getFrom(){
return range?.from
}

public Date getTo(){
return range?.to
}

public Range toRange(){
return range
}
}
@@ -0,0 +1,21 @@
package net.kaleidos.hibernate.postgresql.range

class IntegerRange {
IntRange range

public IntegerRange(Integer from, Integer to) {
range = new IntRange(from, to)
}

public Integer getFrom(){
return range?.from
}

public Integer getTo(){
return range?.to
}

public Range toRange(){
return range
}
}
@@ -0,0 +1,21 @@
package net.kaleidos.hibernate.postgresql.range

class LongRange {
ObjectRange range

public LongRange(Long from, Long to) {
range = new ObjectRange(from, to)
}

public Long getFrom(){
return range?.from
}

public Long getTo(){
return range?.to
}

public Range toRange(){
return range
}
}
@@ -0,0 +1,21 @@
package net.kaleidos.hibernate.postgresql.range

class TimestampRange {
ObjectRange range

public TimestampRange(Date from, Date to) {
range = new ObjectRange(from, to)
}

public Date getFrom(){
return range?.from
}

public Date getTo(){
return range?.to
}

public Range toRange(){
return range
}
}
63 changes: 63 additions & 0 deletions src/groovy/net/kaleidos/hibernate/utils/PgRangeUtils.groovy
@@ -0,0 +1,63 @@
package net.kaleidos.hibernate.utils

import net.kaleidos.hibernate.postgresql.range.IntegerRange
import net.kaleidos.hibernate.postgresql.range.LongRange
import net.kaleidos.hibernate.postgresql.range.DateRange
import net.kaleidos.hibernate.postgresql.range.TimestampRange

public class PgRangeUtils {
private static final String DATE_FORMAT = "yyyy-MM-dd"
private static final String TS_FORMAT = "yyyy-MM-dd hh:mm:ss"

public static IntegerRange parseIntegerRange(String pgResult) {
String parentRemoved = pgResult.substring(1, pgResult.length() -1)
String[] splitted = parentRemoved.split(",")
return new IntegerRange(new Integer(splitted[0]), new Integer(splitted[1]) -1)
}

public static LongRange parseLongRange(String pgResult) {
String parentRemoved = pgResult.substring(1, pgResult.length() -1)
String[] splitted = parentRemoved.split(",")
return new LongRange(new Long(splitted[0]), new Long(splitted[1]) -1)
}

public static DateRange parseDateRange(String pgResult) {
String parentRemoved = pgResult.substring(1, pgResult.length() -1)
String[] splitted = parentRemoved.split(",")
return new DateRange(Date.parse(DATE_FORMAT, splitted[0]), Date.parse(DATE_FORMAT, splitted[1]-1))
}

public static TimestampRange parseTimestampRange(String pgResult) {
String parentRemoved = pgResult.substring(1, pgResult.length() -1)
String[] splitted = parentRemoved.split(",")
return new TimestampRange(Date.parse(TS_FORMAT, splitted[0]), Date.parse(TS_FORMAT, splitted[1]))
}

public static String format(IntegerRange range) {
if (!range) {
return null
}
return "[" + range.getFrom() + ", " + range.getTo() + "]"
}

public static String format(LongRange range) {
if (!range) {
return null
}
return "[" + range.getFrom() + ", " + range.getTo() + "]"
}

public static String format(DateRange range) {
if (!range) {
return null
}
return "[" + range.getFrom().format(DATE_FORMAT) + ", " + range.getTo().format(DATE_FORMAT) + "]"
}

public static String format(TimestampRange range) {
if (!range) {
return null
}
return "[" + range.getFrom().format(TS_FORMAT) + ", " + range.getTo().format(TS_FORMAT) + "]"
}
}
Expand Up @@ -3,6 +3,7 @@
import net.kaleidos.hibernate.usertype.ArrayType;
import net.kaleidos.hibernate.usertype.HstoreType;
import net.kaleidos.hibernate.usertype.JsonMapType;
import net.kaleidos.hibernate.usertype.RangeType;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.PostgreSQL81Dialect;
import org.hibernate.id.PersistentIdentifierGenerator;
Expand All @@ -28,6 +29,12 @@ public PostgresqlExtensionsDialect() {
registerColumnType(ArrayType.FLOAT_ARRAY, "float[]");
registerColumnType(HstoreType.SQLTYPE, "hstore");
registerColumnType(JsonMapType.SQLTYPE, "json");

registerColumnType(RangeType.INTEGER_RANGE, "int4range");
registerColumnType(RangeType.LONG_RANGE, "int8range");
registerColumnType(RangeType.TIMESTAMP_RANGE, "tsrange");
//registerColumnType(RangeType.TIMESTAMP_TZ_RANGE, "tstzrange");
registerColumnType(RangeType.DATE_RANGE, "daterange");
}

/**
Expand Down

0 comments on commit 5e9beb4

Please sign in to comment.