Les bases – Rechercher plusieurs informations

Dans Generic System, il est possible de rechercher spécifiquement un Generic (recherche simple), ou bien un ensemble de Generic (recherche avancée). Quand un ensemble de résultats doit être retourné, Generic System ne renvoie pas de liste de Generic, mais un Snapshot.

Introduction

Qu’est-ce qu’un Snapshot ?

D’un point de vue fonctionnel, un Snapshot est un ensemble de résultats qui est conscient de son contexte. Le Snapshot est directement en relation avec le modèle de persistence des données, contrairement aux Collections Java qui possèdent un cache en interne contenant les informations.

D’un point de vue technique, un Snapshot est d’une part un fournisseur de Stream et d’autre part un aware Iterable. Comme nous allons le voir par la suite, un Snapshot peut être requêté directement en utilisant des filtres de Stream.

Comparaison Snapshot / Collection

Pour prendre un exemple simple, nous allons créer une instance de Vehicle puis la stocker soit dans une Collection, soit dans un Snapshot. Nous allons ensuite vérifier que notre Collection et notre Snapshot contiennent bien cette instance. Puis nous ajoutons une nouvelle instance de Vehicle, et nous vérifions que notre Collection et notre Snapshot contiennent bien les deux instances.

SnapshotCollection

Voici la synthèse des différences :

Ref Collection Snapshot
(1) Crée la classe Vehicle et une instance de Vehicle. Crée le type Vehicle et une instance de Vehicle.
(2) Crée une liste de Vehicle et ajoute l’instance. Récupère les instances de Vehicle via un Snapshot.
(3) Vérifie que la liste de Vehicle contient l’instance myFirstVehicle. Vérifie que le Snapshot d’instances contient l’instance myFirstVehicle.
(4) Crée une seconde instance de Vehicle. Crée une seconde instance de Vehicle.
(5) Ajoute la seconde instance à la liste de Vehicle. Rien à faire.
(6) Vérifie que la liste de Vehicle contient toutes les instances. Vérifie que le Snapshot d’instances contient toutes les instances.

Vous remarquez qu’il est nécessaire de mettre à jour notre Collection pour qu’elle connaisse l’état de nos instances, alors que le Snapshot est en relation directe avec le modèle de persistance, et reste informé des changements.

Recherche avec résultats multiples

Comme nous l’avons vu dans l’article sur les recherches de base, il est possible de rechercher tous les types de Generic grâce aux méthodes getGeneric. De la même façon, il existe des méthodes getGenerics (au pluriel) qui permettent de demander à Generic System de nous renvoyer un ensemble de résultats.

Afin de mieux illustrer cet article, nous allons utiliser le code suivant pour initialiser notre moteur (cliquez pour déplier) :

Cliquez pour déplier le code

Rechercher des types

La recherche de types fait appel à la méthode  getInstances(). Voyons cela en exemple :

Nous pouvons vérifier que notre Snapshot contient bien les types que nous avons créé :

Rechercher des attributs ou des propriétés

La recherche d’attributs et de propriétés fait appel à la méthode  getAttributes() :

Nous pouvons vérifier que notre Snapshot contiennent bien Options, Wheels et Power :

Rechercher des relations ou des links

La recherche de relations ou de links fait appel respectivement aux méthodes  getRelations() et getLinks() :

Là encore, nous pouvons vérifier que les relations que nous avions créés pour l’occasion sont bien contenus dans le Snapshot :

Comme lors d’une recherche simple, il existe une petite subtilité pour rechercher des links. Il faut en effet préciser à quelle relation ils appartiennent :

Info
Il est possible de récupérer les relations depuis n’importe quel type impliqué, et les links depuis n’importe quelle instance impliquée.

Rechercher des instances

La recherche d’instances fait logiquement appel à la méthode  getInstances() :

Nous pouvons ensuite attester qu’il existe bien au moins trois instances pour notre type Vehicle :

Rechercher des sous-instances

Vous avez peut-être lu dans un article précédent qu’il était possible de créer des sous-types, qui héritent d’un type.

ll est donc possible de rechercher les instances de ces sous-types grâce à la méthode getSubInstances() :

Nous pouvons vérifier que ce Snapshot contient bien les instances de Vehicle ainsi que de ces sous-types Car et Bike :

Rechercher des holders

La recherche de holders fait appel à la méthode getHolders. Mais comme lors de la recherche de base, il faut indiquer à Generic System sur quel attribut rechercher les holders :

Dans ce cas, notre Snapshot contient tous les holders de l’attribut Options :

 Filtrer les recherches

Quand vous effectuez une recherche qui renvoie un ensemble de résultats, vous souhaitez peut-être limiter le nombre de résultats obtenus en fonction de critères prédéfinis.

Avec un Snapshot, c’est très simple de filtrer les résultats, puisque que Snapshot est un fournisseur de Stream ! Vous bénéficiez donc de toute la puissance de l’API Stream Java 8.

Reprenons notre exemple, et imaginons que l’on souhaite récupérer toutes les instances de Vehicle ayant l' Options “air conditioning” :

Nous pouvons vérifier que notre Snapshot contient bien myFirstVehicle et myThirdVehicle, mais pas mySecondVehicle :
Bien entendu, le Snapshot filtré est bien conscient de l’état du moteur de persistance ! Vous pouvez le vérifier en ajoutant une autre instance de vehicle qui correspond aux critères de recherche :

En résumé

  • Generic System permet d’effectuer des recherches retournant un ensemble de résultats sous la forme d’un  Snapshot ;
  • Un Snapshot est toujours conscient des modifications du modèle de données. Il s’agit d’un fournisseur de Stream et d’un aware Iterable.
  • Enfin, il est possible de filtrer les recherches en utilisant un Stream. Les critères de sélection se font via la méthode filter.