def where_from_query_question(cls, rp): where = [] query = rp.get('query', '').strip().lower() if not query: return where strict_queries = get_strict_query(query) if len(query.split(' ')) > 1 and not strict_queries: query = ','.join(['query:%s' % q for q in query.split(' ') if q.strip()]) if not query.split(','): return where for type_name, type_queries in strict_queries.iteritems(): same_type = [] for query in type_queries: if type_name == 'tags': same_type.append(or_(Questions.tags.any(func.lower(Tag.text) == query))) elif type_name == 'users': same_type.append(Questions.user_id == query) elif type_name == 'query': different_type = [cls.text.ilike('%' + query + '%'), cls.answers.any(Answers.text.ilike('%' + query + '%'))] same_type.append(or_(*different_type)) where.append(and_(*same_type)) return where
def user_where_from_query(rp): where = [] query = rp.get('query', '').strip().lower() if not query: return where strict_queries = get_strict_query(query) if len(query.split(' ')) > 1 and not strict_queries: query = ','.join(['query:%s' % q for q in query.split(' ') if q.strip()]) if not query.split(','): return where for type_name, type_queries in strict_queries.iteritems(): same_type = [] for query in type_queries: if type_name == 'tags': same_type.append(User.tags.any(func.lower(Tag.text) == query)) elif type_name == 'type': same_type.append(User.roles_rel.any(and_(RoleXUser.role_name == query, RoleXUser.is_primary == True))) elif type_name == 'location': same_type.append(User.state == query) elif type_name == 'technical' and len(type_queries) == 1: if query == 'true': same_type.append(User.is_technical == True) else: same_type.append(User.is_technical.op('IS NOT')(True)) elif type_name == 'companies': same_type.append(User.all_companies.any(func.lower(BaseCompany.name) == query)) elif type_name == 'query': different_type = [] for search_field in User.search_fields: if 'class' in search_field: if 'class' in query: query = query.replace('alchemistclass', '').replace('class', '').strip().split(' ')[0] try: different_type.append(BaseCompany.alchemistclass == int(query)) except: pass else: different_type.append(getattr(User, search_field).ilike('%' + query + '%')) for search_field in ['firstname', 'lastname', 'username', 'email', 'linkedin_email']: different_type.append(getattr(User, search_field).ilike(query + '%')) different_type.append((User.firstname + ' ' + User.lastname).ilike('%' + query + '%')) different_type.append(User.tags.any(Tag.text.ilike('%' + query + '%'))) different_type.append(User.all_companies.any(BaseCompany.name.ilike('%' + query + '%'))) for bool_field in User.boolean_fields: if rp.get(bool_field) or bool_field.split('_')[-1] in (query or ''): different_type.append(getattr(User, bool_field) == True) same_type.append(or_(*different_type)) where.append(and_(*same_type)) return where
def where_from_query(request): where = [] if hasattr(request, 'params'): rp = request.params query = rp.get('query', '').strip().lower() elif request.get('sessquery'): rp = request query = request.get('sessquery').strip().lower() else: query = '' if not query: return where strict_queries = get_strict_query(query) for type_name, type_queries in strict_queries.iteritems(): same_type = [] for query in type_queries: if type_name == 'tags': same_type.append(BaseCompany.tags.any(func.lower(Tag.text) == query)) elif type_name == 'type': same_type.append(BaseCompany.companytype == get_company_typestr(query)) elif type_name == 'class': same_type.append(BaseCompany.alchemistclass == int(query.strip())) elif type_name == 'round': same_type.append(BaseCompany.startup_lastraise == query) elif type_name == 'query': different_type = [] for search_field in BaseCompany.search_fields: if 'class' in search_field: if 'class' in query: query = query.replace('alchemistclass', '').replace('class', '').strip().split(' ')[0] try: different_type.append(BaseCompany.alchemistclass == int(query)) except: pass else: different_type.append(getattr(BaseCompany, search_field).ilike('%' + query + '%')) different_type.append(BaseCompany.tags.any(Tag.text.ilike('%' + query + '%'))) for bool_field in BaseCompany.boolean_fields: if rp.get(bool_field) or bool_field.split('_')[-1] in (query or ''): different_type.append(getattr(BaseCompany, bool_field) == True) same_type.append(or_(*different_type)) where.append(and_(*same_type)) return where