Skip to content

Commit

Permalink
EP-3777 (#1353)
Browse files Browse the repository at this point in the history
* EP-4000

* peruste täyttö fix
  • Loading branch information
oplekal authored Dec 18, 2023
1 parent dddabc6 commit e107055
Show file tree
Hide file tree
Showing 12 changed files with 431 additions and 179 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package fi.vm.sade.eperusteet.dto;

public enum JulkaisuSisaltoTyyppi {
PERUSTE,
TUTKINNONOSA,
KAIKKI;

public static JulkaisuSisaltoTyyppi of(boolean perusteet, boolean tutkinnonosat) {
if (perusteet && !tutkinnonosat) {
return PERUSTE;
}

if (!perusteet && tutkinnonosat) {
return TUTKINNONOSA;
}

return KAIKKI;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package fi.vm.sade.eperusteet.dto.peruste;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import fi.vm.sade.eperusteet.dto.KoulutusDto;
import fi.vm.sade.eperusteet.dto.tutkinnonosa.TutkinnonOsaKaikkiDto;
import fi.vm.sade.eperusteet.dto.tutkinnonrakenne.KoodiDto;
import java.util.Date;
import java.util.List;
Expand Down Expand Up @@ -29,7 +31,15 @@ public class PerusteenJulkaisuData {
private Integer laajuus;
private List<KoulutusDto> koulutukset;
private Set<SuoritustapaDto> suoritustavat;
private List<String> koodit;
private Date julkaistu;
private Long luotu;

@JsonInclude(JsonInclude.Include.NON_NULL)
private TutkinnonOsaKaikkiDto tutkinnonosa;

@JsonInclude(JsonInclude.Include.NON_NULL)
private List<PerusteenJulkaisuData> perusteet;

private String sisaltotyyppi;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@
public interface JulkaisutRepository extends JpaRepository<JulkaistuPeruste, Long> {
List<JulkaistuPeruste> findAllByPeruste(Peruste peruste);

String julkaisutQuery = "FROM ( " +
" SELECT * " +
String julkaisutQuery =
"FROM (SELECT * " +
" FROM (" +
" SELECT ROW_NUMBER() OVER(partition by id) as rownumber, * " +
" FROM julkaistu_peruste_Data_view data" +
" WHERE (" +
" COALESCE(:koulutustyypit, NULL) = '' " +
Expand Down Expand Up @@ -49,7 +51,10 @@ public interface JulkaisutRepository extends JpaRepository<JulkaistuPeruste, Lon
" AND (data.\"voimassaoloLoppuu\" IS NULL OR CAST(data.\"voimassaoloLoppuu\" as bigint) > :nykyhetki))) " +
" )" +
" )" +
" order by nimi->>:kieli asc, ?#{#pageable} " +
" AND (:sisaltotyyppi = 'kaikki' OR sisaltotyyppi = :sisaltotyyppi)" +
" ) subquery " +
" WHERE subquery.rownumber = 1 " +
" order by nimi->>:kieli asc, ?#{#pageable} " +
") t";

@Query(nativeQuery = true,
Expand All @@ -69,8 +74,20 @@ Page<String> findAllJulkisetJulkaisut(
@Param("tyyppi") String tyyppi,
@Param("diaarinumero") String diaarinumero,
@Param("koodi") String koodi,
@Param("sisaltotyyppi") String sisaltotyyppi,
Pageable pageable);

@Query(nativeQuery = true,
value = "SELECT CAST(row_to_json(t) as text) " +
"FROM ( " +
" SELECT * " +
" FROM julkaistu_peruste_Data_view data" +
" WHERE exists (select 1 from jsonb_array_elements(koodit) kd where kd->>0 in (:koodit))" +
" AND sisaltotyyppi = 'peruste' " +
") t"
)
List<String> findAllJulkaistutPerusteetByKoodi(@Param("koodit") Set<String> koodit);

@Query(nativeQuery = true,
value = "SELECT data.koulutustyyppi, COUNT(*) " +
"FROM julkaistu_peruste_Data_view data " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import fi.vm.sade.eperusteet.domain.Kieli;
import fi.vm.sade.eperusteet.domain.PerusteTyyppi;
import fi.vm.sade.eperusteet.domain.Suoritustapakoodi;
import fi.vm.sade.eperusteet.dto.JulkaisuSisaltoTyyppi;
import fi.vm.sade.eperusteet.dto.osaamismerkki.OsaamismerkkiDto;
import fi.vm.sade.eperusteet.dto.peruste.PerusteKaikkiDto;
import fi.vm.sade.eperusteet.dto.peruste.PerusteenJulkaisuData;
Expand Down Expand Up @@ -77,7 +78,9 @@ public ResponseEntity<Page<PerusteenJulkaisuData>> getPerusteet(
@RequestParam(value = "koodi", defaultValue = "", required = false) final String koodi,
@RequestParam(value = "sivu", defaultValue = "0", required = false) final Integer sivu,
@RequestParam(value = "sivukoko", defaultValue = "10", required = false) final Integer sivukoko) {
return ResponseEntity.ok(julkaisutService.getJulkisetJulkaisut(koulutustyyppi, nimi, kieli, tyyppi, tulevat, voimassa, siirtyma, poistuneet, koulutusvienti, diaarinumero, koodi, sivu, sivukoko));
return ResponseEntity.ok(julkaisutService.getJulkisetJulkaisut(
koulutustyyppi, nimi, kieli, tyyppi, tulevat, voimassa, siirtyma, poistuneet, koulutusvienti, diaarinumero, koodi, JulkaisuSisaltoTyyppi.PERUSTE,
sivu, sivukoko));
}

@RequestMapping(value = "/peruste/{perusteId:\\d+}/perusteenosa/{perusteenOsaId}", method = GET)
Expand Down Expand Up @@ -131,6 +134,7 @@ public ResponseEntity<Object> getYtoPerusteDynamicQuery(HttpServletRequest req)
false,
"",
"",
JulkaisuSisaltoTyyppi.PERUSTE,
0,
1);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fi.vm.sade.eperusteet.resource.peruste;

import fi.vm.sade.eperusteet.domain.JulkaisuTila;
import fi.vm.sade.eperusteet.dto.JulkaisuSisaltoTyyppi;
import fi.vm.sade.eperusteet.dto.peruste.JulkaisuBaseDto;
import fi.vm.sade.eperusteet.dto.peruste.PerusteenJulkaisuData;
import fi.vm.sade.eperusteet.dto.util.FieldComparisonFailureDto;
Expand Down Expand Up @@ -67,9 +68,14 @@ public ResponseEntity<Page<PerusteenJulkaisuData>> getKoulutustyyppienJulkaisut(
@RequestParam(value = "tyyppi", defaultValue = "normaali", required = false) final String tyyppi,
@RequestParam(value = "diaarinumero", defaultValue = "", required = false) final String diaarinumero,
@RequestParam(value = "koodi", defaultValue = "", required = false) final String koodi,
@RequestParam(value = "perusteet", defaultValue = "true", required = false) final boolean perusteet,
@RequestParam(value = "tutkinnonosat", defaultValue = "false", required = false) final boolean tutkinnonosat,
@RequestParam(value = "sivu", defaultValue = "0", required = false) final Integer sivu,
@RequestParam(value = "sivukoko", defaultValue = "10", required = false) final Integer sivukoko) {
return ResponseEntity.ok(julkaisutService.getJulkisetJulkaisut(koulutustyyppi, nimi, kieli, tyyppi, tulevat, voimassa, siirtyma, poistuneet, koulutusvienti, diaarinumero, koodi, sivu, sivukoko));
return ResponseEntity.ok(julkaisutService.getJulkisetJulkaisut(
koulutustyyppi, nimi, kieli, tyyppi, tulevat, voimassa, siirtyma, poistuneet, koulutusvienti, diaarinumero, koodi,
JulkaisuSisaltoTyyppi.of(perusteet, tutkinnonosat),
sivu, sivukoko));
}

@RequestMapping(method = POST, value = "/{projektiId}/julkaisu")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import fi.vm.sade.eperusteet.domain.JulkaisuPerusteTila;
import fi.vm.sade.eperusteet.domain.JulkaisuTila;
import fi.vm.sade.eperusteet.domain.Peruste;
import fi.vm.sade.eperusteet.dto.JulkaisuSisaltoTyyppi;
import fi.vm.sade.eperusteet.dto.peruste.JulkaisuBaseDto;
import fi.vm.sade.eperusteet.dto.peruste.PerusteenJulkaisuData;

Expand Down Expand Up @@ -46,7 +47,7 @@ public interface JulkaisutService {
Page<PerusteenJulkaisuData> getJulkisetJulkaisut(
List<String> koulutustyyppi, String nimi, String kieli, String tyyppi, boolean tulevat,
boolean voimassa, boolean siirtyma, boolean poistuneet, boolean koulutusvienti, String diaarinumero,
String koodi, Integer sivu, Integer sivukoko);
String koodi, JulkaisuSisaltoTyyppi julkaisuSisaltoTyyppi, Integer sivu, Integer sivukoko);

@PreAuthorize("permitAll()")
Date viimeisinPerusteenJulkaisuaika(Long perusteId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.eperusteet.service.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.base.Throwables;
Expand Down Expand Up @@ -30,6 +31,7 @@
import fi.vm.sade.eperusteet.domain.tutkinnonosa.TutkinnonOsa;
import fi.vm.sade.eperusteet.domain.validation.ValidHtml;
import fi.vm.sade.eperusteet.dto.DokumenttiDto;
import fi.vm.sade.eperusteet.dto.JulkaisuSisaltoTyyppi;
import fi.vm.sade.eperusteet.dto.MuokkaustietoKayttajallaDto;
import fi.vm.sade.eperusteet.dto.kayttaja.KayttajanTietoDto;
import fi.vm.sade.eperusteet.dto.koodisto.KoodistoKoodiDto;
Expand Down Expand Up @@ -91,6 +93,7 @@
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.HttpMediaTypeNotSupportedException;

import java.io.ByteArrayInputStream;
Expand All @@ -102,6 +105,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -473,15 +477,17 @@ public JulkaisuBaseDto aktivoiJulkaisu(long projektiId, int revision) throws Htt
@Override
public Page<PerusteenJulkaisuData> getJulkisetJulkaisut(List<String> koulutustyyppi, String nimi, String kieli, String tyyppi, boolean tulevat,
boolean voimassa, boolean siirtyma, boolean poistuneet, boolean koulutusvienti, String diaarinumero,
String koodi, Integer sivu, Integer sivukoko) {
String koodi, JulkaisuSisaltoTyyppi sisaltotyyppi,
Integer sivu, Integer sivukoko) {
Pageable pageable = new PageRequest(sivu, sivukoko);
Long currentMillis = DateTime.now().getMillis();
if (tyyppi.equals(PerusteTyyppi.DIGITAALINEN_OSAAMINEN.toString())) {
koulutustyyppi = Arrays.asList("");
koulutustyyppi = List.of("");
} else if (CollectionUtils.isEmpty((koulutustyyppi))) {
koulutustyyppi = Arrays.stream(KoulutusTyyppi.values()).map(KoulutusTyyppi::toString).collect(Collectors.toList());
}
return julkaisutRepository.findAllJulkisetJulkaisut(

Page<PerusteenJulkaisuData> julkaisut = julkaisutRepository.findAllJulkisetJulkaisut(
koulutustyyppi,
nimi,
kieli,
Expand All @@ -494,15 +500,57 @@ public Page<PerusteenJulkaisuData> getJulkisetJulkaisut(List<String> koulutustyy
tyyppi,
diaarinumero,
koodi,
sisaltotyyppi.name().toLowerCase(),
pageable)
.map(obj -> {
try {
return objectMapper.readValue(obj, PerusteenJulkaisuData.class);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
.map(this::convertToPerusteData);

if (!sisaltotyyppi.equals(JulkaisuSisaltoTyyppi.PERUSTE)) {
return taytaPerusteet(julkaisut);
}

return julkaisut;
}

private Page<PerusteenJulkaisuData> taytaPerusteet(Page<PerusteenJulkaisuData> julkaisut) {
Set<String> tutkinnonosaKoodit = julkaisut.getContent().stream()
.filter(julkaisuData -> julkaisuData.getSisaltotyyppi().equals(JulkaisuSisaltoTyyppi.TUTKINNONOSA.name().toLowerCase()))
.map(julkaisuData -> julkaisuData.getTutkinnonosa().getKoodiUri())
.collect(Collectors.toSet());

if (!ObjectUtils.isEmpty(tutkinnonosaKoodit)) {
Map<String, List<PerusteenJulkaisuData>> perusteetTutkinnonosanKoodilla = new HashMap<>();
julkaisutRepository.findAllJulkaistutPerusteetByKoodi(tutkinnonosaKoodit).stream()
.map(this::convertToPerusteData)
.forEach(perusteData -> {
perusteData.getKoodit().forEach(koodi -> {
if (!perusteetTutkinnonosanKoodilla.containsKey(koodi)) {
perusteetTutkinnonosanKoodilla.put(koodi, new ArrayList<>());
}
perusteetTutkinnonosanKoodilla.get(koodi).add(perusteData);
});
});

julkaisut.map(julkaisu -> {
if (julkaisu.getTutkinnonosa() != null && perusteetTutkinnonosanKoodilla.containsKey(julkaisu.getTutkinnonosa().getKoodiUri())) {
if (julkaisu.getPerusteet() == null) {
julkaisu.setPerusteet(new ArrayList<>());
}
});
julkaisu.getPerusteet().addAll(perusteetTutkinnonosanKoodilla.get(julkaisu.getTutkinnonosa().getKoodiUri()));
}
return julkaisu;
});
}

return julkaisut;
}

private PerusteenJulkaisuData convertToPerusteData(String perusteObj) {
try {
return objectMapper.readValue(perusteObj, PerusteenJulkaisuData.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
drop trigger if exists tg_refresh_julkaistu_peruste_data_view on julkaistu_peruste;
drop trigger if exists tg_refresh_julkaistu_peruste_data_view on peruste;
drop function if exists tg_refresh_julkaistu_peruste_data_view;
drop materialized view if exists julkaistu_peruste_data_view;

create materialized view julkaistu_peruste_data_view as
SELECT
data->'nimi' as nimi,
data->'kielet' as kielet,
data->>'voimassaoloAlkaa' as "voimassaoloAlkaa",
data->>'voimassaoloLoppuu' as "voimassaoloLoppuu",
data->>'siirtymaPaattyy' as "siirtymaPaattyy",
data->>'id' as "id",
data->>'id' as "perusteid",
data->>'diaarinumero' as diaarinumero,
data->'osaamisalat' as osaamisalat,
data->'tutkintonimikkeet' as tutkintonimikkeet,
data->'tutkinnonOsat' as tutkinnonosat,
p.tila,
data->>'koulutusvienti' as "koulutusvienti",
data->>'koulutustyyppi' as "koulutustyyppi",
data->>'tyyppi' as "tyyppi",
data->'oppaanKoulutustyypit' as "oppaankoulutustyypit",
data->'suoritustavat'->0->'rakenne'->'muodostumisSaanto'->'laajuus'->>'minimi' as "laajuus",
(SELECT json_agg(tdata->'nimi') from jsonb_array_elements(data->'osaamisalat') tdata) as "osaamisalanimet",
(SELECT json_agg(tdata->'nimi') from jsonb_array_elements(data->'tutkintonimikkeet') tdata) as "tutkintonimikkeetnimet",
(SELECT json_agg(tdata->'nimi') from jsonb_array_elements(data->'tutkinnonOsat') tdata) as "tutkinnonosatnimet",
data->'koulutukset' as koulutukset,
jp.luotu as "julkaistu",
data->'suoritustavat' as "suoritustavat",
data->>'luotu' as "luotu",
COALESCE((SELECT json_agg(tdata->'nimiKoodi'->'uri') from jsonb_array_elements(data->'koulutuksenOsat') tdata)::jsonb, '[]'::jsonb) ||
COALESCE((SELECT json_agg(tdata->'koodi'->'uri') from jsonb_array_elements(data->'tutkinnonOsat') tdata)::jsonb, '[]'::jsonb) ||
COALESCE((SELECT json_agg(tdata->'koulutuskoodiUri') from jsonb_array_elements(data->'koulutukset') tdata)::jsonb, '[]'::jsonb) ||
COALESCE((SELECT json_agg(tdata->'uri') from jsonb_array_elements(data->'osaamisalat') tdata)::jsonb, '[]'::jsonb) ||
COALESCE((SELECT json_agg(tdata->'tutkintonimikeUri') from jsonb_array_elements(data->'tutkintonimikkeet') tdata)::jsonb, '[]'::jsonb) as "koodit",
null as tutkinnonosa,
'peruste' as sisaltotyyppi
FROM julkaistu_peruste jp
INNER JOIN julkaistu_peruste_data d on d.id = jp.data_id
INNER JOIN peruste p on p.id = jp.peruste_id
where revision = (SELECT MAX(revision) FROM julkaistu_peruste j2 WHERE jp.peruste_id = j2.peruste_id)
AND p.tila != 'POISTETTU'
union all
select
tutkinnonosa->'nimi',
kielet,
"voimassaoloAlkaa",
"voimassaoloLoppuu",
"siirtymaPaattyy",
tutkinnonosa->> 'id',
"perusteid",
null,null,null,null,null,
"koulutusvienti","koulutustyyppi","tyyppi",
null,null,null,null,null,null,null,null,null,
('[' || (tutkinnonosa->'koodi'->'uri')::varchar || ']')::jsonb,
tutkinnonosa,
'tutkinnonosa' as sisaltotyyppi
from (SELECT
data->'kielet' as kielet,
data->>'voimassaoloAlkaa' as "voimassaoloAlkaa",
data->>'voimassaoloLoppuu' as "voimassaoloLoppuu",
data->>'siirtymaPaattyy' as "siirtymaPaattyy",
data->>'tyyppi' as "tyyppi",
data->>'koulutusvienti' as "koulutusvienti",
data->>'koulutustyyppi' as "koulutustyyppi",
data->>'id' as "perusteid",
jsonb_array_elements(data->'tutkinnonOsat') as tutkinnonosa
FROM julkaistu_peruste jp
INNER JOIN julkaistu_peruste_data d on d.id = jp.data_id
INNER JOIN peruste p on p.id = jp.peruste_id
where revision = (SELECT MAX(revision) FROM julkaistu_peruste j2 WHERE jp.peruste_id = j2.peruste_id)
AND p.tila != 'POISTETTU') subquery;

CREATE UNIQUE INDEX ON julkaistu_peruste_data_view ("perusteid", "id");

CREATE OR REPLACE FUNCTION tg_refresh_julkaistu_peruste_data_view()
RETURNS trigger AS
$$
BEGIN
REFRESH MATERIALIZED VIEW CONCURRENTLY julkaistu_peruste_data_view;
RETURN null;
END
$$
LANGUAGE plpgsql;

CREATE TRIGGER tg_refresh_julkaistu_peruste_data_view AFTER
INSERT OR UPDATE OR DELETE
ON julkaistu_peruste
FOR EACH STATEMENT EXECUTE PROCEDURE tg_refresh_julkaistu_peruste_data_view();

CREATE TRIGGER tg_refresh_julkaistu_peruste_data_view
AFTER UPDATE ON peruste
FOR EACH ROW
WHEN (NEW.tila <> OLD.tila)
EXECUTE PROCEDURE tg_refresh_julkaistu_peruste_data_view();
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ public void testJulkaiseJaVertaaDataa() throws ExecutionException, InterruptedEx
"normaali",
"",
"",
"peruste",
new PageRequest(0, 10));

Resource resource = new ClassPathResource("material/julkaisu.json");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import fi.vm.sade.eperusteet.domain.JulkaisuPerusteTila;
import fi.vm.sade.eperusteet.domain.JulkaisuTila;
import fi.vm.sade.eperusteet.domain.Peruste;
import fi.vm.sade.eperusteet.dto.JulkaisuSisaltoTyyppi;
import fi.vm.sade.eperusteet.dto.peruste.JulkaisuBaseDto;
import fi.vm.sade.eperusteet.dto.peruste.PerusteenJulkaisuData;
import fi.vm.sade.eperusteet.dto.util.FieldComparisonFailureDto;
Expand Down Expand Up @@ -59,7 +60,7 @@ public JulkaisuBaseDto aktivoiJulkaisu(long projektiId, int revision) {
}

@Override
public Page<PerusteenJulkaisuData> getJulkisetJulkaisut(List<String> koulutustyyppi, String nimi, String kieli, String tyyppi, boolean tulevat, boolean voimassa, boolean siirtyma, boolean poistuneet, boolean koulutusvienti, String diaarinumero, String koodi, Integer sivu, Integer sivukoko) {
public Page<PerusteenJulkaisuData> getJulkisetJulkaisut(List<String> koulutustyyppi, String nimi, String kieli, String tyyppi, boolean tulevat, boolean voimassa, boolean siirtyma, boolean poistuneet, boolean koulutusvienti, String diaarinumero, String koodi, JulkaisuSisaltoTyyppi julkaisuSisaltoTyyppi, Integer sivu, Integer sivukoko) {
return null;
}

Expand Down
Loading

0 comments on commit e107055

Please sign in to comment.