Merge pull request #733 from tschaub/filter-tweaks

Allow writer functions to use document fragments when they need to append more than a single child to the parent.
This commit is contained in:
Tim Schaub
2012-10-26 09:45:53 -07:00
3 changed files with 59 additions and 33 deletions
+10 -33
View File
@@ -279,9 +279,8 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
* {DOMElement} Updated node element. * {DOMElement} Updated node element.
*/ */
writeOgcExpression: function(value, node) { writeOgcExpression: function(value, node) {
if(value instanceof OpenLayers.Filter.Function){ if (value instanceof OpenLayers.Filter.Function){
var child = this.writeNode("Function", value, node); this.writeNode("Function", value, node);
node.appendChild(child);
} else { } else {
this.writeNode("Literal", value, node); this.writeNode("Literal", value, node);
} }
@@ -301,19 +300,6 @@ 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
@@ -324,10 +310,13 @@ 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");
if (filter.type === "FID") { this.writeNode(this.getFilterType(filter), filter, node);
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, filter, node); return node;
} else { },
this.writeNode(this.getFilterType(filter), filter, node); "_featureIds": function(filter) {
var node = this.createDocumentFragment();
for (var i=0, ii=filter.fids.length; i<ii; ++i) {
this.writeNode("ogc:FeatureId", filter.fids[i], node);
} }
return node; return node;
}, },
@@ -341,14 +330,10 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter; var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) { for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i]; childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, 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) {
@@ -356,26 +341,18 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter; var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) { for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i]; childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, 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") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, 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) {
@@ -519,7 +496,7 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
"WITHIN": "WITHIN", "WITHIN": "WITHIN",
"CONTAINS": "CONTAINS", "CONTAINS": "CONTAINS",
"INTERSECTS": "INTERSECTS", "INTERSECTS": "INTERSECTS",
"FID": "FeatureId" "FID": "_featureIds"
}, },
CLASS_NAME: "OpenLayers.Format.Filter.v1" CLASS_NAME: "OpenLayers.Format.Filter.v1"
+20
View File
@@ -230,6 +230,26 @@ OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
return element; return element;
}, },
/**
* APIMethod: createDocumentFragment
* Create a document fragment node that can be appended to another node
* created by createElementNS. This will call
* document.createDocumentFragment outside of IE. In IE, the ActiveX
* object's createDocumentFragment method is used.
*
* Returns:
* {Element} A document fragment.
*/
createDocumentFragment: function() {
var element;
if (this.xmldom) {
element = this.xmldom.createDocumentFragment();
} else {
element = document.createDocumentFragment();
}
return element;
},
/** /**
* APIMethod: createTextNode * APIMethod: createTextNode
* Create a text node. This node can be appended to another node with * Create a text node. This node can be appended to another node with
+29
View File
@@ -166,6 +166,35 @@
"node can be appended to a doc root"); "node can be appended to a doc root");
} }
function test_createDocumentFragment(t) {
t.plan(3);
var format = new OpenLayers.Format.XML();
var uri = "http://foo.com";
var prefix = "foo";
var localName = "bar";
var qualifiedName = prefix + ":" + localName;
var parent = format.createElementNS(uri, qualifiedName);
var fragment = format.createDocumentFragment();
t.eq(fragment.nodeType, 11, "fragment type");
try {
fragment.appendChild(format.createTextNode("one"));
fragment.appendChild(format.createTextNode("two"));
t.eq(fragment.childNodes.length, 2, "fragment has two child nodes");
} catch (err) {
t.fail("trouble appending text nodes to fragment: " + err.message);
}
try {
parent.appendChild(fragment);
t.eq(parent.childNodes.length, 2, "parent has two child nodes");
} catch (err) {
t.fail("trouble appending fragment to parent: " + err.message);
}
}
function test_Format_XML_createTextNode(t) { function test_Format_XML_createTextNode(t) {
t.plan(10); t.plan(10);