Skip to content

Commit 498b088

Browse files
authored
Merge pull request #322 from ahankinson/fixed-321-xml-json
Fixed: Different JSON and XML behaviour
2 parents b646e96 + 08cf0d8 commit 498b088

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

pysolr.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -907,13 +907,17 @@ def suggest_terms(self, fields, prefix, handler="terms", **kwargs):
907907
)
908908
return res
909909

910-
def _build_doc(self, doc, boost=None, fieldUpdates=None):
910+
def _build_json_doc(self, doc):
911+
cleaned_doc = {k: v for k, v in doc.items() if not self._is_null_value(v)}
912+
return cleaned_doc
913+
914+
def _build_xml_doc(self, doc, boost=None, fieldUpdates=None):
911915
doc_elem = ElementTree.Element("doc")
912916

913917
for key, value in doc.items():
914918
if key == NESTED_DOC_KEY:
915919
for child in value:
916-
doc_elem.append(self._build_doc(child, boost, fieldUpdates))
920+
doc_elem.append(self._build_xml_doc(child, boost, fieldUpdates))
917921
continue
918922

919923
if key == "boost":
@@ -932,7 +936,7 @@ def _build_doc(self, doc, boost=None, fieldUpdates=None):
932936
continue
933937

934938
if key == "_doc":
935-
child = self._build_doc(bit, boost)
939+
child = self._build_xml_doc(bit, boost)
936940
doc_elem.append(child)
937941
continue
938942

@@ -1015,7 +1019,8 @@ def add(
10151019
# json array of docs
10161020
if isinstance(message, list):
10171021
# convert to string
1018-
m = json.dumps(message).encode("utf-8")
1022+
cleaned_message = [self._build_json_doc(doc) for doc in message]
1023+
m = json.dumps(cleaned_message).encode("utf-8")
10191024
else:
10201025
raise ValueError("wrong message type")
10211026
else:
@@ -1025,7 +1030,7 @@ def add(
10251030
message.set("commitWithin", commitWithin)
10261031

10271032
for doc in docs:
1028-
el = self._build_doc(doc, boost=boost, fieldUpdates=fieldUpdates)
1033+
el = self._build_xml_doc(doc, boost=boost, fieldUpdates=fieldUpdates)
10291034
message.append(el)
10301035

10311036
# This returns a bytestring. Ugh.

tests/test_client.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -663,32 +663,32 @@ def test_suggest_terms(self):
663663
args, kwargs = self.solr._send_request.call_args
664664
self.assertTrue(args[1].startswith("fakehandler"))
665665

666-
def test__build_doc(self):
666+
def test__build_xml_doc(self):
667667
doc = {
668668
"id": "doc_1",
669669
"title": "Example doc ☃ 1",
670670
"price": 12.59,
671671
"popularity": 10,
672672
}
673673
doc_xml = force_unicode(
674-
ElementTree.tostring(self.solr._build_doc(doc), encoding="utf-8")
674+
ElementTree.tostring(self.solr._build_xml_doc(doc), encoding="utf-8")
675675
)
676676
self.assertIn('<field name="title">Example doc ☃ 1</field>', doc_xml)
677677
self.assertIn('<field name="id">doc_1</field>', doc_xml)
678678
self.assertEqual(len(doc_xml), 152)
679679

680-
def test__build_doc_with_sets(self):
680+
def test__build_xml_doc_with_sets(self):
681681
doc = {"id": "doc_1", "title": "Set test doc", "tags": {"alpha", "beta"}}
682682
doc_xml = force_unicode(
683-
ElementTree.tostring(self.solr._build_doc(doc), encoding="utf-8")
683+
ElementTree.tostring(self.solr._build_xml_doc(doc), encoding="utf-8")
684684
)
685685
self.assertIn('<field name="id">doc_1</field>', doc_xml)
686686
self.assertIn('<field name="title">Set test doc</field>', doc_xml)
687687
self.assertIn('<field name="tags">alpha</field>', doc_xml)
688688
self.assertIn('<field name="tags">beta</field>', doc_xml)
689689
self.assertEqual(len(doc_xml), 144)
690690

691-
def test__build_doc_with_sub_docs(self):
691+
def test__build_xml_doc_with_sub_docs(self):
692692
sub_docs = [
693693
{
694694
"id": "sub_doc_1",
@@ -710,7 +710,7 @@ def test__build_doc_with_sub_docs(self):
710710
"popularity": 10,
711711
"_doc": sub_docs,
712712
}
713-
doc_xml = self.solr._build_doc(doc)
713+
doc_xml = self.solr._build_xml_doc(doc)
714714
self.assertEqual(doc_xml.find("*[@name='id']").text, doc["id"])
715715

716716
children_docs = doc_xml.findall("doc")
@@ -719,6 +719,19 @@ def test__build_doc_with_sub_docs(self):
719719
self.assertEqual(children_docs[0].find("*[@name='id']").text, sub_docs[0]["id"])
720720
self.assertEqual(children_docs[1].find("*[@name='id']").text, sub_docs[1]["id"])
721721

722+
def test_build_json_doc_matches_xml(self):
723+
doc = {
724+
"id": "doc_1",
725+
"title": "",
726+
"price": 12.59,
727+
"popularity": 10
728+
}
729+
730+
doc_json = self.solr._build_json_doc(doc)
731+
doc_xml = self.solr._build_xml_doc(doc)
732+
self.assertNotIn("title", doc_json)
733+
self.assertIsNone(doc_xml.find("*[name='title']"))
734+
722735
def test_add(self):
723736
self.assertEqual(len(self.solr.search("doc")), 3)
724737
self.assertEqual(len(self.solr.search("example")), 2)

0 commit comments

Comments
 (0)