ObjectQuery stützt sich bei der Durchführung der Semantikprüfung und der Auswertung von Pfadausdrücken auf Schema- bzw. Forminformationen. In diesem Abschnitt wird beschrieben, wie das Schema in XML oder über das Programm definiert werden kann.
Das ObjectMap-Schema wird in der ObjectGrid-XML-Implementierungsdeskriptordatei oder über das Programm mit Hilfe der herkömmlichen eXtreme-Scale-Konfigurationstechniken definiert. Ein Beispiel zum Erstellen eines Schemas finden Sie im Abschnitt ObjectQuery-Schema konfigurieren.
Die Schemainformationen beschreiben POJOs (Plain Old Java Objects): aus welchen Attributen sie sich zusammensetzen und welche Typen von Attributen vorhanden sein können, ob die Attribute Primärschlüsselfelder, Beziehungen mit einem einzigen oder mehreren Werten oder bidirektionale Beziehungen sind. Die Schemainformationen weisen ObjectQuery an, Feldzugriff oder Eigenschaftszugriff zu verwenden.
Es können auch andere integrierte serialisierbare Typen als die zuvor genannten in ein Abfrageergebnis, aber nicht in die WHERE- oder FROM-Klausel der Abfrage eingeschlossen werden. Eine Navigation für serialisierbare Attribute ist nicht möglich.
Attributtypen können aus dem Schema ausgeschlossen werden, wenn das Feld bzw. die Eigenschaft statisch oder das Feld transient ist. Da alle Map-Objekte serialisierbar sein müssen, enthält das ObjectGrid nur Attribute aus dem Objekt, die als persistent definiert werden können. Andere Objekte werden ignoriert.
Feldattribute
Wenn das Schema für den Zugriff auf das Objekt über Felder konfiguriert ist, werden alle serialisierbaren, nicht transienten Felder automatisch in das Schema integriert. Zum Auswählen eines Feldattributs in einer Abfrage verwenden Sie den Feldkennzeichnungsnamen aus der Klassendefinition.
Alle öffentlichen, privaten, geschützten und paketgeschützten Felder werden in das Schema eingeschlossen.
Eigenschaftsattribute
Wenn das Schema für den Zugriff auf das Objekt über Eigenschaften konfiguriert ist, werden alle serialisierbaren Methoden, die den Namenskonventionen für JavaBeans-Eigenschaften entsprechen, automatisch in das Schema eingeschlossen. Zum Auswählen eines Eigenschaftsattributs für die Abfrage verwenden Sie die Namenskonventionen für JavaBeans-Eigenschaften.
Alle öffentlichen, privaten, geschützten und paketgeschützten Eigenschaften werden in das Schema eingeschlossen.
Im folgenden Beispiel werden einer Klasse die folgenden Attribute zum Schema hinzugefügt: name, birthday, valid.
public class Person {
public String getName(){}
private java.util.Date getBirthday(){}
boolean isValid(){}
public NonSerializableObject getData(){}
}
Wenn Sie den Kopiermodus "COPY_ON_WRITE" verwenden, muss das Schema immer den eigenschaftsbasierten Zugriff verwenden. COPY_ON_WRITE erstellt Proxy-Objekte, wenn Objekte aus der Map abgerufen werden, und der Zugriff auf diese Objekte ist nur mit Eigenschaftsmethoden möglich. Erfolgt der Zugriff auf andere Weise wird jedes Abfrageergebnis auf null gesetzt.
Jede Beziehung muss in der Schemakonfiguration explizit definiert werden. Die Kardinalität der Beziehung wird automatisch über den Typ des Attributs bestimmt. Wenn das Attribut die Schnittstelle "java.util.Collection" implementiert, ist die Beziehung entweder eine Eins-zu-viele- oder eine Viele-zu-viele-Beziehung.
Anders als Entitätsabfragen dürfen Attribute, die auf andere zwischengespeicherte Objekte verweisen, keine direkten Referenzen auf das Objekt enthalten. Referenzen auf andere Objekte werden als Teil Daten des übergeordneten Objekts serialisiert. Stattdessen muss der Schlüssel im zugehörigen Objekt gespeichert werden.
Beispiel mit einer Viele-zu-eins-Beziehung zwischen einem Kunden (Customer) und einem Auftrag (Order):
Falsch.
Es wird eine Objektreferenzreferenz gespeichert.
public class Customer {
String customerId;
Collection<Order> orders;
}
public class Order {
String orderId;
Customer customer;
}
Richtig. Der Schlüssel wird im zugehörigen Objekt gespeichert.
public class Customer {
String customerId;
Collection<String> orders;
}
public class Order {
String orderId;
String customer;
}
Wenn eine Abfrage ausgeführt wird, die zwei Map-Objekte miteinander verknüpft, wird der Schlüssel automatisch dekomprimiert. Die folgende Abfrage gibt beispielsweise Customer-Objekte zurück:
SELECT c FROM Order o JOIN Customer c WHERE orderId=5
ObjectGrid verwendet Index-Plug-ins, um Maps Indizes hinzuzufügen. Die Abfragesteuerkomponente integriert automatisch alle Indizes, die in einem Schema-Map-Element des Typs "com.ibm.websphere.objectgrid.plugins.index.HashIndex" definiert sind, wenn die Eigenschaft "rangeIndex" auf "true" gesetzt ist. Wenn der Indextyp nicht "HashIndex" ist und die Eigenschaft "rangeIndex" nicht auf "true" gesetzt ist, wird der Index von der Abfrage ignoriert. Ein Beispiel für das Hinzufügen eines Index zum Schema finden Sie in Lernprogramm zu ObjectQuery - Schritt 2.