Datastore fornisce l'accesso programmatico ad alcuni dei suoi metadati per supportare la metaprogrammazione, implementare funzioni amministrative di backend, semplificare la memorizzazione nella cache e altri scopi simili. Puoi utilizzarla, ad esempio, per creare un visualizzatore Datastore personalizzato per la tua applicazione. I metadati disponibili includono informazioni sui gruppi di entità, gli spazi dei nomi, i tipi di entità e le proprietà utilizzate dall'applicazione, nonché le rappresentazioni delle proprietà per ciascuna proprietà.
La dashboard di Datastore in Cloud Console fornisce anche alcuni metadati sulla tua applicazione, ma i dati visualizzati in questa sezione differiscono in alcuni aspetti importanti rispetto a quelli restituiti da queste funzioni.
- attualità. La lettura dei metadati tramite l'API riceve i dati correnti, mentre i dati nella dashboard vengono aggiornati una sola volta al giorno.
- Sommario. Alcuni metadati nella dashboard non sono disponibili mediante le API; è vero anche il contrario.
- Velocità. Le query relative ai metadati e le query vengono fatturate allo stesso modo delle query e dei dati di Datastore. Generalmente, l'esecuzione delle query di metadati che recuperano informazioni su spazi dei nomi, tipi e proprietà è lenta. Come regola generale, è prevista una query di metadati che restituisce N entità all'incirca alla stessa ora di N query ordinarie che restituiscono ognuna una singola entità. Inoltre, le query di rappresentazione delle proprietà (query relative alle proprietà solo senza chiavi) sono più lente rispetto alle query sulle proprietà solo per le chiavi. I metadati dei metadati dei gruppi di entità sono in tempi più rapidi rispetto a quelli delle entità normali.
Metadati gruppo di entità
Cloud Datastore fornisce l'accesso alla "versione" di un gruppo di entità, un numero strettamente positivo garantito a un incremento a ogni modifica del gruppo di entità.
Le versioni dei gruppi di entità si ottengono chiamando get()
su una pseudo-entità speciale che contiene una proprietà __version__
rigorosamente positiva. La chiave pseudo-entità può essere creata utilizzando il metodo Entities.createEntityGroupKey()
:
Comportamento precedente
Nel comportamento delle versioni dei gruppi di entità legacy, la versione del gruppo di entità aumenta solo a seguito di modifiche apportate al gruppo di entità. Potrebbe essere utilizzato il comportamento dei metadati del gruppo di entità legacy, ad esempio per mantenere una cache coerente di una query complessa predecessore su un gruppo di entità.
Questo esempio memorizza nella cache i risultati delle 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 è corrente:
__entity_group__
non possono esistere entità per 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 contrassegnate 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 sono in conflitto con altri nomi uguali che potrebbero già esistere nella tua applicazione. Se esegui query su questi tipi speciali, puoi recuperare le entità contenenti i metadati desiderati.
Le entità restituite dalle query sui metadati vengono generate in modo dinamico in base allo stato attuale di Datastore. Anche se puoi creare oggetti
Entity
locali di tipo __namespace__
, __kind__
o
__property__
, qualsiasi tentativo di
archiviarli in Datastore non andrà a buon fine con
IllegalArgumentException
.
Il modo più semplice per eseguire query sui metadati è utilizzare l'API Datastore di basso livello. Il seguente esempio stampa i nomi di tutti gli spazi dei nomi di un'applicazione:
Query sullo spazio dei nomi
Se l'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ò 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__
il cui nome chiave è il nome di uno spazio dei nomi. Fa eccezione lo spazio dei nomi predefinito
classificato dalla stringa vuota ""
: poiché la stringa vuota non è un nome di chiave
valido, questo spazio dei nomi è assegnato con l'ID numerico 1
. Le query di questo
tipo supportano il filtro solo per intervalli oltre la pseudo-proprietà speciale
__key__
, il cui valore è la chiave dell'entità. I risultati possono essere ordinati in base al valore di __key__
in senso crescente (ma non in ordine decrescente). Poiché le entità __namespace__
non hanno proprietà, sia le query basate solo su chiavi sia quelle senza chiavi restituiscono le stesse informazioni.
L'esempio seguente restituisce un elenco di spazi dei nomi di un'applicazione tra due nomi specificati, start
e end
:
Query tipi
Le query di tipo restituiscono entità di tipo __kind__
il cui nome chiave è quello di un tipo di entità. Le query di questo tipo sono implicitamente limitate allo spazio dei nomi attuale e supportano l'applicazione di filtri solo per intervalli oltre la proprietà pseudo__key__
. I risultati possono essere ordinati in base al valore __key__
(crescente, ma non decrescente). Poiché le entità __kind__
non hanno proprietà, le query solo chiavi e quelle non chiavi restituiscono le stesse informazioni.
L'esempio seguente stampa tutti i tipi i cui nomi iniziano con una lettera minuscola:
Query sulla proprietà
Le query di 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 è creata come segue:
- La chiave dell'entità ha il tipo
__property__
e il nome della chiave P. - La chiave dell'entità principale è di tipo
__kind__
e ha il nome della chiave K.
Il comportamento di una query di una proprietà dipende dal fatto che sia una query di tipo solo chiavi o non chiavi (rappresentazione della proprietà), come descritto in dettaglio nelle sottosezioni seguenti.
Query proprietà: solo chiavi
Le query di proprietà solo con chiave 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à dell'applicazione e le proprietà associate a ciascuno:
Le query di questo tipo sono implicitamente limitate allo spazio dei nomi attuale
e supportano l'applicazione di filtri solo per intervalli oltre la pseudoproprietà __key__
, dove le
chiavi indicano entità __kind__
o __property__
. I risultati possono essere
ordinati per valore __key__
crescente (ma non decrescente). L'applicazione di filtri viene applicata alle coppie tipo-proprietà, ordinate prima per tipo e seconda per proprietà: ad esempio, supponi 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 delle proprietà avrebbe il seguente aspetto:
La query precedente restituirà quanto segue:
Employee: ssn
Invoice: date
Invoice: amount
Manager: name
Tieni presente che i risultati non includono la proprietà name
di tipo Employee
e la proprietà title
di tipo Manager
, né le proprietà di tipo Account
e Product
, perché non rientrano nell'intervallo specificato per la query.
Le query relative alle proprietà supportano anche il filtro dei predecessori su una chiave __kind__
o __property__
per limitare i risultati delle query a un singolo tipo o a una proprietà. Puoi utilizzarla, ad esempio, per ottenere le proprietà associate a una determinata entità, come nell'esempio seguente:
Query proprietà: solo chiavi (rappresentazione proprietà)
Le query di proprietà non basate su chiavi, note come query di rappresentazione delle proprietà,
restituiscono informazioni aggiuntive sulle rappresentazioni utilizzate da ogni coppia di
proprietà. Le proprietà non indicizzate non sono incluse. L'entità restituita per la proprietà P di tipo K ha la stessa chiave di una query di sola chiave corrispondente, insieme a una proprietà property_representation
aggiuntiva che restituisce le rappresentazioni della proprietà. Il valore di questa proprietà è un'istanza di 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 le stesse delle 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 entrambi la rappresentazione STRING
.
La tabella seguente mappa le classi di proprietà alle rispettive 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à: