k4200’s notes and thoughts

Programmer side of k4200

SquerylでPostgreSQLのpoint型のデータを書き込む(これは酷い)

やりたい事

他のORMと比べて便利かどうかは特に検討せずに、とりあえずSquerylを使ってる。

PostgreSQLにはgeometry関連の型があって、更に詳しく言うとPostGISとそうじゃないやつがあるんだけど、その辺の詳細は省略。今回扱うのは通常のpoint型の話。x, yの2次元の座標を扱うもの。

で、今回はその point 型の値を書き込む(その場しのぎの)方法をさらっと。


ちなみに読み込みは?

読み込みだけなら、フィールドをstringで受ければOK。

case class SomeTable (
  val id: Int,

  @Column("location")
  val rawLocation: Option[String]
) extends KeyedEntity[Int] {
  def this() = {
    this(0, None)
  }
  
  def location: Option[Point] = {
    // str2point は文字列をパースして Point 型を返す関数。どっかで適当に定義する。
    rawLocation map { str2point(_) }
  }
}

書き込み・・・

PostgreSqlAdapter をオーバーライドしてしのいだ・・・

import org.postgresql.geometric.PGpoint
import org.squeryl.adapters.PostgreSqlAdapter

  val postgreSqlAdapter = new PostgreSqlAdapter {
    override def convertToJdbcValue(r: AnyRef) : AnyRef = {
      val defval = super.convertToJdbcValue(r)

      if (r.isInstanceOf[String]) {
        // Point.apply(str: String): Option[Point]
        Point(r.asInstanceOf[String]) match {
          case Some(p) =>
            new PGpoint(p.lat, p.lng)
          case None =>
            defval
    	}
      } else {
        defval
      }
    }
  }

最後に

もっと簡単な(というかちゃんとした)方法があれば教えて下さい。

時間がなくて、ちゃんとソースを読んでないので、こんな方法しか思いつかなかった。と言い訳。