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

Bruker feltcache for å unngå å spørre med flere datatyper. #1785

Merged
merged 1 commit into from
Dec 13, 2023
Merged
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
Expand Up @@ -2,8 +2,6 @@ package no.nav.k9.los.nyoppgavestyring.query.db

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 @@ -136,50 +134,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 @@ -258,39 +272,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