Avec un plug-in MapIndexPlugin (index), vous pouvez écrire des stratégies d'indexation personnalisées dont les possibilités dépassent celles des index pré-intégrés fournis par eXtreme Scale.
Les implémentations de MapIndexPlugin doivent utiliser l'interface MapIndexPlugin et suivre les conventions communes de plug-in d'eXtreme Scale.
Les sections suivantes comprennent certaines méthodes importantes de l'interface d'index.
Utilisez la méthode setProperties pour initialiser le plug-in d'index automatiquement. Le paramètre d'objet Properties qui est passé dans la méthode devrait contenir les informations de configuration requise pour initialiser correctement le plug-in d'index. L'implémentation de la méthode setProperties et celle de la méthode getProperties sont nécessaires dans un environnement réparti car la configuration du plug-in d'index se déplace entre les processus client et serveur. Voici un exemple d'implémentation de cette méthode.
setProperties(Properties properties)
// exemple de code de la méthode setProperties
public void setProperties(Properties properties) {
ivIndexProperties = properties;
String ivRangeIndexString = properties.getProperty("rangeIndex");
if (ivRangeIndexString != null && ivRangeIndexString.equals("true")) {
setRangeIndex(true);
}
setName(properties.getProperty("indexName"));
setAttributeName(properties.getProperty("attributeName"));
String ivFieldAccessAttributeString = properties.getProperty("fieldAccessAttribute");
if (ivFieldAccessAttributeString != null && ivFieldAccessAttributeString.equals("true")) {
setFieldAccessAttribute(true);
}
String ivPOJOKeyIndexString = properties.getProperty("POJOKeyIndex");
if (ivPOJOKeyIndexString != null && ivPOJOKeyIndexString.equals("true")) {
setPOJOKeyIndex(true);
}
}
La méthode getProperties extrait la configuration du plug-in d'index depuis une instance MapIndexPlugin. Vous pouvez utiliser les propriétés extraites pour initialiser une autre instance de MapIndexPlugin avec les mêmes états internes. L'implémentation des méthodes getProperties et setProperties est nécessaire pour un environnement réparti. Voici un exemple d'implémentation de la méthode getProperties.
getProperties()
// exemple de code de la méthode getProperties
public Properties getProperties() {
Properties p = new Properties();
p.put("indexName", indexName);
p.put("attributeName", attributeName);
p.put("rangeIndex", ivRangeIndex ? "true" : "false");
p.put("fieldAccessAttribute", ivFieldAccessAttribute ? "true" : "false");
p.put("POJOKeyIndex", ivPOJOKeyIndex ? "true" : "false");
return p;
}
La méthode setEntityMetadata est appelée par l'exécution de WebSphere eXtreme Scale au cours de l'initialisation pour définir l'EntityMetadata du BackingMap associé sur l'instance de MapIndexPlugin. L'EntityMetadata est nécessaire pour la prise en charge de l'indexation des objets bloc de données. Un bloc de données est un ensemble de données qui représente un objet entité ou sa clé. Si le BackingMap est pour une entité, vous devez implémenter cette méthode.
L'échantillon de code suivant implémente la méthode setEntityMetadata.
setEntityMetadata(EntityMetadata entityMetadata)
// exemple de code de la méthode setEntityMetadata
public void setEntityMetadata(EntityMetadata entityMetadata) {
ivEntityMetadata = entityMetadata;
if (ivEntityMetadata != null) {
// ceci est une mappe de blocs de données
TupleMetadata valueMetadata = ivEntityMetadata.getValueMetadata();
int numAttributes = valueMetadata.getNumAttributes();
for (int i = 0; i < numAttributes; i++) {
String tupleAttributeName = valueMetadata.getAttribute(i).getName();
if (attributeName.equals(tupleAttributeName)) {
ivTupleValueIndex = i;
break;
}
}
if (ivTupleValueIndex == -1) {
// attribut non trouvé dans le bloc de données valeur, essaie de le trouver sur le bloc de données clé.
// si trouvé dans le bloc de données clé, implique l'indexation clé sur un des attributs clés de bloc de données.
TupleMetadata keyMetadata = ivEntityMetadata.getKeyMetadata();
numAttributes = keyMetadata.getNumAttributes();
for (int i = 0; i < numAttributes; i++) {
String tupleAttributeName = keyMetadata.getAttribute(i).getName();
if (attributeName.equals(tupleAttributeName)) {
ivTupleValueIndex = i;
ivKeyTupleAttributeIndex = true;
break;
}
}
}
if (ivTupleValueIndex == -1) {
// si entityMetadata n'est pas nul et que nous n'avons pas trouvé
// attributeName dans entityMetadata, il s'agit d'une
// erreur
throw new ObjectGridRuntimeException("Invalid attributeName. Entity: " +
ivEntityMetadata.getName());
}
}
}
La méthode setAttributeName définit le nom de l'attribut à indexer. La classe d'objets mise en cache doit fournir la méthode get pour l'attribut indexé. Par exemple, si l'objet possède un attribut employeeName ou EmployeeName, l'index appelle la méthode getEmployeeName sur l'objet pour extraire la valeur de l'attribut. Le nom d'attribut doit être le même que celui qui se trouve dans la méthode get, et l'attribut doit implémenter l'interface Comparable. Si l'attribut est de type booléen, vous pouvez également utiliser le modèle de la méthode isAttributeName.
La méthode getAttributeName renvoie le nom de l'attribut indexé.
La méthode getAttribute renvoie la valeur de l'attribut indexé à partir de l'objet spécifié. Par exemple, si un objet Employee a un attribut appelé employeeName indexé, vous pouvez utiliser la méthode getAttribute pour extraire la valeur d'attribut employeeName depuis un objet Employee spécifié. Cette méthode est requise dans un environnement WebSphere eXtreme Scale réparti.
getAttribute(Object value)
// exemple de code de la méthode getAttribute
public Object getAttribute(Object value) throws ObjectGridRuntimeException {
if (ivPOJOKeyIndex) {
// Dans le cas de l'indexation d'une clé d'objet Java simple, il n'est pas nécessaire d'obtenir l'attribut à partir de l'objet valeur.
// La clé elle-même est la valeur d'attribut utilisée pour construire l'index.
return null;
}
try {
Object attribute = null;
if (value != null) {
// indiquer la valeur Tuple si ivTupleValueIndex != -1
if (ivTupleValueIndex == -1) {
// valeur normale
if (ivFieldAccessAttribute) {
attribute = this.getAttributeField(value).get(value);
} else {
attribute = getAttributeMethod(value).invoke(value, emptyArray);
}
} else {
// valeur Tuple
attribute = extractValueFromTuple(value);
}
}
return attribute;
} catch (InvocationTargetException e) {
throw new ObjectGridRuntimeException(
"Caught unexpected Throwable during index update processing,
index name = " + indexName + ": " + t,
t);
} catch (Throwable t) {
throw new ObjectGridRuntimeException(
"Caught unexpected Throwable during index update processing,
index name = " + indexName + ": " + t,
t);
}
}