From 9b17796b7bea01ca7ff2671d373ca296325090a5 Mon Sep 17 00:00:00 2001 From: Thomas Raffray Date: Mon, 12 Aug 2024 16:14:00 +0200 Subject: [PATCH] fix(search): do not overwrite existing query filters --- .../Helpers/DisjunctiveFacetingHelper.swift | 10 ++- .../Unit/DisjunctiveFacetingHelperTests.swift | 63 +++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Sources/AlgoliaSearchClient/Helpers/DisjunctiveFacetingHelper.swift b/Sources/AlgoliaSearchClient/Helpers/DisjunctiveFacetingHelper.swift index 46ca63f02..168f8ffe6 100644 --- a/Sources/AlgoliaSearchClient/Helpers/DisjunctiveFacetingHelper.swift +++ b/Sources/AlgoliaSearchClient/Helpers/DisjunctiveFacetingHelper.swift @@ -50,7 +50,10 @@ struct DisjunctiveFacetingHelper { var queries = [Query]() var mainQuery = query - mainQuery.filters = buildFilters(excluding: .none) + if let mainQueryFilters = mainQuery.filters, !mainQueryFilters.isEmpty { + mainQuery.filters = mainQueryFilters + " AND " + } + mainQuery.filters = (mainQuery.filters ?? "") + buildFilters(excluding: .none) queries.append(mainQuery) @@ -59,7 +62,10 @@ struct DisjunctiveFacetingHelper { .forEach { disjunctiveFacet in var disjunctiveQuery = query disjunctiveQuery.facets = [disjunctiveFacet] - disjunctiveQuery.filters = buildFilters(excluding: disjunctiveFacet) + if let disjunctiveQueryFilters = disjunctiveQuery.filters, !disjunctiveQueryFilters.isEmpty { + disjunctiveQuery.filters = disjunctiveQueryFilters + " AND " + } + disjunctiveQuery.filters = (disjunctiveQuery.filters ?? "") + buildFilters(excluding: disjunctiveFacet) disjunctiveQuery.hitsPerPage = 0 disjunctiveQuery.attributesToRetrieve = [] disjunctiveQuery.attributesToHighlight = [] diff --git a/Tests/AlgoliaSearchClientTests/Unit/DisjunctiveFacetingHelperTests.swift b/Tests/AlgoliaSearchClientTests/Unit/DisjunctiveFacetingHelperTests.swift index 447346e01..bfc9a8e7a 100644 --- a/Tests/AlgoliaSearchClientTests/Unit/DisjunctiveFacetingHelperTests.swift +++ b/Tests/AlgoliaSearchClientTests/Unit/DisjunctiveFacetingHelperTests.swift @@ -360,6 +360,7 @@ class DisjunctiveFacetingHelperTests: XCTestCase { let helper = DisjunctiveFacetingHelper(query: Query(), refinements: [:], disjunctiveFacets: []) + var mainResponse = SearchResponse() @@ -382,5 +383,67 @@ class DisjunctiveFacetingHelperTests: XCTestCase { ]) XCTAssertTrue(response.exhaustiveFacetsCount!) } + + func testKeepExistingFilters() throws { + var query = Query() + query.filters = "NOT color:blue" + + let refinements: [Attribute: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"] + ] + let disjunctiveFacets: Set = [ + "color", + "size" + ] + let helper = DisjunctiveFacetingHelper(query: query, + refinements: refinements, + disjunctiveFacets: disjunctiveFacets) + let queries = helper.makeQueries() + XCTAssertEqual(queries.count, 3) + XCTAssertEqual(queries.first?.filters, """ + NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") + """) + XCTAssertEqual(queries[1].facets, ["color"]) + XCTAssertEqual(queries[1].filters, """ + NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") + """) + XCTAssertEqual(queries[2].facets, ["size"]) + XCTAssertEqual(queries[2].filters, """ + NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") + """) + } + + func testKeepExistingFiltersEmpty() throws { + var query = Query() + query.filters = "" + + let refinements: [Attribute: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"] + ] + let disjunctiveFacets: Set = [ + "color", + "size" + ] + let helper = DisjunctiveFacetingHelper(query: query, + refinements: refinements, + disjunctiveFacets: disjunctiveFacets) + let queries = helper.makeQueries() + XCTAssertEqual(queries.count, 3) + XCTAssertEqual(queries.first?.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") + """) + XCTAssertEqual(queries[1].facets, ["color"]) + XCTAssertEqual(queries[1].filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") + """) + XCTAssertEqual(queries[2].facets, ["size"]) + XCTAssertEqual(queries[2].filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") + """) + } }