From f73f7e2e910e9f1cf3d98c591d4afeecbaea51c7 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Fri, 6 Jul 2018 15:23:14 -0700 Subject: [PATCH] Support collators in feature filter expressions. Fixes issue #6920: feature filters using collator expressions would incorrectly be treated as legacy filters. --- src/style-spec/feature_filter/index.js | 3 +-- test/unit/style-spec/feature_filter.test.js | 14 +++++++++++++- test/unit/style-spec/fixture/filters.output.json | 6 +++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/style-spec/feature_filter/index.js b/src/style-spec/feature_filter/index.js index d5baf8ab869..6138bf6e16c 100644 --- a/src/style-spec/feature_filter/index.js +++ b/src/style-spec/feature_filter/index.js @@ -28,7 +28,7 @@ function isExpressionFilter(filter: any) { case '>=': case '<': case '<=': - return filter.length === 3 && (Array.isArray(filter[1]) || Array.isArray(filter[2])); + return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2])); case 'any': case 'all': @@ -153,4 +153,3 @@ function convertHasOp(property: string) { function convertNegation(filter: mixed) { return ['!', filter]; } - diff --git a/test/unit/style-spec/feature_filter.test.js b/test/unit/style-spec/feature_filter.test.js index 877e6de94ab..938bf736357 100644 --- a/test/unit/style-spec/feature_filter.test.js +++ b/test/unit/style-spec/feature_filter.test.js @@ -24,6 +24,19 @@ test('filter', (t) => { t.end(); }); + t.test('expression, collator comparison', (t) => { + const caseSensitive = filter(['==', ['string', ['get', 'x']], ['string', ['get', 'y']], ['collator', { 'case-sensitive': true }]]); + t.equal(caseSensitive({zoom: 0}, {properties: {x: 'a', y: 'b'}}), false); + t.equal(caseSensitive({zoom: 0}, {properties: {x: 'a', y: 'A'}}), false); + t.equal(caseSensitive({zoom: 0}, {properties: {x: 'a', y: 'a'}}), true); + + const caseInsensitive = filter(['==', ['string', ['get', 'x']], ['string', ['get', 'y']], ['collator', { 'case-sensitive': false }]]); + t.equal(caseInsensitive({zoom: 0}, {properties: {x: 'a', y: 'b'}}), false); + t.equal(caseInsensitive({zoom: 0}, {properties: {x: 'a', y: 'A'}}), true); + t.equal(caseInsensitive({zoom: 0}, {properties: {x: 'a', y: 'a'}}), true); + t.end(); + }); + t.test('expression, any/all', (t) => { t.equal(filter(['all'])(), true); t.equal(filter(['all', true])(), true); @@ -52,7 +65,6 @@ test('filter', (t) => { t.end(); }); - t.test('degenerate', (t) => { t.equal(filter()(), true); t.equal(filter(undefined)(), true); diff --git a/test/unit/style-spec/fixture/filters.output.json b/test/unit/style-spec/fixture/filters.output.json index ed3900a35a7..4d66de3d4e4 100644 --- a/test/unit/style-spec/fixture/filters.output.json +++ b/test/unit/style-spec/fixture/filters.output.json @@ -12,11 +12,11 @@ "line": 29 }, { - "message": "layers[3].filter: filter array for operator \"==\" must have 3 elements", + "message": "layers[3].filter: Expected two or three arguments.", "line": 40 }, { - "message": "layers[4].filter: filter array for operator \"==\" must have 3 elements", + "message": "layers[4].filter: Expected two or three arguments." , "line": 47 }, { @@ -55,4 +55,4 @@ "message": "layers[14].filter[2][1]: string expected, array found", "line": 152 } -] \ No newline at end of file +]