Skip to content

Commit a387644

Browse files
committed
change package name from 'org.slick.driver.pg' to 'com.github.tminglei.slickpg'
1 parent 6576722 commit a387644

19 files changed

+199
-48
lines changed

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/slick-pg.iml
21
/project/project
32
/project/target
43
/target

LICENSE.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2121
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2222
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2323
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24-
POSSIBILITY OF SUCH DAMAGE.
24+
POSSIBILITY OF SUCH DAMAGE.

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Usage
1515
To use it, you maybe need integrate it with PostgresDriver like this:
1616
```scala
1717
import slick.driver.PostgresDriver
18-
import com.github.slickpg._
18+
import com.github.tminglei.slickpg._
1919

2020
trait MyPostgresDriver extends PostgresDriver
2121
with PgArraySupport

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
22
<modelVersion>4.0.0</modelVersion>
3-
<groupId>com.github.slickpg</groupId>
3+
<groupId>com.github.tminglei</groupId>
44
<artifactId>slick-pg</artifactId>
55
<version>0.1.0-SNAPSHOT</version>
66
<packaging>jar</packaging>

project/Build.scala

+16-16
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ object SlickPgBuild extends Build {
88
description := "Slick extensions for PostgreSQL",
99
version := "0.1.0-SNAPSHOT",
1010
organizationName := "slick-pg",
11-
organization := "com.github.slickpg",
11+
organization := "com.github.tminglei",
1212

1313
scalaVersion := "2.10.1",
1414
scalaBinaryVersion <<= scalaVersion,
@@ -24,22 +24,22 @@ object SlickPgBuild extends Build {
2424
"com.novocode" % "junit-interface" % "0.10-M4" % "test"
2525
),
2626

27-
resolvers += Resolver.mavenLocal,
28-
publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository"))),
29-
publishMavenStyle := true,
30-
31-
// resolvers += Resolver.sonatypeRepo("snapshots"),
32-
// publishTo <<= version { (v: String) =>
33-
// val nexus = "https://oss.sonatype.org/"
34-
// if (v.trim.endsWith("SNAPSHOT"))
35-
// Some("snapshots" at nexus + "content/repositories/snapshots")
36-
// else
37-
// Some("releases" at nexus + "service/local/staging/deploy/maven2")
38-
// },
27+
// resolvers += Resolver.mavenLocal,
28+
// publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository"))),
3929
// publishMavenStyle := true,
40-
// publishArtifact in Test := false,
41-
// pomIncludeRepository := { _ => false },
42-
// makePomConfiguration ~= { _.copy(configurations = Some(Seq(Compile, Runtime, Optional))) },
30+
31+
resolvers += Resolver.sonatypeRepo("snapshots"),
32+
publishTo <<= version { (v: String) =>
33+
val nexus = "https://oss.sonatype.org/"
34+
if (v.trim.endsWith("SNAPSHOT"))
35+
Some("snapshots" at nexus + "content/repositories/snapshots")
36+
else
37+
Some("releases" at nexus + "service/local/staging/deploy/maven2")
38+
},
39+
publishMavenStyle := true,
40+
publishArtifact in Test := false,
41+
pomIncludeRepository := { _ => false },
42+
makePomConfiguration ~= { _.copy(configurations = Some(Seq(Compile, Runtime, Optional))) },
4343

4444
pomExtra := (
4545
<url>https://github.com/tminglei/slick-pg</url>

project/plugins.sbt

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.4.0")
1414
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.1")
1515

1616
// Add sbt PGP Plugin
17-
addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8")
17+
addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8")

src/main/scala/com/github/slickpg/PgArraySupport.scala src/main/scala/com/github/tminglei.slickpg/PgArraySupport.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import java.util.{Map => JMap, UUID}
44
import scala.slick.driver.{BasicProfile, PostgresDriver}

src/main/scala/com/github/slickpg/PgHStoreSupport.scala src/main/scala/com/github/tminglei.slickpg/PgHStoreSupport.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import scala.slick.driver.{BasicProfile, PostgresDriver}
44
import scala.slick.lifted._

src/main/scala/com/github/slickpg/PgRangeSupport.scala src/main/scala/com/github/tminglei.slickpg/PgRangeSupport.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import java.sql.{Date, Timestamp}
44
import scala.slick.driver.{BasicProfile, PostgresDriver}

src/main/scala/com/github/slickpg/PgSearchSupport.scala src/main/scala/com/github/tminglei.slickpg/PgSearchSupport.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import scala.slick.driver.PostgresDriver
44
import scala.slick.lifted.{OptionMapperDSL, Column, TypeMapper}

src/main/scala/com/github/slickpg/PostGISSupport.scala src/main/scala/com/github/tminglei.slickpg/PostGISSupport.scala

+49-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import com.vividsolutions.jts.io._
44
import com.vividsolutions.jts.geom._
55
import java.sql.SQLException
66
import scala.slick.driver.{BasicProfile, PostgresDriver}
7-
import scala.slick.lifted.{BaseTypeMapper, TypeMapperDelegate, ExtensionMethods, Column}
7+
import scala.slick.lifted._
88
import scala.slick.ast.Library.{SqlFunction, SqlOperator}
99
import scala.slick.ast.{LiteralNode, Node}
1010
import scala.slick.session.{PositionedResult, PositionedParameters}
@@ -33,6 +33,41 @@ trait PostGISSupport { driver: PostgresDriver =>
3333
}
3434
}
3535

36+
trait PostGISAssistants extends PostGISImplicits {
37+
/** Geometry Constructors */
38+
def geomFromText[P, R](wkt: Column[P], srid: Option[Int] = None)(
39+
implicit om: OptionMapperDSL.arg[String, P]#to[Geometry, R]) = srid match {
40+
case Some(srid) => om(PostGISLibrary.GeomFromText.column[Geometry](Node(wkt), LiteralNode(srid)))
41+
case None => om(PostGISLibrary.GeomFromText.column[Geometry](Node(wkt)))
42+
}
43+
def geomFromWKB[P, R](wkb: Column[P], srid: Option[Int] = None)(
44+
implicit om: OptionMapperDSL.arg[Array[Byte], P]#to[Geometry, R]) = srid match {
45+
case Some(srid) => om(PostGISLibrary.GeomFromWKB.column[Geometry](Node(wkb), LiteralNode(srid)))
46+
case None => om(PostGISLibrary.GeomFromWKB.column[Geometry](Node(wkb)))
47+
}
48+
def geomFromEWKT[P, R](ewkt: Column[P])(
49+
implicit om: OptionMapperDSL.arg[String, P]#to[Geometry, R]) = {
50+
om(PostGISLibrary.GeomFromEWKT.column[Geometry](Node(ewkt)))
51+
}
52+
def geomFromEWKB[P, R](ewkb: Column[P])(
53+
implicit om: OptionMapperDSL.arg[Array[Byte], P]#to[Geometry, R]) = {
54+
om(PostGISLibrary.GeomFromEWKB.column[Geometry](Node(ewkb)))
55+
}
56+
def geomFromGML[P, R](gml: Column[P], srid: Option[Int] = None)(
57+
implicit om: OptionMapperDSL.arg[String, P]#to[Geometry, R]) = srid match {
58+
case Some(srid) => om(PostGISLibrary.GeomFromGML.column[Geometry](Node(gml), LiteralNode(srid)))
59+
case None => om(PostGISLibrary.GeomFromGML.column[Geometry](Node(gml)))
60+
}
61+
def geomFromKML[P, R](kml: Column[P])(
62+
implicit om: OptionMapperDSL.arg[String, P]#to[Geometry, R]) = {
63+
om(PostGISLibrary.GeomFromKML.column[Geometry](Node(kml)))
64+
}
65+
def geomFromGeoJSON[P, R](json: Column[P])(
66+
implicit om: OptionMapperDSL.arg[String, P]#to[Geometry, R]) = {
67+
om(PostGISLibrary.GeomFromGeoJSON.column[Geometry](Node(json)))
68+
}
69+
}
70+
3671
//////////////////////////////////////////////////////////////////////////////////
3772

3873
object PostGISLibrary {
@@ -41,7 +76,7 @@ trait PostGISSupport { driver: PostgresDriver =>
4176
val BoxIntersects3D = new SqlOperator("&&&")
4277
val BoxContains = new SqlOperator("~")
4378
val BoxContainedBy = new SqlOperator("@")
44-
val BoxEquals = new SqlOperator("=")
79+
// val BoxEquals = new SqlOperator("=") // it's not necessary
4580
val PointDistance = new SqlOperator("<->")
4681
val BoxDistance = new SqlOperator("<#>")
4782

@@ -54,6 +89,15 @@ trait PostGISSupport { driver: PostgresDriver =>
5489
val BoxLooseAbove = new SqlOperator("|&>")
5590
val BoxStrictAbove = new SqlOperator("|>>")
5691

92+
/** Geometry Constructors */
93+
val GeomFromText = new SqlFunction("ST_GeomFromText")
94+
val GeomFromWKB = new SqlFunction("ST_GeomFromWKB")
95+
val GeomFromEWKT = new SqlFunction("ST_GeomFromEWKT")
96+
val GeomFromEWKB = new SqlFunction("ST_GeomFromEWKB")
97+
val GeomFromGML = new SqlFunction("ST_GeomFromGML")
98+
val GeomFromKML = new SqlFunction("ST_GeomFromKML")
99+
val GeomFromGeoJSON = new SqlFunction("ST_GeomFromGeoJSON")
100+
57101
/** Geometry Accessors */
58102
val GeometryType = new SqlFunction("ST_GeometryType")
59103
val SRID = new SqlFunction("ST_SRID")
@@ -146,10 +190,10 @@ trait PostGISSupport { driver: PostgresDriver =>
146190
def <@[G2, P2, R](geom: Column[P2])(implicit om: o#arg[G2, P2]#to[Boolean, R]) = {
147191
om(PostGISLibrary.BoxContainedBy.column(n, Node(geom)))
148192
}
149-
def <->[G2, P2, R](geom: Column[P2])(implicit om: o#arg[G2, P2]#to[Boolean, R]) = {
193+
def <->[G2, P2, R](geom: Column[P2])(implicit om: o#arg[G2, P2]#to[Double, R]) = {
150194
om(PostGISLibrary.PointDistance.column(n, Node(geom)))
151195
}
152-
def <#>[G2, P2, R](geom: Column[P2])(implicit om: o#arg[G2, P2]#to[Boolean, R]) = {
196+
def <#>[G2, P2, R](geom: Column[P2])(implicit om: o#arg[G2, P2]#to[Double, R]) = {
153197
om(PostGISLibrary.BoxDistance.column(n, Node(geom)))
154198
}
155199

src/main/scala/com/github/slickpg/Range.scala src/main/scala/com/github/tminglei.slickpg/Range.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
case class Range[T](lower: T, upper: T, edge: Range.Edge = Range.IncInf) {
44

src/test/scala/com/github/slickpg/PostGISSupportTest.scala

-12
This file was deleted.

src/test/scala/com/github/slickpg/MyPostgresDriver.scala src/test/scala/com/github/tminglei.slickpg/MyPostgresDriver.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import slick.driver.PostgresDriver
44

@@ -23,6 +23,7 @@ trait MyPostgresDriver extends PostgresDriver
2323
trait SimpleQLPlus extends SimpleQL
2424
with ImplicitsPlus
2525
with SearchAssistants
26+
with PostGISAssistants
2627
}
2728

2829
object MyPostgresDriver extends MyPostgresDriver

src/test/scala/com/github/slickpg/PgArraySupportTest.scala src/test/scala/com/github/tminglei.slickpg/PgArraySupportTest.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import org.junit._
44
import org.junit.Assert._

src/test/scala/com/github/slickpg/PgHStoreSupportTest.scala src/test/scala/com/github/tminglei.slickpg/PgHStoreSupportTest.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import org.junit._
44
import org.junit.Assert._

src/test/scala/com/github/slickpg/PgRangeSupportTest.scala src/test/scala/com/github/tminglei.slickpg/PgRangeSupportTest.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import org.junit._
44
import org.junit.Assert._

src/test/scala/com/github/slickpg/PgSearchSupportTest.scala src/test/scala/com/github/tminglei.slickpg/PgSearchSupportTest.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.slickpg
1+
package com.github.tminglei.slickpg
22

33
import org.junit._
44
import org.junit.Assert._
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.github.tminglei.slickpg
2+
3+
import org.junit._
4+
import org.junit.Assert._
5+
import com.vividsolutions.jts.geom.{Point, Geometry}
6+
import com.vividsolutions.jts.io.{WKBWriter, WKTReader}
7+
8+
class PostGISSupportTest {
9+
import MyPostgresDriver.simple._
10+
11+
val db = Database.forURL(url = "jdbc:postgresql://localhost/test?user=test", driver = "org.postgresql.Driver")
12+
13+
case class GeometryBean(id: Long, geom: Geometry)
14+
15+
object GeomTestTable extends Table[GeometryBean](Some("test"), "geom_test") {
16+
def id = column[Long]("id", O.AutoInc, O.PrimaryKey)
17+
def geom = column[Geometry]("geom")
18+
19+
def * = id ~ geom <> (GeometryBean, GeometryBean.unapply _)
20+
def iCols = geom returning id
21+
}
22+
23+
////////////////////////////////////////////////////////////////////////////////
24+
25+
val wktReader = new WKTReader()
26+
val wkbWriter = new WKBWriter(2, true)
27+
28+
@Test
29+
def testGeomConstructors(): Unit = {
30+
val POINT = "POINT(-71.064544 42.28787)"
31+
val point = wktReader.read(POINT)
32+
33+
db withSession { implicit session: Session =>
34+
val id = GeomTestTable.iCols.insert(point)
35+
val bean = GeometryBean(id, point)
36+
37+
val q0 = GeomTestTable.where(_.id === id.bind).map(t => t)
38+
assertEquals(bean, q0.first())
39+
40+
val q1 = GeomTestTable.where(_.geom === geomFromText(POINT.bind)).map(t => t)
41+
assertEquals(bean, q1.first())
42+
43+
val q2 = GeomTestTable.where(_.geom === geomFromWKB(wkbWriter.write(point).bind)).map(t => t)
44+
assertEquals(bean, q2.first())
45+
46+
val q3 = GeomTestTable.where(_.geom === geomFromEWKT("SRID=0;POINT(-71.064544 42.28787)".bind)).map(t => t)
47+
assertEquals(bean, q3.first())
48+
49+
val q4 = GeomTestTable.where(_.geom === geomFromGML("""<gml:Point>
50+
<gml:coordinates>-71.064544,42.28787</gml:coordinates>
51+
</gml:Point>""".bind)).map(t => t)
52+
assertEquals(bean, q4.first())
53+
54+
val q5 = GeomTestTable.where(_.geom === geomFromKML("""<Point>
55+
<coordinates>-71.064544,42.28787</coordinates>
56+
</Point>""".bind).setSRID(0.bind)).map(t => t)
57+
assertEquals(bean, q5.first())
58+
59+
// disable it, since JSON-C not enabled
60+
// val q6 = GeomTestTable.where(_.geom === geomFromGeoJSON("""{"type":"Point","coordinates":[-71.064544,42.28787]}""".bind)).map(t => t)
61+
// assertEquals(bean, q6.first())
62+
63+
GeomTestTable.where(_.id === id.bind).delete
64+
}
65+
}
66+
67+
@Test
68+
def testGeomOperators(): Unit = {
69+
val line1 = wktReader.read("LINESTRING(0 0, 3 3)")
70+
val line2 = wktReader.read("LINESTRING(1 2, 4 6)")
71+
val line3 = wktReader.read("LINESTRING (1 1, 2 2)")
72+
val line3d1 = wktReader.read("LINESTRING(0 0 1, 3 3 2)")
73+
val line3d2 = wktReader.read("LINESTRING(1 2 1, 4 6 1)")
74+
75+
db withSession { implicit session: Session =>
76+
val id = GeomTestTable.iCols.insert(line1)
77+
val bean = GeometryBean(id, line1)
78+
val id3d = GeomTestTable.iCols.insert(line3d1)
79+
val bean3d = GeometryBean(id3d, line3d1)
80+
81+
///
82+
val q1 = GeomTestTable.where(r => { r.id === id.bind && r.geom @&& line2.bind }).map(r => r)
83+
assertEquals(bean, q1.first())
84+
85+
val q2 = GeomTestTable.where(r => { r.id === id3d.bind && r.geom @&&& line3d2.bind }).map(r => r)
86+
assertEquals(bean3d, q2.first())
87+
88+
val q3 = GeomTestTable.where(r => { r.id === id.bind && r.geom @> line3.bind }).map(r => r)
89+
assertEquals(bean, q3.first())
90+
91+
val q4 = GeomTestTable.where(r => { r.id === id.bind && line3.bind <@ r.geom }).map(r => r)
92+
assertEquals(bean, q4.first())
93+
94+
val q5 = GeomTestTable.where(r => { r.id === id.bind && (r.geom <-> line2.bind) > 0.7d.bind }).map(r => r)
95+
assertEquals(bean, q5.first())
96+
97+
val q6 = GeomTestTable.where(r => { r.id === id.bind && (r.geom <#> line2.bind) === 0.0d.bind}).map(r => r)
98+
assertEquals(bean, q6.first())
99+
100+
///
101+
}
102+
}
103+
104+
//////////////////////////////////////////////////////////////////////
105+
106+
@Before
107+
def createTables(): Unit = {
108+
db withSession { implicit session: Session =>
109+
GeomTestTable.ddl create
110+
}
111+
}
112+
113+
@After
114+
def dropTables(): Unit = {
115+
db withSession { implicit session: Session =>
116+
GeomTestTable.ddl drop
117+
}
118+
}
119+
}

0 commit comments

Comments
 (0)