Skip to content

Commit

Permalink
Add keyword mangling to select function parameters (#2764)
Browse files Browse the repository at this point in the history
fixes #2759
  • Loading branch information
aperfilyev authored and AlecKazakova committed Mar 8, 2022
1 parent ae351a4 commit 335a3d9
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 22 deletions.
6 changes: 6 additions & 0 deletions drivers/android-driver/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ android {
buildFeatures {
buildConfig = false
}

testOptions {
unitTests {
includeAndroidResources = true
}
}
}

dependencies {
Expand Down
2 changes: 1 addition & 1 deletion gradle/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ ext.deps = [
],
sqlitePsi: "com.alecstrong:sqlite-psi-core:0.3.15",
sqliteJdbc: "org.xerial:sqlite-jdbc:3.34.0",
robolectric: 'org.robolectric:robolectric:4.7.2',
robolectric: 'org.robolectric:robolectric:4.7.3',
rxJava2: "io.reactivex.rxjava2:rxjava:2.2.5",
rxJava3: "io.reactivex.rxjava3:rxjava:3.1.2",
guava: "com.google.guava:guava:23.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import com.squareup.kotlinpoet.NameAllocator
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.TypeSpec
import com.squareup.kotlinpoet.TypeVariableName
import com.squareup.kotlinpoet.joinToCode
Expand All @@ -53,20 +54,12 @@ class SelectQueryGenerator(private val query: NamedQuery) : QueryGenerator(query
* `fun selectForId(id: Int): Query<Data>`
*/
fun defaultResultTypeFunction(): FunSpec {
val function = defaultResultTypeFunctionInterface()
val argNameAllocator = NameAllocator()
val params =
query
.arguments
.asSequence()
.sortedBy { it.index }
.onEach { (_, argument) ->
argNameAllocator.newName(argument.name, argument)
}
.map { (_, argument) ->
CodeBlock.of(argNameAllocator[argument])
}
.toList()
val parametersAndTypes = query.arguments.sortedBy { it.index }
.map { (_, arg) -> argNameAllocator.newName(arg.name, arg) to arg.argumentType() }

val function = defaultResultTypeFunctionInterface(parametersAndTypes)
val params = parametersAndTypes.map { (name) -> CodeBlock.of(name) }

val columnArgs = query.resultColumns.map { argument ->
argNameAllocator.newName(argument.name, argument)
Expand Down Expand Up @@ -105,17 +98,17 @@ class SelectQueryGenerator(private val query: NamedQuery) : QueryGenerator(query
.build()
}

fun defaultResultTypeFunctionInterface(): FunSpec.Builder {
private fun defaultResultTypeFunctionInterface(params: List<Pair<String, TypeName>>): FunSpec.Builder {
val function = FunSpec.builder(query.name)
.also(this::addJavadoc)
query.arguments.sortedBy { it.index }.forEach { (_, argument) ->
function.addParameter(argument.name, argument.argumentType())
params.forEach { (name, type) ->
function.addParameter(name, type)
}
return function
.returns(QUERY_TYPE.parameterizedBy(query.interfaceType))
}

fun customResultTypeFunctionInterface(): FunSpec.Builder {
private fun customResultTypeFunctionInterface(): FunSpec.Builder {
val function = FunSpec.builder(query.name)
val params = mutableListOf<CodeBlock>()

Expand Down Expand Up @@ -308,14 +301,14 @@ class SelectQueryGenerator(private val query: NamedQuery) : QueryGenerator(query
FunSpec.builder("addListener")
.addModifiers(OVERRIDE)
.addParameter("listener", QUERY_LISTENER_TYPE)
.addStatement("driver.addListener(listener, arrayOf(${query.tablesObserved.joinToString() { "\"${it.name}\"" }}))")
.addStatement("driver.addListener(listener, arrayOf(${query.tablesObserved.joinToString { "\"${it.name}\"" }}))")
.build()
)
.addFunction(
FunSpec.builder("removeListener")
.addModifiers(OVERRIDE)
.addParameter("listener", QUERY_LISTENER_TYPE)
.addStatement("driver.removeListener(listener, arrayOf(${query.tablesObserved.joinToString() { "\"${it.name}\"" }}))")
.addStatement("driver.removeListener(listener, arrayOf(${query.tablesObserved.joinToString { "\"${it.name}\"" }}))")
.build()
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class ExpressionTest {
val generator = SelectQueryGenerator(file.namedQueries.first())
assertThat(generator.defaultResultTypeFunction().toString()).isEqualTo(
"""
|public fun testQuery(SecondId: kotlin.Long, `value`: kotlin.String): app.cash.sqldelight.Query<com.example.Test> = testQuery(SecondId, value_) { TestId, TestText, SecondId_ ->
|public fun testQuery(SecondId: kotlin.Long, value_: kotlin.String): app.cash.sqldelight.Query<com.example.Test> = testQuery(SecondId, value_) { TestId, TestText, SecondId_ ->
| com.example.Test(
| TestId,
| TestText,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1436,7 +1436,7 @@ class SelectQueryFunctionTest {
val generator = SelectQueryGenerator(query)

val param = ParameterSpec.builder(
"param",
"param_",
Long::class.asTypeName()
.copy(nullable = true)
)
Expand Down Expand Up @@ -1649,4 +1649,35 @@ class SelectQueryFunctionTest {
|""".trimMargin()
)
}

@Test fun `query function with integer named parameter template computes correctly`() {
val file = FixtureCompiler.parseSql(
"""
|CREATE TABLE Player(
| id TEXT PRIMARY KEY,
| username TEXT NOT NULL,
| email TEXT NOT NULL
|);
|
|select_default_with_query:
|SELECT *
|FROM Player
|WHERE username LIKE ('%' || ?1 || '%') OR email LIKE ('%' || ?1 || '%');
""".trimMargin(),
tempFolder
)

val generator = SelectQueryGenerator(file.namedQueries.first())
assertThat(generator.defaultResultTypeFunction().toString()).isEqualTo(
"""
|public fun select_default_with_query(value_: kotlin.String): app.cash.sqldelight.Query<com.example.Player> = select_default_with_query(value_) { id, username, email ->
| com.example.Player(
| id,
| username,
| email
| )
|}
|""".trimMargin()
)
}
}

0 comments on commit 335a3d9

Please sign in to comment.