@@ -21,16 +21,20 @@ package org.eclipse.apoapsis.ortserver.dao.repositories.organization
2121
2222import org.eclipse.apoapsis.ortserver.dao.blockingQuery
2323import org.eclipse.apoapsis.ortserver.dao.entityQuery
24+ import org.eclipse.apoapsis.ortserver.dao.utils.apply
2425import org.eclipse.apoapsis.ortserver.dao.utils.applyRegex
26+ import org.eclipse.apoapsis.ortserver.dao.utils.extractIds
2527import org.eclipse.apoapsis.ortserver.dao.utils.listQuery
28+ import org.eclipse.apoapsis.ortserver.model.CompoundHierarchyId
2629import org.eclipse.apoapsis.ortserver.model.repositories.OrganizationRepository
2730import org.eclipse.apoapsis.ortserver.model.util.FilterParameter
31+ import org.eclipse.apoapsis.ortserver.model.util.HierarchyFilter
2832import org.eclipse.apoapsis.ortserver.model.util.ListQueryParameters
2933import org.eclipse.apoapsis.ortserver.model.util.OptionalValue
3034
3135import org.jetbrains.exposed.sql.Database
3236import org.jetbrains.exposed.sql.Op
33- import org.jetbrains.exposed.sql.and
37+ import org.jetbrains.exposed.sql.SqlExpressionBuilder
3438
3539/* *
3640 * An implementation of [OrganizationRepository] that stores organizations in [OrganizationsTable].
@@ -45,17 +49,17 @@ class DaoOrganizationRepository(private val db: Database) : OrganizationReposito
4549
4650 override fun get (id : Long ) = db.entityQuery { OrganizationDao [id].mapToModel() }
4751
48- override fun list (parameters : ListQueryParameters , filter : FilterParameter ? ) =
52+ override fun list (parameters : ListQueryParameters , nameFilter : FilterParameter ? , hierarchyFilter : HierarchyFilter ) =
4953 db.blockingQuery {
50- OrganizationDao .listQuery(parameters, OrganizationDao ::mapToModel) {
51- var condition: Op <Boolean > = Op .TRUE
52- filter?.let {
53- condition = condition and OrganizationsTable .name.applyRegex(
54- it.value
55- )
56- }
57- condition
54+ val nameCondition = nameFilter?.let {
55+ OrganizationsTable .name.applyRegex(it.value)
56+ } ? : Op .TRUE
57+
58+ val builder = hierarchyFilter.apply (nameCondition) { level, ids, filter ->
59+ generateHierarchyCondition(level, ids, filter)
5860 }
61+
62+ OrganizationDao .listQuery(parameters, OrganizationDao ::mapToModel, builder)
5963 }
6064
6165 override fun update (id : Long , name : OptionalValue <String >, description : OptionalValue <String ?>) = db.blockingQuery {
@@ -69,3 +73,21 @@ class DaoOrganizationRepository(private val db: Database) : OrganizationReposito
6973
7074 override fun delete (id : Long ) = db.blockingQuery { OrganizationDao [id].delete() }
7175}
76+
77+ /* *
78+ * Generate a condition defined by a [filter] for the given [level] and [ids].
79+ */
80+ private fun SqlExpressionBuilder.generateHierarchyCondition (
81+ level : Int ,
82+ ids : List <CompoundHierarchyId >,
83+ filter : HierarchyFilter
84+ ): Op <Boolean > =
85+ when (level) {
86+ CompoundHierarchyId .ORGANIZATION_LEVEL ->
87+ OrganizationsTable .id inList (
88+ ids.extractIds(CompoundHierarchyId .ORGANIZATION_LEVEL ) +
89+ filter.nonTransitiveIncludes[CompoundHierarchyId .ORGANIZATION_LEVEL ].orEmpty()
90+ .extractIds(CompoundHierarchyId .ORGANIZATION_LEVEL )
91+ )
92+ else -> Op .FALSE
93+ }
0 commit comments