Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
*.pyc
*.py[co]
*.egg-info
.tox
build/
docs/_build/
dist/
.DS_Store
/bin
/include
/lib
.Python
34 changes: 25 additions & 9 deletions mysolr/mysolr.py
Original file line number Diff line number Diff line change
Expand Up @@ -351,27 +351,43 @@ def fetch(self, rows=None):
self.query['start'] += self.query['rows']


def _get_add_xml(array_of_hash, overwrite=True):
def _get_add_xml(array_of_hash, overwrite=True, commit_within=None,
boost_values=None):
""" Creates add XML message to send to Solr based on the array of hashes
(documents) provided.

:param overwrite: Newer documents will replace previously added documents
with the same uniqueKey (default is True)

"""
xml = '<add overwrite="%s">' % ('true' if overwrite else 'false')
xml = '<add overwrite="%s"' % ('true' if overwrite else 'false')
if commit_within:
xml += ' commitWithin="%s"' % (commit_within)
xml += '>'

def add_field_xml(doc, key, value):
if isinstance(value, get_basestring()):
value = escape(value)
if key in boost_values:
boost = ' boost="%s"' % boost_values[key]
else:
boost = ''
doc += '<field name="%s"%s>%s</field>' % (key, boost, value)
return doc

for doc_hash in array_of_hash:
doc = '<doc>'
if boost_values is None:
boost_values = {}
if '' in boost_values: # boost value for the entire document
doc = '<doc boost="%s">' % boost_values['']
else:
doc = '<doc>'
for key, value in doc_hash.items():
if isinstance(value, list):
for v in value:
if isinstance(v, get_basestring()):
v = escape(v)
doc += '<field name="%s">%s</field>' % (key, v)
doc = add_field_xml(doc, key, v)
else:
if isinstance(value, get_basestring()):
value = escape(value)
doc += '<field name="%s">%s</field>' % (key, value)
doc = add_field_xml(doc, key, value)
doc += '</doc>'
xml += doc
xml += '</add>'
Expand Down
43 changes: 43 additions & 0 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

import unittest
from mysolr import mysolr


class AddXmlTestCase(unittest.TestCase):

def test_add_xml(self):
self.assertEqual(mysolr._get_add_xml([{'id': 5, 'foo': 'bar'}]),
('<add overwrite="true"><doc><field name="foo">bar'
'</field><field name="id">5</field></doc></add>'))

def test_add_xml_nooverwrite(self):
self.assertEqual(mysolr._get_add_xml([{'id': 5, 'foo': 'bar'}],
overwrite=False),
('<add overwrite="false"><doc><field name="foo">bar'
'</field><field name="id">5</field></doc></add>'))

def test_add_xml_commit_within(self):
self.assertEqual(mysolr._get_add_xml([{'id': 5, 'foo': 'bar'}],
commit_within=2.0),
('<add overwrite="true" commitWithin="2.0"><doc>'
'<field name="foo">bar</field><field name="id">5'
'</field></doc></add>'))

def test_add_xml_commit_doc_boost(self):
self.assertEqual(mysolr._get_add_xml([{'id': 7, 'foo': 'bar'}],
boost_values={'': 2.3}),
('<add overwrite="true"><doc boost="2.3">'
'<field name="foo">bar</field><field name="id">7'
'</field></doc></add>'))

def test_add_xml_commit_field_boost(self):
self.assertEqual(mysolr._get_add_xml([{'id': 7, 'foo': 'bar'}],
boost_values={'foo': 4.2}),
('<add overwrite="true"><doc>'
'<field name="foo" boost="4.2">bar</field>'
'<field name="id">7</field></doc></add>'))

if __name__ == '__main__':
unittest.main()