Skip to content

Commit 3ecb3ec

Browse files
committed
fix(search): do not overwrite existing query filters
1 parent 4334c90 commit 3ecb3ec

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

Sources/AlgoliaSearchClient/Helpers/DisjunctiveFacetingHelper.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ struct DisjunctiveFacetingHelper {
5050
var queries = [Query]()
5151

5252
var mainQuery = query
53-
mainQuery.filters = buildFilters(excluding: .none)
53+
if let mainQueryFilters = mainQuery.filters, !mainQueryFilters.isEmpty {
54+
mainQuery.filters = mainQueryFilters + " AND "
55+
}
56+
mainQuery.filters = (mainQuery.filters ?? "") + buildFilters(excluding: .none)
5457

5558
queries.append(mainQuery)
5659

@@ -59,7 +62,10 @@ struct DisjunctiveFacetingHelper {
5962
.forEach { disjunctiveFacet in
6063
var disjunctiveQuery = query
6164
disjunctiveQuery.facets = [disjunctiveFacet]
62-
disjunctiveQuery.filters = buildFilters(excluding: disjunctiveFacet)
65+
if let disjunctiveQueryFilters = disjunctiveQuery.filters, !disjunctiveQueryFilters.isEmpty {
66+
disjunctiveQuery.filters = disjunctiveQueryFilters + " AND "
67+
}
68+
disjunctiveQuery.filters = (disjunctiveQuery.filters ?? "") + buildFilters(excluding: disjunctiveFacet)
6369
disjunctiveQuery.hitsPerPage = 0
6470
disjunctiveQuery.attributesToRetrieve = []
6571
disjunctiveQuery.attributesToHighlight = []

Tests/AlgoliaSearchClientTests/Unit/DisjunctiveFacetingHelperTests.swift

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,5 +382,67 @@ class DisjunctiveFacetingHelperTests: XCTestCase {
382382
])
383383
XCTAssertTrue(response.exhaustiveFacetsCount!)
384384
}
385+
386+
func testKeepExistingFilters() throws {
387+
var query = Query()
388+
query.filters = "NOT color:blue"
389+
390+
let refinements: [Attribute: [String]] = [
391+
"size": ["m", "s"],
392+
"color": ["blue", "green", "red"],
393+
"brand": ["apple", "samsung", "sony"]
394+
]
395+
let disjunctiveFacets: Set<Attribute> = [
396+
"color",
397+
"size"
398+
]
399+
let helper = DisjunctiveFacetingHelper(query: query,
400+
refinements: refinements,
401+
disjunctiveFacets: disjunctiveFacets)
402+
let queries = helper.makeQueries()
403+
XCTAssertEqual(queries.count, 3)
404+
XCTAssertEqual(queries.first?.filters, """
405+
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")
406+
""")
407+
XCTAssertEqual(queries[1].facets, ["color"])
408+
XCTAssertEqual(queries[1].filters, """
409+
NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s")
410+
""")
411+
XCTAssertEqual(queries[2].facets, ["size"])
412+
XCTAssertEqual(queries[2].filters, """
413+
NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red")
414+
""")
415+
}
416+
417+
func testKeepExistingFiltersEmpty() throws {
418+
var query = Query()
419+
query.filters = ""
420+
421+
let refinements: [Attribute: [String]] = [
422+
"size": ["m", "s"],
423+
"color": ["blue", "green", "red"],
424+
"brand": ["apple", "samsung", "sony"]
425+
]
426+
let disjunctiveFacets: Set<Attribute> = [
427+
"color",
428+
"size"
429+
]
430+
let helper = DisjunctiveFacetingHelper(query: query,
431+
refinements: refinements,
432+
disjunctiveFacets: disjunctiveFacets)
433+
let queries = helper.makeQueries()
434+
XCTAssertEqual(queries.count, 3)
435+
XCTAssertEqual(queries.first?.filters, """
436+
("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s")
437+
""")
438+
XCTAssertEqual(queries[1].facets, ["color"])
439+
XCTAssertEqual(queries[1].filters, """
440+
("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s")
441+
""")
442+
XCTAssertEqual(queries[2].facets, ["size"])
443+
XCTAssertEqual(queries[2].filters, """
444+
("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red")
445+
""")
446+
}
385447

386448
}

0 commit comments

Comments
 (0)