I have this table

db.define_table('t',
    Field('a', type='string'),
    Field('b', type='string'),
    )

db.t.insert(a='US', b='Washington')
db.t.insert(a='US', b='Rochester')
db.t.insert(a='US', b='Los Angeles')
db.t.insert(a='US', b='Minneapolis')

Now I want to search the items in a grid with a custom search box. I would 
like to input in the search box the name of the fields and the value I am 
searching for in this way:

a:s b:och b:er

Meaning: find all the record where field a contains "s" and field b 
contains 'och' and field b contains 'er'

Copying from previous posts of this group, I have now this:

default.py
def search_form(self,url): 
    form = FORM('', 
      INPUT(_name='keywords', _value=request.get_vars.keywords, 
        _style='width:200px;', 
        _id='keywords'), 
        INPUT(_type='submit',_value=T('Search')), 
        INPUT(_type='submit',_value=T('Clear'), 
        _onclick="jQuery('#keywords').val('');"), 
        _method="GET",_action=url) 
    return form 

def search_query(search_text): 
    words= search_text.split(' ') if search_text else [] 
    query = db.t.id<0
    queries=[]
    queries.append(db.t.id>0)
    for word in words: 
        key,value=word.split(':') if ':' in word else ['',word]
        if key=='a': 
            queries.append(db.t.a.contains(value))
        elif key=='b':
            queries.append(db.t.b.contains(value))
        else:
            queries.append(db.t.a.contains(value)|db.t.b.contains(value))
    if len(queries) > 0:
        query = reduce(lambda a,b:(a&b),queries)
    return query

def index():
    search_text=request.get_vars.keywords 
    query=search_query(search_text) 
    fields=[db.t.a, db.t.b]
    table=SQLFORM.grid(query, search_widget=search_form, fields=fields) 
    return locals()

index.html
{{extend 'layout.html'}}
{{=table}}

Now, if in the search box I type 

a:s
The grid is empty and the answer is: *No records found*
the query shown is : ((t.id > 0) AND (t.a LIKE '%s%'))

a:s a:s
The grid returns all the record of US correctly but it writes* **Invalid 
query* above the grid
the query shown is : (((t.id > 0) AND (t.a LIKE '%s%')) AND (t.a LIKE 
'%s%'))

a:s b:e
same as above, the grid returns all the record correctly but it writes *Invalid 
query* above the grid
the query shown is : (((t.id > 0) AND (t.a LIKE '%s%')) AND (t.b LIKE 
'%e%'))

What am I doing wrong?

-- 



Reply via email to