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

com.sksamuel.elastic4s.ExplainDsl.scala Maven / Gradle / Ivy

There is a newer version: 6.0.0-rc1
Show newest version
package com.sksamuel.elastic4s

import org.elasticsearch.action.explain.{ExplainAction, ExplainRequest, ExplainRequestBuilder, ExplainResponse}
import org.elasticsearch.action.support.QuerySourceBuilder
import org.elasticsearch.client.Client

import scala.concurrent.Future

/** @author Stephen Samuel */
trait ExplainDsl {

  implicit object ExplainDefinitionExecutable extends Executable[ExplainDefinition, ExplainResponse, ExplainResponse] {
    override def apply(c: Client, t: ExplainDefinition): Future[ExplainResponse] = {
      val builder = t.build(c.prepareExplain(t.index, t.`type`, t.id))
      injectFuture(builder.execute)
    }
  }

  class ExplainExpectsIndex(id: String) {
    def in(indexAndTypes: IndexAndTypes): ExplainDefinition = {
      new ExplainDefinition(indexAndTypes.index, indexAndTypes.types.head, id)
    }
  }
}

case class ExplainDefinition(index: String,
                             `type`: String,
                             id: String,
                             query: Option[QueryDefinition] = None,
                             fetchSource: Option[Boolean] = None,
                             parent: Option[String] = None,
                             preference: Option[String] = None,
                             routing: Option[String] = None) extends Serializable {

  // used by testing to get the full builder without a client
  private[elastic4s] def request: ExplainRequest = {
    build(new ExplainRequestBuilder(ProxyClients.client, ExplainAction.INSTANCE, index, `type`, id)).request()
  }

  def build(builder: ExplainRequestBuilder): ExplainRequestBuilder = {
    // need to set the query on the request - workaround for ES internals
    query.foreach(q => builder.request.source(new QuerySourceBuilder().setQuery(q.builder)))
    query.foreach(q => builder.setQuery(q.builder))
    fetchSource.foreach(builder.setFetchSource)
    parent.foreach(builder.setParent)
    preference.foreach(builder.setPreference)
    routing.foreach(builder.setRouting)
    builder
  }

  def query(string: String): ExplainDefinition = query(new QueryStringQueryDefinition(string))
  def query(block: => QueryDefinition): ExplainDefinition = copy(query = Option(block))
  def fetchSource(fetchSource: Boolean): ExplainDefinition = copy(fetchSource = Option(fetchSource))
  def parent(parent: String): ExplainDefinition = copy(parent = Option(parent))
  def preference(preference: String): ExplainDefinition = copy(preference = Option(preference))
  def routing(routing: String): ExplainDefinition = copy(routing = Option(routing))
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy