2015-09-03 23 views
2

如何使用Squeryl和postgres後端執行地理查詢?我想要運行的查詢類型是「返回x公里內的所有用戶」等。squeryl地理查詢與postgres後端?

如果地理查詢不直接/通過插件支持,我如何運行原始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/

+0

Squeryl是 「A斯卡拉ORM和DSL與數據庫說話」。您想要將哪個確切的SQL查詢轉換爲squeryl語句? 我想給出一個提示:如果數據庫無法解決您的問題,那麼squeryl也不能解決它們。 – VasyaNovikov

+0

@VasyaNovikov我已經用特定的查詢更新了我的問題,我想執行。 – jbrown

+0

那麼你的問題似乎就是使用數據庫的自定義函數。我從來沒有使用過這個,但似乎squeryl有一段關於這個:http://squeryl.org/custom-functions.html也許它會有所幫助。如果不是這樣,也許你應該就SO提出一個單獨的問題(人們可能跳過了不瞭解「地理」目標的問題)。 – VasyaNovikov

回答

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 [email protected] => a 
    case [email protected]_ => 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

+0

我沒有測試過這個。我想我會使用doobie,因爲它捆綁了對postgis的支持。 – jbrown