Skip to content

Commit

Permalink
fix: muuta nimi-kentän analysointi sellaiseksi, että siihen voidaan k…
Browse files Browse the repository at this point in the history
…ohdistaa vapaatekstihaku. Lisää kunnat kansalaisen hakuindeksiin ja haun parametreihin. (#368)
  • Loading branch information
haapamakim authored Sep 15, 2022
1 parent e61bf78 commit 396e10e
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ Array [
],
"nimi": "unittest2",
"oid": "2",
"paivitetty": "2020-01-01T20:00:00.000Z",
"paivitetty": "2020-01-01T22:00:00+02:00",
"projektiTyyppi": "TIE",
"projektipaallikko": "Projari, Pekka",
"suunnittelustaVastaavaViranomainen": "UUDENMAAN_ELY",
"vaihe": "EI_JULKAISTU",
"vaihe": "SUUNNITTELU",
"vaylamuoto": Array [
"tie",
],
Expand All @@ -34,11 +34,11 @@ Array [
],
"nimi": "unittest1",
"oid": "1",
"paivitetty": "2020-01-01T21:00:00.000Z",
"paivitetty": "2020-01-01T23:00:00+02:00",
"projektiTyyppi": "TIE",
"projektipaallikko": "Projari, Pekka",
"suunnittelustaVastaavaViranomainen": "POHJOIS_POHJANMAAN_ELY",
"vaihe": "EI_JULKAISTU",
"suunnittelustaVastaavaViranomainen": "UUDENMAAN_ELY",
"vaihe": "SUUNNITTELU",
"vaylamuoto": Array [
"tie",
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { describe, it } from "mocha";
import { ProjektiFixture } from "../../test/fixture/projektiFixture";
import { projektiSearchService } from "../../src/projektiSearch/projektiSearchService";
import { ListaaProjektitInput, ProjektiTyyppi, Status, Viranomainen } from "../../../common/graphql/apiModel";
import { Kieli, ListaaProjektitInput, ProjektiTyyppi, Status, Viranomainen } from "../../../common/graphql/apiModel";
import { DBProjekti } from "../../src/database/model/projekti";
import dayjs from "dayjs";
import { UserFixture } from "../../test/fixture/userFixture";
Expand All @@ -17,6 +17,7 @@ type ProjektiVariation = {
oid: string;
suunnittelustaVastaavaViranomainen: Viranomainen;
maakunnat: string[];
kunnat: string[];
} & Omit<ListaaProjektitInput, "vaihe" | "suunnittelustaVastaavaViranomainen">;

const testData: ProjektiVariation[] = [
Expand All @@ -25,6 +26,7 @@ const testData: ProjektiVariation[] = [
projektiTyyppi: ProjektiTyyppi.TIE,
vaylamuoto: ["tie"],
maakunnat: ["Pohjanmaa"],
kunnat: ["Tampere", "Nokia"],
asiatunnus: "A1",
suunnittelustaVastaavaViranomainen: Viranomainen.POHJOIS_POHJANMAAN_ELY,
},
Expand All @@ -33,6 +35,7 @@ const testData: ProjektiVariation[] = [
projektiTyyppi: ProjektiTyyppi.TIE,
vaylamuoto: ["tie"],
maakunnat: ["Uusimaa", "Pirkanmaa"],
kunnat: ["Tampere", "Helsinki"],
asiatunnus: "A2",
suunnittelustaVastaavaViranomainen: Viranomainen.UUDENMAAN_ELY,
},
Expand All @@ -41,6 +44,7 @@ const testData: ProjektiVariation[] = [
projektiTyyppi: ProjektiTyyppi.RATA,
vaylamuoto: ["rata"],
maakunnat: ["Ahvenanmaa"],
kunnat: ["Maarianhamina"],
asiatunnus: "A3",
suunnittelustaVastaavaViranomainen: Viranomainen.VAYLAVIRASTO,
},
Expand All @@ -49,6 +53,7 @@ const testData: ProjektiVariation[] = [
projektiTyyppi: ProjektiTyyppi.RATA,
vaylamuoto: ["tie", "rata"],
maakunnat: ["Uusimaa", "Ahvenanmaa"],
kunnat: ["Maarianhamina", "Helsinki"],
asiatunnus: "A4",
suunnittelustaVastaavaViranomainen: Viranomainen.UUDENMAAN_ELY,
},
Expand All @@ -57,6 +62,7 @@ const testData: ProjektiVariation[] = [
projektiTyyppi: ProjektiTyyppi.YLEINEN,
vaylamuoto: ["tie"],
maakunnat: ["Pirkanmaa"],
kunnat: ["Tampere"],
asiatunnus: "A5",
suunnittelustaVastaavaViranomainen: Viranomainen.PIRKANMAAN_ELY,
},
Expand All @@ -65,6 +71,7 @@ const testData: ProjektiVariation[] = [
projektiTyyppi: ProjektiTyyppi.YLEINEN,
vaylamuoto: ["tie", "rata"],
maakunnat: ["Kanta-Häme"],
kunnat: ["Hämeenlinna"],
asiatunnus: "A6",
suunnittelustaVastaavaViranomainen: Viranomainen.KESKI_SUOMEN_ELY,
},
Expand All @@ -77,25 +84,28 @@ describe.skip("ProjektiSearchService", () => {
before(async () => {
for (let i = 0; i < testData.length; i++) {
const data = testData[i];
const projekti: DBProjekti = projektiFixture.dbProjekti1();
const projekti: DBProjekti = projektiFixture.dbProjekti2();
projekti.oid = data.oid;
projekti.velho.tyyppi = data.projektiTyyppi;
projekti.velho.vaylamuoto = data.vaylamuoto;
projekti.velho.nimi = "unittest" + data.oid;
projekti.velho.kunnat = data.kunnat;
projekti.velho.maakunnat = data.maakunnat;
projekti.velho.asiatunnusELY = data.asiatunnus;
projekti.suunnittelustaVastaavaViranomainen = data.suunnittelustaVastaavaViranomainen;
projekti.paivitetty = dayjs("2020-01-01T23:00:00+02:00").add(-i, "hours").format();
projekti.aloitusKuulutusJulkaisut[0].kuulutusPaiva = "2000-02-02";
projekti.aloitusKuulutusJulkaisut[0].siirtyySuunnitteluVaiheeseen = "2222-02-02";
await projektiSearchService.indexProjekti(projekti);
}
await delay(500);
});

after(async () => {
for (const data of testData) {
await projektiSearchService.removeProjekti(data.oid);
}
});
// after(async () => {
// for (const data of testData) {
// await projektiSearchService.removeProjekti(data.oid);
// }
// });

beforeEach(() => {
userFixture = new UserFixture(userService);
Expand All @@ -118,18 +128,18 @@ describe.skip("ProjektiSearchService", () => {
projektiTyyppi: ProjektiTyyppi.RATA,
})
).tulokset;
expect(results).to.have.length(1);
expect(results[0].oid).to.eq("3");

expect(results.map((result) => result.oid)).to.contain("3");
});

it("should search by vaihe successfully", async () => {
const results = (
await projektiSearchService.searchYllapito({
vaihe: [Status.EI_JULKAISTU],
vaihe: [Status.SUUNNITTELU],
})
).tulokset;
for (const result of results) {
expect(result.vaihe).to.eq(Status.EI_JULKAISTU, JSON.stringify(result));
expect(result.vaihe).to.eq(Status.SUUNNITTELU, JSON.stringify(result));
}
});

Expand All @@ -140,10 +150,7 @@ describe.skip("ProjektiSearchService", () => {
})
).tulokset;
for (const result of results) {
expect(result.suunnittelustaVastaavaViranomainen).to.be.oneOf([
Viranomainen.KESKI_SUOMEN_ELY,
Viranomainen.UUDENMAAN_ELY,
]);
expect(result.suunnittelustaVastaavaViranomainen).to.be.oneOf([Viranomainen.KESKI_SUOMEN_ELY, Viranomainen.UUDENMAAN_ELY]);
}
});

Expand All @@ -152,19 +159,18 @@ describe.skip("ProjektiSearchService", () => {
await projektiSearchService.searchYllapito({
nimi: "unittest3",
projektiTyyppi: ProjektiTyyppi.RATA,
vaihe: [Status.EI_JULKAISTU],
vaihe: [Status.SUUNNITTELU],
})
).tulokset;
expect(results).to.have.length(1);
expect(results[0].oid).to.eq("3");
expect(results.map((result) => result.oid)).to.contain("3");
});

