
com.github.chengpohi.api.dsl.DSLContext.scala Maven / Gradle / Ivy
The newest version!
package com.github.chengpohi.api.dsl
import com.github.chengpohi.collection.JsonCollection.Val
import com.github.chengpohi.helper.ResponseGenerator
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse
import org.elasticsearch.action.admin.cluster.node.info.NodesInfoResponse
import org.elasticsearch.action.admin.cluster.node.stats.NodesStatsResponse
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryResponse
import org.elasticsearch.action.admin.cluster.settings.ClusterUpdateSettingsResponse
import org.elasticsearch.action.admin.cluster.snapshots.create.CreateSnapshotResponse
import org.elasticsearch.action.admin.cluster.snapshots.delete.DeleteSnapshotResponse
import org.elasticsearch.action.admin.cluster.snapshots.get.GetSnapshotsResponse
import org.elasticsearch.action.admin.cluster.snapshots.restore.RestoreSnapshotResponse
import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse
import org.elasticsearch.action.admin.cluster.stats.ClusterStatsResponse
import org.elasticsearch.action.admin.cluster.tasks.PendingClusterTasksResponse
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse
import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse
import org.elasticsearch.action.admin.indices.close.CloseIndexResponse
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse
import org.elasticsearch.action.admin.indices.open.OpenIndexResponse
import org.elasticsearch.action.admin.indices.refresh.RefreshResponse
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsResponse
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse
import org.elasticsearch.action.delete.DeleteResponse
import org.elasticsearch.action.get.GetResponse
import org.elasticsearch.action.index.IndexResponse
import org.elasticsearch.action.search.SearchResponse
import org.elasticsearch.action.update.UpdateResponse
import org.elasticsearch.search.SearchHit
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
import org.json4s._
import org.json4s.native.JsonMethods._
import org.json4s.native.Serialization.write
/**
* Created by xiachen on 10/11/2016.
*/
trait DSLContext {
val responseGenerator = new ResponseGenerator
trait Monoid[A] {
def toJson(a: A): String
}
object Monoid {
implicit object StringResponseMonoid extends Monoid[String] {
override def toJson(a: String): String = a
}
implicit object IndexResponseMonoid extends Monoid[IndexResponse] {
override def toJson(a: IndexResponse): String = responseGenerator.buildXContent(a)
}
implicit object DeleteIndexResponseMonoid extends Monoid[DeleteIndexResponse] {
override def toJson(a: DeleteIndexResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object CreateIndexResponseMonoid extends Monoid[CreateIndexResponse] {
override def toJson(a: CreateIndexResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object SearchResponseMonoid extends Monoid[SearchResponse] {
override def toJson(a: SearchResponse): String = responseGenerator.buildXContent(a)
}
implicit object NodeStatsResponseMonoid extends Monoid[NodesStatsResponse] {
override def toJson(a: NodesStatsResponse): String = responseGenerator.buildXContent(a)
}
implicit object NodeInfoResponseMonoid extends Monoid[NodesInfoResponse] {
override def toJson(a: NodesInfoResponse): String = responseGenerator.buildXContent(a)
}
implicit object IndicesStatsResponseMonoid extends Monoid[IndicesStatsResponse] {
override def toJson(a: IndicesStatsResponse): String = responseGenerator.buildXContent(a)
}
implicit object ClusterStatsResponseMonoid extends Monoid[ClusterStatsResponse] {
override def toJson(a: ClusterStatsResponse): String = responseGenerator.buildXContent(a)
}
implicit object ClusterHealthResponseMonoid extends Monoid[ClusterHealthResponse] {
override def toJson(a: ClusterHealthResponse): String = responseGenerator.buildXContent(a)
}
implicit object ClusterUpdateSettingsResponseMonoid extends Monoid[ClusterUpdateSettingsResponse] {
override def toJson(a: ClusterUpdateSettingsResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object UpdateSettingsResponseMonoid extends Monoid[UpdateSettingsResponse] {
override def toJson(a: UpdateSettingsResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object PutRepositoryResponseMonoid extends Monoid[PutRepositoryResponse] {
override def toJson(a: PutRepositoryResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object CreateSnapshotResponseMonoid extends Monoid[CreateSnapshotResponse] {
override def toJson(a: CreateSnapshotResponse): String = responseGenerator.buildXContent(a)
}
implicit object GetSnapshotsResponseMonoid extends Monoid[GetSnapshotsResponse] {
override def toJson(a: GetSnapshotsResponse): String = responseGenerator.buildXContent(a)
}
implicit object DeleteSnapshotResponseMonoid extends Monoid[DeleteSnapshotResponse] {
override def toJson(a: DeleteSnapshotResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object GetMappingsResponseMonoid extends Monoid[GetMappingsResponse] {
override def toJson(a: GetMappingsResponse): String = responseGenerator.buildGetMappingResponse(a)
}
implicit object PutMappingResponseMonoid extends Monoid[PutMappingResponse] {
override def toJson(a: PutMappingResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object ClusterStateResponseMonoid extends Monoid[ClusterStateResponse] {
override def toJson(a: ClusterStateResponse): String = responseGenerator.buildXContent(a.getState)
}
implicit object GetSettingsResponseMonoid extends Monoid[GetSettingsResponse] {
override def toJson(a: GetSettingsResponse): String = responseGenerator.buildGetSettingsResponse(a)
}
implicit object IndicesAliasesResponseMonoid extends Monoid[IndicesAliasesResponse] {
override def toJson(a: IndicesAliasesResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object RestoreSnapshotResponseMonoid extends Monoid[RestoreSnapshotResponse] {
override def toJson(a: RestoreSnapshotResponse): String = responseGenerator.buildXContent(a)
}
implicit object CloseIndexResponseMonoid extends Monoid[CloseIndexResponse] {
override def toJson(a: CloseIndexResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object PendingClusterTasksResponseMonoid extends Monoid[PendingClusterTasksResponse] {
override def toJson(a: PendingClusterTasksResponse): String = responseGenerator.buildXContent(a)
}
implicit object OpenIndexResponseMonoid extends Monoid[OpenIndexResponse] {
override def toJson(a: OpenIndexResponse): String = responseGenerator.buildAcknowledgedResponse(a)
}
implicit object AnalyzeResponseMonoid extends Monoid[AnalyzeResponse] {
override def toJson(a: AnalyzeResponse): String = responseGenerator.buildXContent(a)
}
implicit object DeleteResponseMonoid extends Monoid[DeleteResponse] {
override def toJson(a: DeleteResponse): String = responseGenerator.buildXContent(a)
}
implicit object UpdateResponseMonoid extends Monoid[UpdateResponse] {
override def toJson(a: UpdateResponse): String = responseGenerator.buildXContent(a)
}
implicit object GetResponseMonoid extends Monoid[GetResponse] {
override def toJson(a: GetResponse): String = responseGenerator.buildXContent(a)
}
implicit object StreamSearchResponseMonoid extends Monoid[Stream[SearchResponse]] {
override def toJson(a: Stream[SearchResponse]): String = {
val s = a.map(s => s.toJson)
responseGenerator.buildStream(s)
}
}
implicit object JoinSearchResponseMonoid extends Monoid[Stream[Map[String, AnyRef]]] {
override def toJson(a: Stream[Map[String, AnyRef]]): String = {
responseGenerator.buildStreamMapTupels(a)
}
}
implicit object SearchHitMonoid extends Monoid[SearchHit] {
override def toJson(a: SearchHit): String = responseGenerator.buildXContent(a)
}
implicit object RefreshResponseMonoid extends Monoid[RefreshResponse] {
override def toJson(a: RefreshResponse): String = a.toString
}
implicit object StreamSearchHitMonoid extends Monoid[Stream[SearchHit]] {
override def toJson(a: Stream[SearchHit]): String = {
val s = a.map(s => s.toJson)
responseGenerator.buildStream(s)
}
}
}
trait MonoidOp[A] {
val F: Monoid[A]
val value: A
def toJson: String = F.toJson(value)
}
implicit def toMonoidOp[A: Monoid](a: A): MonoidOp[A] = new MonoidOp[A] {
val F = implicitly[Monoid[A]]
val value = a
}
trait FutureToJson[A, Future[_]] {
val F: Monoid[A]
val value: A
def toJson: String = F.toJson(value)
def await: A = value
}
implicit def futureToJson[A: Monoid](a: Future[A]): FutureToJson[A, Future] = new FutureToJson[A, Future] {
override val F: Monoid[A] = implicitly[Monoid[A]]
override val value: A = Await.result(a, Duration.Inf)
}
implicit class IndexNameAndIndexType(indexName: String) {
def /(indexType: String): IndexPath = {
IndexPath(indexName, indexType)
}
}
implicit class IndexNameAndIndexTypeVal(indexName: Val) {
def /(indexType: Val): IndexPath = {
IndexPath(indexName.extract[String], indexType.extract[String])
}
def /(indexType: String): IndexPath = {
IndexPath(indexName.extract[String], indexType)
}
}
case class IndexPath(indexName: String, indexType: String)
}
trait Definition[A] {
def execute: Future[A]
def extract(path: String): ExtractDefinition = {
ExtractDefinition(this, path)
}
def json: String
}
case class ExtractDefinition(definition: Definition[_], path: String) extends Definition[String] {
import scala.concurrent.ExecutionContext.Implicits.global
implicit val formats = DefaultFormats
override def execute: Future[String] = {
Future {
val jObj = parse(definition.json)
val result = path.split("\\.").foldLeft(jObj) { (o, i) => o \ i }
write(result)
}
}
override def json: String = Await.result(execute, Duration.Inf)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy