forked from MapComplete/MapComplete
performance: Make _referencing_ways actually lazy
This commit is contained in:
parent
3eee9bd9f8
commit
b99588b4ba
2 changed files with 71 additions and 32 deletions
|
@ -80,20 +80,25 @@ export class ReferencingWaysMetaTagger extends SimpleMetaTagger {
|
||||||
if (!id.startsWith("node/")) {
|
if (!id.startsWith("node/")) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
console.trace("Downloading referencing ways for", feature.properties.id)
|
|
||||||
OsmObject.DownloadReferencingWays(id).then((referencingWays) => {
|
const currentTagsSource = state.allElements?.getEventSourceById(id)
|
||||||
const currentTagsSource = state.allElements?.getEventSourceById(id) ?? []
|
if (currentTagsSource === undefined) {
|
||||||
const wayIds = referencingWays.map((w) => "way/" + w.id)
|
return
|
||||||
wayIds.sort()
|
}
|
||||||
const wayIdsStr = wayIds.join(";")
|
Utils.AddLazyPropertyAsync(
|
||||||
if (
|
currentTagsSource.data,
|
||||||
wayIdsStr !== "" &&
|
"_referencing_ways",
|
||||||
currentTagsSource.data["_referencing_ways"] !== wayIdsStr
|
async () => {
|
||||||
) {
|
const referencingWays = await OsmObject.DownloadReferencingWays(id)
|
||||||
currentTagsSource.data["_referencing_ways"] = wayIdsStr
|
const wayIds = referencingWays.map((w) => "way/" + w.id)
|
||||||
currentTagsSource.ping()
|
wayIds.sort()
|
||||||
|
const wayIdsStr = wayIds.join(";")
|
||||||
|
if (wayIdsStr !== "" && currentTagsSource.data[""] !== wayIdsStr) {
|
||||||
|
currentTagsSource.data["_referencing_ways"] = wayIdsStr
|
||||||
|
currentTagsSource.ping()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -282,16 +287,9 @@ export default class SimpleMetaTaggers {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
Object.defineProperty(feature.properties, "_surface:ha", {
|
Utils.AddLazyProperty(feature.properties, "_surface:ha", () => {
|
||||||
enumerable: false,
|
const sqMeters = GeoOperations.surfaceAreaInSqMeters(feature)
|
||||||
configurable: true,
|
return "" + Math.floor(sqMeters / 1000) / 10
|
||||||
get: () => {
|
|
||||||
const sqMeters = GeoOperations.surfaceAreaInSqMeters(feature)
|
|
||||||
const sqMetersHa = "" + Math.floor(sqMeters / 1000) / 10
|
|
||||||
delete feature.properties["_surface:ha"]
|
|
||||||
feature.properties["_surface:ha"] = sqMetersHa
|
|
||||||
return sqMetersHa
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
@ -443,8 +441,6 @@ export default class SimpleMetaTaggers {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const tagsSource = state.allElements.getEventSourceById(feature.properties.id)
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
private static directionSimplified = new SimpleMetaTagger(
|
private static directionSimplified = new SimpleMetaTagger(
|
||||||
|
|
57
Utils.ts
57
Utils.ts
|
@ -300,6 +300,49 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
|
||||||
return str.substr(0, l - 3) + "..."
|
return str.substr(0, l - 3) + "..."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a property to the given object, but the value will _only_ be calculated when it is actually requested
|
||||||
|
* @param object
|
||||||
|
* @param name
|
||||||
|
* @param init
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
public static AddLazyProperty(object: any, name: string, init: () => any) {
|
||||||
|
Object.defineProperty(object, name, {
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
get: () => {
|
||||||
|
delete object[name]
|
||||||
|
object[name] = init()
|
||||||
|
return object[name]
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a property to the given object, but the value will _only_ be calculated when it is actually requested
|
||||||
|
*/
|
||||||
|
public static AddLazyPropertyAsync(
|
||||||
|
object: any,
|
||||||
|
name: string,
|
||||||
|
init: () => Promise<any>,
|
||||||
|
whenDone?: () => void
|
||||||
|
) {
|
||||||
|
Object.defineProperty(object, name, {
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
get: () => {
|
||||||
|
init().then((r) => {
|
||||||
|
delete object[name]
|
||||||
|
object[name] = r
|
||||||
|
if (whenDone) {
|
||||||
|
whenDone()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
public static FixedLength(str: string, l: number) {
|
public static FixedLength(str: string, l: number) {
|
||||||
str = Utils.EllipsesAfter(str, l)
|
str = Utils.EllipsesAfter(str, l)
|
||||||
while (str.length < l) {
|
while (str.length < l) {
|
||||||
|
@ -1281,13 +1324,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
|
||||||
return d
|
return d
|
||||||
}
|
}
|
||||||
|
|
||||||
private static colorDiff(
|
|
||||||
c0: { r: number; g: number; b: number },
|
|
||||||
c1: { r: number; g: number; b: number }
|
|
||||||
) {
|
|
||||||
return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b)
|
|
||||||
}
|
|
||||||
|
|
||||||
static toIdRecord<T extends { id: string }>(ts: T[]): Record<string, T> {
|
static toIdRecord<T extends { id: string }>(ts: T[]): Record<string, T> {
|
||||||
const result: Record<string, T> = {}
|
const result: Record<string, T> = {}
|
||||||
for (const t of ts) {
|
for (const t of ts) {
|
||||||
|
@ -1317,4 +1353,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
|
||||||
// If the element has a parent, repeat the process for the parent element
|
// If the element has a parent, repeat the process for the parent element
|
||||||
return Utils.findParentWithScrolling(element.parentElement)
|
return Utils.findParentWithScrolling(element.parentElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static colorDiff(
|
||||||
|
c0: { r: number; g: number; b: number },
|
||||||
|
c1: { r: number; g: number; b: number }
|
||||||
|
) {
|
||||||
|
return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue