Store.kt
package com.hexagontk.store
import kotlin.reflect.KClass
import kotlin.reflect.KProperty1
/**
* TODO All methods accepting maps rely on `mapOf` returning an insertion ordered map. Take care of
* this in the future to avoid possible bugs
*/
interface Store<T : Any, K : Any> {
val type: KClass<T>
val key: KProperty1<T, K>
val name: String
val encoder: (T) -> Map<String, *>
val decoder: (Map<String, *>) -> T
fun insertOne(instance: T): K
fun insertMany(instances: List<T>): List<K>
fun insertMany(vararg instances: T): List<K> =
insertMany(instances.toList())
fun saveOne(instance: T): K? // returns key if created, null if updated
fun saveMany(instances: List<T>): List<K?>
fun replaceOne(instance: T): Boolean
fun replaceMany(instances: List<T>): List<T>
fun replaceMany(vararg instances: T): List<T> =
replaceMany(instances.toList())
fun updateOne(key: K, updates: Map<String, *>): Boolean
fun updateOne(key: K, vararg updates: Pair<KProperty1<T, *>, *>): Boolean =
updateOne(key, fields(*updates))
fun updateMany(filter: Map<String, *>, updates: Map<String, *>): Long
fun deleteOne(id: K): Boolean
fun deleteMany(filter: Map<String, *>): Long
fun findOne(key: K): T?
fun findOne(key: K, fields: List<String>): Map<String, *>?
fun findOne(filter: Map<String, *>): T? =
findMany(filter).apply { check(size < 2) }.firstOrNull()
fun findOne(filter: Map<String, *>, fields: List<String>): Map<String, *>? =
findMany(filter, fields).apply { check(size < 2) }.firstOrNull()
fun findMany(
filter: Map<String, *>,
limit: Int? = null,
skip: Int? = null,
sort: Map<String, Boolean> = emptyMap()): List<T>
fun findMany(
filter: Map<String, *>,
fields: List<String>,
limit: Int? = null,
skip: Int? = null,
sort: Map<String, Boolean> = emptyMap()): List<Map<String, *>>
fun findAll(
limit: Int? = null,
skip: Int? = null,
sort: Map<String, Boolean> = emptyMap()): List<T> =
findMany(emptyMap<String, Any>(), limit, skip, sort)
fun findAll(
fields: List<String>,
limit: Int? = null,
skip: Int? = null,
sort: Map<String, Boolean> = emptyMap()): List<Map<String, *>> =
findMany(emptyMap<String, Any>(), fields, limit, skip, sort)
fun count(filter: Map<String, *> = emptyMap<String, Any>()): Long
fun drop()
fun fields(updates: Map<KProperty1<T, *>, *>): Map<String, *> =
updates.mapKeys { it.key.name }
fun fields(vararg updates: Pair<KProperty1<T, *>, *>): Map<String, *> =
fields(updates.toMap())
}