mirror of
https://github.com/Hopiu/xapian-haystack.git
synced 2026-03-16 22:20:31 +00:00
Added sorting to build_schema method, added an always included id field, and updated tests for same.
This commit is contained in:
parent
687899d3bb
commit
fdc84db098
2 changed files with 32 additions and 28 deletions
|
|
@ -408,22 +408,23 @@ class XapianSearchBackendTestCase(TestCase):
|
|||
def test_build_schema(self):
|
||||
(content_field_name, fields) = self.backend.build_schema(self.site.all_searchfields())
|
||||
self.assertEqual(content_field_name, 'text')
|
||||
self.assertEqual(len(fields), 14)
|
||||
self.assertEqual(len(fields), 15)
|
||||
self.assertEqual(fields, [
|
||||
{'column': 0, 'type': 'text', 'field_name': 'name', 'multi_valued': 'false'},
|
||||
{'column': 1, 'type': 'text', 'field_name': 'tags', 'multi_valued': 'true'},
|
||||
{'column': 2, 'type': 'text', 'field_name': 'keys', 'multi_valued': 'true'},
|
||||
{'column': 3, 'type': 'text', 'field_name': 'text', 'multi_valued': 'false'},
|
||||
{'column': 4, 'type': 'float', 'field_name': 'popularity', 'multi_valued': 'false'},
|
||||
{'column': 5, 'type': 'text', 'field_name': 'sites', 'multi_valued': 'true'},
|
||||
{'column': 6, 'type': 'long', 'field_name': 'value', 'multi_valued': 'false'},
|
||||
{'column': 7, 'type': 'text', 'field_name': 'url', 'multi_valued': 'false'},
|
||||
{'column': 8, 'type': 'boolean', 'field_name': 'flag', 'multi_valued': 'false'},
|
||||
{'column': 9, 'type': 'text', 'field_name': 'titles', 'multi_valued': 'true'},
|
||||
{'column': 10, 'type': 'date', 'field_name': 'exp_date', 'multi_valued': 'false'},
|
||||
{'column': 11, 'type': 'text', 'field_name': 'name_exact', 'multi_valued': 'false'},
|
||||
{'column': 12, 'type': 'date', 'field_name': 'pub_date', 'multi_valued': 'false'},
|
||||
{'column': 13, 'type': 'text', 'field_name': 'empty', 'multi_valued': 'false'}
|
||||
{'column': 0, 'type': 'text', 'field_name': 'id', 'multi_valued': 'false'},
|
||||
{'column': 1, 'type': 'text', 'field_name': 'empty', 'multi_valued': 'false'},
|
||||
{'column': 2, 'type': 'date', 'field_name': 'exp_date', 'multi_valued': 'false'},
|
||||
{'column': 3, 'type': 'boolean', 'field_name': 'flag', 'multi_valued': 'false'},
|
||||
{'column': 4, 'type': 'text', 'field_name': 'keys', 'multi_valued': 'true'},
|
||||
{'column': 5, 'type': 'text', 'field_name': 'name', 'multi_valued': 'false'},
|
||||
{'column': 6, 'type': 'text', 'field_name': 'name_exact', 'multi_valued': 'false'},
|
||||
{'column': 7, 'type': 'float', 'field_name': 'popularity', 'multi_valued': 'false'},
|
||||
{'column': 8, 'type': 'date', 'field_name': 'pub_date', 'multi_valued': 'false'},
|
||||
{'column': 9, 'type': 'text', 'field_name': 'sites', 'multi_valued': 'true'},
|
||||
{'column': 10, 'type': 'text', 'field_name': 'tags', 'multi_valued': 'true'},
|
||||
{'column': 11, 'type': 'text', 'field_name': 'text', 'multi_valued': 'false'},
|
||||
{'column': 12, 'type': 'text', 'field_name': 'titles', 'multi_valued': 'true'},
|
||||
{'column': 13, 'type': 'text', 'field_name': 'url', 'multi_valued': 'false'},
|
||||
{'column': 14, 'type': 'long', 'field_name': 'value', 'multi_valued': 'false'}
|
||||
])
|
||||
|
||||
def test_parse_query(self):
|
||||
|
|
@ -436,11 +437,11 @@ class XapianSearchBackendTestCase(TestCase):
|
|||
else:
|
||||
self.assertEqual(str(self.backend.parse_query('name:da*')), 'Xapian::Query((XNAMEdavid1:(pos=1) OR XNAMEdavid2:(pos=1) OR XNAMEdavid3:(pos=1)))')
|
||||
|
||||
self.assertEqual(str(self.backend.parse_query('name:david1..david2')), 'Xapian::Query(VALUE_RANGE 0 david1 david2)')
|
||||
self.assertEqual(str(self.backend.parse_query('value:0..10')), 'Xapian::Query(VALUE_RANGE 6 000000000000 000000000010)')
|
||||
self.assertEqual(str(self.backend.parse_query('value:..10')), 'Xapian::Query(VALUE_RANGE 6 %012d 000000000010)' % (-sys.maxint - 1))
|
||||
self.assertEqual(str(self.backend.parse_query('value:10..*')), 'Xapian::Query(VALUE_RANGE 6 000000000010 %012d)' % sys.maxint)
|
||||
self.assertEqual(str(self.backend.parse_query('popularity:25.5..100.0')), 'Xapian::Query(VALUE_RANGE 4 \xb2` \xba@)')
|
||||
self.assertEqual(str(self.backend.parse_query('name:david1..david2')), 'Xapian::Query(VALUE_RANGE 5 david1 david2)')
|
||||
self.assertEqual(str(self.backend.parse_query('value:0..10')), 'Xapian::Query(VALUE_RANGE 14 000000000000 000000000010)')
|
||||
self.assertEqual(str(self.backend.parse_query('value:..10')), 'Xapian::Query(VALUE_RANGE 14 %012d 000000000010)' % (-sys.maxint - 1))
|
||||
self.assertEqual(str(self.backend.parse_query('value:10..*')), 'Xapian::Query(VALUE_RANGE 14 000000000010 %012d)' % sys.maxint)
|
||||
self.assertEqual(str(self.backend.parse_query('popularity:25.5..100.0')), 'Xapian::Query(VALUE_RANGE 7 \xb2` \xba@)')
|
||||
|
||||
|
||||
class LiveXapianMockSearchIndex(indexes.SearchIndex):
|
||||
|
|
@ -479,19 +480,19 @@ class LiveXapianSearchQueryTestCase(TestCase):
|
|||
|
||||
def test_build_query_gt(self):
|
||||
self.sq.add_filter(SQ(name__gt='m'))
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query((<alldocuments> AND_NOT VALUE_RANGE 3 a m))')
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query((<alldocuments> AND_NOT VALUE_RANGE 2 a m))')
|
||||
|
||||
def test_build_query_gte(self):
|
||||
self.sq.add_filter(SQ(name__gte='m'))
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query(VALUE_RANGE 3 m zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)')
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query(VALUE_RANGE 2 m zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz)')
|
||||
|
||||
def test_build_query_lt(self):
|
||||
self.sq.add_filter(SQ(name__lt='m'))
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query((<alldocuments> AND_NOT VALUE_RANGE 3 m zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz))')
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query((<alldocuments> AND_NOT VALUE_RANGE 2 m zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz))')
|
||||
|
||||
def test_build_query_lte(self):
|
||||
self.sq.add_filter(SQ(name__lte='m'))
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query(VALUE_RANGE 3 a m)')
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query(VALUE_RANGE 2 a m)')
|
||||
|
||||
def test_build_query_multiple_filter_types(self):
|
||||
self.sq.add_filter(SQ(content='why'))
|
||||
|
|
@ -500,7 +501,7 @@ class LiveXapianSearchQueryTestCase(TestCase):
|
|||
self.sq.add_filter(SQ(created__lt=datetime.datetime(2009, 2, 12, 12, 13, 0)))
|
||||
self.sq.add_filter(SQ(title__gte='B'))
|
||||
self.sq.add_filter(SQ(id__in=[1, 2, 3]))
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query(((Zwhi OR why) AND VALUE_RANGE 2 00010101000000 20090210015900 AND (<alldocuments> AND_NOT VALUE_RANGE 3 a david) AND (<alldocuments> AND_NOT VALUE_RANGE 4 20090212121300 99990101000000) AND VALUE_RANGE 1 b zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz AND (Q1 OR Q2 OR Q3)))')
|
||||
self.assertEqual(str(self.sq.build_query()), u'Xapian::Query(((Zwhi OR why) AND VALUE_RANGE 3 00010101000000 20090210015900 AND (<alldocuments> AND_NOT VALUE_RANGE 2 a david) AND (<alldocuments> AND_NOT VALUE_RANGE 1 20090212121300 99990101000000) AND VALUE_RANGE 5 b zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz AND (Q1 OR Q2 OR Q3)))')
|
||||
|
||||
def test_log_query(self):
|
||||
backends.reset_search_queries()
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ from django.core.exceptions import ImproperlyConfigured
|
|||
from django.utils.encoding import smart_unicode, force_unicode
|
||||
|
||||
from haystack.backends import BaseSearchBackend, BaseSearchQuery, SearchNode, log_query
|
||||
from haystack.constants import ID, DJANGO_CT, DJANGO_ID
|
||||
from haystack.exceptions import HaystackError, MissingDependency, MoreLikeThisError
|
||||
from haystack.fields import DateField, DateTimeField, IntegerField, FloatField, BooleanField, MultiValueField
|
||||
from haystack.models import SearchResult
|
||||
|
|
@ -597,10 +598,12 @@ class SearchBackend(BaseSearchBackend):
|
|||
an indexed meta-data.
|
||||
"""
|
||||
content_field_name = ''
|
||||
schema_fields = []
|
||||
column = 0
|
||||
schema_fields = [
|
||||
{'field_name': ID, 'type': 'text', 'multi_valued': 'false', 'column': 0},
|
||||
]
|
||||
column = len(schema_fields)
|
||||
|
||||
for field_name, field_class in fields.items():
|
||||
for field_name, field_class in sorted(fields.items(), key=lambda n: n[0]):
|
||||
if field_class.document is True:
|
||||
content_field_name = field_class.index_fieldname
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue