Mit einem MapIndexPlugin-Plug-in oder Index können Sie angepasste Indexierungsstrategien erstellen, die über die integrierten Indizes hinausgehen, die von eXtreme Scale bereitgestellt werden.
MapIndexPlugin -Implementierungen müssen die Schnittstelle "MapIndexPlugin verwenden und die allgemeinen eXtreme-Scale-Konventionen für Plug-ins einhalten.
In den folgenden Abschnitten werden einige wichtige Methoden der Schnittstelle "Index" beschrieben.
Verwenden Sie die Methode "setProperties", um das Index-Plug-in programmgesteuert zu initialisieren. Der an die Methode übergebene Objektparameter "Properties" muss die erforderlichen Konfigurationsdaten enthalten, damit das Index-Plug-in ordnungsgemäß initialisiert werden kann. Die Implementierung der Methode "setProperties" und die Methode "getProperties" sind in einer verteilten Umgebung erforderlich, weil die Konfiguration des Index-Plug-ins zwischen den Client- und Serverprozessen übergeben wird. Es folgt ein Implementierungsbeispiel für diese Methode:
setProperties(Properties properties)
// Beispielcode für die Methode "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);
}
}
Die Methode "getProperties" extrahiert die Konfiguration des Index-Plug-ins aus einer MapIndexPlugin-Instanz. Sie können die extrahierten Eigenschaften verwenden, um eine weitere MapIndexPlugin-Instanz mit denselben internen Status zu initialisieren. Die Implementierungen der Methode "getProperties" und der Methode "setProperties" sind in einer verteilten Umgebung erforderlich. Es folgt ein Implementierungsbeispiel für die Methode "getProperties":
getProperties()
// Beispielcode für die Methode "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;
}
Die Methode "setEntityMetadata" wird von der Laufzeitumgebung von WebSphere eXtreme Scale während der Initialisierung aufgerufen, um das EntityMetadata-Objekt der zugeordneten BackingMap in der MapIndexPlugin-Instanz zu setzen. Das EntityMetadata-Objekt ist für die Unterstützung der Indexierung von Tupelobjekten erforderlich. Ein Tupel ist eine Datenmenge, die ein Entitätsobjekt oder dessen Schlüssel darstellt. Wenn die BackingMap für eine Entität bestimmt ist, müssen Sie diese Methode implementieren.
Das folgende Codebeispiel implementiert die Methode "setEntityMetadata":
setEntityMetadata(EntityMetadata entityMetadata)
// Beispielcode für die Methode "setEntityMetadata"
public void setEntityMetadata(EntityMetadata entityMetadata) {
ivEntityMetadata = entityMetadata;
if (ivEntityMetadata != null) {
// Die ist eine Tupel-Map
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) {
// Das Attribut wurde nicht im Tupelwert gefunden. Versuchen, es im Schlüsseltupel zu finden.
// Wenn es im Schlüsseltupel vorhanden ist, implizite Schlüsselindexierung nach
// einem der Schlüsselattribute des Tupels
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) {
// Wenn das entityMetadata-Objekt ungleich null ist und
// attributeName nicht im entityMetadata-Objekt gefunden wird,
// ist dies ein Fehler.
throw new ObjectGridRuntimeException("Invalid attributeName. Entity: " +
ivEntityMetadata.getName());
}
}
}
Die Methode "setAttributeName" legt den Namen des zu indexierenden Attributs fest. Die zwischengespeicherte Objektklasse muss die Methode "get" für das indexierte Attribut bereitstellen. Wenn das Objekt beispielsweise ein Attribut "employeeName" oder "EmployeeName" hat, ruft der Index die Methode "getEmployeeName" für das Objekt auf, um den Attributwert zu extrahieren. Der Attributname muss mit dem Namen in der get-Methode identisch sein, und das Attribut muss die Schnittstelle "Comparable" implementieren. Wenn das Attribut ein boolesches Attribut ist, können Sie auch das Methodenmuster "isAttributeName" verwenden.
Die Methode "getAttributeName" gibt den Namen des indexierten Attributs zurück.
Die Methode "getAttribute" gibt den Wert des indexierten Attributs aus dem angegebenen Objekt zurück. Wenn ein Employee-Objekt beispielsweise ein Attribut mit dem Namen "employeeName" hat, das indexiert ist, können Sie die Methode "getAttribute" verwenden, um den Wert des Attributs "employeeName" aus dem angegebenen Employee-Objekt zu extrahieren. Diese Methode ist in einer verteilten Umgebung von WebSphere eXtreme Scale erforderlich.
getAttribute(Object value)
// Beispielcode für die Methode "getAttribute"
public Object getAttribute(Object value) throws ObjectGridRuntimeException {
if (ivPOJOKeyIndex) {
// Bei der Indexierung von POJO-Schlüsseln muss das Attribut nicht aus dem Wertobjekt abgerufen werden.
// Der Schlüssel selbst ist der zum Erstellen des Index verwendete Attributwert.
return null;
}
try {
Object attribute = null;
if (value != null) {
// Tupelwert bearbeiten, wenn ivTupleValueIndex != -1
if (ivTupleValueIndex == -1) {
// regulärer Wert
if (ivFieldAccessAttribute) {
attribute = this.getAttributeField(value).get(value);
} else {
attribute = getAttributeMethod(value).invoke(value, emptyArray);
}
} else {
// Tupelwert
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);
}
}