-
-
Save Eganathan/6692e2ea77fe51daf02f9e34a036f1b5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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