Datastore fornisce l'accesso programmatico ad alcuni dei suoi metadati per supportare la metaprogrammazione, implementare funzioni amministrative di backend, semplificare la memorizzazione nella cache coerente e scopi simili. Puoi utilizzarlo, ad esempio, per creare un visualizzatore Datastore personalizzato per la tua applicazione. I metadati disponibili includono informazioni su gruppi di entità, spazi dei nomi, tipi di entità e proprietà utilizzati dall'applicazione, nonché le rappresentazioni delle proprietà per ogni proprietà.
La dashboard Datastore nella console Google Cloud fornisce anche alcuni metadati sulla tua applicazione, ma i dati visualizzati differiscono per alcuni aspetti importanti da quelli restituiti da queste funzioni.
- Aggiornamento. La lettura dei metadati tramite l'API recupera i dati attuali, mentre i dati nella dashboard vengono aggiornati solo una volta al giorno.
- Sommario. Alcuni metadati nella dashboard non sono disponibili tramite le API; è vero anche il contrario.
- Velocità. Le operazioni di recupero e le query sui metadati vengono fatturate allo stesso modo delle operazioni di recupero e delle query di Datastore. Query dei metadati che recuperano informazioni su spazi dei nomi, tipi e proprietà sono generalmente lente da eseguire. Come regola generale, una query sui metadati che restituisce N entità richiede circa lo stesso tempo di N query ordinarie, ognuna delle quali restituisce una singola entità. Inoltre, le query di rappresentazione delle proprietà (query sulle proprietà non basate solo su chiavi) sono più lente delle query sulle proprietà basate solo su chiavi. I metadati dei gruppi di entità vengono recuperati in modo leggermente più rapido rispetto a un'entità normale.
Metadati del gruppo di entità
Cloud Datastore fornisce l'accesso alla "versione" di un gruppo di entità, un numero strettamente positivo che aumenta a ogni modifica del gruppo di entità.
Le versioni del gruppo di entità vengono ottenute chiamando get()
su una pseudo-entità speciale
che contiene una proprietà __version__
strettamente positiva. La chiave della pseudo-entità
può essere creata utilizzando il
metodo Entities.createEntityGroupKey()
:
Comportamento precedente
Nel comportamento della versione precedente del gruppo di entità, la versione del gruppo di entità aumenta solo in caso di modifiche al gruppo di entità. Il comportamento dei metadati del gruppo di entità legacy potrebbe essere utilizzato, ad esempio, per mantenere una cache coerente di una query complessa sugli antenati di un gruppo di entità.
Questo esempio memorizza nella cache i risultati della query (un conteggio dei risultati corrispondenti) e utilizza il comportamento legacy delle versioni dei gruppi di entità per utilizzare il valore memorizzato nella cache se è attuale:
Le entità __entity_group__
potrebbero non esistere per i gruppi di entità che non sono mai stati scritti.
Query dei metadati
La classe Java
Entities
,
definita nel pacchetto
com.google.appengine.api.datastore
, fornisce tre tipi di entità speciali riservati alle query sui metadati. Sono indicati da costanti statiche della classe Entities
:
Costante statica | Tipo di entità |
---|---|
Entities.NAMESPACE_METADATA_KIND |
__namespace__ |
Entities.KIND_METADATA_KIND |
__kind__ |
Entities.PROPERTY_METADATA_KIND |
__property__ |
Questi tipi non entreranno in conflitto con altri con lo stesso nome che potrebbero già esistere nella tua applicazione. Eseguendo query su questi tipi speciali, puoi recuperare le entità contenenti i metadati desiderati.
Le entità restituite dalle query sui metadati vengono generate dinamicamente in base
allo stato attuale di Datastore. Sebbene sia possibile creare oggetti
Entity
locali di tipo __namespace__
, __kind__
o
__property__
, qualsiasi
tentativo di archiviarli in Datastore non andrà a buon fine
e verrà visualizzato un
IllegalArgumentException
.
Il modo più semplice per eseguire query sui metadati è con l'API Datastore di basso livello. L'esempio seguente stampa i nomi di tutti gli spazi dei nomi in un'applicazione:
Query dello spazio dei nomi
Se la tua applicazione utilizza l'API Namespaces, puoi utilizzare una query dello spazio dei nomi per trovare tutti gli spazi dei nomi utilizzati nelle entità dell'applicazione. Ciò ti consente di eseguire attività come le funzioni amministrative in più spazi dei nomi.
Le query dello spazio dei nomi restituiscono entità del tipo speciale __namespace__
la cui chiave
è il nome di uno spazio dei nomi. Un'eccezione è lo spazio dei nomi predefinito
designato dalla stringa vuota ""
: poiché la stringa vuota non è un nome di chiave valido, questo spazio dei nomi è associato all'ID numerico 1
. Le query di questo
tipo supportano il filtraggio solo per intervalli nella pseudoproprietà speciale
__key__
, il cui valore è la chiave dell'entità. I risultati possono essere ordinati in base al valore __key__
in ordine crescente (ma non decrescente). Poiché le entità __namespace__
non hanno proprietà, sia le query basate solo su chiavi sia quelle non basate solo su chiavi restituiscono le stesse informazioni.
L'esempio seguente restituisce un elenco degli spazi dei nomi di un'applicazione nell'intervallo
tra due nomi specificati, start
e end
:
Query per tipo
Le query per tipo restituiscono entità di tipo __kind__
il cui nome della chiave è il nome di un tipo di entità. Le query di questo tipo sono implicitamente limitate allo spazio dei nomi corrente e supportano il filtro solo per gli intervalli sulla pseudoproprietà __key__
. I risultati possono essere ordinati in ordine crescente (ma non decrescente)
in base al valore di __key__
. Poiché le entità __kind__
non hanno proprietà, sia le query solo con chiavi sia quelle senza chiavi restituiscono le stesse informazioni.
Il seguente esempio stampa tutti i tipi i cui nomi iniziano con una lettera minuscola:
Query sulle proprietà
Le query sulle proprietà restituiscono entità di tipo __property__
che indicano le
proprietà associate a un tipo di entità. L'entità che rappresenta la proprietà P di tipo K è strutturata nel seguente modo:
- La chiave dell'entità ha il tipo
__property__
e il nome della chiave P. - La chiave dell'entità padre ha il tipo
__kind__
e il nome della chiave K.
Il comportamento di una query di proprietà dipende dal fatto che si tratti di una query solo chiavi o di una query non solo chiavi (rappresentazione della proprietà), come descritto in dettaglio nelle sottosezioni seguenti.
Query sulle proprietà: solo chiavi
Le query sulle proprietà solo chiavi restituiscono una chiave per ogni proprietà indicizzata di un tipo di entità specificato. Le proprietà non indicizzate non sono incluse. L'esempio seguente stampa i nomi di tutti i tipi di entità di un'applicazione e le proprietà associate a ciascuno:
Le query di questo tipo sono implicitamente limitate allo spazio dei nomi corrente e
supportano il filtro solo per gli intervalli sulla pseudoproprietà __key__
, dove
le chiavi indicano entità __kind__
o __property__
. I risultati possono essere
ordinati in ordine crescente (ma non decrescente) in base al valore __key__
. Il filtro viene applicato
alle coppie tipo-proprietà, ordinate prima per tipo e poi per proprietà: ad esempio, supponiamo di avere un'entità con queste proprietà:
- tipo
Account
con proprietàbalance
company
- tipo
Employee
con proprietàname
ssn
- tipo
Invoice
con proprietàdate
amount
- tipo
Manager
con proprietàname
title
- tipo
Product
con proprietàdescription
price
La query per restituire i dati della proprietà avrebbe questo aspetto:
La query precedente restituirebbe quanto segue:
Employee: ssn
Invoice: date
Invoice: amount
Manager: name
Nota che i risultati non includono la proprietà name
di tipo Employee
e la proprietà title
di tipo Manager
, né alcuna proprietà di tipo
Account
e Product
, perché non rientrano nell'intervallo specificato per la
query.
Le query sulle proprietà supportano anche il filtro degli antenati su una chiave __kind__
o __property__
, per limitare i risultati della query a un singolo tipo o proprietà. Puoi utilizzarlo, ad esempio, per ottenere le proprietà associate a un determinato tipo di entità, come nel seguente esempio:
Query sulle proprietà: non solo chiavi (rappresentazione della proprietà)
Le query sulle proprietà non basate solo sulle chiavi, note come query di rappresentazione delle proprietà,
restituiscono informazioni aggiuntive sulle rappresentazioni utilizzate da ogni coppia tipo-proprietà. Le proprietà non indicizzate non sono incluse. L'entità restituita per la proprietà
P di tipo K ha la stessa chiave di una corrispondente
query solo chiavi,
insieme a una proprietà property_representation
aggiuntiva che restituisce le
rappresentazioni della proprietà. Il valore di questa proprietà è un'istanza della classe
java.util.Collection<String>
contenente una stringa per ogni rappresentazione della
proprietà P trovata in qualsiasi entità di tipo K.
Tieni presente che le rappresentazioni non sono uguali alle classi di proprietà; più
classi di proprietà possono essere mappate alla stessa rappresentazione. Ad esempio,
java.lang.String
e
com.google.appengine.api.datastore.PhoneNumber
utilizzano entrambe la rappresentazione STRING
.
La seguente tabella esegue la mappatura dalle classi di proprietà alle relative rappresentazioni:
Classe di proprietà | Rappresentazione |
---|---|
java.lang.Byte |
INT64 |
java.lang.Short |
INT64 |
java.lang.Integer |
INT64 |
java.lang.Long |
INT64 |
java.lang.Float |
DOUBLE |
java.lang.Double |
DOUBLE |
java.lang.Boolean |
BOOLEAN |
java.lang.String |
STRING |
com.google.appengine.api.datastore.ShortBlob |
STRING |
java.util.Date |
INT64 |
com.google.appengine.api.datastore.GeoPt |
POINT |
com.google.appengine.api.datastore.PostalAddress |
STRING |
com.google.appengine.api.datastore.PhoneNumber |
STRING |
com.google.appengine.api.datastore.Email |
STRING |
com.google.appengine.api.users.User |
USER |
com.google.appengine.api.datastore.IMHandle |
STRING |
com.google.appengine.api.datastore.Link |
STRING |
com.google.appengine.api.datastore.Category |
STRING |
com.google.appengine.api.datastore.Rating |
INT64 |
com.google.appengine.api.datastore.Key |
REFERENCE |
com.google.appengine.api.blobstore.BlobKey |
STRING |
java.util.Collection<T> |
Rappresentazione di T |
L'esempio seguente trova tutte le rappresentazioni di una proprietà specificata per un determinato tipo di entità: