Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filtrering på INTERVAL med to datoverdier #1778

Merged
merged 3 commits into from
Dec 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package no.nav.k9.los.nyoppgavestyring.query.db

enum class EksternFeltverdiOperator(val kode: String) {
EQUALS("EQUALS"),
LESS_THAN("LESS_THAN"),
GREATER_THAN("GREATER_THAN"),
LESS_THAN_OR_EQUALS("LESS_THAN_OR_EQUALS"),
GREATER_THAN_OR_EQUALS("GREATER_THAN_OR_EQUALS"),
NOT_EQUALS("NOT_EQUALS"),
IN("IN"),
NOT_IN("NOT_IN"),
INTERVAL("RANGE");
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,15 @@ object OppgavefilterDatoTypeUtvider {

// Oversetter operator til pair med grensebetingelser. null tilsvarer fravær av grensebetingelse
// Gjøres for å mappe grensebetingelser individuelt for hver verdi - fremfor alle nedre grenser, deretter alle øvre grenser.
val nedreØvreGrensebetingelse = when (operator) {
FeltverdiOperator.EQUALS.name,
FeltverdiOperator.IN.name -> (FeltverdiOperator.GREATER_THAN_OR_EQUALS to FeltverdiOperator.LESS_THAN_OR_EQUALS)
FeltverdiOperator.GREATER_THAN_OR_EQUALS.name -> (FeltverdiOperator.GREATER_THAN_OR_EQUALS to null)
FeltverdiOperator.GREATER_THAN.name -> (null to FeltverdiOperator.GREATER_THAN)
FeltverdiOperator.LESS_THAN_OR_EQUALS.name -> (null to FeltverdiOperator.LESS_THAN_OR_EQUALS)
FeltverdiOperator.LESS_THAN.name -> (FeltverdiOperator.LESS_THAN to null)
FeltverdiOperator.NOT_EQUALS.name,
FeltverdiOperator.NOT_IN.name -> (FeltverdiOperator.LESS_THAN to FeltverdiOperator.GREATER_THAN)

val nedreØvreGrensebetingelse = when (EksternFeltverdiOperator.valueOf(operator)) {
EksternFeltverdiOperator.EQUALS,
EksternFeltverdiOperator.IN -> (FeltverdiOperator.GREATER_THAN_OR_EQUALS to FeltverdiOperator.LESS_THAN_OR_EQUALS)
EksternFeltverdiOperator.GREATER_THAN_OR_EQUALS -> (FeltverdiOperator.GREATER_THAN_OR_EQUALS to null)
EksternFeltverdiOperator.GREATER_THAN -> (null to FeltverdiOperator.GREATER_THAN)
EksternFeltverdiOperator.LESS_THAN_OR_EQUALS -> (null to FeltverdiOperator.LESS_THAN_OR_EQUALS)
EksternFeltverdiOperator.LESS_THAN -> (FeltverdiOperator.LESS_THAN to null)
EksternFeltverdiOperator.NOT_EQUALS,
EksternFeltverdiOperator.NOT_IN -> (FeltverdiOperator.LESS_THAN to FeltverdiOperator.GREATER_THAN)
else -> return listOf(this)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,15 @@ object OppgavefilterOperatorUtvider {
return dto
}

val operators = when (FeltverdiOperator.valueOf(dto.operator)) {
FeltverdiOperator.IN -> (CombineOperator.OR to FeltverdiOperator.EQUALS)
FeltverdiOperator.NOT_IN, FeltverdiOperator.NOT_EQUALS -> (CombineOperator.AND to FeltverdiOperator.NOT_EQUALS)
FeltverdiOperator.EQUALS -> (CombineOperator.AND to FeltverdiOperator.EQUALS)
val operator = EksternFeltverdiOperator.valueOf(dto.operator)
if (operator == EksternFeltverdiOperator.INTERVAL) {
return lagInterval(dto)
}

val operators = when (operator) {
EksternFeltverdiOperator.IN -> (CombineOperator.OR to FeltverdiOperator.EQUALS)
EksternFeltverdiOperator.NOT_IN, EksternFeltverdiOperator.NOT_EQUALS -> (CombineOperator.AND to FeltverdiOperator.NOT_EQUALS)
EksternFeltverdiOperator.EQUALS -> (CombineOperator.AND to FeltverdiOperator.EQUALS)
else -> throw IllegalStateException("Ukjent feltverdiOperator for mengder")
}

Expand All @@ -44,4 +49,21 @@ object OppgavefilterOperatorUtvider {
}
)
}

// Forventer at listen er sortert når intervall er brukt
private fun lagInterval(dto: FeltverdiOppgavefilter): CombineOppgavefilter {
return CombineOppgavefilter(
combineOperator = CombineOperator.AND.name,
filtere = listOf(
dto.copy(
operator = EksternFeltverdiOperator.GREATER_THAN_OR_EQUALS.name,
verdi = listOf(dto.verdi.first()),
),
dto.copy(
operator = EksternFeltverdiOperator.LESS_THAN_OR_EQUALS.name,
verdi = listOf(dto.verdi.last()),
)
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import assertk.assertions.support.fail
import no.nav.k9.los.domene.lager.oppgave.v2.equalsWithPrecision
import no.nav.k9.los.nyoppgavestyring.FeltType
import no.nav.k9.los.nyoppgavestyring.query.db.CombineOperator
import no.nav.k9.los.nyoppgavestyring.query.db.EksternFeltverdiOperator
import no.nav.k9.los.nyoppgavestyring.query.db.FeltverdiOperator
import no.nav.k9.los.nyoppgavestyring.query.db.OppgavefilterUtvider
import no.nav.k9.los.nyoppgavestyring.query.dto.query.CombineOppgavefilter
Expand Down Expand Up @@ -54,15 +55,37 @@ class OppgavefilterUtviderTest {
assertThat(sisteDatoKombiner.hentFørsteMedOperator(FeltverdiOperator.LESS_THAN).verdi.first()).isEqualToDate(LocalDateTime.parse("2023-05-07T00:00:00"))
assertThat(sisteDatoKombiner.hentFørsteMedOperator(FeltverdiOperator.GREATER_THAN).verdi.first()).isEqualToDate(LocalDateTime.parse("2023-05-07T23:59:59.999"))
}

@Test
fun `Oppgavefiltre skal håndtere intervall-operator`() {
val oppgavefiltre = listOf(
FeltverdiOppgavefilter(null, FeltType.mottattDato.eksternId, EksternFeltverdiOperator.INTERVAL.name, listOf("2023-05-05", "2023-05-07"))
)

val combineFilter = OppgavefilterUtvider.utvid(oppgavefiltre).first() as CombineOppgavefilter
assertThat(combineFilter.combineOperator).isEqualTo(CombineOperator.AND.kode)

val (førsteDatoKombiner, sisteDatoKombiner) = combineFilter.filtere.map { it as FeltverdiOppgavefilter }.apply { first() to last() }
assertThat(førsteDatoKombiner.operator).isEqualTo(FeltverdiOperator.GREATER_THAN_OR_EQUALS.name)
assertThat(førsteDatoKombiner.verdi).containsOnlyDate(LocalDateTime.parse("2023-05-05T00:00"))

assertThat(sisteDatoKombiner.operator).isEqualTo(FeltverdiOperator.LESS_THAN_OR_EQUALS.name)
assertThat(sisteDatoKombiner.verdi).containsOnlyDate(LocalDateTime.parse("2023-05-07T23:59:59.999"))
}
}


internal fun CombineOppgavefilter.hentFørsteMedOperator(operator: FeltverdiOperator) = filtere.map { it as FeltverdiOppgavefilter }.hentFørsteMedOperator(operator)

internal fun List<FeltverdiOppgavefilter>.hentFørsteMedOperator(operator: FeltverdiOperator) = first { it.operator == operator.name }

internal fun Assert<List<Any?>>.containsOnlyDate(expected: LocalDateTime) = given { actual ->
actual.forEach {
if (!LocalDateTime.parse(it as String).equalsWithPrecision(expected, 10)) { fail(expected, it) }
}
}

internal fun Assert<Any?>.isEqualToDate(expected: LocalDateTime) = given { actual ->
if (LocalDateTime.parse(actual as String).equalsWithPrecision(expected, 10)) return
fail(expected, actual)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package no.nav.k9.los.nyoppgavestyring.query.db

import assertk.assertThat
import assertk.assertions.containsAll
import org.junit.jupiter.api.Test

class EksternFeltverdiOperatorTest {

@Test
fun `Skal inneholde alle typene som finnes i den interne FeltVerdiOperator`() {
val feltverdiOperatorBruktEksternt = EksternFeltverdiOperator.entries.map { it.name }
val feltverdiOperatorBruktInternt = FeltverdiOperator.entries.map { it.name }
assertThat(feltverdiOperatorBruktEksternt).containsAll(*feltverdiOperatorBruktInternt.toTypedArray())
}
}