thanks, this is very helpful. On Friday, March 1, 2013 3:19:22 PM UTC+7, Mandar Vaze wrote: > > 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 >
-- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- 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/d/optout.