it("should not include results if name and vaihe don't match at the same time", async () => {
const results = (
await projektiSearchService.searchYllapito({
nimi: "unittest3",
projektiTyyppi: ProjektiTyyppi.RATA,
vaihe: [Status.NAHTAVILLAOLO],
vaihe: [Status.EI_JULKAISTU],
})
).tulokset;
expect(results).to.have.length(0);
Expand Down Expand Up @@ -193,6 +199,7 @@ describe.skip("ProjektiSearchService", () => {
});

it("should search by maakunta", async () => {
userFixture.loginAs(UserFixture.mattiMeikalainen);
const results = (
await projektiSearchService.searchYllapito({
maakunta: ["Uusimaa", "Pirkanmaa"],
Expand Down Expand Up @@ -220,4 +227,41 @@ describe.skip("ProjektiSearchService", () => {
).tulokset;
expect(results2).to.have.length(0);
});

it("should search by maakunta as kansalainen", async () => {
const results = (
await projektiSearchService.searchJulkinen({
kieli: Kieli.SUOMI,
maakunta: ["Uusimaa", "Pirkanmaa"],
})
).tulokset;
for (const result of results) {
expect(result.maakunnat).to.contain.oneOf(["Uusimaa", "Pirkanmaa"]);
}
});

it("should search by kunta as kansalainen", async () => {
const results = (
await projektiSearchService.searchJulkinen({
kieli: Kieli.SUOMI,
kunta: ["Maarianhamina"],
})
).tulokset;
for (const result of results) {
expect(result.kunnat).to.contain("Maarianhamina");
}
});

it("should search by nimi as kansalainen", async () => {
const results = (
await projektiSearchService.searchJulkinen({
kieli: Kieli.SUOMI,
nimi: "testiprojekti",
vaihe: [Status.ALOITUSKUULUTUS],
})
).tulokset;
for (const result of results) {
expect(result.nimi).to.contain("testiprojekti");
}
});
});
6 changes: 4 additions & 2 deletions backend/src/config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { log } from "./logger";
import * as AWSXRay from "aws-xray-sdk-core";

const BaseConfig = require("../../common/BaseConfig.js").BaseConfig;

const config = {
projektiTableName: process.env.TABLE_PROJEKTI,
feedbackTableName: process.env.TABLE_FEEDBACK,
Expand Down Expand Up @@ -56,8 +58,8 @@ AWSXRay.setLogger({
log.warn(message, { meta });
},
info: (message, meta) => {
// Reduce unnecessary logging in local development
if (process.env.NODE_ENV !== "development") {
// Reduce unnecessary logging in development
if (BaseConfig.isPermanentEnvironment()) {
log.info(message, { meta });
}
},
Expand Down
2 changes: 1 addition & 1 deletion backend/src/projektiSearch/openSearchClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export abstract class OpenSearchClient {

async query(query: SearchOpts): Promise<any> {
const body = JSON.stringify(query);
log.info("query", { index: this.index, query });
log.info("query " + this.index);
const request = new HttpRequest({
body,
headers: {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/projektiSearch/projekti-settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"analysis": {
"analyzer": {
"sortable": {
"tokenizer": "keyword",
"tokenizer": "StandardTokenizer",
"filter": [
"lowercase"
]
Expand Down
13 changes: 9 additions & 4 deletions backend/src/projektiSearch/projektiSearchService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const projektiSarakeToField: Record<ProjektiSarake, string> = {
class ProjektiSearchService {
async indexProjekti(projekti: DBProjekti) {
const projektiToIndex = adaptProjektiToIndex(projekti);
log.info("Index projekti", { oid: projekti.oid, projektiToIndex });
log.info("Index projekti", { oid: projekti.oid });
await openSearchClientYllapito.putDocument(projekti.oid, projektiToIndex);

projekti.tallennettu = true;
Expand All @@ -42,7 +42,7 @@ class ProjektiSearchService {
for (const kieli of Object.values(Kieli)) {
const projektiJulkinenToIndex = adaptProjektiToJulkinenIndex(apiProjekti, kieli);
if (projektiJulkinenToIndex) {
log.info("Index julkinen projekti", { oid: projekti.oid, kieli, projektiJulkinenToIndex });
log.info("Index julkinen projekti", { oid: projekti.oid, kieli });
await openSearchClientJulkinen[kieli].putDocument(projekti.oid, projektiJulkinenToIndex);
}
}
Expand Down Expand Up @@ -123,7 +123,7 @@ class ProjektiSearchService {
const searchResultDocuments = adaptSearchResultsToProjektiHakutulosDokumenttis(searchResult);
const resultCount = searchResult.hits.total.value;

log.info(resultCount + " " + projektiTyyppi + " search results from OpenSearch", { searchResult });
log.info(resultCount + " " + projektiTyyppi + " search results from OpenSearch");
const result: ProjektiHakutulos = {
__typename: "ProjektiHakutulos",
tulokset: searchResultDocuments,
Expand Down Expand Up @@ -178,7 +178,7 @@ class ProjektiSearchService {
const searchResultDocuments = adaptSearchResultsToProjektiHakutulosDokumenttis(searchResult);

const resultCount = searchResult.hits.total.value;
log.info(resultCount + " search results from OpenSearch", { searchResult });
log.info(resultCount + " search results from OpenSearch");
return {
__typename: "ProjektiHakutulosJulkinen",
tulokset: searchResultDocuments,
Expand Down Expand Up @@ -230,6 +230,11 @@ class ProjektiSearchService {
terms: { "maakunnat.keyword": params.maakunta },
});
}
if (params.kunta) {
queries.push({
terms: { "kunnat.keyword": params.kunta },
});
}
if (params.vaylamuoto) {
queries.push({
terms: { "vaylamuoto.keyword": params.vaylamuoto },
Expand Down
6 changes: 3 additions & 3 deletions deployment/bin/setupEnvironment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,13 +189,13 @@ export async function getEnvironmentVariablesFromSSM(variables?: HassuSSMParamet
}

async function main() {
const searchStackOutputs = await readAccountStackOutputs();
const accountStackOutputs = await readAccountStackOutputs();
const backendStackOutputs = await readBackendStackOutputs();
const frontendStackOutputs = await readFrontendStackOutputs();
const variables = await readParametersForEnv<HassuSSMParameters>(BaseConfig.infraEnvironment, Region.EU_WEST_1);
const environmentVariables = await getEnvironmentVariablesFromSSM(variables);
writeEnvFile(".env.test", {
SEARCH_DOMAIN: searchStackOutputs.SearchDomainEndpointOutput,
SEARCH_DOMAIN: accountStackOutputs.SearchDomainEndpointOutput,
FRONTEND_DOMAIN_NAME: frontendStackOutputs.CloudfrontPrivateDNSName,
TABLE_PROJEKTI: Config.projektiTableName,
TABLE_FEEDBACK: Config.feedbackTableName,
Expand All @@ -213,7 +213,7 @@ async function main() {
FRONTEND_DOMAIN_NAME: frontendStackOutputs.CloudfrontPrivateDNSName,
SONARQUBE_HOST_URL: variables.SonarQubeHostURL,
SONARQUBE_ACCESS_TOKEN: variables.SonarQubeAccessToken,
SEARCH_DOMAIN: searchStackOutputs.SearchDomainEndpointOutput,
SEARCH_DOMAIN: accountStackOutputs.SearchDomainEndpointOutput,
TABLE_PROJEKTI: Config.projektiTableName,
TABLE_FEEDBACK: Config.feedbackTableName,
});
Expand Down
1 change: 1 addition & 0 deletions graphql/inputs.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ input ListaaProjektitInput {
kieli: Kieli
asiatunnus: String
maakunta: [String!]
kunta: [String!]
vaylamuoto: [String!]
suunnittelustaVastaavaViranomainen: [Viranomainen!]
vaihe: [Status!]
Expand Down
1 change: 1 addition & 0 deletions graphql/types.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -724,6 +724,7 @@ type ProjektiHakutulosDokumentti {
hankkeenKuvaus: String
asiatunnus: String
maakunnat: [String!]
kunnat: [String!]
vaylamuoto: [String!]
suunnittelustaVastaavaViranomainen: Viranomainen
vaihe: Status
Expand Down

0 comments on commit 396e10e

Please sign in to comment.