Skip to content

Commit

Permalink
Search. Source filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitriy Grigoryev authored and ihostage committed Dec 21, 2020
1 parent 7eeabeb commit a16424d
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ data class SearchRequest @JvmOverloads constructor(
@JsonProperty("min_score")
val minScore: Double? = null,
@JsonProperty("search_after")
val searchAfter: List<Any>? = null
val searchAfter: List<Any>? = null,
@JsonProperty("_source")
val source: SourceFilter<*>? = null
) {

class Builder {
Expand All @@ -41,6 +43,7 @@ data class SearchRequest @JvmOverloads constructor(
private var sort: MutableList<Order> = mutableListOf()
private var minScore: Double? = null
private var searchAfter: MutableList<Any> = mutableListOf()
private var source: SourceFilter<*>? = null

fun query(query: Query) = apply { this.query = query }
fun scriptField(name: String, script: Script) = apply { this.scriptFields.add(ScriptField(name, script)) }
Expand All @@ -56,6 +59,7 @@ data class SearchRequest @JvmOverloads constructor(
fun minScore(minScore: Double) = apply { this.minScore = minScore }
fun searchAfter(vararg searchAfter: Any) = apply { this.searchAfter.addAll(searchAfter) }
fun searchAfter(searchAfter: List<Any>) = apply { this.searchAfter.addAll(searchAfter) }
fun source(source: SourceFilter<*>) = apply { this.source = source }

fun build() = SearchRequest(
query = query ?: error("Query can't be null"),
Expand All @@ -67,12 +71,13 @@ data class SearchRequest @JvmOverloads constructor(
suggest = if (suggest.isEmpty()) null else suggest.toMap(),
sort = if (sort.isEmpty()) null else sort.toList(),
minScore = minScore,
searchAfter = if (searchAfter.isEmpty()) null else searchAfter.toList()
searchAfter = if (searchAfter.isEmpty()) null else searchAfter.toList(),
source = source
)
}

companion object {
@JvmStatic
fun builder() = Builder()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.taymyr.lagom.elasticsearch.search.dsl

import com.fasterxml.jackson.annotation.JsonValue

/**
* See [[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html#source-filtering]]
*/
sealed class SourceFilter<T>(open val value: T) {
data class Inclusion(@get:JsonValue override val value: Boolean) : SourceFilter<Boolean>(value)

data class SinglePath(@get:JsonValue override val value: String) : SourceFilter<String>(value)

data class MultiPath(@get:JsonValue override val value: List<String>) : SourceFilter<List<String>>(value)

data class IncExc(val includes: List<String>, val excludes: List<String>)

data class IncludeExclude(@get:JsonValue override val value: IncExc) : SourceFilter<IncExc>(value)

companion object {
@JvmField
val EXCLUDE_SOURCE = Inclusion(false)
@JvmField
val INCLUDE_SOURCE = Inclusion(true)
@JvmStatic
fun singlePath(value: String) = SinglePath(value)
@JvmStatic
fun multiPath(value: List<String>) = MultiPath(value)
@JvmStatic
fun multiPath(includes: List<String>, excludes: List<String>) = IncludeExclude(IncExc(includes, excludes))
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.taymyr.lagom.elasticsearch.search.dsl;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -167,4 +166,48 @@ void shouldThrowExceptionForIncorrectRequest() {
.isInstanceOf(IllegalStateException.class)
.hasMessage("Query can't be null");
}

@Test
@DisplayName("source filter serialization")
void shouldSerializeSourceFilter() {
SearchRequest request = SearchRequest.builder()
.source(SourceFilter.EXCLUDE_SOURCE)
.query(IdsQuery.of("1"))
.build();
String actual = serializeRequest(request, SearchRequest.class);
String expected = resourceAsString("org/taymyr/lagom/elasticsearch/search/dsl/query/source/source_excluded.json");
assertThatJson(actual).isEqualTo(expected);

request = SearchRequest.builder()
.source(SourceFilter.INCLUDE_SOURCE)
.query(IdsQuery.of("1"))
.build();
actual = serializeRequest(request, SearchRequest.class);
expected = resourceAsString("org/taymyr/lagom/elasticsearch/search/dsl/query/source/source_included.json");
assertThatJson(actual).isEqualTo(expected);

request = SearchRequest.builder()
.source(SourceFilter.singlePath("order.client.*"))
.query(IdsQuery.of("1"))
.build();
actual = serializeRequest(request, SearchRequest.class);
expected = resourceAsString("org/taymyr/lagom/elasticsearch/search/dsl/query/source/source_single_path.json");
assertThatJson(actual).isEqualTo(expected);

request = SearchRequest.builder()
.source(SourceFilter.multiPath(asList("order.client.*", "order.price.*")))
.query(IdsQuery.of("1"))
.build();
actual = serializeRequest(request, SearchRequest.class);
expected = resourceAsString("org/taymyr/lagom/elasticsearch/search/dsl/query/source/source_multi_path.json");
assertThatJson(actual).isEqualTo(expected);

request = SearchRequest.builder()
.source(SourceFilter.multiPath(asList("order.client.*", "order.seller.*"), asList( "order.price.*")))
.query(IdsQuery.of("1"))
.build();
actual = serializeRequest(request, SearchRequest.class);
expected = resourceAsString("org/taymyr/lagom/elasticsearch/search/dsl/query/source/source_includes_excludes.json");
assertThatJson(actual).isEqualTo(expected);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"_source": false,
"query": {
"ids": {
"values": [
"1"
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"_source": true,
"query": {
"ids": {
"values": [
"1"
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"_source": {
"includes": ["order.client.*", "order.seller.*"],
"excludes": ["order.price.*"]
},
"query": {
"ids": {
"values": [
"1"
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"_source": ["order.client.*", "order.price.*"],
"query": {
"ids": {
"values": [
"1"
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"_source": "order.client.*",
"query": {
"ids": {
"values": [
"1"
]
}
}
}

0 comments on commit a16424d

Please sign in to comment.