diff --git a/modules/example/src/main/scala/example/api/Criteria.scala b/modules/example/src/main/scala/example/api/Criteria.scala index 3a9988f47..f6b9ecbd2 100644 --- a/modules/example/src/main/scala/example/api/Criteria.scala +++ b/modules/example/src/main/scala/example/api/Criteria.scala @@ -10,14 +10,20 @@ object Criteria { implicit val schema: Schema[Criteria] = DeriveSchema.gen[Criteria] } -final case class IntCriteria(field: IntFilter, operator: FilterOperator, value: Int) extends Criteria +final case class CompoundCriteria(operator: CompoundOperator, filters: List[Criteria]) extends Criteria final case class DateCriteria(field: DateFilter, operator: FilterOperator, value: LocalDateTime) extends Criteria -final case class CompoundCriteria( - operator: CompoundOperator, - filters: List[Criteria] -) extends Criteria +final case class IntCriteria(field: IntFilter, operator: FilterOperator, value: Int) extends Criteria + +final case class StringCriteria(field: StringFilter, operator: StringFilterOperator, value: String) extends Criteria + +sealed trait CompoundOperator + +object CompoundOperator { + case object And extends CompoundOperator + case object Or extends CompoundOperator +} sealed trait FilterOperator @@ -27,11 +33,18 @@ object FilterOperator { case object EqualTo extends FilterOperator } -sealed trait CompoundOperator +sealed trait StringFilterOperator -object CompoundOperator { - case object And extends CompoundOperator - case object Or extends CompoundOperator +object StringFilterOperator { + case object Contains extends StringFilterOperator + case object StartsWith extends StringFilterOperator + case object Pattern extends StringFilterOperator +} + +sealed trait DateFilter + +case object LastCommitAt extends DateFilter { + override def toString: String = "lastCommitAt" } sealed trait IntFilter @@ -46,8 +59,26 @@ object IntFilter { } } -sealed trait DateFilter +sealed trait StringFilter -case object LastCommitAt extends DateFilter { - override def toString: String = "lastCommitAt" +object StringFilter { + case object Id extends StringFilter { + override def toString: String = "id" + } + + case object Organization extends StringFilter { + override def toString: String = "organization" + } + + case object Name extends StringFilter { + override def toString: String = "name" + } + + case object Url extends StringFilter { + override def toString: String = "url" + } + + case object Description extends StringFilter { + override def toString: String = "description" + } } diff --git a/modules/example/src/main/scala/example/api/Repositories.scala b/modules/example/src/main/scala/example/api/Repositories.scala index 5d128cdfa..45b66ee4d 100644 --- a/modules/example/src/main/scala/example/api/Repositories.scala +++ b/modules/example/src/main/scala/example/api/Repositories.scala @@ -99,28 +99,28 @@ object Repositories { private def createElasticQuery(query: Criteria): ElasticQuery[_] = query match { - case IntCriteria(field, operator, value) => + case CompoundCriteria(operator, filters) => operator match { - case GreaterThan => - ElasticQuery.range(field.toString).gt(value) - case LessThan => - ElasticQuery.range(field.toString).lt(value) - case EqualTo => - ElasticQuery.matches(field.toString, value) + case And => boolQuery().must(filters.map(createElasticQuery): _*) + case Or => boolQuery().should(filters.map(createElasticQuery): _*) } case DateCriteria(field, operator, value) => operator match { - case GreaterThan => - ElasticQuery.range(field.toString).gt(value.toString) - case LessThan => - ElasticQuery.range(field.toString).lt(value.toString) - case EqualTo => - ElasticQuery.matches(field.toString, value.toString) + case GreaterThan => ElasticQuery.range(field.toString).gt(value.toString) + case LessThan => ElasticQuery.range(field.toString).lt(value.toString) + case EqualTo => ElasticQuery.matches(field.toString, value.toString) } - case CompoundCriteria(operator, filters) => + case IntCriteria(field, operator, value) => operator match { - case And => boolQuery().must(filters.map(createElasticQuery): _*) - case Or => boolQuery().should(filters.map(createElasticQuery): _*) + case GreaterThan => ElasticQuery.range(field.toString).gt(value) + case LessThan => ElasticQuery.range(field.toString).lt(value) + case EqualTo => ElasticQuery.matches(field.toString, value) + } + case StringCriteria(field, operator, value) => + operator match { + case StringFilterOperator.Contains => ElasticQuery.contains(field.toString, value) + case StringFilterOperator.StartsWith => ElasticQuery.startsWith(field.toString, value) + case StringFilterOperator.Pattern => ElasticQuery.wildcard(field.toString, value) } } diff --git a/modules/example/zio-elasticsearch-example.postman_collection.json b/modules/example/zio-elasticsearch-example.postman_collection.json index e7c6ced89..cd854f9ba 100644 --- a/modules/example/zio-elasticsearch-example.postman_collection.json +++ b/modules/example/zio-elasticsearch-example.postman_collection.json @@ -1,9 +1,8 @@ { "info": { - "_postman_id": "7bf079a3-55fa-4833-9627-648026c5fda4", + "_postman_id": "056ad5a1-fa75-4ff1-a176-3c6f9dec5b7f", "name": "zio-elasticsearch-example", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "1136886" + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { @@ -408,6 +407,31 @@ } }, "response": [] + }, + { + "name": "Search for documents in which name starts with term1 and contains term2", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"CompoundCriteria\": {\n \"operator\": {\"And\": {}},\n \"filters\": [\n {\n \"StringCriteria\": {\n \"field\": {\"Name\": {}},\n \"operator\": {\"StartsWith\": {}},\n \"value\": \"scrul\"\n }\n },\n {\n \"StringCriteria\": {\n \"field\": {\"Name\": {}},\n \"operator\": {\"Contains\": {}},\n \"value\": \"detector\"\n }\n }\n ]\n }\n}" + }, + "url": { + "raw": "http://localhost:{{HTTP_PORT}}/api/repositories/search", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "{{HTTP_PORT}}", + "path": [ + "api", + "repositories", + "search" + ] + } + }, + "response": [] } ], "event": [