• Aucun résultat trouvé

Le moteur d’interrogation fonctionnelle

Le paragraphe 3.4.5 nous a permis de découvrir de quelle manière l’abstraction d’une requête d’interrogation était réalisée dans eXoMiLe. Cependant une question demeure sans réponse : comment effectuer des interrogations sur plusieurs tables ?

L’abstraction présentée nous permet d’exprimer un besoin fonctionnel dans le sens où le client ne connait pas la structure de persistance et exprime sa demande en s’appuyant sur les caractéristiques de l’indexation.

La détermination d’un chemin de jointure est donc une opération qui consiste à déterminer un chemin, optimal de préférence, qui permettra de retrouver l’ensemble des informations demandées. Nous avons abordé au paragraphe 3.2.2 la notion de champs référencés que nous avons traduit par une redondance volontaire de l’information dans la base de données. Le calcul doit donc tenir compte de ces derniers afin d’offrir le chemin le plus court possible, sinon l’utilité de tels champs n’est plus.

Un chemin de jointure peut être réalisé en s’appuyant sur les informations parent/enfant de l’indexation ou l’identifiant de document propagé dans l’ensemble des enfants. Le choix de l’exploitation de l’un ou l’autre est laissé à la charge de l’implémentation du moteur de jointure. Par exemple, un chemin de jointure pourra concerner des liens parent/enfant (Figure 55), des liens parent/enfant/frère (Figure 56), des liens racine/enfant (Figure 57)… De plus, le sens de parcours aura une incidence sur les résultats renvoyés.

Figure 55 - Jointure parent/enfant

Table document

Table d'indexation racine

Table d'indexation

Figure 56 - Jointure parent/enfant/frère

Figure 57 - Jointure racine/enfant

Nous concluons donc qu’il n’y a pas un seul moteur de jointure mais des implémentations différentes en fonction des utilisations. Une fois de plus, une conception astucieuse permet d’injecter le moteur choisi en fonction du besoin. Par défaut, eXoMiLe propose nativement deux moteurs que nous allons présenter dans cette section :

· le moteur document vers index, · le moteur index vers document.

Table d'indexation

Table d'indexation

Table d'indexation

...

Table document

Table d'indexation

3.5.1 L’abstraction du moteur de jointure

Un moteur de jointure est constitué de deux éléments distincts : le calculateur de chemins et l’analyseur de requête.

Le premier peut être vu comme un algorithme qui calcule l’ensemble des jointures possibles en respectant les conditions de parcours (point de départ, direction, type de jointure). Il associe à chaque chemin, un ensemble de champs accessibles.

La Figure 58 illustre le calcul des chemins de jointures possibles entre trois tables T1, T2 et T3.

T1

F1 F2

T1

T2

T1

T2

T3

F1 F2 F3 F1 F2 F3 F4

Figure 58 - Représentation du calcul des chemins de jointures

Nous pouvons remarquer que, dans cet exemple, toutes les solutions ne sont pas couvertes. Ce n’est aucunement un oubli, mais la conséquence des conditions de parcours. Dans cet exemple, le parcours est de type parent/enfant, dans la direction enfant vers parent et avec pour origine la table T1. Le même parcours orienté parent vers enfant aurait probablement conduit à un ensemble de possibilités plus important, un parent pouvant avoir plusieurs enfants.

L’analyseur de requête est l’élément en charge de renvoyer le chemin optimal en s’appuyant sur les résultats du calculateur de chemins. Il commence par calculer les besoins en champs de la requête qui lui est soumise. A partir de ce résultat, il va déterminer un ensemble de chemins permettant de couvrir la demande. En s’appuyant sur l’exemple précédent, une requête exploitant les champs F1, F2 et F3 pourra être satisfaite par les chemins T1-T2 et T1-T2-T3.

Le choix du chemin optimal est le résultat de l’algorithme de pondération utilisé. Nous sommes ici confrontés à un problème bien connu en théorie des graphes qui est la recherche du plus court chemin dans un graphe pondéré, ce dernier pouvant être pondéré sur les nœuds ou sur les arcs. Cette pondération est l’expression mathématique de la stratégie de parcours de l’arbre employée.

Un moteur de jointure est initialisé à partir d’un point de départ. Ce dernier correspond à une référence de mapping (cf. paragraphe 3.4.2.1). Ainsi le client ne renseigne que l’élément d’indexation de départ de sa recherche, les étapes d’initialisation et de calcul sur les différentes structures lui sont totalement masquées.

Les détails de réalisation de l’abstraction du moteur de jointure sont présentés dans le diagramme de classe de l’annexe F.

3.5.2 Les implémentations par défaut

Nous avons vu qu’il était possible d’implémenter des moteurs de jointures personnalisés permettant de répondre à des besoins spécifiques. Bien que cela offre une souplesse non négligeable pour le client, la réalisation peut être une étape fastidieuse et même répétitive.

Les fonctionnalités standard d’eXoMiLe permettent d’identifier deux types d’interrogations couramment utilisées : la recherche de documents et la recherche d’index. Nous sommes donc confrontés à deux parcours parent/enfant mais dont l’orientation est différente. Le premier descendra dans les index alors que le second remontera jusqu’à la table des documents (Figure 59).

Figure 59 - Parcours des moteurs de jointures par défaut

Table document

Table d'indexation racine

Table d'indexation

Table d'indexation

Table d'indexation

...

Table d'indexation

...

Document à index Index à document

Ces deux implémentations exploitent les liens parent/enfant. Le périmètre de calcul des chemins possibles est donc un sous arbre.

Dans le parcours document vers index, la racine du sous arbre est le point d’origine fourni. Le nombre de chemins calculé est alors le nombre de nœuds (tables) recensés dans ce sous arbre.

Dans le parcours index vers document, le sous arbre est une liste (du fait de la monoparentalité des nœuds) constituée des nœuds entre la feuille (le point d’origine) et la table des documents (la racine). Le nombre de chemins calculé est alors le nombre de nœuds constituant cette liste, c’est-à-dire la profondeur du sous arbre.