Skip to content

Commit

Permalink
(example): Support contains and startsWith queries (#50)
Browse files Browse the repository at this point in the history
  • Loading branch information
dbulaja98 authored Jan 30, 2023
1 parent 0e0525b commit 304b042
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 31 deletions.
55 changes: 43 additions & 12 deletions modules/example/src/main/scala/example/api/Criteria.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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"
}
}
32 changes: 16 additions & 16 deletions modules/example/src/main/scala/example/api/Repositories.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down
30 changes: 27 additions & 3 deletions modules/example/zio-elasticsearch-example.postman_collection.json
Original file line number Diff line number Diff line change
@@ -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": [
{
Expand Down Expand Up @@ -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": [
Expand Down

0 comments on commit 304b042

Please sign in to comment.