All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dslplatform.api.client.Utils.scala Maven / Gradle / Ivy

package com.dslplatform.api.client

import com.dslplatform.api.patterns.Searchable
import com.dslplatform.api.patterns.SearchableRepository

object Utils {
  protected[client] def buildArguments(
    specification: Option[String],
    limit: Option[Int],
    offset: Option[Int],
    order: Map[String, Boolean]): String = {
    val params = Seq(
      makeParam("specification", specification),
      makeParam("limit", limit.map{ _.toString }),
      makeParam("offset", offset.map{ _.toString }),
      makeParam("order", makeOrderArguments(order))).flatten
    concatenateUrlParams(params)
  }

  protected[client] def buildOlapArguments(
    dimensions: TraversableOnce[String],
    facts: TraversableOnce[String],
    limit: Option[Int],
    offset: Option[Int],
    order: Map[String, Boolean],
    specification: Option[String] = None): String = {

    if (!contains(dimensions, order) & !contains(facts, order)) throw new IllegalArgumentException("Order must be an element of dimmensions or facts!");
    Seq(
      makeParam("dimensions", dimensions),
      makeParam("facts", facts),
      makeParam("limit", limit.map{ _.toString }),
      makeParam("offset", offset.map{ _.toString }),
      makeParam("order", makeOrderArguments(order)),
      makeParam("specification", specification)).flatten match {
        case Seq() =>
          throw new IllegalArgumentException("At least one dimension or fact is required")
        case params =>
          params.mkString("?", "&", "")
      }
  }

  private def makeOrderArguments(order: Map[String, Boolean]) = order.map{ case (k, v) => (if (v) "-" else "") + k }

  private def concatenateUrlParams(params: TraversableOnce[String], withFirst: Boolean = true) =
    if (params.isEmpty) ""
    else params.mkString(if (withFirst) "?" else "&", "&", "")

  private def makeParam(param: String, args: TraversableOnce[String]) =
    if (args.isEmpty) None else Some(args.mkString(param + "=", ",", ""))

  private def contains(iterSource: TraversableOnce[String], orders: Map[String, Boolean]) =
    if (orders == null || iterSource == null) true
    else {
      val list = iterSource.toList
      orders.keySet.forall(list.contains(_))
    }

  implicit class SearchPimp[TSearchable <: Searchable](
      repository: SearchableRepository[TSearchable]) {
    /**
     * Returns an instance of {@link SearchBuilder search builder} for this repository.
     * Search builder is helper class with fluent API for building search.
     *
     * @return utility class for building a search.
     */
    def builder() = new SearchBuilder[TSearchable](repository)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy