It may not be what you want but have you explored our full text search support through the use of the match operator?
On May 10, 2009, at 6:13 AM, Nicholas Dudfield <[email protected]> wrote: > > Greetings, > > I have been using SQLA for a few months. > > For admin CRUD index pages I have been using a naive search_keywords > function as > seen at end of message. > > Instead of using a primitive shlex.split, which incidentally is not > unicode > friendly, and one crude search_type (AND|OR) I'd like to use something > that will > lex/parse a search string and build the queries. > > eg. > ((x or z or y) and q) or not "h m" > > I imagine this would be a fairly common requirement however I can't > seem > to find > any implementation anywhere. > > I used google code search with the query "pyparsing sqlalchemy > lang:python" > however found no useful results. > > Before I set off attempting to learn about lexing/[py]parsing I was > wondering if > any one has some code like this laying about underneath their bed. > > Cheers. > > === > === > === > === > ==================================================================== > = > = > === > === > === > === > ==================================================================== > > ensure_list = lambda l: l if isinstance(l, list) else [l] > > def shlex_split(line): > """ shlex.split does not handle unicode properly so must be > codecd """ > if isinstance(line, unicode): > line = line.encode('utf-8') > return [ w.strip().decode('utf-8') for w in shlex.split(line) ] > > def like_escape(s): > return ( s.replace('\\', '\\\\') > .replace('%', '\\%') > .replace('_', '\\_') ) > > def search_keywords(q, model, key_words='', fields=[], > search_type='and', > default_fields=[], **kw): > > if not key_words: > return q > > # Escape the search string > # TODO: this should be done by formencode validators > if isinstance(key_words, basestring): > key_words = shlex_split(key_words) > > # Space delimited keyword search > key_words = ['%'+ like_escape(w) +'%' for w in key_words] > > # Make sure fields is a list and if none specified use default > fields = ensure_list(fields) if fields else default_fields # TODO > > # WHERE ($X OR $Y) AND|OR ($Z OR $Q) ... > search_type = and_ if search_type == 'and' else or_ > > if key_words: > q = q.filter ( > search_type ( * ( > or_( *( getattr(model, field).like(key_word, > escape=r'\\') > for field in fields ) ) > for key_word in key_words > ) > ) > ) > > return q > > === > === > === > === > ==================================================================== > = > = > === > === > === > === > ==================================================================== > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
