Hard to say what's going on. I would suggest looking at db._timings (which is available in response.toolbar()) after running each version of that query on the grid. db._timings will show the exact SQL that was executed to get the count and then to return the actual records. Perhaps that will provide a clue.
Anthony On Wednesday, November 19, 2014 11:43:45 AM UTC-5, Prasad Muley wrote: > > 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.