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

Lager materialized view for å bedre ytelse #93

Merged
merged 2 commits into from
Sep 25, 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
2 changes: 1 addition & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ jobs:
permissions: {}
name: "Deploy app to dev"
needs: "build"
if: github.ref == 'refs/heads/samenligning-med-bransje'
if: github.ref == 'refs/heads/matview'
runs-on: "ubuntu-latest"
steps:
- uses: "actions/checkout@v3"
Expand Down
5 changes: 5 additions & 0 deletions src/main/kotlin/no/nav/lydia/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ import no.nav.lydia.sykefraversstatistikk.api.geografi.GeografiService
import no.nav.lydia.sykefraversstatistikk.api.sykefraversstatistikk
import no.nav.lydia.sykefraversstatistikk.import.StatistikkMetadataVirksomhetConsumer
import no.nav.lydia.sykefraversstatistikk.import.StatistikkPerKategoriConsumer
import no.nav.lydia.vedlikehold.StatistikkViewOppdaterer
import no.nav.lydia.virksomhet.VirksomhetRepository
import no.nav.lydia.virksomhet.VirksomhetService
import no.nav.lydia.virksomhet.api.VIRKSOMHET_PATH
Expand Down Expand Up @@ -124,6 +125,10 @@ fun startLydiaBackend() {
run()
}.also { HelseMonitor.leggTilHelsesjekk(it) }

StatistikkViewOppdaterer.apply {
run(dataSource = dataSource)
}

