Skip to content

Commit

Permalink
SearchDisjunctiveFacets use all filters
Browse files Browse the repository at this point in the history
  • Loading branch information
q-litzler committed May 11, 2019
1 parent 7f0c277 commit d43f9f9
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 18 deletions.
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/Library.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ object Library: Dependency {

override val group = "com.algolia"
override val artifact = "algoliasearch-client-kotlin"
override val version = "1.0.0-beta03"
override val version = "1.0.0-beta04"
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,13 @@ public interface EndpointSearch {
*
* @param query The [Query] used to search.
* @param disjunctiveFacets List of [Attribute] that are marked as disjunctive facets.
* @param filters The [Filter.Facet] to be applied
* @param filters The [Filter] to be applied.
* @param requestOptions Configure request locally with [RequestOptions].
*/
suspend fun searchDisjunctiveFacets(
query: Query,
disjunctiveFacets: List<Attribute>,
filters: List<Filter.Facet>,
filters: Set<Filter>,
requestOptions: RequestOptions? = null
): ResponseSearch
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,12 @@ internal class EndpointSearchImpl(
override suspend fun searchDisjunctiveFacets(
query: Query,
disjunctiveFacets: List<Attribute>,
filters: List<Filter.Facet>,
filters: Set<Filter>,
requestOptions: RequestOptions?
): ResponseSearch {
val (orFilters, andFilters) = filters.partition { disjunctiveFacets.contains(it.attribute) }
val queryAnd = buildAndQueries(query, andFilters, orFilters)
val queriesOr = buildOrQueries(disjunctiveFacets, query, andFilters, orFilters)
val (filtersOr, filtersAnd) = filters.partition { disjunctiveFacets.contains(it.attribute) }
val queryAnd = buildAndQueries(query, filtersAnd, filtersOr)
val queriesOr = buildOrQueries(query, filtersAnd, filtersOr, disjunctiveFacets)
val results = EndpointMultipleIndexImpl(transport).multipleQueries(queryAnd.plus(queriesOr)).results
val resultAnd = results.first()
val resultsOr = results.subList(1, results.size)
Expand All @@ -89,22 +89,24 @@ internal class EndpointSearchImpl(

private fun buildAndQueries(
query: Query,
andFilters: List<Filter.Facet>,
orFilters: List<Filter.Facet>
filtersAnd: List<Filter>,
filtersOr: List<Filter>
): List<IndexQuery> {
return query.copy().apply {
filters {
and { +andFilters }
orFacet { +orFilters }
and { +filtersAnd }
orFacet { +filtersOr.filterIsInstance<Filter.Facet>() }
orTag { +filtersOr.filterIsInstance<Filter.Tag>() }
orNumeric { +filtersOr.filterIsInstance<Filter.Numeric>() }
}
}.let { listOf(IndexQuery(indexName, it)) }
}

private fun buildOrQueries(
disjunctiveFacets: List<Attribute>,
query: Query,
andFilters: List<Filter.Facet>,
orFilters: List<Filter.Facet>
filtersAnd: List<Filter>,
filtersOr: List<Filter>,
disjunctiveFacets: List<Attribute>
): List<IndexQuery> {
return disjunctiveFacets.map { attribute ->
query.copy().apply {
Expand All @@ -114,8 +116,10 @@ internal class EndpointSearchImpl(
hitsPerPage = 0
analytics = false
filters {
and { +andFilters }
orFacet { +orFilters.filter { it.attribute != attribute } }
and { +filtersAnd }
orFacet { +filtersOr.filterIsInstance<Filter.Facet>().filter { it.attribute != attribute } }
orTag { +filtersOr.filterIsInstance<Filter.Tag>() }
orNumeric { +filtersOr.filterIsInstance<Filter.Numeric>() }
}
}
}.map { IndexQuery(indexName, it) }
Expand Down
4 changes: 2 additions & 2 deletions src/commonTest/kotlin/suite/TestSuiteDisjunctive.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ internal class TestSuiteDisjunctive {
facets = facets
)
val disjunctiveFacets = listOf(brand)
val filters = listOf(
val filters = setOf(
Filter.Facet(brand, "Apple"),
Filter.Facet(brand, "Samsung"),
Filter.Facet(brand, "Commas' voice, Ltd"),
Expand Down Expand Up @@ -93,7 +93,7 @@ internal class TestSuiteDisjunctive {
facets = setOf(city)
)
val disjunctiveFacets = listOf(stars, facilities)
val filters = mutableListOf<Filter.Facet>()
val filters = mutableSetOf<Filter.Facet>()

index.apply {
val tasks = mutableListOf<Task>()
Expand Down

0 comments on commit d43f9f9

Please sign in to comment.