Skip to content

Commit dc6fd5e

Browse files
authored
Merge pull request #866 from algolia/fix/disjunctive-faceting-helper
fix(search): disjunctive faceting helper
2 parents 4334c90 + 23fb88b commit dc6fd5e

File tree

2 files changed

+103
-4
lines changed

2 files changed

+103
-4
lines changed

Sources/AlgoliaSearchClient/Helpers/DisjunctiveFacetingHelper.swift

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

5252
var mainQuery = query
53-
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 ")
5460

5561
queries.append(mainQuery)
5662

5763
disjunctiveFacets
5864
.sorted(by: { $0.rawValue < $1.rawValue })
5965
.forEach { disjunctiveFacet in
60-
var disjunctiveQuery = query
61-
disjunctiveQuery.facets = [disjunctiveFacet]
62-
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 ")
6375
disjunctiveQuery.hitsPerPage = 0
6476
disjunctiveQuery.attributesToRetrieve = []
6577
disjunctiveQuery.attributesToHighlight = []

Tests/AlgoliaSearchClientTests/Unit/DisjunctiveFacetingHelperTests.swift

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,5 +382,92 @@ 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+
}
447+
448+
func testKeepExistingFiltersNoRefinement() throws {
449+
var query = Query()
450+
query.filters = "NOT color:blue"
385451

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+
}
386473
}

0 commit comments

Comments
 (0)