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
2 changes: 1 addition & 1 deletion tests/test_queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class PersonSchema(Schema):
nothing = Integer.using(facet=True, optional=True)
nostore = Integer.using(optional=True, store=False)

description = Text.using(prefix=False)
description = Text.using(prefix=False, sortable=True)
cualificaciones = Text.using(language="es")

keywords = Array.of(String)
Expand Down
17 changes: 15 additions & 2 deletions xodb/database.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import time
import string
import logging
import uuid
from uuid import uuid4
from collections import namedtuple, OrderedDict
from contextlib import contextmanager
from datetime import datetime, date

import xapian
import nilsimsa
Expand All @@ -15,7 +17,7 @@
from xapian import QueryParser, DocNotFoundError

from . import snowball
from .elements import Schema, String, Integer, Float, Array
from .elements import Schema, String, Integer, Array, DateTime, Date
from .exc import ValidationError, PrefixError
from .tools import LRUDict, lazy_property

Expand Down Expand Up @@ -92,7 +94,7 @@ def __getstate__(self):
id=str(self.__xodb_id__))

def __setstate__(self, state):
self.__xodb_query__ = xapian_Query.unserialise(state['query'])
self.__xodb_query__ = xapian.Query.unserialise(state['query'])
self.__xodb_id__ = uuid.UUID(state['id'])

def __str__(self):
Expand Down Expand Up @@ -127,6 +129,17 @@ def _xodb_schema(self):
return _lookup_schema(typ).from_flat(data)

def __getattr__(self, name):
slot = self._xodb_db.values.get(name)
if slot:
typ = self._xodb_db.value_sorts[name]
val = self._xodb_document.get_value(slot)
if typ == 'datetime':
return datetime.strptime(val, DateTime.value_format)
if typ == 'date':
return datetime.strptime(val, Date.value_format).date()
if typ == 'integer':
return xapian.sortable_unserialise(val)
return val
try:
return self._xodb_schema[name].value
except KeyError:
Expand Down
1 change: 0 additions & 1 deletion xodb/elements.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,6 @@ def _handle_location(self, element, parent):
return True

def _handle_nilsimsa(self, element, parent):
memo = self._memo
try:
val = (parent[element.from_field].value
.encode('translit/long')
Expand Down
93 changes: 2 additions & 91 deletions xodb/tools/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# OrderedDict is cargoed from SQLAlchemy,
from collections import OrderedDict

# LRUDict is cargoed from Idealist.org


Expand All @@ -17,96 +18,6 @@ def __get__(self, obj, cls):
return result


class OrderedDict(dict):
"""A dict that returns keys/values/items in the order they were added."""

def __init__(self, ____sequence=None, **kwargs):
self._list = []
if ____sequence is None:
if kwargs:
self.update(**kwargs)
else:
self.update(____sequence, **kwargs)

def clear(self):
self._list = []
dict.clear(self)

def copy(self):
return self.__copy__()

def __copy__(self):
return OrderedDict(self)

def sort(self, *arg, **kw):
self._list.sort(*arg, **kw)

def update(self, ____sequence=None, **kwargs):
if ____sequence is not None:
if hasattr(____sequence, 'keys'):
for key in ____sequence.keys():
self.__setitem__(key, ____sequence[key])
else:
for key, value in ____sequence:
self[key] = value
if kwargs:
self.update(kwargs)

def setdefault(self, key, value):
if key not in self:
self.__setitem__(key, value)
return value
else:
return self.__getitem__(key)

def __iter__(self):
return iter(self._list)

def values(self):
return [self[key] for key in self._list]

def itervalues(self):
return iter(self.values())

def keys(self):
return list(self._list)

def iterkeys(self):
return iter(self.keys())

def items(self):
return [(key, self[key]) for key in self.keys()]

def iteritems(self):
return iter(self.items())

def __setitem__(self, key, object):
if key not in self:
try:
self._list.append(key)
except AttributeError:
# work around Python pickle loads() with
# dict subclass (seems to ignore __setstate__?)
self._list = [key]
dict.__setitem__(self, key, object)

def __delitem__(self, key):
dict.__delitem__(self, key)
self._list.remove(key)

def pop(self, key, *default):
present = key in self
value = dict.pop(self, key, *default)
if present:
self._list.remove(key)
return value

def popitem(self):
item = dict.popitem(self)
self._list.remove(item[0])
return item


class LRUDict(OrderedDict):
"""
A simple data structure to provide item ordering based on usage for a
Expand Down