Skip to content

Commit a9bda3d

Browse files
authored
feat: add basic support of extensions (#398)
1 parent 228fc23 commit a9bda3d

File tree

7 files changed

+70
-68
lines changed

7 files changed

+70
-68
lines changed

client/src/commonMain/kotlin/com/algolia/search/dsl/DSLQuery.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import com.algolia.search.dsl.strategy.DSLAdvancedSyntaxFeatures
1717
import com.algolia.search.dsl.strategy.DSLAlternativesAsExact
1818
import com.algolia.search.model.filter.FilterGroupsConverter
1919
import com.algolia.search.model.search.Query
20+
import kotlinx.serialization.json.JsonObjectBuilder
21+
import kotlinx.serialization.json.buildJsonObject
2022

2123
/**
2224
* Create a [Query] with [block] and an optional [query].
@@ -197,3 +199,12 @@ public fun Query.explainModules(block: DSLExplainModules.() -> Unit) {
197199
public fun Query.naturalLanguages(block: DSLLanguage.() -> Unit) {
198200
naturalLanguages = DSLLanguage(block)
199201
}
202+
203+
/**
204+
* Assign the output of [block] to [Query.extensions].
205+
*/
206+
public fun Query.extensions(block: JsonObjectBuilder.() -> Unit) {
207+
extensions = buildJsonObject {
208+
block()
209+
}
210+
}

client/src/commonMain/kotlin/com/algolia/search/model/response/ResponseSearch.kt

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,16 @@ import com.algolia.search.model.analytics.ABTestID
1010
import com.algolia.search.model.filter.FilterGroup
1111
import com.algolia.search.model.insights.InsightsEvent
1212
import com.algolia.search.model.rule.RenderingContent
13-
import com.algolia.search.model.search.Cursor
14-
import com.algolia.search.model.search.Explain
15-
import com.algolia.search.model.search.Facet
16-
import com.algolia.search.model.search.FacetStats
17-
import com.algolia.search.model.search.Point
18-
import com.algolia.search.model.search.Query
19-
import com.algolia.search.model.search.RankingInfo
20-
import com.algolia.search.model.search.RemoveWordIfNoResults
13+
import com.algolia.search.model.search.*
2114
import com.algolia.search.model.settings.Settings
2215
import com.algolia.search.serialize.KSerializerFacetMap
2316
import com.algolia.search.serialize.KSerializerPoint
17+
import com.algolia.search.serialize.internal.*
2418
import com.algolia.search.serialize.internal.Json
25-
import com.algolia.search.serialize.internal.JsonNonStrict
26-
import com.algolia.search.serialize.internal.Key
27-
import com.algolia.search.serialize.internal.asJsonInput
28-
import com.algolia.search.serialize.internal.asJsonOutput
29-
import com.algolia.search.serialize.internal.jsonObjectOrNull
30-
import com.algolia.search.serialize.internal.jsonPrimitiveOrNull
31-
import kotlinx.serialization.DeserializationStrategy
32-
import kotlinx.serialization.ExperimentalSerializationApi
33-
import kotlinx.serialization.KSerializer
34-
import kotlinx.serialization.SerialName
35-
import kotlinx.serialization.Serializable
36-
import kotlinx.serialization.Serializer
19+
import kotlinx.serialization.*
3720
import kotlinx.serialization.encoding.Decoder
3821
import kotlinx.serialization.encoding.Encoder
39-
import kotlinx.serialization.json.JsonElement
40-
import kotlinx.serialization.json.JsonObject
41-
import kotlinx.serialization.json.floatOrNull
42-
import kotlinx.serialization.json.int
43-
import kotlinx.serialization.json.jsonObject
22+
import kotlinx.serialization.json.*
4423

4524
@Serializable
4625
public data class ResponseSearch(
@@ -213,7 +192,12 @@ public data class ResponseSearch(
213192
* In case of A/B test, reports the ID of the A/B test used.
214193
* Returned only if [Query.getRankingInfo] is set to true.
215194
*/
216-
@SerialName(Key.ABTestID) val abTestIDOrNull: ABTestID? = null
195+
@SerialName(Key.ABTestID) val abTestIDOrNull: ABTestID? = null,
196+
197+
/**
198+
* Search extensions.
199+
*/
200+
@SerialName(Key.Extensions) val extensionsOrNull: JsonObject? = null,
217201
) : ResultSearch {
218202

219203
/**
@@ -523,6 +507,12 @@ public data class ResponseSearch(
523507
public val abTestID: ABTestID
524508
get() = checkNotNull(abTestIDOrNull)
525509

510+
/**
511+
* Search extensions.
512+
*/
513+
public val extensions: JsonObject
514+
get() = requireNotNull(extensionsOrNull)
515+
526516
/**
527517
* Returns the position (0-based) within the [hits] result list of the record matching against the given [objectID].
528518
* If the [objectID] is not found, -1 is returned.

client/src/commonMain/kotlin/com/algolia/search/model/search/Query.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.algolia.search.serialize.KSerializerPoint
1111
import com.algolia.search.serialize.internal.Key
1212
import kotlinx.serialization.SerialName
1313
import kotlinx.serialization.Serializable
14+
import kotlinx.serialization.json.JsonObject
1415

1516
@Serializable
1617
@DSLParameters
@@ -507,4 +508,9 @@ public data class Query(
507508
* Re-Ranking (with false) at search time.
508509
*/
509510
@SerialName(Key.EnableReRanking) override var enableReRanking: Boolean? = null,
511+
512+
/**
513+
* Search extensions..
514+
*/
515+
@SerialName(Key.Extensions) public var extensions: JsonObject? = null,
510516
) : SearchParameters

client/src/commonMain/kotlin/com/algolia/search/serialize/internal/Key.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,4 +434,5 @@ internal object Key {
434434
const val FallbackParameters: String = "fallbackParameters"
435435
const val Default: String = "default"
436436
const val AlgoliaAgent = "X-Algolia-Agent"
437+
const val Extensions = "extensions"
437438
}

client/src/commonTest/kotlin/Extensions.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@ import com.algolia.search.model.Attribute
22
import com.algolia.search.model.IndexName
33
import com.algolia.search.model.ObjectID
44
import com.algolia.search.model.filter.Filter
5-
import com.algolia.search.model.rule.FacetOrdering
6-
import com.algolia.search.model.rule.FacetValuesOrder
7-
import com.algolia.search.model.rule.FacetsOrder
8-
import com.algolia.search.model.rule.RenderingContent
9-
import com.algolia.search.model.rule.SortRule
5+
import com.algolia.search.model.rule.*
106
import kotlinx.serialization.json.add
117
import kotlinx.serialization.json.buildJsonArray
8+
import kotlinx.serialization.json.buildJsonObject
9+
import kotlinx.serialization.json.put
1210

1311
internal fun set(vararg filters: Filter) = mutableSetOf(*filters)
1412

@@ -24,6 +22,15 @@ internal val objectIDA = ObjectID("442854")
2422
internal val objectIDB = ObjectID("322601")
2523
internal val nestedLists = listOf(listOf(string), listOf(string))
2624
internal val attributes = listOf(attributeA, attributeB)
25+
internal val extensions = buildJsonObject {
26+
put(
27+
key = "queryCategorization",
28+
element = buildJsonObject {
29+
put("enableCategoriesRetrieval", true)
30+
put("enableAutoFiltering", false)
31+
},
32+
)
33+
}
2734
internal val renderingContent = RenderingContent(
2835
facetOrdering = FacetOrdering(
2936
facets = FacetsOrder(

client/src/commonTest/kotlin/dsl/TestDSLQuery.kt

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,12 @@
11
package dsl
22

33
import attributeA
4-
import com.algolia.search.dsl.alternativesAsExact
5-
import com.algolia.search.dsl.analyticsTags
6-
import com.algolia.search.dsl.attributesToHighlight
7-
import com.algolia.search.dsl.attributesToRetrieve
8-
import com.algolia.search.dsl.attributesToSnippet
9-
import com.algolia.search.dsl.disableExactOnAttributes
10-
import com.algolia.search.dsl.disableTypoToleranceOnAttributes
11-
import com.algolia.search.dsl.explainModules
12-
import com.algolia.search.dsl.facetFilters
13-
import com.algolia.search.dsl.facets
14-
import com.algolia.search.dsl.filters
15-
import com.algolia.search.dsl.insideBoundingBox
16-
import com.algolia.search.dsl.insidePolygon
17-
import com.algolia.search.dsl.naturalLanguages
18-
import com.algolia.search.dsl.numericFilters
19-
import com.algolia.search.dsl.optionalFilters
20-
import com.algolia.search.dsl.optionalWords
21-
import com.algolia.search.dsl.query
22-
import com.algolia.search.dsl.queryLanguages
23-
import com.algolia.search.dsl.responseFields
24-
import com.algolia.search.dsl.restrictSearchableAttributes
25-
import com.algolia.search.dsl.ruleContexts
26-
import com.algolia.search.dsl.tagFilters
4+
import com.algolia.search.dsl.*
275
import com.algolia.search.helper.and
286
import com.algolia.search.model.search.BoundingBox
297
import com.algolia.search.model.search.Polygon
8+
import kotlinx.serialization.json.buildJsonObject
9+
import kotlinx.serialization.json.put
3010
import shouldNotBeNull
3111
import unknown
3212
import kotlin.test.Test
@@ -300,4 +280,21 @@ internal class TestDSLQuery {
300280

301281
query.naturalLanguages.shouldNotBeNull()
302282
}
283+
284+
@Test
285+
fun extensions() {
286+
val query = query {
287+
extensions {
288+
put(
289+
key = "queryCategorization",
290+
element = buildJsonObject {
291+
put("enableCategoriesRetrieval", true)
292+
put("enableAutoFiltering", false)
293+
},
294+
)
295+
}
296+
}
297+
298+
query.extensions.shouldNotBeNull()
299+
}
303300
}

client/src/commonTest/kotlin/serialize/search/TestQuery.kt

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,12 @@ import attributesJson
55
import boolean
66
import com.algolia.search.helper.and
77
import com.algolia.search.model.insights.UserToken
8-
import com.algolia.search.model.search.AlternativesAsExact
9-
import com.algolia.search.model.search.AroundPrecision
10-
import com.algolia.search.model.search.AroundRadius
11-
import com.algolia.search.model.search.ExactOnSingleWordQuery
12-
import com.algolia.search.model.search.ExplainModule
13-
import com.algolia.search.model.search.IgnorePlurals
14-
import com.algolia.search.model.search.Language
15-
import com.algolia.search.model.search.Query
16-
import com.algolia.search.model.search.QueryType
17-
import com.algolia.search.model.search.RemoveStopWords
18-
import com.algolia.search.model.search.RemoveWordIfNoResults
19-
import com.algolia.search.model.search.ResponseFields
20-
import com.algolia.search.model.search.SortFacetsBy
21-
import com.algolia.search.model.search.TypoTolerance
8+
import com.algolia.search.model.search.*
229
import com.algolia.search.model.settings.AdvancedSyntaxFeatures
2310
import com.algolia.search.model.settings.Distinct
2411
import com.algolia.search.serialize.internal.JsonNoDefaults
2512
import com.algolia.search.serialize.internal.Key
13+
import extensions
2614
import int
2715
import kotlinx.serialization.json.add
2816
import kotlinx.serialization.json.buildJsonArray
@@ -109,6 +97,7 @@ internal class TestQuery : TestSerializer<Query>(Query.serializer()) {
10997
relevancyStrictness = int,
11098
decompoundQuery = boolean,
11199
enableReRanking = boolean,
100+
extensions = extensions,
112101
) to buildJsonObject {
113102
put(Key.Query, string)
114103
put(Key.AttributesToRetrieve, attributesJson)
@@ -201,6 +190,7 @@ internal class TestQuery : TestSerializer<Query>(Query.serializer()) {
201190
put(Key.RelevancyStrictness, int)
202191
put(Key.DecompoundQuery, boolean)
203192
put(Key.EnableReRanking, boolean)
193+
put(Key.Extensions, extensions)
204194
}
205195
)
206196

0 commit comments

Comments
 (0)