Configuration d'un schéma ObjectQuery

ObjectQuery utilise des informations de schéma ou de forme pour effectuer une vérification sémantique et évaluer des expressions de chemin. Cette section décrit comment définir le schéma au langage XML ou à l'aide d'un programme.

Définition du schéma

Le schéma ObjectMap est défini dans le descripteur de déploiement ObjectGrid au langage XML ou à l'aide d'un programme en faisant appel aux techniques de configuration classiques d'eXtreme Scale. Pour obtenir un exemple de création de schéma, reportez-vous à la section Configuration d'un schéma ObjectQuery

Les informations de schéma décrivent les objets Java simples : quels sont leurs attributs, quels sont les types d'attributs, si les attributs sont des zones de clé primaire, des relations à valeur unique ou à valeurs multiples ou des relations bidirectionnelles. Les informations de schéma demandent à ObjectQuery d'utiliser l'accès par zone ou par propriété.

Attributs pouvant être interrogés

Lorsque le schéma est défini dans le descripteur d'ObjectGrid, les objets du schéma sont examinés en profondeur pour déterminer les attributs disponibles pour l'interrogation. Vous pouvez interroger les types d'attributs suivants :
  • les types primitifs Java, notamment les encapsuleurs
  • java.lang.String
  • java.math.BigInteger
  • java.math.BigDecimal
  • java.util.Date
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp
  • java.util.Calendar
  • byte[]
  • java.lang.Byte[]
  • char[]
  • java.lang.Character[]
  • J2SE enum

Les types sérialisables imbriqués autres que ceux susmentionnés peuvent également être inclus dans un résultat de requête et non dans la clause WHERE ou FROM de la requête. Les attributs sérialisables ne peuvent pas être parcourus.

Les types d'attributs peuvent être exclus du schéma si le type n'est pas sérialisable, si la zone ou la propriété sont statiques ou si la zone est transitoire. Etant donné que tous les objets de mappe doivent être sérialisables, le descripteur d'ObjectGrid inclut uniquement les attributs qui peuvent être conservés dans l'objet. Les autres objets sont ignorés.

Attributs de zone

Lorsque le schéma est configuré pour accéder à l'objet par zone, toutes les zones sérialisables non transitoires sont automatiquement incorporées au schéma. Pour sélectionner un attribut de zone dans une requête, utilisez le nom de l'identificateur de la zone tel qu'il existe dans la définition de la classe.

Toutes les zones publiques, privées, protégées et protégées par package sont incluses dans le schéma.

Attributs de propriété

Lorsque le schéma est configuré pour accéder à l'objet à l'aide de propriétés, toutes les méthodes sérialisables qui suivent les conventions de dénomination des propriétés JavaBeans sont automatiquement incorporées au schéma. Pour sélectionner un attribut de propriété pour la requête, utilisez les conventions de dénomination des propriétés de style JavaBeans.

Toutes les propriétés publiques, privées, protégées et protégées par package sont incluses dans le schéma.

Dans la classe ci-dessous, les attributs suivants sont ajoutés au schéma : name, birthday, valid.

public class Person {
  public String getName(){}
  private java.util.Date getBirthday(){}
  boolean isValid(){}
  public NonSerializableObject getData(){}
}

Lors de l'utilisation du mode de copie COPY_ON_WRITE de l'attribut CopyMode, le schéma de la requête doit toujours utiliser l'accès à l'aide des propriétés. Le mode COPY_ON_WRITE crée des objets proxy dès que des objets sont extraits de la mappe et peut uniquement y accéder à l'aide des méthodes de propriété. Si ces consignes ne sont pas respectées, les résultats de la requête seront nuls.

Relations

Chaque relation doit être explicitement définie dans la configuration du schéma. La cardinalité de la relation est automatiquement déterminée par le type de l'attribut. Si l'attribut implémente l'interface java.util.Collection, la relation est une relation un-à-plusieurs ou une relation plusieurs-à-plusieurs.

Contrairement aux requêtes d'entité, les attributs qui se réfèrent à d'autres objets cache ne doivent pas stocker les références directes à l'objet. Les références à d'autres objets sont sérialisées comme faisant partie intégrante des données de l'objet. Stockez plutôt la clé permettant d'accéder à l'objet lié.

Par exemple, dans le cas d'une relation plusieurs-à-un entre un client et une commande :

Incorrect. Enregistrement d'une référence à l'objet.

public class Customer {
  String customerId;
  Collection<Order> orders;
}

public class Order {
  String orderId;
  Customer customer;
}
Correct. Clé vers l'objet lié.

public class Customer {
  String customerId;
  Collection<String> orders;
}

public class Order {
  String orderId;
  String customer;
}

Lorsqu'une requête établissant une jointure entre deux objets de mappe est exécutée, la taille de la clé est automatiquement augmenté. Par exemple, la requête suivante devrait retourner les objets Customer :

SELECT c FROM Order o JOIN Customer c WHERE orderId=5

Utilisation des index

Le descripteur d'ObjectGrid utilise des plug-in d'index pour ajouter des index aux mappes. Le moteur de requête incorpore automatiquement tous les index définis pour un élément de mappage de schéma de type : com.ibm.websphere.objectgrid.plugins.index.HashIndex et la propriété rangeIndex est définie sur true. Si le type d'index n'est pas HashIndex et si la propriété rangeIndex n'est pas définie sur true, l'index n'est pas pris en compte par la requête. Voir le Tutoriel ObjectQuery - Etape 2 pour un exemple d'ajout d'un index à un schéma.