Skip to content

Commit 23fb88b

Browse files
committed
fix: beware of refinement list
1 parent 3ecb3ec commit 23fb88b

File tree

2 files changed

+41
-10
lines changed

2 files changed

+41
-10
lines changed

Sources/AlgoliaSearchClient/Helpers/DisjunctiveFacetingHelper.swift

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

5252
var mainQuery = query
53-
if let mainQueryFilters = mainQuery.filters, !mainQueryFilters.isEmpty {
54-
mainQuery.filters = mainQueryFilters + " AND "
55-
}
56-
mainQuery.filters = (mainQuery.filters ?? "") + buildFilters(excluding: .none)
53+
mainQuery.filters = [
54+
mainQuery.filters,
55+
buildFilters(excluding: .none)
56+
]
57+
.compactMap { $0 }
58+
.filter { !$0.isEmpty }
59+
.joined(separator: " AND ")
5760

5861
queries.append(mainQuery)
5962

6063
disjunctiveFacets
6164
.sorted(by: { $0.rawValue < $1.rawValue })
6265
.forEach { disjunctiveFacet in
63-
var disjunctiveQuery = query
64-
disjunctiveQuery.facets = [disjunctiveFacet]
65-
if let disjunctiveQueryFilters = disjunctiveQuery.filters, !disjunctiveQueryFilters.isEmpty {
66-
disjunctiveQuery.filters = disjunctiveQueryFilters + " AND "
67-
}
68-
disjunctiveQuery.filters = (disjunctiveQuery.filters ?? "") + buildFilters(excluding: disjunctiveFacet)
66+
var disjunctiveQuery = query
67+
disjunctiveQuery.facets = [disjunctiveFacet]
68+
disjunctiveQuery.filters = [
69+
disjunctiveQuery.filters,
70+
buildFilters(excluding: disjunctiveFacet)
71+
]
72+
.compactMap { $0 }
73+
.filter { !$0.isEmpty }
74+
.joined(separator: " AND ")
6975
disjunctiveQuery.hitsPerPage = 0
7076
disjunctiveQuery.attributesToRetrieve = []
7177
disjunctiveQuery.attributesToHighlight = []

Tests/AlgoliaSearchClientTests/Unit/DisjunctiveFacetingHelperTests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,5 +444,30 @@ class DisjunctiveFacetingHelperTests: XCTestCase {
444444
("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red")
445445
""")
446446
}
447+
448+
func testKeepExistingFiltersNoRefinement() throws {
449+
var query = Query()
450+
query.filters = "NOT color:blue"
447451

452+
let disjunctiveFacets: Set<Attribute> = [
453+
"color",
454+
"size"
455+
]
456+
let helper = DisjunctiveFacetingHelper(query: query,
457+
refinements: [:],
458+
disjunctiveFacets: disjunctiveFacets)
459+
let queries = helper.makeQueries()
460+
XCTAssertEqual(queries.count, 3)
461+
XCTAssertEqual(queries.first?.filters, """
462+
NOT color:blue
463+
""")
464+
XCTAssertEqual(queries[1].facets, ["color"])
465+
XCTAssertEqual(queries[1].filters, """
466+
NOT color:blue
467+
""")
468+
XCTAssertEqual(queries[2].facets, ["size"])
469+
XCTAssertEqual(queries[2].filters, """
470+
NOT color:blue
471+
""")
472+
}
448473
}

0 commit comments

Comments
 (0)