Skip to content

Commit 2e5fa23

Browse files
feat(search/settings): Add decompoundQuery search & settings parameter (#722)
1 parent b97fefe commit 2e5fa23

File tree

11 files changed

+58
-1
lines changed

11 files changed

+58
-1
lines changed

Sources/AlgoliaSearchClient/Models/Common/CommonParameters.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ public protocol CommonParameters {
148148
- [Documentation](https://www.algolia.com/doc/api-reference/api-parameters/queryLanguages/?language=swift)
149149
*/
150150
var queryLanguages: [Language]? { get set }
151+
152+
/**
153+
Enable word segmentation (also called decompounding) at query time for
154+
compatible languages.
155+
For example, this turns the Dutch query "spaanplaatbehang" into "spaan plaat behang" to retrieve more relevant results.
156+
- Engine default: true
157+
- [Documentation](https://www.algolia.com/doc/api-reference/api-parameters/decompoundQuery/?client=swift)
158+
*/
159+
var decompoundQuery: Bool? { get set }
151160

152161
// MARK: - Query rules
153162

Sources/AlgoliaSearchClient/Models/Search/Query/Query+Codable.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ extension SearchParametersStorage: Codable {
5050
ignorePlurals = try container.decodeIfPresent(forKey: .ignorePlurals)
5151
removeStopWords = try container.decodeIfPresent(forKey: .removeStopWords)
5252
queryLanguages = try container.decodeIfPresent(forKey: .queryLanguages)
53+
decompoundQuery = try container.decodeIfPresent(forKey: .decompoundQuery)
5354
enableRules = try container.decodeIfPresent(forKey: .enableRules)
5455
ruleContexts = try container.decodeIfPresent(forKey: .ruleContexts)
5556
enablePersonalization = try container.decodeIfPresent(forKey: .enablePersonalization)
@@ -120,6 +121,7 @@ extension SearchParametersStorage: Codable {
120121
try container.encodeIfPresent(ignorePlurals, forKey: .ignorePlurals)
121122
try container.encodeIfPresent(removeStopWords, forKey: .removeStopWords)
122123
try container.encodeIfPresent(queryLanguages, forKey: .queryLanguages)
124+
try container.encodeIfPresent(decompoundQuery, forKey: .decompoundQuery)
123125
try container.encodeIfPresent(enableRules, forKey: .enableRules)
124126
try container.encodeIfPresent(ruleContexts, forKey: .ruleContexts)
125127
try container.encodeIfPresent(enablePersonalization, forKey: .enablePersonalization)
@@ -189,6 +191,7 @@ extension SearchParametersStorage: Codable {
189191
case ignorePlurals
190192
case removeStopWords
191193
case queryLanguages
194+
case decompoundQuery
192195
case enableRules
193196
case ruleContexts
194197
case enablePersonalization

Sources/AlgoliaSearchClient/Models/Search/Query/Query+URLEncodable.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ extension Query: URLEncodable {
167167
urlEncoder.set(alternativesAsExact, for: .alternativesAsExact)
168168
urlEncoder.set(ignorePlurals, for: .ignorePlurals)
169169
urlEncoder.set(queryLanguages, for: .queryLanguages)
170+
urlEncoder.set(decompoundQuery, for: .decompoundQuery)
170171
urlEncoder.set(enableRules, for: .enableRules)
171172
urlEncoder.set(ruleContexts, for: .ruleContexts)
172173
urlEncoder.set(enablePersonalization, for: .enablePersonalization)

Sources/AlgoliaSearchClient/Models/Search/SearchParameters.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,5 +277,5 @@ public protocol SearchParameters: CommonParameters {
277277
- [Documentation](https://www.algolia.com/doc/api-reference/api-parameters/_/?language=swift)
278278
*/
279279
var explainModules: [ExplainModule]? { get set }
280-
280+
281281
}

Sources/AlgoliaSearchClient/Models/Search/SearchParametersStorage.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public struct SearchParametersStorage: SearchParameters, Equatable {
4848
public var removeStopWords: LanguageFeature?
4949
public var queryLanguages: [Language]?
5050
public var naturalLanguages: [Language]?
51+
public var decompoundQuery: Bool?
5152
public var enableRules: Bool?
5253
public var ruleContexts: [String]?
5354
public var enablePersonalization: Bool?
@@ -244,6 +245,10 @@ extension SearchParametersStorageContainer {
244245
get { searchParametersStorage.naturalLanguages }
245246
set { searchParametersStorage.naturalLanguages = newValue }
246247
}
248+
public var decompoundQuery: Bool? {
249+
get { searchParametersStorage.decompoundQuery }
250+
set { searchParametersStorage.decompoundQuery = newValue }
251+
}
247252
public var enableRules: Bool? {
248253
get { searchParametersStorage.enableRules }
249254
set { searchParametersStorage.enableRules = newValue }

Sources/AlgoliaSearchClient/Models/Settings/SettingsParametersCodingKeys.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public enum SettingsParametersCodingKeys: String, CodingKey {
3838
case decompoundedAttributes
3939
case keepDiacriticsOnCharacters
4040
case queryLanguages
41+
case decompoundQuery
4142
case enableRules
4243
case enablePersonalization
4344
case queryType

Sources/AlgoliaSearchClient/Models/Settings/SettingsParametersStorage.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct SettingsParametersStorage: SettingsParameters {
4040
var customNormalization: [String: [String: String]]?
4141
var queryLanguages: [Language]?
4242
var indexLanguages: [Language]?
43+
var decompoundQuery: Bool?
4344
var enableRules: Bool?
4445
var enablePersonalization: Bool?
4546
var queryType: QueryType?
@@ -203,6 +204,10 @@ extension SettingsParametersStorageContainer {
203204
get { settingsParametersStorage.indexLanguages }
204205
set { settingsParametersStorage.indexLanguages = newValue }
205206
}
207+
public var decompoundQuery: Bool? {
208+
get { settingsParametersStorage.decompoundQuery }
209+
set { settingsParametersStorage.decompoundQuery = newValue }
210+
}
206211
public var enableRules: Bool? {
207212
get { settingsParametersStorage.enableRules }
208213
set { settingsParametersStorage.enableRules = newValue }

Tests/AlgoliaSearchClientTests/Doc/APIParameters/APIParameters+Languages.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,5 +246,33 @@ extension APIParameters {
246246
}
247247
}
248248
}
249+
250+
func decompoundQuery() {
251+
/*
252+
decompoundQuery = true
253+
*/
254+
func enable_decompound_query_by_default() {
255+
let settings = Settings()
256+
.set(\.decompoundQuery, to: true)
257+
258+
index.setSettings(settings) { result in
259+
if case .success(let response) = result {
260+
print("Response: \(response)")
261+
}
262+
}
263+
}
264+
265+
func enable_decompound_query_search_time() {
266+
let query = Query("query")
267+
.set(\.decompoundQuery, to: true)
268+
269+
index.search(query: query) { result in
270+
if case .success(let response) = result {
271+
print("Response: \(response)")
272+
}
273+
}
274+
}
275+
}
276+
249277
}
250278
}

Tests/AlgoliaSearchClientTests/Misc/Settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"attributeForDistinct": null,
2020
"exactOnSingleWordQuery": "attribute",
2121
"enablePersonalization": true,
22+
"decompoundQuery": true,
2223
"ranking": [
2324
"typo",
2425
"geo",

Tests/AlgoliaSearchClientTests/Unit/QueryTests.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class QueryTests: XCTestCase {
6363
.set(\.alternativesAsExact, to: [.ignorePlurals, .singleWordSynonym])
6464
.set(\.ignorePlurals, to: false)
6565
.set(\.queryLanguages, to: [.hindi, .albanian])
66+
.set(\.decompoundQuery, to: false)
6667
.set(\.enableRules, to: true)
6768
.set(\.ruleContexts, to: ["rc1", "rc2"])
6869
.set(\.enablePersonalization, to: false)
@@ -137,6 +138,7 @@ class QueryTests: XCTestCase {
137138
"alternativesAsExact=ignorePlurals,singleWordSynonym",
138139
"ignorePlurals=false",
139140
"queryLanguages=hi,sq",
141+
"decompoundQuery=false",
140142
"enableRules=true",
141143
"ruleContexts=rc1,rc2",
142144
"enablePersonalization=false",
@@ -223,6 +225,7 @@ class QueryTests: XCTestCase {
223225
"advancedSyntaxFeatures": ["excludeWords", "exactPhrase"],
224226
"optionalWords": ["optWord1", "optWord2"],
225227
"removeStopWords": ["ar", "fr"],
228+
"decompoundQuery": false,
226229
"disableExactOnAttributes": ["deAttr1", "deAttr2"],
227230
"exactOnSingleWordQuery": "word",
228231
"alternativesAsExact": ["ignorePlurals", "singleWordSynonym"],

0 commit comments

Comments
 (0)