Skip to content

Commit 5bd07ea

Browse files
authored
Merge pull request #358 from ramayer/escape_xml_in_delete_using_elementree
Escape xml in delete() using ElementTree
2 parents da6082f + b48eabd commit 5bd07ea

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

pysolr.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -1119,11 +1119,18 @@ def delete(
11191119
else:
11201120
doc_id = list(filter(None, id))
11211121
if doc_id:
1122-
m = "<delete>%s</delete>" % "".join("<id>%s</id>" % i for i in doc_id)
1122+
et = ElementTree.Element("delete")
1123+
for one_doc_id in doc_id:
1124+
subelem = ElementTree.SubElement(et, 'id')
1125+
subelem.text = one_doc_id
1126+
m = ElementTree.tostring(et)
11231127
else:
11241128
raise ValueError("The list of documents to delete was empty.")
11251129
elif q is not None:
1126-
m = "<delete><query>%s</query></delete>" % q
1130+
et = ElementTree.Element("delete")
1131+
subelem = ElementTree.SubElement(et, 'query')
1132+
subelem.text = q
1133+
m = ElementTree.tostring(et)
11271134

11281135
return self._update(
11291136
m,

tests/test_client.py

+8
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,14 @@ def test_delete(self):
909909
self.assertEqual(len(self.solr.search("type_s:grandchild")), 1)
910910
self.solr.delete(q="price:[0 TO 15]")
911911
self.solr.delete(q="type_s:parent", commit=True)
912+
913+
# Test a query that would need to be quoted when using the XML API.
914+
# Ids with a "<" character will give an error using v3.9.0 or earlier
915+
self.solr.delete(id='cats<dogs')
916+
# These will delete too much when using v3.9.0 or earlier.
917+
self.solr.delete(q='id:*</query><query> id:999 AND id:9999')
918+
self.solr.delete(id='doc_4</id><id>doc_3', commit=True)
919+
912920
# one simple doc should remain
913921
# parent documents were also deleted but children remain as orphans
914922
self.assertEqual(len(self.solr.search("doc")), 1)

0 commit comments

Comments
 (0)