From a9a281418f82fb94d7cf018f826d5f5899b490b4 Mon Sep 17 00:00:00 2001 From: Michel Pelletier Date: Mon, 17 Jun 2013 22:14:04 -0700 Subject: [PATCH 1/3] If atts name has a value slot, use it instead of inflating the schema. --- xodb/database.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/xodb/database.py b/xodb/database.py index d06b7a8..93746db 100644 --- a/xodb/database.py +++ b/xodb/database.py @@ -1,6 +1,7 @@ import time import string import logging +import uuid from uuid import uuid4 from collections import namedtuple, OrderedDict from contextlib import contextmanager @@ -15,7 +16,7 @@ from xapian import QueryParser, DocNotFoundError from . import snowball -from .elements import Schema, String, Integer, Float, Array +from .elements import Schema, String, Integer, Array from .exc import ValidationError, PrefixError from .tools import LRUDict, lazy_property @@ -92,7 +93,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): @@ -127,6 +128,9 @@ def _xodb_schema(self): return _lookup_schema(typ).from_flat(data) def __getattr__(self, name): + slot = self._xodb_db.values.get(name) + if slot: + return self._xodb_document.get_value(slot) try: return self._xodb_schema[name].value except KeyError: From 0e0c126a45d040e3b14ac39640189de42fe8c694 Mon Sep 17 00:00:00 2001 From: Michel Pelletier Date: Mon, 17 Jun 2013 22:35:36 -0700 Subject: [PATCH 2/3] Handle datetimes. --- xodb/database.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/xodb/database.py b/xodb/database.py index 93746db..e5aa7ee 100644 --- a/xodb/database.py +++ b/xodb/database.py @@ -5,6 +5,7 @@ from uuid import uuid4 from collections import namedtuple, OrderedDict from contextlib import contextmanager +from datetime import datetime, date import xapian import nilsimsa @@ -16,7 +17,7 @@ from xapian import QueryParser, DocNotFoundError from . import snowball -from .elements import Schema, String, Integer, Array +from .elements import Schema, String, Integer, Array, DateTime, Date from .exc import ValidationError, PrefixError from .tools import LRUDict, lazy_property @@ -130,7 +131,15 @@ def _xodb_schema(self): def __getattr__(self, name): slot = self._xodb_db.values.get(name) if slot: - return self._xodb_document.get_value(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: From 0dfe7898208779187aa0426dbdbeae19f3d1510e Mon Sep 17 00:00:00 2001 From: Michel Pelletier Date: Tue, 18 Jun 2013 10:38:57 -0700 Subject: [PATCH 3/3] Removed old ordereddict. --- tests/test_queries.py | 2 +- xodb/elements.py | 1 - xodb/tools/__init__.py | 93 +----------------------------------------- 3 files changed, 3 insertions(+), 93 deletions(-) diff --git a/tests/test_queries.py b/tests/test_queries.py index 17ad08a..d15b592 100644 --- a/tests/test_queries.py +++ b/tests/test_queries.py @@ -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) diff --git a/xodb/elements.py b/xodb/elements.py index 4d8a8ce..ed75a7f 100644 --- a/xodb/elements.py +++ b/xodb/elements.py @@ -283,7 +283,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') diff --git a/xodb/tools/__init__.py b/xodb/tools/__init__.py index 2976d2c..145d127 100644 --- a/xodb/tools/__init__.py +++ b/xodb/tools/__init__.py @@ -1,4 +1,5 @@ -# OrderedDict is cargoed from SQLAlchemy, +from collections import OrderedDict + # LRUDict is cargoed from Idealist.org @@ -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