Skip to content

Commit

Permalink
Bruker feltcache for å unngå å spørre med flere datatyper. Dette redu…
Browse files Browse the repository at this point in the history
…serer størrelsen på spørringen, forbedrer ytelse og gjør (forhåpentligvis) koden lettere å lese. (#1785)
  • Loading branch information
stiangre authored Dec 13, 2023
1 parent 60a87c8 commit a9de120
Showing 1 changed file with 56 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit a9de120

Please sign in to comment.