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.

Reply via email to