Fixed #593 -- Added 'search' DB-API lookup type, which does full-text index searches in MySQL
git-svn-id: http://code.djangoproject.com/svn/django/trunk@3073 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
142e59b462
commit
168429d597
|
@ -125,6 +125,9 @@ def get_limit_offset_sql(limit, offset=None):
|
||||||
def get_random_function_sql():
|
def get_random_function_sql():
|
||||||
return "RAND()"
|
return "RAND()"
|
||||||
|
|
||||||
|
def get_fulltext_search_sql(field_name):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def get_drop_foreignkey_sql():
|
def get_drop_foreignkey_sql():
|
||||||
return "DROP CONSTRAINT"
|
return "DROP CONSTRAINT"
|
||||||
|
|
||||||
|
|
|
@ -33,5 +33,6 @@ get_date_extract_sql = complain
|
||||||
get_date_trunc_sql = complain
|
get_date_trunc_sql = complain
|
||||||
get_limit_offset_sql = complain
|
get_limit_offset_sql = complain
|
||||||
get_random_function_sql = complain
|
get_random_function_sql = complain
|
||||||
|
get_fulltext_search_sql = complain
|
||||||
get_drop_foreignkey_sql = complain
|
get_drop_foreignkey_sql = complain
|
||||||
OPERATOR_MAPPING = {}
|
OPERATOR_MAPPING = {}
|
||||||
|
|
|
@ -152,6 +152,9 @@ def get_limit_offset_sql(limit, offset=None):
|
||||||
def get_random_function_sql():
|
def get_random_function_sql():
|
||||||
return "RAND()"
|
return "RAND()"
|
||||||
|
|
||||||
|
def get_fulltext_search_sql(field_name):
|
||||||
|
return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name
|
||||||
|
|
||||||
def get_drop_foreignkey_sql():
|
def get_drop_foreignkey_sql():
|
||||||
return "DROP FOREIGN KEY"
|
return "DROP FOREIGN KEY"
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,9 @@ def get_limit_offset_sql(limit, offset=None):
|
||||||
def get_random_function_sql():
|
def get_random_function_sql():
|
||||||
return "DBMS_RANDOM.RANDOM"
|
return "DBMS_RANDOM.RANDOM"
|
||||||
|
|
||||||
|
def get_fulltext_search_sql(field_name):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def get_drop_foreignkey_sql():
|
def get_drop_foreignkey_sql():
|
||||||
return "DROP FOREIGN KEY"
|
return "DROP FOREIGN KEY"
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,9 @@ def get_limit_offset_sql(limit, offset=None):
|
||||||
def get_random_function_sql():
|
def get_random_function_sql():
|
||||||
return "RANDOM()"
|
return "RANDOM()"
|
||||||
|
|
||||||
|
def get_fulltext_search_sql(field_name):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def get_drop_foreignkey_sql():
|
def get_drop_foreignkey_sql():
|
||||||
return "DROP CONSTRAINT"
|
return "DROP CONSTRAINT"
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,9 @@ def get_limit_offset_sql(limit, offset=None):
|
||||||
def get_random_function_sql():
|
def get_random_function_sql():
|
||||||
return "RANDOM()"
|
return "RANDOM()"
|
||||||
|
|
||||||
|
def get_fulltext_search_sql(field_name):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def get_drop_foreignkey_sql():
|
def get_drop_foreignkey_sql():
|
||||||
return "DROP CONSTRAINT"
|
return "DROP CONSTRAINT"
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,9 @@ def get_limit_offset_sql(limit, offset=None):
|
||||||
def get_random_function_sql():
|
def get_random_function_sql():
|
||||||
return "RANDOM()"
|
return "RANDOM()"
|
||||||
|
|
||||||
|
def get_fulltext_search_sql(field_name):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
def get_drop_foreignkey_sql():
|
def get_drop_foreignkey_sql():
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,7 @@ class Field(object):
|
||||||
|
|
||||||
def get_db_prep_lookup(self, lookup_type, value):
|
def get_db_prep_lookup(self, lookup_type, value):
|
||||||
"Returns field's value prepared for database lookup."
|
"Returns field's value prepared for database lookup."
|
||||||
if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'ne', 'year', 'month', 'day'):
|
if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'ne', 'year', 'month', 'day', 'search'):
|
||||||
return [value]
|
return [value]
|
||||||
elif lookup_type in ('range', 'in'):
|
elif lookup_type in ('range', 'in'):
|
||||||
return value
|
return value
|
||||||
|
|
|
@ -615,6 +615,8 @@ def get_where_clause(lookup_type, table_prefix, field_name, value):
|
||||||
return "%s = %%s" % backend.get_date_extract_sql(lookup_type, table_prefix + field_name)
|
return "%s = %%s" % backend.get_date_extract_sql(lookup_type, table_prefix + field_name)
|
||||||
elif lookup_type == 'isnull':
|
elif lookup_type == 'isnull':
|
||||||
return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or ''))
|
return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or ''))
|
||||||
|
elif lookup_type == 'search':
|
||||||
|
return backend.get_fulltext_search_sql(table_prefix + field_name)
|
||||||
raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type)
|
raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type)
|
||||||
|
|
||||||
def get_cached_row(klass, row, index_start):
|
def get_cached_row(klass, row, index_start):
|
||||||
|
|
|
@ -1035,6 +1035,15 @@ SQL equivalent::
|
||||||
|
|
||||||
SELECT ... WHERE pub_date IS NULL;
|
SELECT ... WHERE pub_date IS NULL;
|
||||||
|
|
||||||
|
search
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
A boolean full-text search, taking advantage of full-text indexing. This is
|
||||||
|
like ``contains`` but is significantly faster due to full-text indexing.
|
||||||
|
|
||||||
|
Note this is only available in MySQL and requires direct manipulation of the
|
||||||
|
database to add the full-text index.
|
||||||
|
|
||||||
Default lookups are exact
|
Default lookups are exact
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue