sqldelight icon indicating copy to clipboard operation
sqldelight copied to clipboard

Queries do not import entity classes from root package directory when necessary

Open mainrs opened this issue 1 year ago • 1 comments

SQLDelight Version

2.0.1

Operating System

Linux

Gradle Version

8.4

Kotlin Version

1.9.21

Dialect

SQLite 3.35

AGP Version

8.1.0

Describe the Bug

Storing query files in a sub-module results in generated Kotlin files that miss import statements for the entity classes. This only happens if query functions use the RETURNING statement, since then they need to refer to the entity class.

My queries are inside a module called queries. I have the following query:

insert:
INSERT INTO users (name, emoji) VALUES (?, ?) RETURNING *;

My generated query looks like this:

package namespace.queries

import app.cash.sqldelight.ExecutableQuery
import app.cash.sqldelight.Query
import app.cash.sqldelight.SuspendingTransacterImpl
import app.cash.sqldelight.db.QueryResult
import app.cash.sqldelight.db.SqlCursor
import app.cash.sqldelight.db.SqlDriver
import kotlin.Any
import kotlin.Long
import kotlin.String

public class UserQueries(
  driver: SqlDriver,
) : SuspendingTransacterImpl(driver) {
  public fun <T : Any> insert(
    name: String,
    emoji: String,
    mapper: (
      id: Long,
      name: String,
      emoji: String,
    ) -> T,
  ): ExecutableQuery<T> = InsertQuery(name, emoji) { cursor ->
    mapper(
      cursor.getLong(0)!!,
      cursor.getString(1)!!,
      cursor.getString(2)!!
    )
  }

  public fun insert(name: String, emoji: String): ExecutableQuery<Users> = insert(name, emoji) { id,
      name_, emoji_ ->
    Users(
      id,
      name_,
      emoji_
    )
  }

  public fun <T : Any> selectAll(mapper: (
    id: Long,
    name: String,
    emoji: String,
  ) -> T): Query<T> = Query(272_669_366, arrayOf("users"), driver, "User.sq", "selectAll",
      "SELECT * FROM users") { cursor ->
    mapper(
      cursor.getLong(0)!!,
      cursor.getString(1)!!,
      cursor.getString(2)!!
    )
  }

  public fun selectAll(): Query<net.zerotask.karaoke.server.database.Users> = selectAll { id, name,
      emoji ->
    net.zerotask.karaoke.server.database.Users(
      id,
      name,
      emoji
    )
  }

  public suspend fun deleteAll() {
    driver.execute(1_629_935_527, """DELETE FROM users""", 0).await()
    notifyQueries(1_629_935_527) { emit ->
      emit("users")
    }
  }

  private inner class InsertQuery<out T : Any>(
    public val name: String,
    public val emoji: String,
    mapper: (SqlCursor) -> T,
  ) : ExecutableQuery<T>(mapper) {
    override fun <R> execute(mapper: (SqlCursor) -> QueryResult<R>): QueryResult<R> =
        driver.executeQuery(2_135_066_792,
        """INSERT INTO users (name, emoji) VALUES (?, ?) RETURNING *""", mapper, 2) {
      bindString(0, name)
      bindString(1, emoji)
    }

    override fun toString(): String = "User.sq:insert"
  }
}

However, the entities themselves are in the namespace package. My sqldelight configuration is:

sqldelight {
    databases {
        create("Database") {
            packageName.set("namespace")
            dialect(libs.sqldelight.sqlite.dialect)
            generateAsync.set(true)
        }
    }
}

Stacktrace

None available

Gradle Build Script

plugins {
    alias(libs.plugins.kotlinJvm)
    alias(libs.plugins.sqldelight)
}

group = "namespace"
version = "1.0.0"

sqldelight {
    databases {
        create("Database") {
            packageName.set("namespace")
            dialect(libs.sqldelight.sqlite.dialect)
            generateAsync.set(true)
        }
    }
}

dependencies {
    implementation(libs.sqldelight.sqlite)
}

mainrs avatar Dec 21 '23 16:12 mainrs

🤔 This could be fixed by https://github.com/cashapp/sqldelight/pull/4885 issue https://github.com/cashapp/sqldelight/issues/4448

  • It just missed the 2.0.1 release

Maybe try the snapshot release 2.1.0-SNAPSHOT and see if that works for you To setup a build for snapshot -> https://cashapp.github.io/sqldelight/2.0.1/#snapshots

griffio avatar Dec 21 '23 18:12 griffio