Filter.kt 3.5 KB
Newer Older
Jonas Waeber's avatar
Jonas Waeber committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * search-doc-service
 * Copyright (C) 2020 Memoriav
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package org.memobase.helpers

Jonas Waeber's avatar
Jonas Waeber committed
21
import ch.memobase.rdf.EBUCORE
Jonas Waeber's avatar
Jonas Waeber committed
22 23 24
import com.beust.klaxon.JsonArray
import com.beust.klaxon.JsonObject
import org.apache.logging.log4j.LogManager
Jonas Waeber's avatar
Jonas Waeber committed
25
import org.memobase.model.FacetContainer
Jonas Waeber's avatar
Jonas Waeber committed
26 27 28 29 30 31 32 33 34 35 36 37

object Filter {
    private val log = LogManager.getLogger("SearchDocFilter")

    /**
     *
     *
     * @param sourceProperty
     * @param sourceResource
     * @param fullGraph
     * @return The list of de-referenced JSON Objects.
     */
Jonas Waeber's avatar
Jonas Waeber committed
38 39 40 41 42
    fun entitiesByProperty(
        sourceProperty: String,
        sourceResource: JsonObject?,
        fullGraph: Map<String, JsonObject>
    ): List<JsonObject> {
Jonas Waeber's avatar
Jonas Waeber committed
43 44 45 46 47 48
        if (sourceResource == null) {
            log.info("No results collected from property $sourceProperty, because resource does not exist.")
            return emptyList()
        }
        return sourceResource[sourceProperty].let {
            when (it) {
Jonas Waeber's avatar
Jonas Waeber committed
49 50 51 52 53 54 55 56 57
                is String ->
                    when (val newValue = fullGraph[it]) {
                        is JsonObject -> listOf(newValue)
                        else -> {
                            log.error("Could not extract json-object from entity $it in property $sourceProperty.")
                            emptyList()
                        }
                    }
                is JsonObject ->
Jonas Waeber's avatar
Jonas Waeber committed
58
                    when (val newValue = fullGraph[it[KEYS.entityId]]) {
Jonas Waeber's avatar
Jonas Waeber committed
59 60 61 62 63 64
                        is JsonObject -> listOf(newValue)
                        else -> {
                            log.error("Could not extract json-object from entity $it in property $sourceProperty.")
                            emptyList()
                        }
                    }
Jonas Waeber's avatar
Jonas Waeber committed
65 66 67 68
                is JsonArray<*> ->
                    it.mapNotNull { child ->
                        when (child) {
                            is String -> fullGraph[child]
Jonas Waeber's avatar
Jonas Waeber committed
69
                            is JsonObject -> fullGraph[child[KEYS.entityId]]
Jonas Waeber's avatar
Jonas Waeber committed
70 71 72 73
                            else -> null
                        }
                    }
                null -> {
Jonas Waeber's avatar
Jonas Waeber committed
74
                    log.info("Property $sourceProperty is not defined in resource ${sourceResource[KEYS.entityId]}.")
Jonas Waeber's avatar
Jonas Waeber committed
75 76 77
                    emptyList()
                }
                else -> {
Jonas Waeber's avatar
Jonas Waeber committed
78
                    log.error("Unexpected JSON structure for property $sourceProperty in resource ${sourceResource[KEYS.entityId]}.")
Jonas Waeber's avatar
Jonas Waeber committed
79 80 81 82 83
                    emptyList()
                }
            }
        }
    }
Jonas Waeber's avatar
Jonas Waeber committed
84 85 86 87 88 89 90 91 92 93 94 95

    fun checkLocator(digitalObject: JsonObject?, accessDigital: List<FacetContainer>): Boolean {
        return if (digitalObject != null) {
            if (digitalObject.containsKey(EBUCORE.locator.localName)) {
                accessDigital.any { it.facet?.contains("public") ?: false }
            } else {
                false
            }
        } else {
            false
        }
    }
Jonas Waeber's avatar
Jonas Waeber committed
96
}