This extension allows for using some PostGis functions with the Activate persistence framework.
In order to use this extension, you need to add the PostGisContext trait to your storage, along the ActivateContext. The dialect is then defined to be the postgisDialect this extension is providing.
object ApplicationStorage extends PostGisContext with ActivateContext {
val storage =
new AsyncPostgreSQLStorage {
def configuration =
new AsyncConfiguration(
host = Configuration.dbUrl,
port = Configuration.dbPort,
username = Configuration.dbUsr,
password = Some(Configuration.dbPwd),
database = Some(Configuration.dbName))
lazy val objectFactory = new PostgreSQLConnectionFactory(configuration)
override val dialect = postgisDialect
}
/* ... */
}In your entity, you can define the change operation calling the update.
override protected def afterInitialize = {
on(_.jsonfence).change {
transactional {
val update = (this, Map(
"id" -> StringStorageValue(Option(id)),
"geofence" -> PostGisStorageValue(jsonfence)))
import scala.concurrent.ExecutionContext.Implicits.global
storage.storeAsync(Nil, Nil, Nil, List(update), Nil)
}
}
}Now, you can define a method to check whether some set of points are completely enclosed within the fence.
def isStretchOutOfFence(placeId: String, stretchId: String): Boolean = transactional {
query {
(place: PlaceTable, stretch: StretchTable) =>
where((place.id :== placeId) :&& (stretch.id :== stretchId) :&&
(stretch.geopoints.isNotNull) :&& (place.geofence :|+ stretch.geopoints)) select (place, stretch)
}.isEmpty
}