forked from MapComplete/MapComplete
Performance optimazations
This commit is contained in:
parent
632e7e9f9a
commit
d2b245ab54
15 changed files with 321 additions and 214 deletions
|
|
@ -9,7 +9,7 @@ import LayerConfig from "../Models/ThemeConfig/LayerConfig";
|
|||
import {CountryCoder} from "latlon2country"
|
||||
|
||||
|
||||
export class SimpleMetaTagger {
|
||||
export class SimpleMetaTagger {
|
||||
public readonly keys: string[];
|
||||
public readonly doc: string;
|
||||
public readonly isLazy: boolean;
|
||||
|
|
@ -42,9 +42,9 @@ export class SimpleMetaTagger {
|
|||
export class CountryTagger extends SimpleMetaTagger {
|
||||
private static readonly coder = new CountryCoder("https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/latlon2country", Utils.downloadJson);
|
||||
public runningTasks: Set<any>;
|
||||
|
||||
|
||||
constructor() {
|
||||
const runningTasks= new Set<any>();
|
||||
const runningTasks = new Set<any>();
|
||||
super
|
||||
(
|
||||
{
|
||||
|
|
@ -77,20 +77,12 @@ export class CountryTagger extends SimpleMetaTagger {
|
|||
return false;
|
||||
})
|
||||
)
|
||||
this.runningTasks = runningTasks;
|
||||
this.runningTasks = runningTasks;
|
||||
}
|
||||
}
|
||||
|
||||
export default class SimpleMetaTaggers {
|
||||
|
||||
private static readonly cardinalDirections = {
|
||||
N: 0, NNE: 22.5, NE: 45, ENE: 67.5,
|
||||
E: 90, ESE: 112.5, SE: 135, SSE: 157.5,
|
||||
S: 180, SSW: 202.5, SW: 225, WSW: 247.5,
|
||||
W: 270, WNW: 292.5, NW: 315, NNW: 337.5
|
||||
}
|
||||
|
||||
|
||||
public static readonly objectMetaInfo = new SimpleMetaTagger(
|
||||
{
|
||||
keys: ["_last_edit:contributor",
|
||||
|
|
@ -121,7 +113,25 @@ export default class SimpleMetaTaggers {
|
|||
return true;
|
||||
}
|
||||
)
|
||||
public static country = new CountryTagger()
|
||||
public static geometryType = new SimpleMetaTagger(
|
||||
{
|
||||
keys: ["_geometry:type"],
|
||||
doc: "Adds the geometry type as property. This is identical to the GoeJson geometry type and is one of `Point`,`LineString`, `Polygon` and exceptionally `MultiPolygon` or `MultiLineString`",
|
||||
},
|
||||
(feature, _) => {
|
||||
const changed = feature.properties["_geometry:type"] === feature.geometry.type;
|
||||
feature.properties["_geometry:type"] = feature.geometry.type;
|
||||
return changed
|
||||
}
|
||||
)
|
||||
|
||||
private static readonly cardinalDirections = {
|
||||
N: 0, NNE: 22.5, NE: 45, ENE: 67.5,
|
||||
E: 90, ESE: 112.5, SE: 135, SSE: 157.5,
|
||||
S: 180, SSW: 202.5, SW: 225, WSW: 247.5,
|
||||
W: 270, WNW: 292.5, NW: 315, NNW: 337.5
|
||||
}
|
||||
private static latlon = new SimpleMetaTagger({
|
||||
keys: ["_lat", "_lon"],
|
||||
doc: "The latitude and longitude of the point (or centerpoint in the case of a way/area)"
|
||||
|
|
@ -201,7 +211,6 @@ export default class SimpleMetaTaggers {
|
|||
return true;
|
||||
})
|
||||
);
|
||||
|
||||
private static canonicalize = new SimpleMetaTagger(
|
||||
{
|
||||
doc: "If 'units' is defined in the layoutConfig, then this metatagger will rewrite the specified keys to have the canonical form (e.g. `1meter` will be rewritten to `1m`)",
|
||||
|
|
@ -254,7 +263,6 @@ export default class SimpleMetaTaggers {
|
|||
return rewritten
|
||||
})
|
||||
)
|
||||
|
||||
private static lngth = new SimpleMetaTagger(
|
||||
{
|
||||
keys: ["_length", "_length:km"],
|
||||
|
|
@ -269,7 +277,6 @@ export default class SimpleMetaTaggers {
|
|||
return true;
|
||||
})
|
||||
)
|
||||
public static country = new CountryTagger()
|
||||
private static isOpen = new SimpleMetaTagger(
|
||||
{
|
||||
keys: ["_isOpen"],
|
||||
|
|
@ -277,23 +284,33 @@ export default class SimpleMetaTaggers {
|
|||
includesDates: true,
|
||||
isLazy: true
|
||||
},
|
||||
((feature, _, __ ,state) => {
|
||||
((feature, _, __, state) => {
|
||||
if (Utils.runningFromConsole) {
|
||||
// We are running from console, thus probably creating a cache
|
||||
// isOpen is irrelevant
|
||||
return false
|
||||
}
|
||||
if(feature.properties.opening_hours === "24/7"){
|
||||
feature.properties._isOpen = "yes"
|
||||
return true;
|
||||
}
|
||||
|
||||
Object.defineProperty(feature.properties, "_isOpen", {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
get: () => {
|
||||
if(feature.properties.id === "node/7464543832"){
|
||||
console.log("Getting _isOpen for ", feature.properties.i)
|
||||
}
|
||||
delete feature.properties._isOpen
|
||||
feature.properties._isOpen = undefined
|
||||
const tagsSource = state.allElements.getEventSourceById(feature.properties.id);
|
||||
tagsSource
|
||||
.addCallbackAndRunD(tags => {
|
||||
if (tags.opening_hours === undefined || tags._country === undefined) {
|
||||
tagsSource.addCallbackAndRunD(tags => {
|
||||
// Install a listener to the tags...
|
||||
if (tags.opening_hours === undefined){
|
||||
return;
|
||||
}
|
||||
if(tags._country === undefined) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
|
|
@ -305,18 +322,20 @@ export default class SimpleMetaTaggers {
|
|||
country_code: tags._country.toLowerCase()
|
||||
}
|
||||
}, {tag_key: "opening_hours"});
|
||||
// AUtomatically triggered on the next change
|
||||
|
||||
// AUtomatically triggered on the next change (and a bit below)
|
||||
const updateTags = () => {
|
||||
const oldValueIsOpen = tags["_isOpen"];
|
||||
const oldNextChange = tags["_isOpen:nextTrigger"] ?? 0;
|
||||
|
||||
if (oldNextChange > (new Date()).getTime() &&
|
||||
tags["_isOpen:oldvalue"] === tags["opening_hours"]
|
||||
tags["_isOpen:oldvalue"] === tags["opening_hours"] // Check that changes have to be made
|
||||
&& tags["_isOpen"] !== undefined) {
|
||||
// Already calculated and should not yet be triggered
|
||||
return false;
|
||||
}
|
||||
|
||||
// Recalculate!
|
||||
tags["_isOpen"] = oh.getState() ? "yes" : "no";
|
||||
const comment = oh.getComment();
|
||||
if (comment) {
|
||||
|
|
@ -380,8 +399,6 @@ export default class SimpleMetaTaggers {
|
|||
return true;
|
||||
})
|
||||
)
|
||||
|
||||
|
||||
private static currentTime = new SimpleMetaTagger(
|
||||
{
|
||||
keys: ["_now:date", "_now:datetime", "_loaded:date", "_loaded:_datetime"],
|
||||
|
|
@ -410,20 +427,6 @@ export default class SimpleMetaTaggers {
|
|||
return true;
|
||||
}
|
||||
);
|
||||
|
||||
public static geometryType = new SimpleMetaTagger(
|
||||
{
|
||||
keys:["_geometry:type"],
|
||||
doc: "Adds the geometry type as property. This is identical to the GoeJson geometry type and is one of `Point`,`LineString`, `Polygon` and exceptionally `MultiPolygon` or `MultiLineString`",
|
||||
},
|
||||
(feature, _) => {
|
||||
const changed = feature.properties["_geometry:type"] === feature.geometry.type;
|
||||
feature.properties["_geometry:type"] = feature.geometry.type;
|
||||
return changed
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
public static metatags: SimpleMetaTagger[] = [
|
||||
SimpleMetaTaggers.latlon,
|
||||
SimpleMetaTaggers.layerInfo,
|
||||
|
|
@ -439,11 +442,9 @@ export default class SimpleMetaTaggers {
|
|||
SimpleMetaTaggers.geometryType
|
||||
|
||||
];
|
||||
|
||||
public static readonly lazyTags: string[] = [].concat(...SimpleMetaTaggers.metatags.filter(tagger => tagger.isLazy)
|
||||
.map(tagger => tagger.keys));
|
||||
|
||||
|
||||
/**
|
||||
* Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme.
|
||||
* These changes are performed in-place.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue