Skip to content

Instantly share code, notes, and snippets.

@Eganathan
Created May 26, 2025 12:24
Show Gist options
  • Select an option

  • Save Eganathan/6692e2ea77fe51daf02f9e34a036f1b5 to your computer and use it in GitHub Desktop.

Select an option

Save Eganathan/6692e2ea77fe51daf02f9e34a036f1b5 to your computer and use it in GitHub Desktop.
internal class QueryBuilder(private val tableName: String) {
private val columns = mutableListOf<String>()
private val joins = mutableListOf<String>()
private val filters = mutableListOf<String>()
private val groupBy = mutableListOf<String>()
private var orderBy = mutableListOf<String>()
private var limit: Int? = null
private var offset: Int? = null
fun select(vararg columns: String) = apply {
this.columns.addAll(columns)
}
fun join(joinClause: String) = apply {
joins.add(joinClause)
}
fun bulkJoins(joinClauses: List<String>) = apply {
joins.addAll(joinClauses)
}
fun where(condition: String) = apply {
filters.add(condition)
}
fun orderBy(column: String, sortOrder: String) = apply {
orderBy.add("$column $sortOrder")
}
fun groupBy(vararg columns: String) = apply {
this.groupBy.addAll(columns)
}
fun paginate(page: Int, perPage: Int = PagingConsts.PERPAGE) = apply {
this.limit = perPage
this.offset = (page - 1) * perPage // so we don't get duplicate entries from old page
}
fun build(): String {
val query = buildString {
append("SELECT ")
append(if (columns.isEmpty()) "*" else columns.joinToString(", "))
append(" FROM $tableName")
if (joins.isNotEmpty()) append(" ${joins.joinToString(" ")}")
if (filters.isNotEmpty()) append(" WHERE ${filters.joinToString(" AND ")}")
if (groupBy.isNotEmpty()) append(" GROUP BY ${groupBy.joinToString(", ")}")
if (orderBy.isNotEmpty()) append(" ORDER BY ${orderBy.joinToString(", ")}")
limit?.let { append(" LIMIT $it") }
offset?.let { append(" OFFSET $it") }
}
Log.d("QueryBuilder", query)
return query
}
}
// DSL for query building
internal fun buildQuery(
tableName: String,
page: Int,
builder: QueryBuilder.() -> Unit
): SimpleSQLiteQuery {
return SimpleSQLiteQuery(
QueryBuilder(tableName).apply(block = builder)
.paginate(page = page).build()
)
}
internal fun buildQuery(
tableName: String,
builder: QueryBuilder.() -> Unit
): SimpleSQLiteQuery {
return SimpleSQLiteQuery(
QueryBuilder(tableName).apply(block = builder).build()
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment