blob: 8d56022dbe7c2f3889139eff66795d59a97a676d [file] [log] [blame]
import shlex
import pysolr
from pysolr import SolrError
class Solr(pysolr.Solr):
"""Solr server that accepts default values for `commit` and
`commitWithin` and passes those values through to each `add` and
`delete` call, unless explicitly overridden.
"""
def __init__(self, server, commit=True, commitWithin=None, **kw):
pysolr.Solr.__init__(self, server, **kw)
self.commit = commit
self.commitWithin = commitWithin
def add(self, *args, **kw):
if 'commit' not in kw:
kw['commit'] = self.commit
if self.commitWithin and 'commitWithin' not in kw:
kw['commitWithin'] = self.commitWithin
return pysolr.Solr.add(self, *args, **kw)
def delete(self, *args, **kw):
if 'commit' not in kw:
kw['commit'] = self.commit
return pysolr.Solr.delete(self, *args, **kw)
class MockSOLR(object):
class MockHits(list):
@property
def hits(self):
return len(self)
@property
def docs(self):
return self
def __init__(self):
self.db = {}
def add(self, objects):
for o in objects:
o['text'] = ''.join(o['text'])
self.db[o['id']] = o
def commit(self):
pass
def search(self, q, fq=None, **kw):
if isinstance(q, unicode):
q = q.encode('latin-1')
# Parse query
preds = []
q_parts = shlex.split(q)
if fq: q_parts += fq
for part in q_parts:
if part == '&&':
continue
if ':' in part:
field, value = part.split(':', 1)
preds.append((field, value))
else:
preds.append(('text', part))
result = self.MockHits()
for obj in self.db.values():
for field, value in preds:
neg = False
if field[0] == '!':
neg = True
field = field[1:]
if field == 'text' or field.endswith('_t'):
if (value not in str(obj.get(field, ''))) ^ neg:
break
else:
if (value != str(obj.get(field, ''))) ^ neg:
break
else:
result.append(obj)
return result
def delete(self, *args, **kwargs):
if kwargs.get('q', None) == '*:*':
self.db = {}
elif kwargs.get('id', None):
del self.db[kwargs['id']]
elif kwargs.get('q', None):
for doc in self.search(kwargs['q']):
self.delete(id=doc['id'])