diff --git a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/query/db/SqlOppgaveQuery.kt b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/query/db/SqlOppgaveQuery.kt index 647394644..56adde26f 100644 --- a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/query/db/SqlOppgaveQuery.kt +++ b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/query/db/SqlOppgaveQuery.kt @@ -4,8 +4,6 @@ import no.nav.k9.los.nyoppgavestyring.kodeverk.EgenAnsatt import no.nav.k9.los.nyoppgavestyring.kodeverk.BeskyttelseType import no.nav.k9.los.nyoppgavestyring.mottak.feltdefinisjon.Datatype import no.nav.k9.los.nyoppgavestyring.mottak.feltdefinisjon.Datatype.* -import no.nav.k9.los.nyoppgavestyring.query.dto.felter.Oppgavefelt -import no.nav.k9.los.nyoppgavestyring.transientfeltutleder.K9SakBeslutterTransientFeltutleder import no.nav.k9.los.spi.felter.OrderByInput import no.nav.k9.los.spi.felter.SqlMedParams import no.nav.k9.los.spi.felter.TransientFeltutleder @@ -158,50 +156,66 @@ class SqlOppgaveQuery( * typekonverteringen blir gjort ved opprettelse av spørring og at feilende * typekonvertering gjør at spørringen feiler. */ - val queryVerdiParam: Any? + query += "${databaseverdiMedCasting(feltområde, feltkode)} ${operator.sql} (:feltverdi$index)" + val queryVerdiParam = castTilRiktigKotlintype(feltområde, feltkode, feltverdi) + + query += ") " + + queryParams.putAll(mapOf( + "feltOmrade$index" to feltområde, + "feltkode$index" to feltkode, + "feltverdi$index" to queryVerdiParam + )) + } + + private fun databaseverdiMedCasting(feltområde: String, feltkode: String): String { when (oppgavefelterKodeOgType[OmrådeOgKode(feltområde, feltkode)]) { TIMESTAMP -> { - query += "CAST(ov.verdi AS timestamp) ${operator.sql} (:feltverdi$index)" - queryVerdiParam = try { + return "CAST(ov.verdi AS timestamp)" + } + DURATION -> { + return "CAST(ov.verdi AS interval)" + } + INTEGER -> { + return "CAST(ov.verdi AS integer)" + } + DOUBLE -> { + return "CAST(ov.verdi AS DOUBLE PRECISION)" + } + else -> { + return "ov.verdi" + } + } + } + + private fun castTilRiktigKotlintype(feltområde: String, feltkode: String, feltverdi: Any): Any? { + when (oppgavefelterKodeOgType[OmrådeOgKode(feltområde, feltkode)]) { + TIMESTAMP -> { + return try { LocalDateTime.parse(feltverdi as String) } catch (e: Exception) { null } ?: try { LocalDate.parse(feltverdi as String) } catch (e: Exception) { null } } - DURATION -> { - query += "CAST(ov.verdi AS interval) ${operator.sql} (:feltverdi$index)" - queryVerdiParam = try { + return try { PGInterval(feltverdi as String) } catch (e: Exception) { null } } - INTEGER -> { - query += "CAST(ov.verdi AS integer) ${operator.sql} (:feltverdi$index)" - queryVerdiParam = try { + return try { BigInteger(feltverdi as String) } catch (e: Exception) { null } } - DOUBLE -> { - query += "CAST(ov.verdi AS DOUBLE PRECISION) ${operator.sql} (:feltverdi$index)" - queryVerdiParam = try { + return try { BigDecimal(feltverdi as String) } catch (e: Exception) { null } } else -> { - query += "ov.verdi ${operator.sql} (:feltverdi$index)" - queryVerdiParam = feltverdi + return feltverdi } } - - query += ") " - - queryParams.putAll(mutableMapOf( - "feltOmrade$index" to feltområde, - "feltkode$index" to feltkode, - "feltverdi$index" to queryVerdiParam - )) } private fun utenOppgavefelt(combineOperator: CombineOperator, feltområde: String, feltkode: String, operator: FeltverdiOperator) { @@ -280,39 +294,24 @@ class SqlOppgaveQuery( "orderByfeltkode$index" to feltkode )) - /* - * Koden under håndterer sortering per datatype. - * - * Mulig forbedring: Hvis vi cacher hvilke "tolkes_som" hvert enkelt felt er, - * så kan vi legge til kun den datatypen som blir brukt. - */ - val conversions = arrayOf( - "CASE WHEN fd.tolkes_som = 'Duration' THEN ov.verdi::interval ELSE NULL END", - "CASE WHEN fd.tolkes_som = 'Integer' THEN ov.verdi::integer ELSE NULL END", - "CASE WHEN fd.tolkes_som = 'Double' THEN CAST(ov.verdi AS DOUBLE PRECISION) ELSE NULL END", - "CASE WHEN fd.tolkes_som = 'Timestamp' THEN ov.verdi::timestamp ELSE NULL END", - "CASE WHEN fd.tolkes_som NOT IN ('Duration', 'Integer', 'Double', 'Timestamp') THEN ov.verdi ELSE NULL END" - ) - - for (typeConversion in conversions) { - orderBySql += """ - , ( - SELECT $typeConversion - FROM Oppgavefelt_verdi ov INNER JOIN Oppgavefelt f ON ( - f.id = ov.oppgavefelt_id - ) INNER JOIN Feltdefinisjon fd ON ( - fd.id = f.feltdefinisjon_id - ) INNER JOIN Omrade fo ON ( - fo.id = fd.omrade_id - ) - WHERE ov.oppgave_id = o.id - AND fo.ekstern_id = :orderByfeltOmrade$index - AND fd.ekstern_id = :orderByfeltkode$index - ) - """.trimIndent() - - orderBySql += if (økende) "ASC" else "DESC" - } + val typeConversion = databaseverdiMedCasting(feltområde, feltkode) + orderBySql += """ + , ( + SELECT $typeConversion + FROM Oppgavefelt_verdi ov INNER JOIN Oppgavefelt f ON ( + f.id = ov.oppgavefelt_id + ) INNER JOIN Feltdefinisjon fd ON ( + fd.id = f.feltdefinisjon_id + ) INNER JOIN Omrade fo ON ( + fo.id = fd.omrade_id + ) + WHERE ov.oppgave_id = o.id + AND fo.ekstern_id = :orderByfeltOmrade$index + AND fd.ekstern_id = :orderByfeltkode$index + ) + """.trimIndent() + + orderBySql += if (økende) "ASC" else "DESC" } fun medLimit(limit: Int) {