Class: Google::Cloud::Datastore::Dataset
- Inherits:
-
Object
- Object
- Google::Cloud::Datastore::Dataset
- Defined in:
- lib/google/cloud/datastore/dataset.rb,
lib/google/cloud/datastore/dataset/query_results.rb,
lib/google/cloud/datastore/dataset/lookup_results.rb
Overview
Dataset
Dataset is the data saved in a project's Datastore. Dataset is analogous to a database in relational database world.
Dataset is the main object for interacting with Google Datastore. Entity objects are created, read, updated, and deleted by Dataset.
Direct Known Subclasses
Defined Under Namespace
Classes: LookupResults, QueryResults
Instance Method Summary collapse
-
#allocate_ids(incomplete_key, count = 1) ⇒ Array<Google::Cloud::Datastore::Key>
Generate IDs for a Key before creating an entity.
-
#commit {|commit| ... } ⇒ Array<Google::Cloud::Datastore::Entity>
Make multiple changes in a single commit.
-
#delete(*entities_or_keys) ⇒ Boolean
Remove entities from the Datastore.
-
#entity(*key_or_path, project: nil, namespace: nil) {|entity| ... } ⇒ Google::Cloud::Datastore::Entity
Create a new empty Entity instance.
-
#find(key_or_kind, id_or_name = nil, consistency: nil) ⇒ Google::Cloud::Datastore::Entity?
(also: #get)
Retrieve an entity by key.
-
#find_all(*keys, consistency: nil) ⇒ Google::Cloud::Datastore::Dataset::LookupResults
(also: #lookup)
Retrieve the entities for the provided keys.
-
#gql(query, bindings = {}) ⇒ Google::Cloud::Datastore::GqlQuery
Create a new GqlQuery instance.
-
#insert(*entities) ⇒ Array<Google::Cloud::Datastore::Entity>
Insert one or more entities to the Datastore.
-
#key(*path, project: nil, namespace: nil) ⇒ Google::Cloud::Datastore::Key
Create a new Key instance.
-
#project_id ⇒ Object
(also: #project)
The Datastore project connected to.
-
#query(*kinds) ⇒ Google::Cloud::Datastore::Query
Create a new Query instance.
-
#read_only_transaction {|tx| ... } ⇒ Object
(also: #snapshot)
Creates a read-only transaction that provides a consistent snapshot of Cloud Datastore.
-
#run(query, namespace: nil, consistency: nil) ⇒ Google::Cloud::Datastore::Dataset::QueryResults
(also: #run_query)
Retrieve entities specified by a Query.
-
#save(*entities) ⇒ Array<Google::Cloud::Datastore::Entity>
(also: #upsert)
Persist one or more entities to the Datastore.
-
#transaction(deadline: nil, previous_transaction: nil) {|tx| ... } ⇒ Object
Creates a Datastore Transaction.
-
#update(*entities) ⇒ Array<Google::Cloud::Datastore::Entity>
Update one or more entities to the Datastore.
Instance Method Details
#allocate_ids(incomplete_key, count = 1) ⇒ Array<Google::Cloud::Datastore::Key>
Generate IDs for a Key before creating an entity.
113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/google/cloud/datastore/dataset.rb', line 113 def allocate_ids incomplete_key, count = 1 if incomplete_key.complete? fail Google::Cloud::Datastore::KeyError, "An incomplete key must be provided." end ensure_service! incomplete_keys = count.times.map { incomplete_key.to_grpc } allocate_res = service.allocate_ids(*incomplete_keys) allocate_res.keys.map { |key| Key.from_grpc key } end |
#commit {|commit| ... } ⇒ Array<Google::Cloud::Datastore::Entity>
Make multiple changes in a single commit.
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
# File 'lib/google/cloud/datastore/dataset.rb', line 300 def commit return unless block_given? c = Commit.new yield c ensure_service! commit_res = service.commit c.mutations entities = c.entities returned_keys = commit_res.mutation_results.map(&:key) returned_keys.each_with_index do |key, index| next if entities[index].nil? entities[index].key = Key.from_grpc(key) unless key.nil? end entities.each { |e| e.key.freeze unless e.persisted? } entities end |
#delete(*entities_or_keys) ⇒ Boolean
Remove entities from the Datastore.
276 277 278 279 |
# File 'lib/google/cloud/datastore/dataset.rb', line 276 def delete *entities_or_keys commit { |c| c.delete(*entities_or_keys) } true end |
#entity(*key_or_path, project: nil, namespace: nil) {|entity| ... } ⇒ Google::Cloud::Datastore::Entity
Create a new empty Entity instance. This is a convenience method to make the creation of Entity objects easier.
867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
# File 'lib/google/cloud/datastore/dataset.rb', line 867 def entity *key_or_path, project: nil, namespace: nil entity = Entity.new # Set the key if key_or_path.flatten.first.is_a? Google::Cloud::Datastore::Key entity.key = key_or_path.flatten.first else entity.key = key key_or_path, project: project, namespace: namespace end yield entity if block_given? entity end |
#find(key_or_kind, id_or_name = nil, consistency: nil) ⇒ Google::Cloud::Datastore::Entity? Also known as: get
Retrieve an entity by key.
349 350 351 352 353 354 355 |
# File 'lib/google/cloud/datastore/dataset.rb', line 349 def find key_or_kind, id_or_name = nil, consistency: nil key = key_or_kind unless key.is_a? Google::Cloud::Datastore::Key key = Key.new key_or_kind, id_or_name end find_all(key, consistency: consistency).first end |
#find_all(*keys, consistency: nil) ⇒ Google::Cloud::Datastore::Dataset::LookupResults Also known as: lookup
Retrieve the entities for the provided keys. The order of results is
undefined and has no relation to the order of keys
arguments.
383 384 385 386 387 388 389 |
# File 'lib/google/cloud/datastore/dataset.rb', line 383 def find_all *keys, consistency: nil ensure_service! check_consistency! consistency lookup_res = service.lookup(*Array(keys).flatten.map(&:to_grpc), consistency: consistency) LookupResults.from_grpc lookup_res, service, consistency end |
#gql(query, bindings = {}) ⇒ Google::Cloud::Datastore::GqlQuery
Create a new GqlQuery instance. This is a convenience method to make the creation of GqlQuery objects easier.
693 694 695 696 697 698 |
# File 'lib/google/cloud/datastore/dataset.rb', line 693 def gql query, bindings = {} gql = GqlQuery.new gql.query_string = query gql.named_bindings = bindings unless bindings.empty? gql end |
#insert(*entities) ⇒ Array<Google::Cloud::Datastore::Entity>
Insert one or more entities to the Datastore. An InvalidArgumentError will raised if the entities cannot be inserted.
226 227 228 |
# File 'lib/google/cloud/datastore/dataset.rb', line 226 def insert *entities commit { |c| c.insert(*entities) } end |
#key(*path, project: nil, namespace: nil) ⇒ Google::Cloud::Datastore::Key
Create a new Key instance. This is a convenience method to make the creation of Key objects easier.
783 784 785 786 787 788 789 790 791 792 793 |
# File 'lib/google/cloud/datastore/dataset.rb', line 783 def key *path, project: nil, namespace: nil path = path.flatten.each_slice(2).to_a # group in pairs kind, id_or_name = path.pop Key.new(kind, id_or_name).tap do |k| k.project = project k.namespace = namespace unless path.empty? k.parent = key path, project: project, namespace: namespace end end end |
#project_id ⇒ Object Also known as: project
The Datastore project connected to.
82 83 84 |
# File 'lib/google/cloud/datastore/dataset.rb', line 82 def project_id service.project end |
#query(*kinds) ⇒ Google::Cloud::Datastore::Query
Create a new Query instance. This is a convenience method to make the creation of Query objects easier.
656 657 658 659 660 |
# File 'lib/google/cloud/datastore/dataset.rb', line 656 def query *kinds query = Query.new query.kind(*kinds) unless kinds.empty? query end |
#read_only_transaction {|tx| ... } ⇒ Object Also known as: snapshot
Creates a read-only transaction that provides a consistent snapshot of Cloud Datastore. This can be useful when multiple reads are needed to render a page or export data that must be consistent.
A read-only transaction cannot modify entities; in return they do not contend with other read-write or read-only transactions. Using a read-only transaction for transactions that only read data will potentially improve throughput.
Read-only single-group transactions never fail due to concurrent modifications, so you don't have to implement retries upon failure. However, multi-entity-group transactions can fail due to concurrent modifications, so these should have retries.
610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 |
# File 'lib/google/cloud/datastore/dataset.rb', line 610 def read_only_transaction tx = ReadOnlyTransaction.new service return tx unless block_given? begin yield tx tx.commit rescue begin tx.rollback rescue raise TransactionError, "Transaction failed to commit and rollback." end raise TransactionError, "Transaction failed to commit." end end |
#run(query, namespace: nil, consistency: nil) ⇒ Google::Cloud::Datastore::Dataset::QueryResults Also known as: run_query
Retrieve entities specified by a Query.
455 456 457 458 459 460 461 462 463 464 465 |
# File 'lib/google/cloud/datastore/dataset.rb', line 455 def run query, namespace: nil, consistency: nil ensure_service! unless query.is_a?(Query) || query.is_a?(GqlQuery) fail ArgumentError, "Cannot run a #{query.class} object." end check_consistency! consistency query_res = service.run_query query.to_grpc, namespace, consistency: consistency QueryResults.from_grpc query_res, service, namespace, query.to_grpc.dup end |
#save(*entities) ⇒ Array<Google::Cloud::Datastore::Entity> Also known as: upsert
Persist one or more entities to the Datastore.
177 178 179 |
# File 'lib/google/cloud/datastore/dataset.rb', line 177 def save *entities commit { |c| c.save(*entities) } end |
#transaction(deadline: nil, previous_transaction: nil) {|tx| ... } ⇒ Object
Creates a Datastore Transaction.
Transactions using the block syntax are committed upon block completion and are automatically retried when known errors are raised during commit. All other errors will be passed on.
All changes are accumulated in memory until the block completes.
Transactions will be automatically retried when possible, until
deadline
is reached. This operation makes separate API requests to
begin and commit the transaction.
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 |
# File 'lib/google/cloud/datastore/dataset.rb', line 538 def transaction deadline: nil, previous_transaction: nil deadline = validate_deadline deadline backoff = 1.0 start_time = Time.now tx = Transaction.new \ service, previous_transaction: previous_transaction return tx unless block_given? begin yield tx tx.commit rescue Google::Cloud::UnavailableError => err # Re-raise if deadline has passed raise err if Time.now - start_time > deadline # Sleep with incremental backoff sleep(backoff *= 1.3) # Create new transaction and retry the block tx = Transaction.new service, previous_transaction: tx.id retry rescue begin tx.rollback rescue raise TransactionError, "Transaction failed to commit and rollback." end raise TransactionError, "Transaction failed to commit." end end |
#update(*entities) ⇒ Array<Google::Cloud::Datastore::Entity>
Update one or more entities to the Datastore. An InvalidArgumentError will raised if the entities cannot be updated.
257 258 259 |
# File 'lib/google/cloud/datastore/dataset.rb', line 257 def update *entities commit { |c| c.update(*entities) } end |