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

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

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

import org.elasticsearch.action.index.{IndexAction, IndexRequestBuilder, IndexResponse}
import org.elasticsearch.action.percolate.{PercolateAction, PercolateRequestBuilder, PercolateResponse}
import org.elasticsearch.client.Client
import org.elasticsearch.common.bytes.BytesArray
import org.elasticsearch.common.xcontent.{XContentHelper, XContentBuilder, XContentFactory}
import org.elasticsearch.percolator.PercolatorService

import scala.collection.mutable.ListBuffer
import scala.concurrent.Future
import scala.language.implicitConversions

/** @author Stephen Samuel */
trait PercolateDsl extends QueryDsl {

  class RegisterExpectsIndex(id: String) {
    def into(index: String) = new RegisterDefinition(index, id)
  }

  implicit object RegisterDefinitionExecutable extends Executable[RegisterDefinition, IndexResponse, IndexResponse] {
    override def apply(c: Client, t: RegisterDefinition): Future[IndexResponse] = {
      injectFuture(c.index(t.build, _))
    }
  }

  implicit object PercolateDefinitionExecutable
    extends Executable[PercolateDefinition, PercolateResponse, PercolateResponse] {
    override def apply(c: Client, t: PercolateDefinition): Future[PercolateResponse] = {
      injectFuture(c.percolate(t.build, _))
    }
  }

  implicit object RegisterDefinitionShow extends Show[RegisterDefinition] {
    override def show(f: RegisterDefinition): String = XContentHelper.convertToJson(f.build.source, true, true)
  }

  implicit class RegisterDefinitionShowOps(f: RegisterDefinition) {
    def show: String = RegisterDefinitionShow.show(f)
  }

  implicit object PercolateDefinitionShow extends Show[PercolateDefinition] {
    override def show(f: PercolateDefinition): String = XContentHelper.convertToJson(f.build.source, true, true)
  }

  implicit class PercolateDefinitionShowOps(f: PercolateDefinition) {
    def show: String = PercolateDefinitionShow.show(f)
  }
}

class RegisterDefinition(index: String, id: String) extends BulkCompatibleDefinition {

  private[this] var _query: QueryDefinition = _
  private val _fields = new ListBuffer[(String, Any)]

  def build = {
    val source = XContentFactory.jsonBuilder().startObject().field("query", _query.builder)
    for ( tuple <- _fields ) {
      source.field(tuple._1, tuple._2)
    }
    source.endObject()
    new IndexRequestBuilder(ProxyClients.client, IndexAction.INSTANCE).setIndex(index)
      .setType(PercolatorService.TYPE_NAME).setId(id).setRefresh(true)
      .setSource(source).request
  }

  def query(block: => QueryDefinition): RegisterDefinition = {
    _query = block
    this
  }
  def query(string: String) = {
    _query = new QueryStringQueryDefinition(string)
    this
  }
  def fields(map: Map[String, Any]): RegisterDefinition = fields(map.toList)
  def fields(_fields: (String, Any)*): RegisterDefinition = fields(_fields.toIterable)
  def fields(iterable: Iterable[(String, Any)]) = {
    this._fields ++= iterable
    this
  }
}

case class PercolateDefinition(indexesAndTypes: IndexesAndTypes) {
  require(indexesAndTypes != null, "index must not be null or empty")

  private val _fields = new ListBuffer[(String, Any)]
  private var _rawDoc: Option[String] = None
  private[this] var _query: QueryDefinition = _

  def build = new PercolateRequestBuilder(ProxyClients.client, PercolateAction.INSTANCE)
    .setSource(_doc)
    .setIndices(indexesAndTypes.indexes: _*)
    .setDocumentType(indexesAndTypes.types.head)
    .request()

  private[elastic4s] def _doc: XContentBuilder = {
    val source = XContentFactory.jsonBuilder().startObject()

    if (_query != null)
      source.field("query", _query.builder)

    _rawDoc match {
      case Some(doc) =>
        source.rawField("doc", new BytesArray(doc.getBytes("UTF-8")))
      case None =>
        source.startObject("doc")
        for ( tuple <- _fields ) {
          source.field(tuple._1, tuple._2)
        }
        source.endObject()
    }
    source.endObject()
    source
  }

  def rawDoc(json: String): PercolateDefinition = {
    this._rawDoc = Some(json)
    this
  }

  def doc(fields: (String, Any)*): PercolateDefinition = {
    this._fields ++= fields
    this
  }

  def doc(fields: Map[String, Any]): PercolateDefinition = {
    this._fields ++= fields
    this
  }

  def query(string: String): PercolateDefinition = query(new QueryStringQueryDefinition(string))
  def query(block: => QueryDefinition) = {
    _query = block
    this
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy