From 7b8c952d4cc0a5ea7a7238366e05e20a3afeb211 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 +++++++++++++- 2 files changed, 14 insertions(+), 3 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);