Extending the filter format and the feature ID filter to support writing of logical filters that contain FID filters. r=bartvde (closes #3012)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@11756 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -25,6 +25,12 @@ OpenLayers.Filter.FeatureId = OpenLayers.Class(OpenLayers.Filter, {
|
|||||||
*/
|
*/
|
||||||
fids: null,
|
fids: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property: type
|
||||||
|
* {String} Type to identify this filter.
|
||||||
|
*/
|
||||||
|
type: "FID",
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor: OpenLayers.Filter.FeatureId
|
* Constructor: OpenLayers.Filter.FeatureId
|
||||||
* Creates an ogc:FeatureId rule.
|
* Creates an ogc:FeatureId rule.
|
||||||
|
|||||||
@@ -272,6 +272,19 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
return this.writers.ogc["Filter"].apply(this, [filter]);
|
return this.writers.ogc["Filter"].apply(this, [filter]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method: writeFeatureIdNodes
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* filter - {<OpenLayers.Filter.FeatureId}
|
||||||
|
* node - {DOMElement}
|
||||||
|
*/
|
||||||
|
writeFeatureIdNodes: function(filter, node) {
|
||||||
|
for (var i=0, ii=filter.fids.length; i<ii; ++i) {
|
||||||
|
this.writeNode("FeatureId", filter.fids[i], node);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Property: writers
|
* Property: writers
|
||||||
* As a compliment to the readers property, this structure contains public
|
* As a compliment to the readers property, this structure contains public
|
||||||
@@ -282,11 +295,8 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
"ogc": {
|
"ogc": {
|
||||||
"Filter": function(filter) {
|
"Filter": function(filter) {
|
||||||
var node = this.createElementNSPlus("ogc:Filter");
|
var node = this.createElementNSPlus("ogc:Filter");
|
||||||
var sub = filter.CLASS_NAME.split(".").pop();
|
if (filter.type === "FID") {
|
||||||
if(sub == "FeatureId") {
|
this.writeFeatureIdNodes(filter, node);
|
||||||
for(var i=0; i<filter.fids.length; ++i) {
|
|
||||||
this.writeNode("FeatureId", filter.fids[i], node);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
this.writeNode(this.getFilterType(filter), filter, node);
|
this.writeNode(this.getFilterType(filter), filter, node);
|
||||||
}
|
}
|
||||||
@@ -300,31 +310,43 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
"And": function(filter) {
|
"And": function(filter) {
|
||||||
var node = this.createElementNSPlus("ogc:And");
|
var node = this.createElementNSPlus("ogc:And");
|
||||||
var childFilter;
|
var childFilter;
|
||||||
for(var i=0; i<filter.filters.length; ++i) {
|
for (var i=0, ii=filter.filters.length; i<ii; ++i) {
|
||||||
childFilter = filter.filters[i];
|
childFilter = filter.filters[i];
|
||||||
|
if (childFilter.type === "FID") {
|
||||||
|
this.writeFeatureIdNodes(childFilter, node);
|
||||||
|
} else {
|
||||||
this.writeNode(
|
this.writeNode(
|
||||||
this.getFilterType(childFilter), childFilter, node
|
this.getFilterType(childFilter), childFilter, node
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
"Or": function(filter) {
|
"Or": function(filter) {
|
||||||
var node = this.createElementNSPlus("ogc:Or");
|
var node = this.createElementNSPlus("ogc:Or");
|
||||||
var childFilter;
|
var childFilter;
|
||||||
for(var i=0; i<filter.filters.length; ++i) {
|
for (var i=0, ii=filter.filters.length; i<ii; ++i) {
|
||||||
childFilter = filter.filters[i];
|
childFilter = filter.filters[i];
|
||||||
|
if (childFilter.type === "FID") {
|
||||||
|
this.writeFeatureIdNodes(childFilter, node);
|
||||||
|
} else {
|
||||||
this.writeNode(
|
this.writeNode(
|
||||||
this.getFilterType(childFilter), childFilter, node
|
this.getFilterType(childFilter), childFilter, node
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
"Not": function(filter) {
|
"Not": function(filter) {
|
||||||
var node = this.createElementNSPlus("ogc:Not");
|
var node = this.createElementNSPlus("ogc:Not");
|
||||||
var childFilter = filter.filters[0];
|
var childFilter = filter.filters[0];
|
||||||
|
if (childFilter.type === "FID") {
|
||||||
|
this.writeFeatureIdNodes(childFilter, node);
|
||||||
|
} else {
|
||||||
this.writeNode(
|
this.writeNode(
|
||||||
this.getFilterType(childFilter), childFilter, node
|
this.getFilterType(childFilter), childFilter, node
|
||||||
);
|
);
|
||||||
|
}
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
"PropertyIsLessThan": function(filter) {
|
"PropertyIsLessThan": function(filter) {
|
||||||
@@ -460,7 +482,8 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
"DWITHIN": "DWITHIN",
|
"DWITHIN": "DWITHIN",
|
||||||
"WITHIN": "WITHIN",
|
"WITHIN": "WITHIN",
|
||||||
"CONTAINS": "CONTAINS",
|
"CONTAINS": "CONTAINS",
|
||||||
"INTERSECTS": "INTERSECTS"
|
"INTERSECTS": "INTERSECTS",
|
||||||
|
"FID": "FeatureId"
|
||||||
},
|
},
|
||||||
|
|
||||||
CLASS_NAME: "OpenLayers.Format.Filter.v1"
|
CLASS_NAME: "OpenLayers.Format.Filter.v1"
|
||||||
|
|||||||
@@ -166,9 +166,96 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function test_logical_fid(t) {
|
||||||
|
// the Filter Encoding spec doesn't allow for FID filters inside logical filters
|
||||||
|
// however, to be liberal, we will write them without complaining
|
||||||
|
t.plan(3);
|
||||||
|
|
||||||
|
var filter = new OpenLayers.Filter.Logical({
|
||||||
|
type: OpenLayers.Filter.Logical.OR,
|
||||||
|
filters: [
|
||||||
|
new OpenLayers.Filter.Comparison({
|
||||||
|
type: OpenLayers.Filter.Comparison.LIKE,
|
||||||
|
property: "person",
|
||||||
|
value: "me"
|
||||||
|
}),
|
||||||
|
new OpenLayers.Filter.FeatureId({fids: ["foo.1", "foo.2"]})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
var format = new OpenLayers.Format.Filter.v1_0_0();
|
||||||
|
|
||||||
|
var got = format.write(filter);
|
||||||
|
var exp = readXML("LogicalFeatureId");
|
||||||
|
t.xml_eq(got, exp, "wrote FID filter in logical OR without complaint");
|
||||||
|
|
||||||
|
filter = new OpenLayers.Filter.Logical({
|
||||||
|
type: OpenLayers.Filter.Logical.AND,
|
||||||
|
filters: [
|
||||||
|
new OpenLayers.Filter.Comparison({
|
||||||
|
type: OpenLayers.Filter.Comparison.LIKE,
|
||||||
|
property: "person",
|
||||||
|
value: "me"
|
||||||
|
}),
|
||||||
|
new OpenLayers.Filter.FeatureId({fids: ["foo.1", "foo.2"]})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
got = format.write(filter);
|
||||||
|
exp = readXML("LogicalFeatureIdAnd");
|
||||||
|
t.xml_eq(got, exp, "wrote FID filter in logical AND without complaint");
|
||||||
|
|
||||||
|
filter = new OpenLayers.Filter.Logical({
|
||||||
|
type: OpenLayers.Filter.Logical.NOT,
|
||||||
|
filters: [
|
||||||
|
new OpenLayers.Filter.FeatureId({fids: ["foo.2"]})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
got = format.write(filter);
|
||||||
|
exp = readXML("LogicalFeatureIdNot");
|
||||||
|
t.xml_eq(got, exp, "wrote FID filter in logical NOT without complaint");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function readXML(id) {
|
||||||
|
var xml = document.getElementById(id).firstChild.nodeValue;
|
||||||
|
return new OpenLayers.Format.XML().read(xml).documentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
<div id="LogicalFeatureId"><!--
|
||||||
|
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||||
|
<ogc:Or>
|
||||||
|
<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">
|
||||||
|
<ogc:PropertyName>person</ogc:PropertyName>
|
||||||
|
<ogc:Literal>me</ogc:Literal>
|
||||||
|
</ogc:PropertyIsLike>
|
||||||
|
<ogc:FeatureId fid="foo.1"/>
|
||||||
|
<ogc:FeatureId fid="foo.2"/>
|
||||||
|
</ogc:Or>
|
||||||
|
</ogc:Filter>
|
||||||
|
--></div>
|
||||||
|
<div id="LogicalFeatureIdAnd"><!--
|
||||||
|
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||||
|
<ogc:And>
|
||||||
|
<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">
|
||||||
|
<ogc:PropertyName>person</ogc:PropertyName>
|
||||||
|
<ogc:Literal>me</ogc:Literal>
|
||||||
|
</ogc:PropertyIsLike>
|
||||||
|
<ogc:FeatureId fid="foo.1"/>
|
||||||
|
<ogc:FeatureId fid="foo.2"/>
|
||||||
|
</ogc:And>
|
||||||
|
</ogc:Filter>
|
||||||
|
--></div>
|
||||||
|
<div id="LogicalFeatureIdNot"><!--
|
||||||
|
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||||
|
<ogc:Not>
|
||||||
|
<ogc:FeatureId fid="foo.2"/>
|
||||||
|
</ogc:Not>
|
||||||
|
</ogc:Filter>
|
||||||
|
--></div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user