Hi Anthony, Sorry for pasting insufficient code.
Following is code from controllers/xyz.py def built_in_search(keywords): """This module will return True if opertor in built_in_search is used in keywords""" search_operators = ['=', '!=', '<', '>', '<=', '>=', 'starts with', 'contains', 'in', 'not in'] return any(operator in keywords for operator in search_operators) def _custom_search_query(user_company_locs, keywords, field_dicts): """This module will build search each keyword in keywords in predefined table attributes""" keys = keywords.strip() user_company_exist = False import time start_time = time.time() filters = [] print "\n Keywords", keys words = keys.split(' ') for field_name, db_table_attr in field_dicts.iteritems(): #check for company name if field_name == 'company_name': company = db(db.company.name.contains(keys)).select().first() if company is not None and company.id in user_company_locs: filters.append(db_table_attr == company.id) user_company_exist = True continue all_words_filter = [] for word in words: all_words_filter.append(db_table_attr.contains(word)) filters.append(reduce(lambda a, b: (a & b), all_words_filter)) print "Time required custom build query", time.time() - start_time return reduce(lambda a, b: a | b, filters), user_company_exist def controller_name(): #following variable contains a list of all company ids user_company_locs = get_user_company_ids() query = (db.company.id.belongs(user_company_locs)) status_query = valid_status_query #can't disclose it. #following dict it contains # { "id":db.company.id, # "name": db.company.name } field_dicts = { 'valid_table_attr_name' : valid_table_attr, . . } keywords = request.vars.keywords if keywords and not built_in_search(keywords): new_query, usr_company_exist = _custom_search_query( user_company_locs, keywords, field_dicts) #entered company_name exist in user_company_locs list then #display only single record only single. if usr_company_exist: query = new_query & status_query else: query &= status_query & new_query grid = SQLFORM.grid(query, create=allow_create, orderby=~db.valid_table_name.created_on, showbuttontext=False, csv=False, deletable=False, maxtextlengths=textlengths, searchable=True) I've printed query object in pdb. IF I search "XYZ" keyword then it shows correct count in pdb -> db(query).count() *But grid shows only 3 records* IF I search "XYZ Private" or "XYZ P" or any valid word after "XYZ" *then it also shows correct count in pdb as well as on grid*. Why is grid showing different records (count)? It is showing same record (count) on DAL or PDB. On Wed, Nov 19, 2014 at 7:47 PM, Anthony <abasta...@gmail.com> wrote: > Is this the exact code? I notice that the output of the call to > _custom_search_query gets assigned to the tuple (new_query, > user_company_exist), but (a) that function does not return a tuple, and (b) > you don't use new_query when calling the grid. > > Anthony > > > On Wednesday, November 19, 2014 6:16:19 AM UTC-5, Prasad Muley wrote: >> >> Hi All, >> >> I want to support multiple keywords search as well as web2py's >> built-in-search. >> >> I've written one module which will check if in_built_search is >> called or not. >> >> * If in_built_search isn't called then search keywords in >> custom_module* >> >> *def built_in_search(keywords):* >> * """This module will return True if opertor* >> * in built_in_search is used in keywords"""* >> * search_operators = ['=', '!=', '<', '>', '<=', '>=',* >> * 'starts with', 'contains', 'in', 'not in']* >> * return any(operator in keywords for operator in search_operators)* >> >> >> >> Code of SQLFORM.GRID in *controllers/default.py* >> >> >> keywords = request.vars.keywords >> >> if keywords and not built_in_search(keywords): >> >> new_query, usr_company_exist = _custom_search_query(keywords, >> field_dicts) >> >> #field_dicts contains field_name and table attribute. >> >> >> >> grid = SQLFORM.grid(query, create=allow_create, >> orderby=~db.table_name.created_on, >> showbuttontext=False, csv=False, >> deletable=False, >> maxtextlengths=textlengths, >> searchable=True) >> >> >> Here I am building query according to *request.vars.keywords* >> >> I've written a custom module to search keywords on *selected attributes* >> as : >> It also searches on reference key (company_name) >> >> >> >> *def _custom_search_query(keywords, field_dicts):* >> * """This module will build search each keyword in keywords* >> * in predefined table attributes"""* >> >> * keys = keywords.strip()* >> * user_company_exist = False* >> * import time* >> * start_time = time.time()* >> * filters = []* >> * print "\n Keywords", keys* >> * words = keys.split(' ')* >> >> * for field_name, db_table_attr in field_dicts.iteritems():* >> >> * #check for company name* >> * if field_name == 'company_name':* >> * company = >> db(db.company.name.contains(keys)).select().first()* >> * if company is not None:* >> * filters.append(db_table_attr == company.id >> <http://company.id>)* >> * continue* >> * all_words_filter = []* >> >> * for word in words:* >> * all_words_filter.append(db_table_attr.contains(word))* >> * filters.append(reduce(lambda a, b: (a & b), all_words_filter))* >> >> * return reduce(lambda a, b: a | b, filters)* >> >> >> >> If I tried to search '*XYZ'* (First_name_of_company) in search box, then *it >> gives me* *incorrect records.* >> Actually It shows only 3 records. >> >> *I've printed count of query in pdb.* >> >> >> *(Pdb) db(query).count()139L* >> *It is showing exact count as in database.* >> >> >> If I tried to search '*XYZ Private' *(first and middle name of company) >> in search box, then *It gives me correct records.* >> >> *I've also printed query count in pdb.(Pdb) db(query).count()139L* >> It also shows exact count as in database. >> >> Does any one know why is it giving different results? >> >> >> -- > 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 a topic in the > Google Groups "web2py-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/web2py/jPPj8zbV7k4/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- Thanks and Regards Prasad M. Muley Programmer at One Delta Synergies Pvt Ltd. | PICT 2013 “Pretty much everything on the web uses those two things: *C* and *UNIX*,” - Dennis Ritchie *http://www.cs.bell-labs.com/who/dmr/* <http://www.cs.bell-labs.com/who/dmr/> -- 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 web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.