forked from MapComplete/MapComplete
Fix Tag.matchesProperties and RegexTag.matchesProperties, they do match on definedProperties now (and are faster)
This commit is contained in:
parent
30bc620827
commit
15ff38a098
3 changed files with 51 additions and 21 deletions
|
@ -47,6 +47,11 @@ export class RegexTag extends TagsFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
matchesProperties(tags: any): boolean {
|
matchesProperties(tags: any): boolean {
|
||||||
|
if(typeof this.key === "string"){
|
||||||
|
const value = tags[this.key] ?? ""
|
||||||
|
return RegexTag.doesMatch(value, this.value) != this.invert;
|
||||||
|
}
|
||||||
|
|
||||||
for (const key in tags) {
|
for (const key in tags) {
|
||||||
if (key === undefined) {
|
if (key === undefined) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -23,26 +23,14 @@ export class Tag extends TagsFilter {
|
||||||
|
|
||||||
|
|
||||||
matchesProperties(properties: any): boolean {
|
matchesProperties(properties: any): boolean {
|
||||||
for (const propertiesKey in properties) {
|
const foundValue = properties[this.key]
|
||||||
if (!properties.hasOwnProperty(propertiesKey)) {
|
if (foundValue === undefined && (this.value === "" || this.value === undefined)) {
|
||||||
continue
|
// The tag was not found
|
||||||
}
|
|
||||||
if (this.key === propertiesKey) {
|
|
||||||
const value = properties[propertiesKey];
|
|
||||||
if (value === undefined) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return value === this.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// The tag was not found
|
|
||||||
|
|
||||||
if (this.value === "") {
|
|
||||||
// and it shouldn't be found!
|
// and it shouldn't be found!
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return foundValue === this.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
asOverpass(): string[] {
|
asOverpass(): string[] {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import {Tag} from "../Logic/Tags/Tag";
|
||||||
import {And} from "../Logic/Tags/And";
|
import {And} from "../Logic/Tags/And";
|
||||||
import {TagUtils} from "../Logic/Tags/TagUtils";
|
import {TagUtils} from "../Logic/Tags/TagUtils";
|
||||||
import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig";
|
import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig";
|
||||||
|
import {RegexTag} from "../Logic/Tags/RegexTag";
|
||||||
|
|
||||||
|
|
||||||
Utils.runningFromConsole = true;
|
Utils.runningFromConsole = true;
|
||||||
|
@ -173,7 +174,6 @@ export default class TagSpec extends T {
|
||||||
equal(undefined, tr.GetRenderValue({"foo": "bar"}));
|
equal(undefined, tr.GetRenderValue({"foo": "bar"}));
|
||||||
|
|
||||||
})],
|
})],
|
||||||
|
|
||||||
[
|
[
|
||||||
"Empty match test",
|
"Empty match test",
|
||||||
() => {
|
() => {
|
||||||
|
@ -214,7 +214,8 @@ export default class TagSpec extends T {
|
||||||
const overpassOrInor = TagUtils.Tag(orInOr).asOverpass()
|
const overpassOrInor = TagUtils.Tag(orInOr).asOverpass()
|
||||||
equal(3, overpassOrInor.length)
|
equal(3, overpassOrInor.length)
|
||||||
}
|
}
|
||||||
], [
|
],
|
||||||
|
[
|
||||||
"Merge touching opening hours",
|
"Merge touching opening hours",
|
||||||
() => {
|
() => {
|
||||||
const oh1: OpeningHour = {
|
const oh1: OpeningHour = {
|
||||||
|
@ -239,7 +240,8 @@ export default class TagSpec extends T {
|
||||||
equal(r.endHour, 12)
|
equal(r.endHour, 12)
|
||||||
|
|
||||||
}
|
}
|
||||||
], [
|
],
|
||||||
|
[
|
||||||
"Merge overlapping opening hours",
|
"Merge overlapping opening hours",
|
||||||
() => {
|
() => {
|
||||||
const oh1: OpeningHour = {
|
const oh1: OpeningHour = {
|
||||||
|
@ -394,7 +396,8 @@ export default class TagSpec extends T {
|
||||||
|
|
||||||
]));
|
]));
|
||||||
equal(rules, "Tu 23:00-00:00");
|
equal(rules, "Tu 23:00-00:00");
|
||||||
}], ["JOIN OH with overflowed hours", () => {
|
}],
|
||||||
|
["JOIN OH with overflowed hours", () => {
|
||||||
const rules = OH.ToString(
|
const rules = OH.ToString(
|
||||||
OH.MergeTimes([
|
OH.MergeTimes([
|
||||||
|
|
||||||
|
@ -483,7 +486,41 @@ export default class TagSpec extends T {
|
||||||
const tagRendering = new TagRenderingConfig(config, null, "test");
|
const tagRendering = new TagRenderingConfig(config, null, "test");
|
||||||
equal(true, tagRendering.IsKnown({bottle: "yes"}))
|
equal(true, tagRendering.IsKnown({bottle: "yes"}))
|
||||||
equal(false, tagRendering.IsKnown({}))
|
equal(false, tagRendering.IsKnown({}))
|
||||||
}]]);
|
}],
|
||||||
|
[
|
||||||
|
"Tag matches a lazy property",
|
||||||
|
() => {
|
||||||
|
const properties = {}
|
||||||
|
const key = "_key"
|
||||||
|
Object.defineProperty(properties, key, {
|
||||||
|
configurable: true,
|
||||||
|
get: function () {
|
||||||
|
delete properties[key]
|
||||||
|
properties[key] = "yes"
|
||||||
|
return "yes"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const filter = new Tag("_key", "yes")
|
||||||
|
T.isTrue(filter.matchesProperties(properties), "Lazy value not matched")
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"RegextTag matches a lazy property",
|
||||||
|
() => {
|
||||||
|
const properties = {}
|
||||||
|
const key = "_key"
|
||||||
|
Object.defineProperty(properties, key, {
|
||||||
|
configurable: true,
|
||||||
|
get: function () {
|
||||||
|
delete properties[key]
|
||||||
|
properties[key] = "yes"
|
||||||
|
return "yes"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const filter = TagUtils.Tag("_key~*")
|
||||||
|
T.isTrue(filter.matchesProperties(properties), "Lazy value not matched")
|
||||||
|
}
|
||||||
|
]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue