如何在 kotlin-exposed 中编写 withinOP postgis 扩展?

How to write withinOP postgis extension in kotlin-exposed?

这是一段代码,使我能够 运行 postgis && 以几何作为输入

private class WithinOp(val expr1: Expression<*>, val geom: PGgeometry) : Op<Boolean>() {
    override fun toQueryBuilder(queryBuilder: QueryBuilder) {
        expr1.toQueryBuilder(queryBuilder)
        queryBuilder.args
        queryBuilder.append(" && \'${geom.value}\'")
    }

查询的样子: SELECT * FROM table WHERE table."location" && 'SRID=4326;POLYGON((1 2,2 2,2 3,1 3,1 2))

目前这已成为一个问题,因为 && 正在搜索 minimum bounding rectangle。它对我的目标来说不够准确,所以我想用更准确的 postgis 方法替换它,例如 ST_Intersects

但是当我更新我的构建器时它不起作用,因为错误地构建了这个查询:

private class WithinOp(val expr1: Expression<*>, val geom: PGgeometry) : Op<Boolean>() {
    override fun toQueryBuilder(queryBuilder: QueryBuilder) {
        expr1.toQueryBuilder(queryBuilder)
        queryBuilder.args
        queryBuilder.append(" ST_Intersects($expr1, \'${geom.value}\'")

查询:SELECT * FROM table WHERE table."location" ST_Intersects(waycare.sql.Table.location, 'SRID=4326;POLYGON((1 2,2 2,2 3,1 3,1 2)) - 不正确

正确的语法是:SELECT * FROM table WHERE ST_Intersects(table."location",'SRID=4326;POLYGON((1 2,2 2,2 3,1 3,1 2))

如何在暴露的情况下构建良好的扩展没有很好的记录。但我必须找到一些解决方案。感谢任何帮助。

我认为你需要在这里使用 CustomFunction。我没有测试下面的代码,但它应该足以抓住这个想法:

class ST_IntersectsFunction(val expr1: Expression<*>, val geom: String) 
   : CustomFunction<Boolean>("ST_Intersects", BooleanColumnType(), expr1, stringParam(geom.value))

并使用:

 table.select { ST_IntersectsFunction(table.id, geom) eq true }