Squeryl geo用postgres后端查询?

时间:2015-09-03 16:17:36

标签: squeryl

如何使用带有postgres后端的Squeryl执行地理查询?我想要运行的查询类型是“返回x公里内的所有用户”等等。

如果不直接/通过插件支持地理查询,我该如何运行原始SQL查询?我看到了一个要点,看起来很复杂。

更新 具体来说,我想运行以下查询:

SELECT events.id, events.name FROM events 
WHERE earth_box( {current_user_lat}, {current_user_lng}, 
  {radius_in_metres}) @> ll_to_earth(events.lat, events.lng);

这取自http://johanndutoit.net/searching-in-a-radius-using-postgres/

1 个答案:

答案 0 :(得分:0)

此对象应解决您的问题。

object object RawSql {

  def q(query: String, args: Any*) =
    new RawTupleQuery(query, args)

  class RawTupleQuery(query: String, args: Seq[Any]) {

    private def prep = {

      val s = Session.currentSession

      val st = s.connection.prepareStatement(query)

      def unwrap(o: Any) = o match {
    case None => null
    case Some(ob) => ob.asInstanceOf[AnyRef]
    case null => null
    case a@AnyRef => a
    case a@_ => a
      }

      for(z <- args.zipWithIndex) {
    st.setObject(z._2 + 1, unwrap(z._1))
      }

      st
    }

    def toSeq[A1]()(implicit f1 : TypedExpressionFactory[A1,_]) = {

      val st = prep
      val rs = st.executeQuery

      try {

    val ab = new ArrayBuffer[A1]

    val m1 = f1.thisMapper.asInstanceOf[PrimitiveJdbcMapper[A1]]

    while(rs.next)
      ab.append(m1.convertFromJdbc(m1.extractNativeJdbcValue(rs, 1)))

    ab
      }
      finally {
    rs.close()
    st.close()
      }
    }

    def toTupleSeq[A1,A2]()(implicit f1 : TypedExpressionFactory[A1,_], f2 : TypedExpressionFactory[A2,_]) = {

      val st = prep
      val rs = st.executeQuery

      try {

    val ab = new ArrayBuffer[(A1,A2)]

    val m1 = f1.thisMapper.asInstanceOf[PrimitiveJdbcMapper[A1]]
    val m2 = f2.thisMapper.asInstanceOf[PrimitiveJdbcMapper[A2]]

    while(rs.next)
      ab.append(
        (m1.convertFromJdbc(m1.extractNativeJdbcValue(rs, 1)),
          m2.convertFromJdbc(m2.extractNativeJdbcValue(rs, 2))))
    ab
      }
      finally {
    rs.close()
    st.close()
      }
    }
  }
}

我从这个要点得到了:

https://gist.github.com/max-l/9250053