All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.algolia.search.model.settings.AttributeForFaceting.kt Maven / Gradle / Ivy

package com.algolia.search.model.settings

import com.algolia.search.helper.toAttribute
import com.algolia.search.model.Attribute
import com.algolia.search.serialize.internal.Key
import com.algolia.search.serialize.internal.regexFilterOnly
import com.algolia.search.serialize.internal.regexSearchable
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.Serializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

@Serializable(AttributeForFaceting.Companion::class)
public sealed class AttributeForFaceting {

    public abstract val attribute: Attribute

    public data class Default(override val attribute: Attribute) : AttributeForFaceting()

    /**
     * Defines an [Attribute] as filterable only and not facetable.
     * If you only need the filtering feature, you can take advantage of filterOnly which will reduce the index size
     * and improve the speed of the search.
     * You cannot define an attribute as both [FilterOnly] and [Searchable].
     */
    public data class FilterOnly(override val attribute: Attribute) : AttributeForFaceting()

    /**
     * Defines an attribute as searchable.
     * If you want to search for values of a given facet (using the Search for facet values method
     * you need to specify [Searchable].
     * You cannot define an attribute as both [Searchable] and [FilterOnly].
     */
    public data class Searchable(override val attribute: Attribute) : AttributeForFaceting()

    @OptIn(ExperimentalSerializationApi::class)
    @Serializer(AttributeForFaceting::class)
    public companion object : KSerializer {

        override fun serialize(encoder: Encoder, value: AttributeForFaceting) {
            val string = when (value) {
                is Default -> value.attribute.raw
                is FilterOnly -> "${Key.FilterOnly}(${value.attribute.raw})"
                is Searchable -> "${Key.Searchable}(${value.attribute.raw})"
            }
            String.serializer().serialize(encoder, string)
        }

        override fun deserialize(decoder: Decoder): AttributeForFaceting {
            val string = String.serializer().deserialize(decoder)
            val findFilterOnly = regexFilterOnly.find(string)
            val findSearchable = regexSearchable.find(string)

            return when {
                findFilterOnly != null -> FilterOnly(findFilterOnly.groupValues[1].toAttribute())
                findSearchable != null -> Searchable(findSearchable.groupValues[1].toAttribute())
                else -> Default(string.toAttribute())
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy