Skip to content

Commit

Permalink
Merge pull request #773 from City-of-Helsinki/UHF-8934-fix-search-by-…
Browse files Browse the repository at this point in the history
…address

UHF-8934: Fix search by address
  • Loading branch information
Jussiles authored Sep 21, 2023
2 parents ac16ced + 40b74cf commit b9e7c69
Show file tree
Hide file tree
Showing 14 changed files with 65 additions and 103 deletions.
2 changes: 1 addition & 1 deletion dist/js/news-archive.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/js/school-search.min.js

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 0 additions & 27 deletions src/js/react/apps/job-search/hooks/useWindowDimensions.tsx

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import CardItem from '@/react/common/Card';
import type NewsItem from '../../types/NewsItem';
import CardImage from '@/react/common/CardImage';
import type NewsItem from '../../types/NewsItem';

const ResultCard = ({
alt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const ResultsContainer = () => {
useScrollToResults(scrollTarget, choices);

const hits = data?.hits?.hits;
const total = data?.hits.total.value || 0;
const total = data?.hits?.total?.value || 0;

const getResults = () => {
if (!data && !error) {
Expand Down
2 changes: 1 addition & 1 deletion src/js/react/apps/school-search/components/ResultCard.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import CardItem from '@/react/common/Card';
import { School } from '../types/School';
import CardImage from '@/react/common/CardImage';
import { School } from '../types/School';

const ResultCard = ({ additional_filters, address, summary_processed, name, name_override, picture_url, media_as_objects, url }: School) => {
const title = name_override?.[0] || name?.[0];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Button, TextInput } from 'hds-react';
import { useSetAtom } from 'jotai';

import { paramsAtom } from '../store';
import SearchParams from '../types/SearchParams';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { useAtomValue, useSetAtom } from 'jotai';

import { paramsAtom, updateParamsAtom } from '../store';
import UseProximityQuery from '../hooks/UseProximityQuery';
import ResultsList from '../components/ResultsList';
Expand Down
2 changes: 1 addition & 1 deletion src/js/react/apps/school-search/enum/GlobalSettings.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const GlobalSettings = {
coordinatesBaseUrl: 'https://api.hel.fi/servicemap/v2/search?municipality=helsinki&type=address&q=heteniityntie&page=1&page_size=1&language=fi&format=json',
addressBaseUrl: 'https://api.hel.fi/servicemap/v2/search?municipality=helsinki&type=address&q=heteniityntie&page=1&page_size=1&language=fi&format=json',
index: 'schools',
locationsBaseUrl: 'https://api.hel.fi/servicemap/v2/administrative_division/?municipality=helsinki&type=lower_comprehensive_school_district_fi,lower_comprehensive_school_district_sv,upper_comprehensive_school_district_fi,upper_comprehensive_school_district_sv',
size: 10
Expand Down
62 changes: 16 additions & 46 deletions src/js/react/apps/school-search/helpers/ProximityQuery.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import GlobalSettings from '../enum/GlobalSettings';
import BooleanQuery from '@/types/BooleanQuery';
import GlobalSettings from '../enum/GlobalSettings';

const getQueryString = (ids: number[]|null, coordinates: number[]|null, page: number) => {
const { size } = GlobalSettings;
const lang = drupalSettings.path.currentLanguage;

const query: BooleanQuery = {
bool: {
filter: [
{
term: {
_language: drupalSettings.path.currentLanguage
_language: lang
}
}
],
Expand All @@ -24,64 +25,33 @@ const getQueryString = (ids: number[]|null, coordinates: number[]|null, page: nu
}
}
];

query.bool.should = [
// Show finnish schools first
// Show finnish schools first when using fi or en, swedish when sv
{
nested: {
path: 'additional_filters',
query: {
term: {
'additional_filters.finnish_education': {
value: true,
boost: 20
constant_score: {
boost: 1,
filter: {
term: {
[lang === 'sv' ? 'additional_filters.swedish_education' : 'additional_filters.finnish_education']: {
value: true,
}
}
}
}
}
},
}
},
// Show 1-6 classes before 7-9
{
nested: {
path: 'additional_filters',
query: {
term: {
'additional_filters.grades_1_6': {
value: true,
boost: 10
}
}
}
}
}
];
}

let sort: any = [
{
'name.keyword': 'asc'
}
];
let sort: any = [{'name.keyword':'asc'}];

if (coordinates && coordinates.length) {
const [lat, lon] = coordinates;

sort = [
{
_score: 'desc'
},
{
_geo_distance: {
coordinates: {
lat,
lon,
},
order: 'asc',
unit: 'm',
distance_type: 'arc',
ignore_unmapped: true
}
}, ...sort];
sort = [{_score:'desc'}, ...sort];
}

return JSON.stringify({
Expand Down
39 changes: 28 additions & 11 deletions src/js/react/apps/school-search/helpers/SubQueries.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,33 @@
import GlobalSettings from '../enum/GlobalSettings';

export const getCoordsUrl = (address: string) => {
const { coordinatesBaseUrl } = GlobalSettings;
const url = new URL(coordinatesBaseUrl);
const params = new URLSearchParams(url.search);
params.set('q', address);
url.search = params.toString();
export const getAddressUrls = (address: string) => {
const { addressBaseUrl } = GlobalSettings;
const languages = ['fi', 'sv'];

// Servicemap's search API works only with one language, distinct urls is needed to get both lang data
const urls = languages.map((language: string) => {
const url = new URL(addressBaseUrl);
const params = new URLSearchParams(url.search);
params.set('q', address);
params.set('language', language);
url.search = params.toString();

return url.toString();
});

return urls;
};

return url.toString();
export const getAddresses = (urls: string[]) => {
const promises = urls.map(async (url: string) => fetch(url).then((res) => res.json()));

return Promise.all(promises);
};

export const parseCoordinates = (addressData: any) => {
const addresses = addressData.filter((address: any) => address.results.length);
const [lon, lat]: number[] = addresses[0].results[0].location.coordinates;
return [lat, lon];
};

export const getLocationsUrl = (lat: number|undefined, lon: number|undefined) => {
Expand All @@ -26,7 +46,4 @@ export const getLocationsUrl = (lat: number|undefined, lon: number|undefined) =>
return url.toString();
};

export const parseCoordinates = (data: any) => {
const [lon, lat]: number[] = data.results[0].location.coordinates;
return [lat, lon];
};

13 changes: 6 additions & 7 deletions src/js/react/apps/school-search/hooks/UseProximityQuery.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
import useSWR from 'swr';
import { useAtomValue } from 'jotai';

import SearchParams from '../types/SearchParams';
import configurationsAtom from '../store';
import { getCoordsUrl, getLocationsUrl, parseCoordinates } from '../helpers/SubQueries';
import { getAddressUrls, getLocationsUrl, getAddresses, parseCoordinates } from '../helpers/SubQueries';
import getQueryString from '../helpers/ProximityQuery';
import GlobalSettings from '../enum/GlobalSettings';

const UseProximityQuery = (params: SearchParams) => {
const { baseUrl } = useAtomValue(configurationsAtom);
const page = Number.isNaN(Number(params.page)) ? 1 : Number(params.page);

const fetcher = async() => {
const fetcher = async () => {
const { index } = GlobalSettings;
const { keyword } = params;

let coordinates = null;
let ids = null;

if (keyword && keyword) {
const coordinatesRes = await fetch(getCoordsUrl(keyword));
const coordinatesData = await coordinatesRes.json();

coordinates = parseCoordinates(coordinatesData);
if (keyword) {
const addresses = await getAddresses(getAddressUrls(keyword));
coordinates = parseCoordinates(addresses);
}

if (keyword && !coordinates) {
Expand Down
1 change: 1 addition & 0 deletions src/js/react/apps/school-search/store.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { atom } from 'jotai';

import SearchParams from './types/SearchParams';

export const configurationsAtom = atom(() => {
Expand Down

0 comments on commit b9e7c69

Please sign in to comment.