Идиоматический способ создания переменной mongodb Query для данных в Kotlin? - PullRequest
0 голосов
/ 20 февраля 2019

Используя Kotlin и Spring Data mongodb, я пытаюсь найти самый идиоматический метод, который может получать обнуляемые параметры (через пользовательские фильтры) и создавать запрос MongoTemplate с ненулевыми значениями (который в Java будеткуча если).Это то, что я придумал до сих пор, но мне интересно, есть ли лучший способ:

// extending Query
open class Filter {
  // case insensitive 'like' criteria
  fun Query.like(field: String, value: String?) = value?.let {
    this.addCriteria(Criteria.where(field).regex(it,"i"))
  }

  // queries from a date, to a date or between two dates
  fun <T: Comparable<T>> Query.between(field: String, from: T?, to: T?) {
    if (from != null || to != null) {
      val criteria = where(field)
      from?.let { criteria.gte(it) }
      to?.let { criteria.lte(it) }
      this.addCriteria(criteria)
    }
  }

  fun Query.onlyActive(active: Boolean?) = when (active) {
    true -> this.addCriteria(Criteria.where("active").`is`(true))
    else -> null
  }
}

// data class extending Filter()
data class myFilter(val: name: String, val type: String?, val content:String?,
  val fromNum: Int?, val toNum: Int?, val fromDate: LocalDateTime?,
  val toDate: LocalDateTime?, val active? = false): Filter() {

  fun toQuery(): Query {
    // name is a mandatory param
    val query = Query.query(Criteria.where("name").`is`(name))

    with(query) {
      like("type", type)
      like("content", content)
      between("num", fromNum, toNum)
      between("date", fromDate, toDate)
      onlyActive(active)
    }

    return query
  }
}
...