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.

Reply via email to