replaced text_score
attribute to get_text_score
method
Signed-off-by: Wilson Júnior <wilsonpjunior@gmail.com>
This commit is contained in:
parent
d27e1eee25
commit
74a89223c0
@ -143,13 +143,6 @@ class Document(BaseDocument):
|
|||||||
return property(fget, fset)
|
return property(fget, fset)
|
||||||
pk = pk()
|
pk = pk()
|
||||||
|
|
||||||
@property
|
|
||||||
def text_score(self):
|
|
||||||
"""
|
|
||||||
Used for text searchs
|
|
||||||
"""
|
|
||||||
return self._data.get('text_score')
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _get_db(cls):
|
def _get_db(cls):
|
||||||
"""Some Model using other db_alias"""
|
"""Some Model using other db_alias"""
|
||||||
|
@ -6,6 +6,7 @@ import operator
|
|||||||
import pprint
|
import pprint
|
||||||
import re
|
import re
|
||||||
import warnings
|
import warnings
|
||||||
|
import types
|
||||||
|
|
||||||
from bson import SON
|
from bson import SON
|
||||||
from bson.code import Code
|
from bson.code import Code
|
||||||
@ -37,6 +38,8 @@ PULL = 4
|
|||||||
|
|
||||||
RE_TYPE = type(re.compile(''))
|
RE_TYPE = type(re.compile(''))
|
||||||
|
|
||||||
|
def get_text_score(doc):
|
||||||
|
return doc._data.get('_text_score')
|
||||||
|
|
||||||
class BaseQuerySet(object):
|
class BaseQuerySet(object):
|
||||||
|
|
||||||
@ -158,8 +161,14 @@ class BaseQuerySet(object):
|
|||||||
|
|
||||||
if queryset._as_pymongo:
|
if queryset._as_pymongo:
|
||||||
return queryset._get_as_pymongo(queryset._cursor[key])
|
return queryset._get_as_pymongo(queryset._cursor[key])
|
||||||
return queryset._document._from_son(queryset._cursor[key],
|
doc = queryset._document._from_son(queryset._cursor[key],
|
||||||
_auto_dereference=self._auto_dereference, only_fields=self.only_fields)
|
_auto_dereference=self._auto_dereference, only_fields=self.only_fields)
|
||||||
|
|
||||||
|
if self._include_text_scores:
|
||||||
|
doc.get_text_score = types.MethodType(get_text_score, doc)
|
||||||
|
|
||||||
|
return doc
|
||||||
|
|
||||||
raise AttributeError
|
raise AttributeError
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
@ -192,7 +201,7 @@ class BaseQuerySet(object):
|
|||||||
"""
|
"""
|
||||||
return self.__call__(*q_objs, **query)
|
return self.__call__(*q_objs, **query)
|
||||||
|
|
||||||
def search_text(self, text, language=None, include_text_scores=False):
|
def search_text(self, text, language=None, include_text_scores=True):
|
||||||
"""
|
"""
|
||||||
Start a text search, using text indexes.
|
Start a text search, using text indexes.
|
||||||
Require: MongoDB server version 2.6+.
|
Require: MongoDB server version 2.6+.
|
||||||
@ -202,7 +211,7 @@ class BaseQuerySet(object):
|
|||||||
If not specified, the search uses the default language of the index.
|
If not specified, the search uses the default language of the index.
|
||||||
For supported languages, see `Text Search Languages <http://docs.mongodb.org/manual/reference/text-search-languages/#text-search-languages>`.
|
For supported languages, see `Text Search Languages <http://docs.mongodb.org/manual/reference/text-search-languages/#text-search-languages>`.
|
||||||
|
|
||||||
:param include_text_scores: If True, automaticaly add a text_score attribute to Document.
|
:param include_text_scores: If True, automatically add a get_text_score method to Document.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
queryset = self.clone()
|
queryset = self.clone()
|
||||||
@ -1341,6 +1350,10 @@ class BaseQuerySet(object):
|
|||||||
return self._get_as_pymongo(raw_doc)
|
return self._get_as_pymongo(raw_doc)
|
||||||
doc = self._document._from_son(raw_doc,
|
doc = self._document._from_son(raw_doc,
|
||||||
_auto_dereference=self._auto_dereference, only_fields=self.only_fields)
|
_auto_dereference=self._auto_dereference, only_fields=self.only_fields)
|
||||||
|
|
||||||
|
if self._include_text_scores:
|
||||||
|
doc.get_text_score = types.MethodType(get_text_score, doc)
|
||||||
|
|
||||||
if self._scalar:
|
if self._scalar:
|
||||||
return self._get_scalar(doc)
|
return self._get_scalar(doc)
|
||||||
|
|
||||||
@ -1380,7 +1393,7 @@ class BaseQuerySet(object):
|
|||||||
if 'fields' not in cursor_args:
|
if 'fields' not in cursor_args:
|
||||||
cursor_args['fields'] = {}
|
cursor_args['fields'] = {}
|
||||||
|
|
||||||
cursor_args['fields']['text_score'] = {'$meta': "textScore"}
|
cursor_args['fields']['_text_score'] = {'$meta': "textScore"}
|
||||||
|
|
||||||
return cursor_args
|
return cursor_args
|
||||||
|
|
||||||
@ -1597,7 +1610,7 @@ class BaseQuerySet(object):
|
|||||||
if key == '$text_score':
|
if key == '$text_score':
|
||||||
# automatically set to include text scores
|
# automatically set to include text scores
|
||||||
self._include_text_scores = True
|
self._include_text_scores = True
|
||||||
key_list.append(('text_score', {'$meta': "textScore"}))
|
key_list.append(('_text_score', {'$meta': "textScore"}))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
direction = pymongo.ASCENDING
|
direction = pymongo.ASCENDING
|
||||||
|
@ -2783,13 +2783,12 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.assertTrue('dilma' in new.content)
|
self.assertTrue('dilma' in new.content)
|
||||||
self.assertTrue('planejamento' in new.title)
|
self.assertTrue('planejamento' in new.title)
|
||||||
|
|
||||||
query = News.objects.search_text(
|
query = News.objects.search_text("candidata")
|
||||||
"candidata", include_text_scores=True)
|
|
||||||
|
|
||||||
self.assertTrue(query._include_text_scores)
|
self.assertTrue(query._include_text_scores)
|
||||||
new = query.first()
|
new = query.first()
|
||||||
|
|
||||||
self.assertTrue(isinstance(new.text_score, float))
|
self.assertTrue(isinstance(new.get_text_score(), float))
|
||||||
|
|
||||||
# count
|
# count
|
||||||
query = News.objects.search_text('brasil').order_by('$text_score')
|
query = News.objects.search_text('brasil').order_by('$text_score')
|
||||||
@ -2799,9 +2798,9 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.assertEqual(query._query, {'$text': {'$search': 'brasil'}})
|
self.assertEqual(query._query, {'$text': {'$search': 'brasil'}})
|
||||||
cursor_args = query._cursor_args
|
cursor_args = query._cursor_args
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
cursor_args['fields'], {'text_score': {'$meta': 'textScore'}})
|
cursor_args['fields'], {'_text_score': {'$meta': 'textScore'}})
|
||||||
|
|
||||||
text_scores = [i.text_score for i in query]
|
text_scores = [i.get_text_score() for i in query]
|
||||||
self.assertEqual(len(text_scores), 3)
|
self.assertEqual(len(text_scores), 3)
|
||||||
|
|
||||||
self.assertTrue(text_scores[0] > text_scores[1])
|
self.assertTrue(text_scores[0] > text_scores[1])
|
||||||
@ -2811,7 +2810,7 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
# get item
|
# get item
|
||||||
item = News.objects.search_text(
|
item = News.objects.search_text(
|
||||||
'brasil').order_by('$text_score').first()
|
'brasil').order_by('$text_score').first()
|
||||||
self.assertEqual(item.text_score, max_text_score)
|
self.assertEqual(item.get_text_score(), max_text_score)
|
||||||
|
|
||||||
@skip_older_mongodb
|
@skip_older_mongodb
|
||||||
def test_distinct_handles_references_to_alias(self):
|
def test_distinct_handles_references_to_alias(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user