embeddedServer(Netty, port = 8080) {
lydiaRestApi(
naisEnvironment = naisEnv,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerP
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåEiere
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåKommuner
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåSektor
import no.nav.lydia.virksomhet.domene.VirksomhetStatus
import javax.sql.DataSource

class StatusoversiktRepository(val dataSource: DataSource) {
Expand All @@ -25,43 +24,26 @@ class StatusoversiktRepository(val dataSource: DataSource) {
SELECT
count(*) as antall, ia_sak.status
FROM
sykefravar_statistikk_virksomhet AS statistikk
JOIN virksomhet USING (orgnr)
JOIN sykefravar_statistikk_virksomhet_siste_4_kvartal AS statistikk_siste4 USING (orgnr)
${
if (næringsgrupperMedBransjer.isNotEmpty()) " JOIN virksomhet_naringsundergrupper AS vn on (virksomhet.id = vn.virksomhet) "
else ""
}
${
if (sektorer.isNotEmpty()) " LEFT JOIN virksomhet_statistikk_metadata USING (orgnr) "
else ""
}
virksomhetsstatistikk_for_prioritering AS statistikk
LEFT JOIN ia_sak ON ( ia_sak.orgnr = statistikk.orgnr )

WHERE
statistikk.arstall = :arstall
AND statistikk.kvartal = :kvartal

true = true
${filtrerPåBransjeOgNæring(søkeparametere = søkeparametere)}
${filtrerPåKommuner(søkeparametere = søkeparametere)}
${filtrerPåSektor(søkeparametere = søkeparametere)}
${filtrerPåEiere(søkeparametere = søkeparametere)}

${søkeparametere.sykefraværsprosentFra?.let { " AND statistikk_siste4.prosent >= $it " } ?: ""}
${søkeparametere.sykefraværsprosentTil?.let { " AND statistikk_siste4.prosent <= $it " } ?: ""}
${søkeparametere.ansatteFra?.let { " AND statistikk.antall_personer >= $it " } ?: ""}
${søkeparametere.ansatteTil?.let { " AND statistikk.antall_personer <= $it " } ?: ""}

AND virksomhet.status = '${VirksomhetStatus.AKTIV.name}'
${søkeparametere.sykefraværsprosentFra?.let { " AND prosent >= $it " } ?: ""}
${søkeparametere.sykefraværsprosentTil?.let { " AND prosent <= $it " } ?: ""}
${søkeparametere.ansatteFra?.let { " AND antall_personer_siste_kvartal >= $it " } ?: ""}
${søkeparametere.ansatteTil?.let { " AND antall_personer_siste_kvartal <= $it " } ?: ""}
GROUP BY
ia_sak.status
""".trimIndent()

val query = queryOf(
statement = sql,
mapOf(
"kvartal" to søkeparametere.periode.kvartal,
"arstall" to søkeparametere.periode.årstall,
"naringer" to session.createArrayOf("text", næringsgrupperMedBransjer),
"kommuner" to session.createArrayOf("text", søkeparametere.kommunenummer),
"sektorer" to session.createArrayOf("text", sektorer),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,23 @@ import kotliquery.using
import no.nav.lydia.ia.sak.domene.IAProsessStatus
import no.nav.lydia.sykefraversstatistikk.api.Periode
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel.*
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel.ANTALL_PERSONER
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel.MULIGE_DAGSVERK
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel.NAVN_PÅ_VIRKSOMHET
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel.SIST_ENDRET
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel.SYKEFRAVÆRSPROSENT
import no.nav.lydia.sykefraversstatistikk.api.Sorteringsnøkkel.TAPTE_DAGSVERK
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåSnitt
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåBransjeOgNæring
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåEiere
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåKommuner
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåSektor
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåSnitt
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.filtrerPåStatus
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.joinTilNæringEllerBransje
import no.nav.lydia.sykefraversstatistikk.domene.Virksomhetsoversikt
import no.nav.lydia.sykefraversstatistikk.domene.VirksomhetsstatistikkSiste4Kvartal
import no.nav.lydia.sykefraversstatistikk.domene.VirksomhetsstatistikkSisteKvartal
import no.nav.lydia.sykefraversstatistikk.import.Kvartal
import no.nav.lydia.virksomhet.domene.VirksomhetStatus
import javax.sql.DataSource

class VirksomhetsinformasjonRepository(val dataSource: DataSource) {
Expand All @@ -38,41 +41,25 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {

val sql = """
SELECT
virksomhet.orgnr,
virksomhet.navn,
statistikk.orgnr,
statistikk.navn,
statistikk.arstall,
statistikk.kvartal,
statistikk.antall_personer,
statistikk_siste4.tapte_dagsverk,
statistikk_siste4.mulige_dagsverk,
statistikk_siste4.prosent,
statistikk_siste4.maskert,
statistikk_siste4.sist_endret,
statistikk.antall_personer_siste_kvartal AS antall_personer,
statistikk.tapte_dagsverk,
statistikk.mulige_dagsverk,
statistikk.prosent,
statistikk.maskert,
ia_sak.status,
ia_sak.eid_av,
ia_sak.endret
FROM
sykefravar_statistikk_virksomhet AS statistikk
JOIN virksomhet USING (orgnr)
JOIN sykefravar_statistikk_virksomhet_siste_4_kvartal AS statistikk_siste4
ON (statistikk.orgnr = statistikk_siste4.orgnr
AND statistikk.kvartal = statistikk_siste4.publisert_kvartal
AND statistikk.arstall = statistikk_siste4.publisert_arstall)
JOIN virksomhet_naringsundergrupper AS vn on (virksomhet.id = vn.virksomhet)
${
if (sektorer.isNotEmpty()) "LEFT JOIN virksomhet_statistikk_metadata " +
"ON (virksomhet.orgnr = virksomhet_statistikk_metadata.orgnr) "
else ""
}
FROM
virksomhetsstatistikk_for_prioritering AS statistikk
LEFT JOIN ia_sak ON (
(ia_sak.orgnr = statistikk.orgnr) AND
ia_sak.endret = (select max(endret) from ia_sak iasak2 where iasak2.orgnr = statistikk.orgnr)
)
${joinTilNæringEllerBransje(søkeparametere)}

WHERE
statistikk.arstall = :arstall
AND statistikk.kvartal = :kvartal
WHERE true = true

${filtrerPåBransjeOgNæring(søkeparametere = søkeparametere)}
${filtrerPåKommuner(søkeparametere = søkeparametere)}
Expand All @@ -81,12 +68,10 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {
${filtrerPåEiere(søkeparametere = søkeparametere)}
${filtrerPåSnitt(søkeparametere = søkeparametere)}

${søkeparametere.sykefraværsprosentFra?.let { " AND statistikk_siste4.prosent >= $it " } ?: ""}
${søkeparametere.sykefraværsprosentTil?.let { " AND statistikk_siste4.prosent <= $it " } ?: ""}
${søkeparametere.ansatteFra?.let { " AND statistikk.antall_personer >= $it " } ?: ""}
${søkeparametere.ansatteTil?.let { " AND statistikk.antall_personer <= $it " } ?: ""}

AND virksomhet.status = '${VirksomhetStatus.AKTIV.name}'
${søkeparametere.sykefraværsprosentFra?.let { " AND prosent >= $it " } ?: ""}
${søkeparametere.sykefraværsprosentTil?.let { " AND prosent <= $it " } ?: ""}
${søkeparametere.ansatteFra?.let { " AND antall_personer_siste_kvartal >= $it " } ?: ""}
${søkeparametere.ansatteTil?.let { " AND antall_personer_siste_kvartal <= $it " } ?: ""}
${søkeparametere.sorteringsnøkkel.tilOrderBy()} ${søkeparametere.sorteringsretning} NULLS LAST
LIMIT ${søkeparametere.virksomheterPerSide()}
OFFSET ${søkeparametere.offset()}
Expand All @@ -95,8 +80,6 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {
val query = queryOf(
statement = sql,
mapOf(
"kvartal" to søkeparametere.periode.kvartal,
"arstall" to søkeparametere.periode.årstall,
"naringer" to session.createArrayOf("text", næringsgrupperMedBransjer),
"kommuner" to session.createArrayOf("text", søkeparametere.kommunenummer),
"sektorer" to session.createArrayOf("text", sektorer),
Expand All @@ -112,51 +95,30 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {

val sql = """
SELECT
COUNT(statistikk_siste4.orgnr) AS total
FROM
sykefravar_statistikk_virksomhet AS statistikk
JOIN virksomhet USING (orgnr)
JOIN sykefravar_statistikk_virksomhet_siste_4_kvartal AS statistikk_siste4
ON (statistikk.orgnr = statistikk_siste4.orgnr
AND statistikk.kvartal = statistikk_siste4.publisert_kvartal
AND statistikk.arstall = statistikk_siste4.publisert_arstall)
${
if (sektorer.isNotEmpty()) "LEFT JOIN virksomhet_statistikk_metadata " +
"ON (virksomhet.orgnr = virksomhet_statistikk_metadata.orgnr) "
else ""
}
COUNT(statistikk.orgnr) AS total
FROM
virksomhetsstatistikk_for_prioritering AS statistikk
LEFT JOIN ia_sak ON (
(ia_sak.orgnr = statistikk.orgnr) AND
ia_sak.endret = (select max(endret) from ia_sak iasak2 where iasak2.orgnr = statistikk.orgnr)
)
JOIN virksomhet_naringsundergrupper AS vn on (virksomhet.id = vn.virksomhet)
${joinTilNæringEllerBransje(søkeparametere)}

WHERE
statistikk.arstall = :arstall
AND statistikk.kvartal = :kvartal

WHERE true = true
${filtrerPåBransjeOgNæring(søkeparametere = søkeparametere)}
${filtrerPåKommuner(søkeparametere = søkeparametere)}
${filtrerPåStatus(søkeparametere = søkeparametere)}
${filtrerPåSektor(søkeparametere = søkeparametere)}
${filtrerPåEiere(søkeparametere = søkeparametere)}

${søkeparametere.sykefraværsprosentFra?.let { " AND statistikk_siste4.prosent >= $it " } ?: ""}
${søkeparametere.sykefraværsprosentTil?.let { " AND statistikk_siste4.prosent <= $it " } ?: ""}
${søkeparametere.sykefraværsprosentFra?.let { " AND prosent >= $it " } ?: ""}
${søkeparametere.sykefraværsprosentTil?.let { " AND prosent <= $it " } ?: ""}
${filtrerPåSnitt(søkeparametere = søkeparametere)}
${søkeparametere.ansatteFra?.let { " AND statistikk.antall_personer >= $it " } ?: ""}
${søkeparametere.ansatteTil?.let { " AND statistikk.antall_personer <= $it " } ?: ""}

AND virksomhet.status = '${VirksomhetStatus.AKTIV.name}'
""".trimIndent()
${søkeparametere.ansatteFra?.let { " AND antall_personer_siste_kvartal >= $it " } ?: ""}
${søkeparametere.ansatteTil?.let { " AND antall_personer_siste_kvartal <= $it " } ?: ""}
""".trimIndent()

val query = queryOf(
statement = sql,
mapOf(
"kvartal" to søkeparametere.periode.kvartal,
"arstall" to søkeparametere.periode.årstall,

"naringer" to session.createArrayOf("text", næringsgrupperMedBransjer),
"kommuner" to session.createArrayOf("text", søkeparametere.kommunenummer),
"sektorer" to session.createArrayOf("text", sektorer),
Expand Down Expand Up @@ -242,7 +204,6 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {
muligeDagsverk = row.doubleOrNull("mulige_dagsverk") ?: 0.0,
sykefraversprosent = row.doubleOrNull("prosent") ?: 0.0,
maskert = row.boolean("maskert"),
opprettet = row.localDateTime("sist_endret"),
status = row.stringOrNull("status")?.let {
IAProsessStatus.valueOf(it)
},
Expand All @@ -267,12 +228,12 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {

private fun Sorteringsnøkkel.tilOrderBy(): String {
return when (this) {
NAVN_PÅ_VIRKSOMHET -> "ORDER BY virksomhet.navn"
ANTALL_PERSONER -> "ORDER BY statistikk.antall_personer"
SYKEFRAVÆRSPROSENT -> "ORDER BY statistikk_siste4.prosent"
TAPTE_DAGSVERK -> "ORDER BY statistikk_siste4.tapte_dagsverk"
MULIGE_DAGSVERK -> "ORDER BY statistikk_siste4.mulige_dagsverk"
SIST_ENDRET -> "ORDER BY ia_sak.endret"
NAVN_PÅ_VIRKSOMHET -> "ORDER BY navn"
ANTALL_PERSONER -> "ORDER BY antall_personer"
SYKEFRAVÆRSPROSENT -> "ORDER BY prosent"
TAPTE_DAGSVERK -> "ORDER BY tapte_dagsverk"
MULIGE_DAGSVERK -> "ORDER BY mulige_dagsverk"
SIST_ENDRET -> "ORDER BY endret"
}
}
}
Loading