Ticket #1492: filter.2.patch
| File filter.2.patch, 81.1 kB (added by tschaub, 9 months ago) |
|---|
-
tests/Filter/FeatureId.html
old new 1 <html> 2 <head> 3 <script src="../../lib/OpenLayers.js"></script> 4 <script type="text/javascript"> 5 6 function test_FeatureId_constructor(t) { 7 t.plan(3); 8 9 var options = {'foo': 'bar'}; 10 var filter = new OpenLayers.Filter.FeatureId(options); 11 t.ok(filter instanceof OpenLayers.Filter.FeatureId, 12 "new OpenLayers.Filter.FeatureId returns object" ); 13 t.eq(filter.foo, "bar", "constructor sets options correctly"); 14 t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 15 } 16 17 function test_FeatureId_destroy(t) { 18 t.plan(1); 19 20 var filter = new OpenLayers.Filter.FeatureId(); 21 filter.destroy(); 22 t.eq(filter.symbolizer, null, "symbolizer hash nulled properly"); 23 } 24 25 function test_FeatureId_evaluate(t) { 26 t.plan(3); 27 28 var filter = new OpenLayers.Filter.FeatureId( 29 {fids: ["fid_1", "fid_3"]}); 30 31 var filterResults = { 32 "fid_1" : true, 33 "fid_2" : false, 34 "fid_3" : true}; 35 for (var i in filterResults) { 36 var feature = new OpenLayers.Feature.Vector(); 37 feature.fid = i; 38 var result = filter.evaluate(feature); 39 t.eq(result, filterResults[i], "feature "+i+" evaluates to "+result.toString()+" correctly."); 40 feature.destroy(); 41 } 42 } 43 </script> 44 </head> 45 <body> 46 </body> 47 </html> -
tests/Filter/Comparison.html
old new 1 <html> 2 <head> 3 <script src="../../lib/OpenLayers.js"></script> 4 <script type="text/javascript"> 5 6 function test_Comparison_constructor(t) { 7 t.plan(3); 8 9 var options = {'foo': 'bar'}; 10 var filter = new OpenLayers.Filter.Comparison(options); 11 t.ok(filter instanceof OpenLayers.Filter.Comparison, 12 "new OpenLayers.Filter.Comparison returns object" ); 13 t.eq(filter.foo, "bar", "constructor sets options correctly"); 14 t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 15 } 16 17 function test_Comparison_destroy(t) { 18 t.plan(1); 19 20 var filter = new OpenLayers.Filter.Comparison(); 21 filter.destroy(); 22 t.eq(filter.symbolizer, null, "symbolizer hash nulled properly"); 23 } 24 25 function test_Comparison_value2regex(t) { 26 t.plan(2); 27 28 var filter = new OpenLayers.Filter.Comparison({ 29 property: "foo", 30 value: "*b?r\\*\\?*", 31 type: OpenLayers.Filter.Comparison.LIKE}); 32 filter.value2regex("*", "?", "\\"); 33 t.eq(filter.value, ".*b.r\\*\\?.*", "Regular expression generated correctly."); 34 35 filter.value = "%b.r!%!.%"; 36 filter.value2regex("%", ".", "!"); 37 t.eq(filter.value, ".*b.r\\%\\..*", "Regular expression with different wildcard and escape chars generated correctly."); 38 } 39 40 function test_regex2value(t) { 41 t.plan(8); 42 43 function r2v(regex) { 44 return OpenLayers.Filter.Comparison.prototype.regex2value.call( 45 {value: regex} 46 ); 47 } 48 49 t.eq(r2v("foo"), "foo", "doesn't change string without special chars"); 50 t.eq(r2v("foo.*foo"), "foo*foo", "wildCard replaced"); 51 t.eq(r2v("foo.foo"), "foo.foo", "singleChar replaced"); 52 t.eq(r2v("foo\\\\foo"), "foo\\foo", "escape removed"); 53 t.eq(r2v("foo!foo"), "foo!!foo", "escapes !"); 54 t.eq(r2v("foo\\*foo"), "foo!*foo", "replaces escape on *"); 55 t.eq(r2v("foo\\.foo"), "foo!.foo", "replaces escape on ."); 56 t.eq(r2v("foo\\\\.foo"), "foo\\.foo", "unescapes only \\ before ."); 57 58 } 59 60 function test_Comparison_evaluate(t) { 61 t.plan(5); 62 63 var filter = new OpenLayers.Filter.Comparison({ 64 property: "area", 65 lowerBoundary: 1000, 66 upperBoundary: 4999, 67 type: OpenLayers.Filter.Comparison.BETWEEN}); 68 69 var features = [ 70 new OpenLayers.Feature.Vector(null, { 71 area: 999}), 72 new OpenLayers.Feature.Vector(null, { 73 area: 1000}), 74 new OpenLayers.Feature.Vector(null, { 75 area: 4999}), 76 new OpenLayers.Feature.Vector(null, { 77 area: 5000})]; 78 // PropertyIsBetween filter: lower and upper boundary are inclusive 79 var filterResults = { 80 0: false, 81 1: true, 82 2: true, 83 3: false}; 84 for (var i in filterResults) { 85 var result = filter.evaluate(features[i].attributes); 86 t.eq(result, filterResults[i], "feature "+i+ 87 " evaluates to "+result.toString()+" correctly."); 88 } 89 var context = { 90 area: 4998 91 }; 92 var result = filter.evaluate(context); 93 t.eq(result, true, "evaluation against custom filter context works."); 94 } 95 </script> 96 </head> 97 <body> 98 </body> 99 </html> -
tests/Filter/Logical.html
old new 1 <html> 2 <head> 3 <script src="../../lib/OpenLayers.js"></script> 4 <script type="text/javascript"> 5 6 function test_Logical_constructor(t) { 7 t.plan(3); 8 9 var options = {'foo': 'bar'}; 10 var filter = new OpenLayers.Filter.Logical(options); 11 t.ok(filter instanceof OpenLayers.Filter.Logical, 12 "new OpenLayers.Filter.Logical returns object" ); 13 t.eq(filter.foo, "bar", "constructor sets options correctly"); 14 t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 15 } 16 17 function test_Logical_destroy(t) { 18 t.plan(1); 19 20 var filter = new OpenLayers.Filter.Logical(); 21 filter.destroy(); 22 t.eq(filter.filters, null, "filters array nulled properly"); 23 } 24 25 function test_Logical_evaluate(t) { 26 t.plan(1); 27 28 var filter = new OpenLayers.Filter.Logical({ 29 type: OpenLayers.Filter.Logical.NOT}); 30 filter.filters.push(new OpenLayers.Filter()); 31 32 var feature = new OpenLayers.Feature.Vector(); 33 34 t.eq(filter.evaluate(feature.attributes), false, 35 "feature evaluates to false correctly."); 36 } 37 </script> 38 </head> 39 <body> 40 </body> 41 </html> -
tests/Format/SLD/v1_0_0.html
old new 1 <html> 2 <head> 3 <script src="../../../lib/OpenLayers.js"></script> 4 <script type="text/javascript"> 5 6 var sld = 7 '<StyledLayerDescriptor version="1.0.0" ' + 8 'xmlns="http://www.opengis.net/sld" ' + 9 'xmlns:gml="http://www.opengis.net/gml" ' + 10 'xmlns:ogc="http://www.opengis.net/ogc" ' + 11 'xmlns:xlink="http://www.w3.org/1999/xlink" ' + 12 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' + 13 'xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">' + 14 '<NamedLayer>' + 15 '<Name>AAA161</Name>' + 16 '<UserStyle>' + 17 '<FeatureTypeStyle>' + 18 '<Rule>' + 19 '<Name>stortsteen</Name>' + 20 '<ogc:Filter>' + 21 '<ogc:PropertyIsEqualTo>' + 22 '<ogc:PropertyName>CTE</ogc:PropertyName>' + 23 '<ogc:Literal>V0305</ogc:Literal>' + 24 '</ogc:PropertyIsEqualTo>' + 25 '</ogc:Filter>' + 26 '<MaxScaleDenominator>50000</MaxScaleDenominator>' + 27 '<PolygonSymbolizer>' + 28 '<Fill>' + 29 '<CssParameter name="fill">#ffffff</CssParameter>' + 30 '</Fill>' + 31 '<Stroke>' + 32 '<CssParameter name="stroke">#000000</CssParameter>' + 33 '</Stroke>' + 34 '</PolygonSymbolizer>' + 35 '</Rule>' + 36 '<Rule>' + 37 '<Name>betonbekleding</Name>' + 38 '<ogc:Filter>' + 39 '<ogc:PropertyIsLessThan>' + 40 '<ogc:PropertyName>CTE</ogc:PropertyName>' + 41 '<ogc:Literal>1000</ogc:Literal>' + 42 '</ogc:PropertyIsLessThan>' + 43 '</ogc:Filter>' + 44 '<MaxScaleDenominator>50000</MaxScaleDenominator>' + 45 '<PolygonSymbolizer>' + 46 '<Fill>' + 47 '<CssParameter name="fill">#ffff00</CssParameter>' + 48 '</Fill>' + 49 '<Stroke>' + 50 '<CssParameter name="stroke">#0000ff</CssParameter>' + 51 '</Stroke>' + 52 '</PolygonSymbolizer>' + 53 '</Rule>' + 54 '</FeatureTypeStyle>' + 55 '</UserStyle>' + 56 '</NamedLayer>' + 57 '<NamedLayer>' + 58 '<Name>Second Layer</Name>' + 59 '<UserStyle>' + 60 '<FeatureTypeStyle>' + 61 '<Rule>' + 62 '<Name>first rule second layer</Name>' + 63 '<ogc:Filter>' + 64 '<ogc:Or>' + 65 '<ogc:PropertyIsBetween>' + 66 '<ogc:PropertyName>number</ogc:PropertyName>' + 67 '<ogc:LowerBoundary>' + 68 '<ogc:Literal>1064866676</ogc:Literal>' + 69 '</ogc:LowerBoundary>' + 70 '<ogc:UpperBoundary>' + 71 '<ogc:Literal>1065512599</ogc:Literal>' + 72 '</ogc:UpperBoundary>' + 73 '</ogc:PropertyIsBetween>' + 74 '<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">' + 75 '<ogc:PropertyName>cat</ogc:PropertyName>' + 76 '<ogc:Literal>*dog.food!*good</ogc:Literal>' + 77 '</ogc:PropertyIsLike>' + 78 '<ogc:Not>' + 79 '<ogc:PropertyIsLessThanOrEqualTo>' + 80 '<ogc:PropertyName>FOO</ogc:PropertyName>' + 81 '<ogc:Literal>5000</ogc:Literal>' + 82 '</ogc:PropertyIsLessThanOrEqualTo>' + 83 '</ogc:Not>' + 84 '</ogc:Or>' + 85 '</ogc:Filter>' + 86 '<MaxScaleDenominator>10000</MaxScaleDenominator>' + 87 '<PointSymbolizer>' + 88 '<Graphic>' + 89 '<Mark>' + 90 '<WellKnownName>star</WellKnownName>' + 91 '<Fill>' + 92 '<CssParameter name="fill">lime</CssParameter>' + 93 '</Fill>' + 94 '<Stroke>' + 95 '<CssParameter name="stroke">olive</CssParameter>' + 96 '<CssParameter name="stroke-width">2</CssParameter>' + 97 '</Stroke>' + 98 '</Mark>' + 99 '</Graphic>' + 100 '</PointSymbolizer>' + 101 '</Rule>' + 102 '</FeatureTypeStyle>' + 103 '</UserStyle>' + 104 '</NamedLayer>' + 105 '</StyledLayerDescriptor>'; 106 107 function test_read(t) { 108 t.plan(6); 109 110 var parser = new OpenLayers.Format.SLD.v1_0_0(); 111 var xml = new OpenLayers.Format.XML(); 112 var obj = parser.read(xml.read(sld)); 113 114 // test the named layer count 115 var count = 0; 116 for(var key in obj.namedLayers) { 117 ++count; 118 } 119 t.eq(count, 2, "correct number of named layers"); 120 121 var layer, style, rule; 122 123 // check the first named layer 124 layer = obj.namedLayers["AAA161"]; 125 t.ok(layer, "first named layer exists"); 126 t.ok(layer.userStyles instanceof Array, "(AAA161) layer has array of user styles"); 127 t.eq(layer.userStyles.length, 1, "(AAA161) first layer has a single user style"); 128 129 // check the first user style 130 style = layer.userStyles[0]; 131 t.ok(style instanceof OpenLayers.Style, "(AAA161,0) user style is instance of OpenLayers.Style"); 132 t.eq(style.rules.length, 2, "(AAA161,0) user style has 2 rules"); 133 134 // check the first rule 135 // etc. I'm convinced read works, really wanted to test write (since examples don't test that) 136 // I'll add more tests here later. 137 138 } 139 140 function test_write(t) { 141 t.plan(1); 142 143 // read first - testing that write produces the SLD aboce 144 var parser = new OpenLayers.Format.SLD.v1_0_0(); 145 var xml = new OpenLayers.Format.XML(); 146 var obj = parser.read(xml.read(sld)); 147 148 var node = parser.write(obj); 149 t.xml_eq(node, sld, "SLD correctly written"); 150 151 } 152 153 154 </script> 155 </head> 156 <body> 157 </body> 158 </html> -
tests/Filter.html
old new 1 <html> 2 <head> 3 <script src="../lib/OpenLayers.js"></script> 4 <script type="text/javascript"> 5 6 function test_initialize(t) { 7 t.plan(3); 8 9 var options = {'foo': 'bar'}; 10 var filter = new OpenLayers.Filter(options); 11 t.ok(filter instanceof OpenLayers.Filter, 12 "new OpenLayers.Filter returns object" ); 13 t.eq(filter.foo, "bar", "constructor sets options correctly"); 14 t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 15 } 16 17 </script> 18 </head> 19 <body> 20 </body> 21 </html> -
tests/Rule/FeatureId.html
old new 1 <html>2 <head>3 <script src="../../lib/OpenLayers.js"></script>4 <script type="text/javascript">5 6 function test_FeatureId_constructor(t) {7 t.plan(3);8 9 var options = {'foo': 'bar'};10 var rule = new OpenLayers.Rule.FeatureId(options);11 t.ok(rule instanceof OpenLayers.Rule.FeatureId,12 "new OpenLayers.Rule.FeatureId returns object" );13 t.eq(rule.foo, "bar", "constructor sets options correctly");14 t.eq(typeof rule.evaluate, "function", "rule has an evaluate function");15 }16 17 function test_FeatureId_destroy(t) {18 t.plan(1);19 20 var rule = new OpenLayers.Rule.FeatureId();21 rule.destroy();22 t.eq(rule.symbolizer, null, "symbolizer hash nulled properly");23 }24 25 function test_FeatureId_evaluate(t) {26 t.plan(3);27 28 var rule = new OpenLayers.Rule.FeatureId(29 {fids: ["fid_1", "fid_3"]});30 31 var ruleResults = {32 "fid_1" : true,33 "fid_2" : false,34 "fid_3" : true};35 for (var i in ruleResults) {36 var feature = new OpenLayers.Feature.Vector();37 feature.fid = i;38 var result = rule.evaluate(feature);39 t.eq(result, ruleResults[i], "feature "+i+" evaluates to "+result.toString()+" correctly.");40 feature.destroy();41 }42 }43 </script>44 </head>45 <body>46 </body>47 </html> -
tests/Rule/Comparison.html
old new 1 <html>2 <head>3 <script src="../../lib/OpenLayers.js"></script>4 <script type="text/javascript">5 6 function test_Comparison_constructor(t) {7 t.plan(3);8 9 var options = {'foo': 'bar'};10 var rule = new OpenLayers.Rule.Comparison(options);11 t.ok(rule instanceof OpenLayers.Rule.Comparison,12 "new OpenLayers.Rule.Comparison returns object" );13 t.eq(rule.foo, "bar", "constructor sets options correctly");14 t.eq(typeof rule.evaluate, "function", "rule has an evaluate function");15 }16 17 function test_Comparison_destroy(t) {18 t.plan(1);19 20 var rule = new OpenLayers.Rule.Comparison();21 rule.destroy();22 t.eq(rule.symbolizer, null, "symbolizer hash nulled properly");23 }24 25 function test_Comparison_value2regex(t) {26 t.plan(2);27 28 var rule = new OpenLayers.Rule.Comparison({29 property: "foo",30 value: "*b?r\\*\\?*",31 type: OpenLayers.Rule.Comparison.LIKE});32 rule.value2regex("*", "?", "\\");33 t.eq(rule.value, ".*b.r\\*\\?.*", "Regular expression generated correctly.");34 35 rule.value = "%b.r!%!.%";36 rule.value2regex("%", ".", "!");37 t.eq(rule.value, ".*b.r\\%\\..*", "Regular expression with different wildcard and escape chars generated correctly.");38 }39 40 function test_regex2value(t) {41 t.plan(8);42 43 function r2v(regex) {44 return OpenLayers.Rule.Comparison.prototype.regex2value.call(45 {value: regex}46 );47 }48 49 t.eq(r2v("foo"), "foo", "doesn't change string without special chars");50 t.eq(r2v("foo.*foo"), "foo*foo", "wildCard replaced");51 t.eq(r2v("foo.foo"), "foo.foo", "singleChar replaced");52 t.eq(r2v("foo\\\\foo"), "foo\\foo", "escape removed");53 t.eq(r2v("foo!foo"), "foo!!foo", "escapes !");54 t.eq(r2v("foo\\*foo"), "foo!*foo", "replaces escape on *");55 t.eq(r2v("foo\\.foo"), "foo!.foo", "replaces escape on .");56 t.eq(r2v("foo\\\\.foo"), "foo\\.foo", "unescapes only \\ before .");57 58 }59 60 function test_Comparison_evaluate(t) {61 t.plan(5);62 63 var rule = new OpenLayers.Rule.Comparison({64 property: "area",65 lowerBoundary: 1000,66 upperBoundary: 4999,67 type: OpenLayers.Rule.Comparison.BETWEEN});68 69 var features = [70 new OpenLayers.Feature.Vector(null, {71 area: 999}),72 new OpenLayers.Feature.Vector(null, {73 area: 1000}),74 new OpenLayers.Feature.Vector(null, {75 area: 4999}),76 new OpenLayers.Feature.Vector(null, {77 area: 5000})];78 // PropertyIsBetween filter: lower and upper boundary are inclusive79 var ruleResults = {80 0: false,81 1: true,82 2: true,83 3: false};84 for (var i in ruleResults) {85 var result = rule.evaluate(features[i]);86 t.eq(result, ruleResults[i], "feature "+i+87 " evaluates to "+result.toString()+" correctly.");88 }89 rule.context = {90 area: 499891 }92 var result = rule.evaluate();93 t.eq(result, true, "evaluation against custom rule context works.");94 }95 </script>96 </head>97 <body>98 </body>99 </html> -
tests/Rule/Logical.html
old new 1 <html>2 <head>3 <script src="../../lib/OpenLayers.js"></script>4 <script type="text/javascript">5 6 function test_Logical_constructor(t) {7 t.plan(3);8 9 var options = {'foo': 'bar'};10 var rule = new OpenLayers.Rule.Logical(options);11 t.ok(rule instanceof OpenLayers.Rule.Logical,12 "new OpenLayers.Rule.Logical returns object" );13 t.eq(rule.foo, "bar", "constructor sets options correctly");14 t.eq(typeof rule.evaluate, "function", "rule has an evaluate function");15 }16 17 function test_Logical_destroy(t) {18 t.plan(1);19 20 var rule = new OpenLayers.Rule.Logical();21 rule.destroy();22 t.eq(rule.rules, null, "rules array nulled properly");23 }24 25 function test_Logical_evaluate(t) {26 t.plan(1);27 28 var rule = new OpenLayers.Rule.Logical({29 type: OpenLayers.Rule.Logical.NOT});30 rule.rules.push(new OpenLayers.Rule());31 32 var feature = new OpenLayers.Feature.Vector();33 34 t.eq(rule.evaluate(feature), false,35 "feature evaluates to false correctly.");36 }37 </script>38 </head>39 <body>40 </body>41 </html> -
tests/Style.html
old new 27 27 28 28 var style = new OpenLayers.Style(baseStyle); 29 29 30 var rule1 = new OpenLayers.Rule.FeatureId({ 31 fids: ["1"], 32 symbolizer: {"Point": {fillColor: "green"}}, 33 maxScaleDenominator: 500000}); 34 var rule2 = new OpenLayers.Rule.FeatureId({ 35 fids: ["1"], 36 symbolizer: {"Point": {fillColor: "yellow"}}, 37 minScaleDenominator: 500000, 38 maxScaleDenominator: 1000000}); 39 var rule3 = new OpenLayers.Rule.FeatureId({ 40 fids: ["1"], 41 symbolizer: {"Point": {fillColor: "red"}}, 42 minScaleDenominator: 1000000, 43 maxScaleDenominator: 2500000}); 30 var rule1 = new OpenLayers.Rule({ 31 symbolizer: {"Point": {fillColor: "green"}}, 32 maxScaleDenominator: 500000, 33 filter: new OpenLayers.Filter.FeatureId({ 34 fids: ["1"] 35 }) 36 }); 37 var rule2 = new OpenLayers.Rule({ 38 symbolizer: {"Point": {fillColor: "yellow"}}, 39 minScaleDenominator: 500000, 40 maxScaleDenominator: 1000000, 41 filter: new OpenLayers.Filter.FeatureId({ 42 fids: ["1"] 43 }) 44 }); 45 var rule3 = new OpenLayers.Rule({ 46 symbolizer: {"Point": {fillColor: "red"}}, 47 minScaleDenominator: 1000000, 48 maxScaleDenominator: 2500000, 49 filter: new OpenLayers.Filter.FeatureId({ 50 fids: ["1"] 51 }) 52 }); 44 53 45 54 var feature = new OpenLayers.Feature.Vector( 46 55 new OpenLayers.Geometry.Point(3,5), … … 119 128 120 129 function test_Style_context(t) { 121 130 t.plan(1); 122 var rule = new OpenLayers.Rule.Comparison({ 123 type: OpenLayers.Rule.Comparison.LESS_THAN, 124 property: "size", 125 value: 11, 126 symbolizer: {"Point": {externalGraphic: "${img1}"}}}); 131 var rule = new OpenLayers.Rule({ 132 symbolizer: {"Point": {externalGraphic: "${img1}"}}, 133 filter: new OpenLayers.Filter.Comparison({ 134 type: OpenLayers.Filter.Comparison.LESS_THAN, 135 property: "size", 136 value: 11 137 }) 138 }); 127 139 var style = new OpenLayers.Style(); 128 140 style.context = { 129 141 "img1": "myImage.png" -
tests/list-tests.html
old new 29 29 <li>Format/OSM.html</li> 30 30 <li>Format/KML.html</li> 31 31 <li>Format/SLD.html</li> 32 <li>Format/SLD/v1_0_0.html</li> 32 33 <li>Format/WKT.html</li> 33 34 <li>Format/WMC.html</li> 34 35 <li>Format/WMC/v1_1_0.html</li> … … 46 47 <li>Style.html</li> 47 48 <li>StyleMap.html</li> 48 49 <li>Rule.html</li> 49 <li>Rule/Comparison.html</li> 50 <li>Rule/FeatureId.html</li> 51 <li>Rule/Logical.html</li> 50 <li>Filter.html</li> 51 <li>Filter/Comparison.html</li> 52 <li>Filter/FeatureId.html</li> 53 <li>Filter/Logical.html</li> 52 54 <li>Events.html</li> 53 55 <li>Util.html</li> 54 56 <li>Lang.html</li> -
lib/OpenLayers/Filter/FeatureId.js
old new 1 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD 2 * license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the 3 * full text of the license. */ 4 5 6 /** 7 * @requires OpenLayers/Filter.js 8 */ 9 10 /** 11 * Class: OpenLayers.Filter.FeatureId 12 * This class represents a ogc:FeatureId Filter, as being used for rule-based SLD 13 * styling 14 * 15 * Inherits from 16 * - <OpenLayers.Filter> 17 */ 18 OpenLayers.Filter.FeatureId = OpenLayers.Class(OpenLayers.Filter, { 19 20 /** 21 * APIProperty: fids 22 * {Array(<String>)} Feature Ids to evaluate this rule against. To be passed 23 * To be passed inside the params object. 24 */ 25 fids: null, 26 27 /** 28 * Constructor: OpenLayers.Filter.FeatureId 29 * Creates an ogc:FeatureId rule. 30 * 31 * Parameters: 32 * options - {Object} An optional object with properties to set on the 33 * rule 34 * 35 * Returns: 36 * {<OpenLayers.Filter.FeatureId>} 37 */ 38 initialize: function(options) { 39 this.fids = []; 40 OpenLayers.Filter.prototype.initialize.apply(this, [options]); 41 }, 42 43 /** 44 * APIMethod: evaluate 45 * evaluates this rule for a specific feature 46 * 47 * Parameters: 48 * feature - {<OpenLayers.Feature>} feature to apply the rule to. 49 * For vector features, the check is run against the fid, 50 * for plain features against the id. 51 * 52 * Returns: 53 * {boolean} true if the rule applies, false if it does not 54 */ 55 evaluate: function(feature) { 56 for (var i=0; i<this.fids.length; i++) { 57 var fid = feature.fid || feature.id; 58 if (fid == this.fids[i]) { 59 return true; 60 } 61 } 62 return false; 63 }, 64 65 CLASS_NAME: "OpenLayers.Filter.FeatureId" 66 }); -
lib/OpenLayers/Filter/Comparison.js
old new 1 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD 2 * license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the 3 * full text of the license. */ 4 5 /** 6 * @requires OpenLayers/Filter.js 7 */ 8 9 /** 10 * Class: OpenLayers.Filter.Comparison 11 * This class represents a comparison filter. 12 * 13 * Inherits from 14 * - <OpenLayers.Filter> 15 */ 16 OpenLayers.Filter.Comparison = OpenLayers.Class(OpenLayers.Filter, { 17 18 /** 19 * APIProperty: type 20 * {String} type: type of the comparison. This is one of 21 * - OpenLayers.Filter.Comparison.EQUAL_TO = "=="; 22 * - OpenLayers.Filter.Comparison.NOT_EQUAL_TO = "!="; 23 * - OpenLayers.Filter.Comparison.LESS_THAN = "<"; 24 * - OpenLayers.Filter.Comparison.GREATER_THAN = ">"; 25 * - OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = "<="; 26 * - OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">="; 27 * - OpenLayers.Filter.Comparison.BETWEEN = ".."; 28 * - OpenLayers.Filter.Comparison.LIKE = "~"; 29 */ 30 type: null, 31 32 /** 33 * APIProperty: property 34 * {String} 35 * name of the context property to compare 36 */ 37 property: null, 38 39 /** 40 * APIProperty: value 41 * {Number} or {String} 42 * comparison value for binary comparisons. In the case of a String, this 43 * can be a combination of text and propertyNames in the form 44 * "literal ${propertyName}" 45 */ 46 value: null, 47 48 /** 49 * APIProperty: lowerBoundary 50 * {Number} or {String} 51 * lower boundary for between comparisons. In the case of a String, this 52 * can be a combination of text and propertyNames in the form 53 * "literal ${propertyName}" 54 */ 55 lowerBoundary: null, 56 57 /** 58 * APIProperty: upperBoundary 59 * {Number} or {String} 60 * upper boundary for between comparisons. In the case of a String, this 61 * can be a combination of text and propertyNames in the form 62 * "literal ${propertyName}" 63 */ 64 upperBoundary: null, 65 66 /** 67 * Constructor: OpenLayers.Filter.Comparison 68 * Creates a comparison rule. 69 * 70 * Parameters: 71 * params - {Object} Hash of parameters for this rule: 72 * - 73 * - value: 74 * options - {Object} An optional object with properties to set on the 75 * rule 76 * 77 * Returns: 78 * {<OpenLayers.Filter.Comparison>} 79 */ 80 initialize: function(options) { 81 OpenLayers.Filter.prototype.initialize.apply(this, [options]); 82 }, 83 84 /** 85 * APIMethod: evaluate 86 * Evaluates this filter in a specific context. Should be implemented by 87 * subclasses. 88 * 89 * Parameters: 90 * context - {Object} Context to use in evaluating the filter. 91 * 92 * Returns: 93 * {Boolean} The filter applies. 94 */ 95 evaluate: function(context) { 96 switch(this.type) { 97 case OpenLayers.Filter.Comparison.EQUAL_TO: 98 case OpenLayers.Filter.Comparison.LESS_THAN: 99 case OpenLayers.Filter.Comparison.GREATER_THAN: 100 case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO: 101 case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO: 102 return this.binaryCompare(context, this.property, this.value); 103 104 case OpenLayers.Filter.Comparison.BETWEEN: 105 var result = 106 context[this.property] >= this.lowerBoundary; 107 result = result && 108 context[this.property] <= this.upperBoundary; 109 return result; 110 case OpenLayers.Filter.Comparison.LIKE: 111 var regexp = new RegExp(this.value, 112 "gi"); 113 return regexp.test(context[this.property]); 114 } 115 }, 116 117 /** 118 * APIMethod: value2regex 119 * Converts the value of this rule into a regular expression string, 120 * according to the wildcard characters specified. This method has to 121 * be called after instantiation of this class, if the value is not a 122 * regular expression already. 123 * 124 * Parameters: 125 * wildCard - {<Char>} wildcard character in the above value, default 126 * is "*" 127 * singleChar - {<Char>) single-character wildcard in the above value 128 * default is "." 129 * escape - {<Char>) escape character in the above value, default is 130 * "!" 131 * 132 * Returns: 133 * {String} regular expression string 134 */ 135 value2regex: function(wildCard, singleChar, escapeChar) { 136 if (wildCard == ".") { 137 var msg = "'.' is an unsupported wildCard character for "+ 138 "OpenLayers.Filter.Comparison"; 139 OpenLayers.Console.error(msg); 140 return null; 141 } 142 143 // set UMN MapServer defaults for unspecified parameters 144 wildCard = wildCard ? wildCard : "*"; 145 singleChar = singleChar ? singleChar : "."; 146 escapeChar = escapeChar ? escapeChar : "!"; 147 148 this.value = this.value.replace( 149 new RegExp("\\"+escapeChar, "g"), "\\"); 150 this.value = this.value.replace( 151 new RegExp("\\"+singleChar, "g"), "."); 152 this.value = this.value.replace( 153 new RegExp("\\"+wildCard, "g"), ".*"); 154 this.value = this.value.replace( 155 new RegExp("\\\\.\\*", "g"), "\\"+wildCard); 156 this.value = this.value.replace( 157 new RegExp("\\\\\\.", "g"), "\\"+singleChar); 158 159 return this.value; 160 }, 161 162 /** 163 * Method: regex2value 164 * Convert the value of this rule from a regular expression string into an 165 * ogc literal string using a wildCard of *, a singleChar of ., and an 166 * escape of !. Leaves the <value> property unmodified. 167 * 168 * Returns: 169 * {String} A string value. 170 */ 171 regex2value: function() { 172 173 var value = this.value; 174 175 // replace ! with !! 176 value = value.replace(/!/g, "!!"); 177 178 // replace \. with !. (watching out for \\.) 179 value = value.replace(/(\\)?\\\./g, function($0, $1) { 180 return $1 ? $0 : "!."; 181 }); 182 183 // replace \* with #* (watching out for \\*) 184 value = value.replace(/(\\)?\\\*/g, function($0, $1) { 185 return $1 ? $0 : "!*"; 186 }); 187 188 // replace \\ with \ 189 value = value.replace(/\\\\/g, "\\"); 190 191 // convert .* to * (the sequence #.* is not allowed) 192 value = value.replace(/\.\*/g, "*"); 193 194 return value; 195 }, 196 197 /** 198 * Function: binaryCompare 199 * Compares a feature property to a rule value 200 * 201 * Parameters: 202 * context - {Object} 203 * property - {String} or {Number} 204 * value - {String} or {Number}, same as property 205 * 206 * Returns: 207 * {boolean} 208 */ 209 binaryCompare: function(context, property, value) { 210 switch (this.type) { 211 case OpenLayers.Filter.Comparison.EQUAL_TO: 212 return context[property] == value; 213 case OpenLayers.Filter.Comparison.NOT_EQUAL_TO: 214 &n
