カスタム関数で Squeryl を使用して地理空間検索を行っていますが、生成された SQL が正しくありません。私は自分が何を間違えたのかを理解しようとして髪を引っ張っています。これは私が持っているものの非常に単純化された例です:
正弦方程式用に次のカスタム関数を作成しました。
class SIN(e: NumericalExpression[Double], m:OutMapper[Double])
extends FunctionNode[Double]("sin", Some(m), Seq(e)) with NumericalExpression[Double]
def sin(e: NumericalExpression[Double])(implicit m:OutMapper[Double]) = new SIN(e,m)
次に、次のようなクエリを作成しました (明らかに、このテストのために単純化されています)。
val query = from(StoreTable)(s =>
select(s)
orderBy(sin(s.latitude * Math.PI / 180))
)
次のSQLを生成します
Select ...
From
store store14
Order By
sin(store14.latitude)
order by の「Math.PI / 180」の部分はどうなりましたか? もう少し掘り下げてみると、データベース側で式を評価する & 関数を発見しました。これはこのコンテキストでは理にかなっていますが、& 式を使用すると実際には NullPointerException が発生します。具体的に行ったことは次のとおりです。
val query = from(this.table)(s =>
select(s)
orderBy(sin(&(s.latitude * Math.PI / 180.0)))
)
その結果、次の例外が発生します。
[error] NullPointerException: null (QueryDsl.scala:159)
[error] org.squeryl.internals.FieldReferenceLinker$.pushExpressionOrCollectValue(FieldReferenceLinker.scala:36)
[error] org.squeryl.dsl.QueryDsl$class.$amp(QueryDsl.scala:159)
[error] org.squeryl.PrimitiveTypeMode$.$amp(PrimitiveTypeMode.scala:40)
誰が私が間違っているのか教えてもらえますか?
前もって感謝します!ジョー