Full text support in peewee
Adds support for full text search in peewee with the creation of two new field types: `FullIndexedCharField` and `FullIndexedTextField`. Note that this change depends upon https://github.com/zzzeek/sqlalchemy/pull/339 [Delivers #137453279] [Delivers #137453317]
This commit is contained in:
parent
048f932094
commit
d89c79b92d
4 changed files with 105 additions and 2 deletions
|
@ -2,7 +2,8 @@ import base64
|
|||
import resumablehashlib
|
||||
import json
|
||||
|
||||
from peewee import TextField
|
||||
from peewee import TextField, CharField, Clause
|
||||
from data.text import prefix_search
|
||||
|
||||
|
||||
class _ResumableSHAField(TextField):
|
||||
|
@ -64,3 +65,44 @@ class Base64BinaryField(TextField):
|
|||
if value is None:
|
||||
return None
|
||||
return base64.b64decode(value)
|
||||
|
||||
|
||||
def _add_fulltext(field_class):
|
||||
""" Adds support for full text indexing and lookup to the given field class. """
|
||||
class indexed_class(field_class):
|
||||
# Marker used by SQLAlchemy translation layer to add the proper index for full text searching.
|
||||
__fulltext__ = True
|
||||
|
||||
def __init__(self, match_function, *args, **kwargs):
|
||||
field_class.__init__(self, *args, **kwargs)
|
||||
self.match_function = match_function
|
||||
|
||||
def match(self, query):
|
||||
return self.match_function(self, query)
|
||||
|
||||
def match_prefix(self, query):
|
||||
return prefix_search(self, query)
|
||||
|
||||
def __mod__(self, _):
|
||||
raise Exception('Unsafe operation: Use `match` or `match_prefix`')
|
||||
|
||||
def __pow__(self, _):
|
||||
raise Exception('Unsafe operation: Use `match` or `match_prefix`')
|
||||
|
||||
def __contains__(self, _):
|
||||
raise Exception('Unsafe operation: Use `match` or `match_prefix`')
|
||||
|
||||
def contains(self, _):
|
||||
raise Exception('Unsafe operation: Use `match` or `match_prefix`')
|
||||
|
||||
def startswith(self, _):
|
||||
raise Exception('Unsafe operation: Use `match` or `match_prefix`')
|
||||
|
||||
def endswith(self, _):
|
||||
raise Exception('Unsafe operation: Use `match` or `match_prefix`')
|
||||
|
||||
return indexed_class
|
||||
|
||||
|
||||
FullIndexedCharField = _add_fulltext(CharField)
|
||||
FullIndexedTextField = _add_fulltext(TextField)
|
||||
|
|
Reference in a new issue