Avancé – La représentation de l’information au sein de Generic System

À votre avis, comment est représentée l’information dans Generic System ? Est-ce sous forme de table (de manière scalaire) comme pour les bases de données relationnelles ? Ou plutôt dans un arbre, comme pour les fichiers XML ?

Modèle de représentation de l’information

Generic System enregistre l’information dans un graphe. Celui-ci a une seule racine : le nœud qui représente Engine. Tous les nœuds du graphe sont des objets qui implémentent l’interface Generic, y compris Engine. Ils ont la particularité d’être immuables et ont un cycle de vie simplifié : ils naissent et peuvent mourir. En aucun cas ils ne peuvent être modifiés.

Tous les nœuds contiennent dès leur construction une et une seule donnée. Celle-ci joue un rôle de désignant pour la structure de l’information et un rôle de désigné pour les occurrences de cette information. Par exemple, le nom d’une personne est le désignant et la personne est le désigné. Cette donnée doit être Serializable et implémenter correctement les méthodes equals() et hashCode().

Relations entre les nœuds

Les nœuds sont reliés entre eux par le principe « ancêtres / dépendances » : les ancêtres d’un nœud dépendant doivent exister pendant toute la durée de vie de ce dernier.

Trois types de liaison « ancêtres / dépendances » coexistent dans Generic System : l’instanciation, l’héritage et la composition.
Les ancêtres d’un Generic sont donc son « meta », ses « supers » et ses « composants ». Ces dépendances sont ses « instances », ses « héritiers » et ses « composites ».

Continue reading Avancé – La représentation de l’information au sein de Generic System

Système d’indexation

Afin d’améliorer les performances du moteur d’informations de Generic System, un système de cache automatique qui évite la répétition de requêtes coûteuses au back-office a été mis en place.

De nombreuses méthodes qui renvoient un Snapshot font par exemple appel à la méthode  getDependencies(), suivie d’un ou plusieurs filtres (seulement les instances, une valeur ou des composants donnés, etc.). Pour éviter d’avoir à re-filtrer les Snapshot à plusieurs reprises, nous avons créé des arbres permettant de stocker les résultats des filtrages dans les classes AbstractTsDependencies et PseudoConcurrentCollection. L’arbre est constitué de nœuds contenant :

  • l’index lui-même, sous forme d’implémentation de l’interface Index fournissant les méthodes add(), remove() et iterator() ;
  • des enfants sous forme de HashMap ayant pour clés des IndexFilter et pour valeur le nœud contenant l’index filtré avec sa clef. Les entrées sont créées automatiquement lors du get() si elles n’existent pas. La méthode filter(List filters) va chercher le nœud de l’arbre correspondant aux filtres indiqués.

Continue reading Système d’indexation