Package Jointures

Fichiers du package

FichierDescription
jointures.php

Déduction automatique d'une chaîne de jointures

Proposer une amélioration

Liste des fonctions

array calculer_chaine_jointures( \objetc & $boucle , array $depart , array $arrivee , array $vu = array() , array $milieu_exclus = array() , integer $max_liens = 5 )

Paramètres

  1. \objetc & $boucle
  2. array $depart

    sous la forme array(nom de la table, description)

  3. array $arrivee

    sous la forme array(nom de la table, description)

  4. array $vu = array()

    tables deja vues dans la jointure, pour ne pas y repasser

  5. array $milieu_exclus = array()

    cles deja utilisees, pour ne pas les reutiliser

  6. integer $max_liens = 5

    nombre maxi d'etapes

Retour

  • array

Utilisé par

Package

Proposer une amélioration

L'objet boucle est modifié pour compléter la requête. La fonction retourne l'alias d'arrivée une fois la jointure construire, en general un "Lx"

string calculer_jointure( \Boucle & $boucle , array $depart , array $arrivee , string $col = '' , boolean $cond = false , integer $max_liens = 5 )

Paramètres

  1. \Boucle & $boucle

    Description de la boucle

  2. array $depart

    Table de départ, sous la forme (nom de la table, description de la table)

  3. array $arrivee

    Table d'arrivée, sous la forme (nom de la table, description de la table)

  4. string $col = ''

    Colonne cible de la jointure

  5. boolean $cond = false

    Flag pour savoir si le critère est conditionnel ou non

  6. integer $max_liens = 5

    Nombre maximal de liaisons possibles pour trouver la jointure.

Retour

  • string

    Alias de la table de jointure (Lx)

Package

Proposer une amélioration
array | false chercher_champ_dans_tables( string | array $cle , array $tables , string $connect , boolean | string $checkarrivee = false )

Paramètres

  1. string | array $cle

    Nom de la ou des colonnes à trouver dans les tables indiquées

  2. array $tables

    Liste de noms de tables ou des couples (alias => nom de table).

    • $boucle->from (alias => nom de table) : les tables déjà utilisées dans une boucle
    • $boucle->jointures : les tables utilisables en tant que jointure
    • $boucle->jointures_explicites les jointures explicitement indiquées à l'écriture de la boucle
  3. string $connect

    Nom du connecteur SQL

  4. boolean | string $checkarrivee = false

    false : peu importe la table, si on trouve le/les champs, c'est bon. string : nom de la table où on veut trouver le champ.

Retour

  • array | false

    false : on n'a pas trouvé array : infos sur la table trouvée. Les clés suivantes sont retournés :

    • 'desc' : tableau de description de la table,
    • 'table' : nom de la table
    • 'alias' : alias utilisé pour la table (si pertinent. ie: avec $boucle->from transmis par exemple)

Package

Proposer une amélioration

Exemple : décompose id_article en (id_objet,objet,article)

array | string decompose_champ_id_objet( string $champ )

Paramètres

  1. string $champ

    Nom du champ à décomposer

Retour

  • array | string

    Tableau si décomposable : 'id_objet', 'objet', Type de l'objet Chaine sinon : le nom du champ (non décomposable donc)

Package

Proposer une amélioration

Ajoute

  • la jointure dans le tableau $boucle->join,
  • la table de jointure dans le from
  • un modificateur 'lien'
string fabrique_jointures( \Boucle & $boucle , array $res , boolean $cond = false , array $desc = array() , string $nom = '' , string $col = '' , boolean $echap = true )

Paramètres

  1. \Boucle & $boucle

    Description de la boucle

  2. array $res

    Chaîne des jointures $res = array( array(table_depart,array(table_arrivee,desc),jointure), ... ) Jointure peut être un tableau pour les jointures sur champ decomposé array('id_article','id_objet','objet','article') array('id_objet','id_article','objet','article')

  3. boolean $cond = false

    Flag pour savoir si le critère est conditionnel ou non

  4. array $desc = array()

    Description de la table de départ

  5. string $nom = ''

    Nom de la table de départ

  6. string $col = ''

    Colonne cible de la jointure

  7. boolean $echap = true

    Écrire les valeurs dans boucle->join en les échappant ou non ?

Retour

  • string

    Alias de la table de jointure (Lx)

Utilisé par

Package

Proposer une amélioration

sinon on construit une liste des champs a partir de la liste des cles de la table

array liste_champs_jointures( string $nom , array $desc , boolean $primary = false )

Paramètres

  1. string $nom
  2. array $desc
  3. boolean $primary = false

Retour

  • array

Utilise

Package

Proposer une amélioration

À améliorer, notamment voir si calculer_select ne pourrait pas la réutiliser lorsqu'on sait si le critere conditionnel est finalement present

boolean nogroupby_if( array $depart , array $arrivee , string | array $col )

Paramètres

  1. array $depart
  2. array $arrivee
  3. string | array $col

Retour

  • boolean

Utilisé par

Package

Proposer une amélioration
array split_key( string $v , array $join = array() )

Paramètres

  1. string $v
  2. array $join = array()

Retour

  • array

Package

Proposer une amélioration
array | string trouver_champ_exterieur( string | array $cle , array $joints , \Boucle & $boucle , boolean | string $checkarrivee = false )

Paramètres

  1. string | array $cle

    Nom de la ou des colonnes à trouver dans les tables de jointures

  2. array $joints

    Liste des jointures possibles (ex: $boucle->jointures ou $boucle->jointures_explicites)

  3. \Boucle & $boucle

    Description de la boucle

  4. boolean | string $checkarrivee = false

    false : peu importe la table, si on trouve le/les champs, c'est bon. string : nom de la table jointe où on veut trouver le champ.

Retour

  • array | string

    chaîne vide : on n'a pas trouvé liste si trouvé : nom de la table, description de la table, clé(s) de la table

Package

Proposer une amélioration

Si le champ demandé existe dans la table, on l'utilise, sinon on regarde si le champ se décompose en objet/id_objet et si la table possède ces champs, et dans ce cas, on les retourne.

array trouver_champs_decomposes( string $champ , array $desc )

Paramètres

  1. string $champ

    Nom du champ à tester (ex. id_article)

  2. array $desc

    Description de la table

Retour

  • array

    Liste du/des champs. Soit

    • array($champ), si le champ existe dans la table ou si on ne peut décomposer.
    • array(id_objet, objet), si le champ n'existe pas mais qu'on peut décomposer

Package

Proposer une amélioration

Cela construira les jointures necessaires si une possibilite est trouve et retournera le nom de l'alias de la table contenant ce champ (L2 par exemple pour 'spip_mots AS L2' dans le FROM),

string trouver_jointure_champ( string $champ , object & $boucle , array $jointures = false , boolean $cond = false , boolean | string $checkarrivee = false )

Paramètres

  1. string $champ

    Nom du champ cherche (exemple id_article)

  2. object & $boucle

    Informations connues de la boucle

  3. array $jointures = false

    Liste des tables parcourues (articles, mots) pour retrouver le champ sql et calculer la jointure correspondante. En son absence et par defaut, on utilise la liste des jointures connues par SPIP pour la table en question ($boucle->jointures)

  4. boolean $cond = false

    flag pour savoir si le critere est conditionnel ou non

  5. boolean | string $checkarrivee = false

    false : peu importe la table, si on trouve le/les champs, c'est bon. string : nom de la table jointe où on veut trouver le champ.

Retour

  • string

Package

Proposer une amélioration