Skip to content

Commit a10b82f

Browse files
authored
Merge pull request #111 from algolia/feature/query-rule-alternative
Query Rule Alternatives
2 parents c27e841 + bbaca63 commit a10b82f

File tree

7 files changed

+68
-9
lines changed

7 files changed

+68
-9
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.algolia.search.model.rule
2+
3+
import com.algolia.search.serialize.asJsonInput
4+
import kotlinx.serialization.Decoder
5+
import kotlinx.serialization.Encoder
6+
import kotlinx.serialization.KSerializer
7+
import kotlinx.serialization.Serializer
8+
import kotlinx.serialization.internal.BooleanSerializer
9+
import kotlinx.serialization.json.JsonLiteral
10+
11+
12+
public sealed class Alternatives {
13+
14+
public object True : Alternatives()
15+
16+
public object False : Alternatives()
17+
18+
@Serializer(Alternatives::class)
19+
companion object : KSerializer<Alternatives> {
20+
21+
override fun serialize(encoder: Encoder, obj: Alternatives) {
22+
when (obj) {
23+
is Alternatives.True -> BooleanSerializer.serialize(encoder, true)
24+
is Alternatives.False -> BooleanSerializer.serialize(encoder, false)
25+
}
26+
}
27+
28+
override fun deserialize(decoder: Decoder): Alternatives {
29+
return when (val element = decoder.asJsonInput()) {
30+
is JsonLiteral -> if (element.boolean) Alternatives.True else Alternatives.False
31+
else -> throw Exception("Unsupported Type")
32+
}
33+
}
34+
}
35+
}

src/commonMain/kotlin/com/algolia/search/model/rule/Condition.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.algolia.search.model.rule
22

3+
import com.algolia.search.serialize.KeyAlternatives
34
import com.algolia.search.serialize.KeyAnchoring
45
import com.algolia.search.serialize.KeyContext
56
import com.algolia.search.serialize.KeyPattern
@@ -16,5 +17,9 @@ public data class Condition(
1617
* same context is specified at query time (using the ruleContexts parameter). When absent, the rule is generic
1718
* and always applies (provided that its other conditions are met, of course).
1819
*/
19-
@SerialName(KeyContext) val context: String? = null
20+
@SerialName(KeyContext) val context: String? = null,
21+
/**
22+
* Indicates if the rule can be applied with alternatives.
23+
*/
24+
@SerialName(KeyAlternatives) val alternative: Alternatives? = null
2025
)

src/commonMain/kotlin/com/algolia/search/serialize/Keys.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,4 +362,5 @@ public const val KeySuburb = "suburb"
362362
public const val KeyVillage = "village"
363363
public const val KeySimilarQuery = "similarQuery"
364364
public const val KeyEnableABTest = "enableABTest"
365-
public const val KeyIndexLanguages = "indexLanguages"
365+
public const val KeyAlternatives = "alternatives"
366+
public const val KeyIndexLanguages = "indexLanguages"

src/commonTest/kotlin/serialize/TestKeys.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ internal class TestKeys {
353353
KeyVillage shouldEqual "village"
354354
KeySimilarQuery shouldEqual "similarQuery"
355355
KeyEnableABTest shouldEqual "enableABTest"
356+
KeyAlternatives shouldEqual "alternatives"
356357
KeyIndexLanguages shouldEqual "indexLanguages"
357358
}
358359
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package serialize.rule
2+
3+
import com.algolia.search.model.rule.Alternatives
4+
import kotlinx.serialization.json.JsonLiteral
5+
import serialize.TestSerializer
6+
7+
8+
internal class TestAlternatives : TestSerializer<Alternatives>(Alternatives) {
9+
10+
override val items = listOf(
11+
Alternatives.True to JsonLiteral(true),
12+
Alternatives.False to JsonLiteral(false)
13+
)
14+
}
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package serialize.rule
22

33
import attributeA
4+
import com.algolia.search.model.rule.Alternatives
45
import com.algolia.search.model.rule.Anchoring
56
import com.algolia.search.model.rule.Condition
67
import com.algolia.search.model.rule.Pattern
7-
import com.algolia.search.serialize.JsonNoDefaults
8-
import com.algolia.search.serialize.KeyAnchoring
9-
import com.algolia.search.serialize.KeyIs
10-
import com.algolia.search.serialize.KeyPattern
8+
import com.algolia.search.serialize.*
119
import kotlinx.serialization.json.json
1210
import serialize.TestSerializer
1311
import unknown
@@ -18,17 +16,21 @@ internal class TestCondition : TestSerializer<Condition>(Condition.serializer(),
1816
override val items = listOf(
1917
Condition(
2018
anchoring = Anchoring.Is,
21-
pattern = Pattern.Facet(attributeA)
19+
pattern = Pattern.Facet(attributeA),
20+
alternative = Alternatives.True
2221
) to json {
2322
KeyAnchoring to KeyIs
2423
KeyPattern to "{facet:$attributeA}"
24+
KeyAlternatives to true
2525
},
2626
Condition(
2727
anchoring = Anchoring.Is,
28-
pattern = Pattern.Literal(unknown)
28+
pattern = Pattern.Literal(unknown),
29+
alternative = Alternatives.False
2930
) to json {
3031
KeyAnchoring to KeyIs
3132
KeyPattern to unknown
33+
KeyAlternatives to false
3234
}
3335
)
3436
}

src/commonTest/resources/rule_edits.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"objectID": "query_edits",
44
"condition": {
55
"anchoring": "is",
6-
"pattern": "mobile phone"
6+
"pattern": "mobile phone",
7+
"alternatives": true
78
},
89
"consequence": {
910
"params": {

0 commit comments

Comments
 (0)