Hi,
As you all know, SQLFORM.grid search does not support searching for
multiple words - it throws an error "Invalid Query"
Searching for multiple words may be a common requirement.
I looked thru various older posting on this group, but none worked for me
AS IS (Possiblly because they were old - it worked with whatever was
current version of web2py at the time of original post) This one came the
closest : https://groups.google.com/forum/?fromgroups=#!topic/web2py
/9_1ECdKHKUo
Here is the version that worked for me: (web2py Version 2.3.2 (2012-12-17
15:03:30) stable)
#Referred to the web2py implementation of search (gluon/sqlhtml.py:def
grid())
#Modified to support multiple words
def search_query(fields, keywords):
if isinstance(keywords, (tuple, list)):
keywords = keywords[0]
request.vars.keywords = keywords
key = keywords.strip()
if key and not '"' in key and not "'" in key:
SEARCHABLE_TYPES = ('string', 'text', 'list:string')
words = key.split(' ') if key else []
filters = []
for field in fields:
if field.type in SEARCHABLE_TYPES:
all_words_filters = []
for word in words:
all_words_filters.append(field.contains(word))
filters.append(reduce(lambda a, b: (a & b),all_words_filters
))
parts = filters
else:
parts = None
if parts:
return reduce(lambda a, b: a | b, parts)
else:
return None
Why "&" in the first reduce ? Because if I use "|" then search results are
too wide. e.g. if I typed "web2py is great" - then using "|" would return
all the matches containing the word "is" even if "web2py" and "great" are
missing.
Off course using "&" isn't fool proof either since it will match a record
having text "web2py is not great" as well (since all three words are
present)
One big change from what previous posts having been saying is that I did
NOT override the search widget. Search widgets works well as is.
Only difference is that I assigned the above function to "searchable"
parameter when calling the SQLFORM.grid like
grid = SQLFORM.grid(query,create=True, searchable=search_query) #Use other
params as required
I came to realize this after I looked at web2py code (gluon/sqlhtml.py)
where if "searchable" is callable - then it is called. I somehow used to
think that it is a boolean (True/False)
I hope this helps someone
-Mandar
--
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.