def count_fulltext(search_terms, actif = True, bloque = False): """ Compter les anciens trouvés par la recherche fulltext :param str search_terms: Termes utilisés pour la recherche :param bool actif: True (default) = Chercher uniquement les actifs False = Chercher uniquement les inactifs None = Chercher TOUS les anciens :param bool bloque: True = Chercher uniquement les bloqués False (default) = Chercher uniquement les autres None = Chercher tous les anciens :return int: le nombre d'anciens qui satisfont les termes de recherche """ sel = select([func.count(__ancien.c.id_ancien.distinct())]).where("fulltext @@ to_tsquery('french', :input_str)") sel = sel.where(__ancien.c.nouveau == False) if actif is not None: sel = sel.where(__ancien.c.actif == actif) if bloque is not None: sel = sel.where(__ancien.c.bloque == bloque) res = engine.execute(sel, input_str=helper.prepare_for_fulltext(search_terms)).first()[0] return res
def fulltext_search(search_terms, offset = 0, limit =0, actif = True, bloque = False): """ Recherche un ancien dans l'annuaire par fulltext search :param str search_terms: Termes utilisés pour la recherche :param int offset: démarrer la requête au rang X :param int limit: prendre Y résultats :param bool actif: True (default) = Chercher uniquement les actifs False = Chercher uniquement les inactifs None = Chercher TOUS les anciens :param bool bloque: True = Chercher uniquement les bloqués False (default) = Chercher uniquement les autres None = Chercher tous les anciens :return: """ aaa = __asso_ancien_adresse from_obj = __ancien from_obj = from_obj.outerjoin( aaa, and_(__ancien.c.id_ancien == aaa.c.id_ancien, aaa.c.actif == True) ).outerjoin( __adresse, aaa.c.id_adresse == __adresse.c.id_adresse ).outerjoin( __ville, __adresse.c.id_ville == __ville.c.id_ville ).outerjoin( __pays, __ville.c.id_pays == __pays.c.id_pays ).outerjoin( __experience, and_(__ancien.c.id_ancien == __experience.c.id_ancien) ).outerjoin( __entreprise, __experience.c.id_entreprise == __entreprise.c.id_entreprise ) sel = select( [ __ancien.c.id_ancien.label('id'), __ancien.c.prenom.label('prenom'), __ancien.c.nom.label('nom'), __ancien.c.ecole.label('ecole'), __ancien.c.promo.label('promo'), __ancien.c.fulltext.label('fulltext'), __ville.c.nom.label('ville'), __adresse.c.code.label('code_postal'), __entreprise.c.nom.label('entreprise'), __pays.c.nom.label('pays') ], from_obj=from_obj, use_labels=True ).order_by( __ancien.c.ecole, __ancien.c.promo, __ancien.c.nom, __ancien.c.prenom, desc(__experience.c.actif), desc(__experience.c.debut).nullslast() ) sel = sel.where("fulltext @@ to_tsquery('french', :input_str)") sel = sel.where(__ancien.c.nouveau == False) if actif is not None: sel = sel.where(__ancien.c.actif == actif) if bloque is not None: sel = sel.where(__ancien.c.bloque == bloque) sel = sel.distinct( __ancien.c.ecole, __ancien.c.promo, __ancien.c.nom, __ancien.c.prenom ) new_sel = sel.alias().select().order_by( "ts_rank_cd(fulltext, to_tsquery('french', :input_str)) DESC" ) new_sel = new_sel.offset(offset).limit(limit) res = engine.execute(new_sel, input_str=helper.prepare_for_fulltext(search_terms)).fetchall() return res