text-to-map
Version:
Text To Map usiluje o lepší, strojově zpracovatelné využití částí vyhlášek s výčtem ulic a dalších lokací. Jde o rozšiřitelnou sadu konceptů a nástrojů, které zajistí hladký převod výčtu ulic a jejich rozsahů v lidsky srozumitelném jazyce do strojově zpra
71 lines • 12.2 kB
JavaScript
import { wholeLineError } from "../street-markdown/smd";
import { findClosestString } from "../utils/helpers";
import { getKnexDb, insertMultipleRows } from "./db";
export const insertSchools = async (schools) => {
const knex = getKnexDb();
const uniqueSchools = filterOutDuplicates(schools);
const existingIzo = (await knex.select("izo").from("school")).map((row) => row.izo);
const toInsert = uniqueSchools.filter((school) => !existingIzo.includes(school.izo));
const toUpdate = uniqueSchools.filter((school) => existingIzo.includes(school.izo));
for (const school of toUpdate) {
await knex.from("school").where("izo", school.izo).update({
name: school.name,
capacity: school.capacity,
});
}
const insertedSchools = await insertMultipleRows(toInsert.map((school) => [
school.izo,
school.redizo,
school.name,
school.capacity.toString(),
school.type.toString(),
]), "school", ["izo", "redizo", "name", "capacity", "type"]);
const locations = toInsert
.filter((school) => school.locations.length > 0)
.map((school) => [
school.izo,
school.locations[0].addressPointId.toString(), // add only first location
]);
let insertedLocations = 0;
// plus filter out duplicate locations (same address id + izo)
for (const location of locations) {
try {
insertedLocations += await insertMultipleRows([location], "school_location", ["school_izo", "address_point_id"], true);
}
catch (error) {
console.log(`Cannot add location with RUIAN code ${location[1]} (school IZO = ${location[0]}): code does not exist.`);
}
}
return insertedSchools + insertedLocations;
};
export const findSchool = (name, schools, maxDistance) => {
if (schools.length === 0) {
return {
school: null,
errors: [wholeLineError("Aktuální zřizovatel nemá žádné školy.", name)],
};
}
const errors = [];
const exactSchool = schools.find((school) => school.name === name);
if (exactSchool) {
return { school: exactSchool, errors };
}
const namesList = schools.map((school) => school.name);
const bestMatch = findClosestString(name, namesList, maxDistance);
if (bestMatch === null) {
errors.push(wholeLineError(`Škola s názvem '${name}' neexistuje.`, name));
return { school: null, errors };
}
const closestSchool = schools.find((school) => bestMatch === school.name);
errors.push(wholeLineError(`Škola s názvem '${name}' neexistuje, mysleli jste '${bestMatch}'?`, name));
return { school: closestSchool, errors };
};
const filterOutDuplicates = (schools) => {
const izoSet = new Set();
return schools.filter((school) => {
const duplicate = izoSet.has(school.izo);
izoSet.add(school.izo);
return !duplicate;
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9zY2hvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsT0FBaUIsRUFBbUIsRUFBRTtJQUN4RSxNQUFNLElBQUksR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUV6QixNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQy9ELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNqQixDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FDbkMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQzlDLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDL0MsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQ2pDLENBQUM7SUFFRixLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFBRTtRQUM3QixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMs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QUFDO0tBQ2pDO0lBQ0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUxRSxNQUFNLENBQUMsSUFBSSxDQUNULGNBQWMsQ0FDWixtQkFBbUIsSUFBSSwrQkFBK0IsU0FBUyxJQUFJLEVBQ25FLElBQUksQ0FDTCxDQUNGLENBQUM7SUFFRixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMzQyxDQUFDLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFHLENBQUMsT0FBaUIsRUFBWSxFQUFFO0lBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDekIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDL0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdob2xlTGluZUVycm9yIH0gZnJvbSBcIi4uL3N0cmVldC1tYXJrZG93bi9zbWRcIjtcclxuaW1wb3J0IHsgU21kRXJyb3IgfSBmcm9tIFwiLi4vc3RyZWV0LW1hcmtkb3duL3R5cGVzXCI7XHJcbmltcG9ydCB7IGZpbmRDbG9zZXN0U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2hlbHBlcnNcIjtcclxuaW1wb3J0IHsgZ2V0S25leERiLCBpbnNlcnRNdWx0aXBsZVJvd3MgfSBmcm9tIFwiLi9kYlwiO1xyXG5pbXBvcnQgeyBTY2hvb2wgfSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydFNjaG9vbHMgPSBhc3luYyAoc2Nob29sczogU2Nob29sW10pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuXHJcbiAgY29uc3QgdW5pcXVlU2Nob29scyA9IGZpbHRlck91dER1cGxpY2F0ZXMoc2Nob29scyk7XHJcbiAgY29uc3QgZXhpc3RpbmdJem8gPSAoYXdhaXQga25leC5zZWxlY3QoXCJpem9cIikuZnJvbShcInNjaG9vbFwiKSkubWFwKFxyXG4gICAgKHJvdykgPT4gcm93Lml6b1xyXG4gICk7XHJcblxyXG4gIGNvbnN0IHRvSW5zZXJ0ID0gdW5pcXVlU2Nob29scy5maWx0ZXIoXHJcbiAgICAoc2Nob29sKSA9PiAhZXhpc3RpbmdJem8uaW5jbHVkZXMoc2Nob29sLml6bylcclxuICApO1xyXG4gIGNvbnN0IHRvVXBkYXRlID0gdW5pcXVlU2Nob29scy5maWx0ZXIoKHNjaG9vbCkgPT5cclxuICAgIGV4aXN0aW5nSXpvLmluY2x1ZGVzKHNjaG9vbC5pem8pXHJcbiAgKTtcclxuXHJcbiAgZm9yIChjb25zdCBzY2hvb2wgb2YgdG9VcGRhdGUpIHtcclxuICAgIGF3YWl0IGtuZXguZnJvbShcInNjaG9vbFwiKS53aGVyZShcIml6b1wiLCBzY2hvb2wuaXpvKS51cGRhdGUoe1xyXG4gICAgICBuYW1lOiBzY2hvb2wubmFtZSxcclxuICAgICAgY2FwYWNpdHk6IHNjaG9vbC5jYXBhY2l0eSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaW5zZXJ0ZWRTY2hvb2xzID0gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgdG9JbnNlcnQubWFwKChzY2hvb2wpID0+IFtcclxuICAgICAgc2Nob29sLml6byxcclxuICAgICAgc2Nob29sLnJlZGl6byxcclxuICAgICAgc2Nob29sLm5hbWUsXHJcbiAgICAgIHNjaG9vbC5jYXBhY2l0eS50b1N0cmluZygpLFxyXG4gICAgICBzY2hvb2wudHlwZS50b1N0cmluZygpLFxyXG4gICAgXSksXHJcbiAgICBcInNjaG9vbFwiLFxyXG4gICAgW1wiaXpvXCIsIFwicmVkaXpvXCIsIFwibmFtZVwiLCBcImNhcGFjaXR5XCIsIFwidHlwZVwiXVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGxvY2F0aW9ucyA9IHRvSW5zZXJ0XHJcbiAgICAuZmlsdGVyKChzY2hvb2wpID0+IHNjaG9vbC5sb2NhdGlvbnMubGVuZ3RoID4gMClcclxuICAgIC5tYXAoKHNjaG9vbCkgPT4gW1xyXG4gICAgICBzY2hvb2wuaXpvLFxyXG4gICAgICBzY2hvb2wubG9jYXRpb25zWzBdLmFkZHJlc3NQb2ludElkLnRvU3RyaW5nKCksIC8vIGFkZCBvbmx5IGZpcnN0IGxvY2F0aW9uXHJcbiAgICBdKTtcclxuXHJcbiAgbGV0IGluc2VydGVkTG9jYXRpb25zID0gMDtcclxuXHJcbiAgLy8gcGx1cyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZSBsb2NhdGlvbnMgKHNhbWUgYWRkcmVzcyBpZCArIGl6bylcclxuICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaW5zZXJ0ZWRMb2NhdGlvbnMgKz0gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgICAgIFtsb2NhdGlvbl0sXHJcbiAgICAgICAgXCJzY2hvb2xfbG9jYXRpb25cIixcclxuICAgICAgICBbXCJzY2hvb2xfaXpvXCIsIFwiYWRkcmVzc19wb2ludF9pZFwiXSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBgQ2Fubm90IGFkZCBsb2NhdGlvbiB3aXRoIFJVSUFOIGNvZGUgJHtsb2NhdGlvblsxXX0gKHNjaG9vbCBJWk8gPSAke2xvY2F0aW9uWzBdfSk6IGNvZGUgZG9lcyBub3QgZXhpc3QuYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGluc2VydGVkU2Nob29scyArIGluc2VydGVkTG9jYXRpb25zO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGZpbmRTY2hvb2wgPSAoXHJcbiAgbmFtZTogc3RyaW5nLFxyXG4gIHNjaG9vbHM6IFNjaG9vbFtdLFxyXG4gIG1heERpc3RhbmNlPzogbnVtYmVyXHJcbik6IHsgc2Nob29sOiBTY2hvb2wgfCBudWxsOyBlcnJvcnM6IFNtZEVycm9yW10gfSA9PiB7XHJcbiAgaWYgKHNjaG9vbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzY2hvb2w6IG51bGwsXHJcbiAgICAgIGVycm9yczogW3dob2xlTGluZUVycm9yKFwiQWt0dcOhbG7DrSB6xZlpem92YXRlbCBuZW3DoSDFvsOhZG7DqSDFoWtvbHkuXCIsIG5hbWUpXSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBlcnJvcnM6IFNtZEVycm9yW10gPSBbXTtcclxuXHJcbiAgY29uc3QgZXhhY3RTY2hvb2wgPSBzY2hvb2xzLmZpbmQoKHNjaG9vbCkgPT4gc2Nob29sLm5hbWUgPT09IG5hbWUpO1xyXG4gIGlmIChleGFjdFNjaG9vbCkge1xyXG4gICAgcmV0dXJuIHsgc2Nob29sOiBleGFjdFNjaG9vbCwgZXJyb3JzIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBuYW1lc0xpc3QgPSBzY2hvb2xzLm1hcCgoc2Nob29sKSA9PiBzY2hvb2wubmFtZSk7XHJcbiAgY29uc3QgYmVzdE1hdGNoID0gZmluZENsb3Nlc3RTdHJpbmcobmFtZSwgbmFtZXNMaXN0LCBtYXhEaXN0YW5jZSk7XHJcbiAgaWYgKGJlc3RNYXRjaCA9PT0gbnVsbCkge1xyXG4gICAgZXJyb3JzLnB1c2god2hvbGVMaW5lRXJyb3IoYMWga29sYSBzIG7DoXp2ZW0gJyR7bmFtZX0nIG5lZXhpc3R1amUuYCwgbmFtZSkpO1xyXG4gICAgcmV0dXJuIHsgc2Nob29sOiBudWxsLCBlcnJvcnMgfTtcclxuICB9XHJcbiAgY29uc3QgY2xvc2VzdFNjaG9vbCA9IHNjaG9vbHMuZmluZCgoc2Nob29sKSA9PiBiZXN0TWF0Y2ggPT09IHNjaG9vbC5uYW1lKTtcclxuXHJcbiAgZXJyb3JzLnB1c2goXHJcbiAgICB3aG9sZUxpbmVFcnJvcihcclxuICAgICAgYMWga29sYSBzIG7DoXp2ZW0gJyR7bmFtZX0nIG5lZXhpc3R1amUsIG15c2xlbGkganN0ZSAnJHtiZXN0TWF0Y2h9Jz9gLFxyXG4gICAgICBuYW1lXHJcbiAgICApXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHsgc2Nob29sOiBjbG9zZXN0U2Nob29sLCBlcnJvcnMgfTtcclxufTtcclxuXHJcbmNvbnN0IGZpbHRlck91dER1cGxpY2F0ZXMgPSAoc2Nob29sczogU2Nob29sW10pOiBTY2hvb2xbXSA9PiB7XHJcbiAgY29uc3QgaXpvU2V0ID0gbmV3IFNldCgpO1xyXG4gIHJldHVybiBzY2hvb2xzLmZpbHRlcigoc2Nob29sKSA9PiB7XHJcbiAgICBjb25zdCBkdXBsaWNhdGUgPSBpem9TZXQuaGFzKHNjaG9vbC5pem8pO1xyXG4gICAgaXpvU2V0LmFkZChzY2hvb2wuaXpvKTtcclxuICAgIHJldHVybiAhZHVwbGljYXRlO1xyXG4gIH0pO1xyXG59O1xyXG4iXX0=