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.
102 103 104 105 106 107 108 109 110 111 |
# File 'lib/google/cloud/datastore/dataset.rb', line 102 def allocate_ids incomplete_key, count = 1 if incomplete_key.complete? raise Datastore::KeyError, "An incomplete key must be provided." end ensure_service! incomplete_keys = Array.new(count) { 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.
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 |
# File 'lib/google/cloud/datastore/dataset.rb', line 288 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.
264 265 266 267 |
# File 'lib/google/cloud/datastore/dataset.rb', line 264 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.
855 856 857 858 859 860 861 862 863 864 865 866 867 868 |
# File 'lib/google/cloud/datastore/dataset.rb', line 855 def entity *key_or_path, project: nil, namespace: nil entity = Entity.new # Set the key entity.key = if key_or_path.flatten.first.is_a? Datastore::Key key_or_path.flatten.first else 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.
337 338 339 340 341 342 343 |
# File 'lib/google/cloud/datastore/dataset.rb', line 337 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.
371 372 373 374 375 376 377 |
# File 'lib/google/cloud/datastore/dataset.rb', line 371 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.
681 682 683 684 685 686 |
# File 'lib/google/cloud/datastore/dataset.rb', line 681 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.
214 215 216 |
# File 'lib/google/cloud/datastore/dataset.rb', line 214 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.
771 772 773 774 775 776 777 778 779 780 781 |
# File 'lib/google/cloud/datastore/dataset.rb', line 771 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.
81 82 83 |
# File 'lib/google/cloud/datastore/dataset.rb', line 81 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.
644 645 646 647 648 |
# File 'lib/google/cloud/datastore/dataset.rb', line 644 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.
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 |
# File 'lib/google/cloud/datastore/dataset.rb', line 598 def read_only_transaction tx = ReadOnlyTransaction.new service return tx unless block_given? begin yield tx tx.commit rescue StandardError begin tx.rollback rescue StandardError 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.
443 444 445 446 447 448 449 450 451 452 453 |
# File 'lib/google/cloud/datastore/dataset.rb', line 443 def run query, namespace: nil, consistency: nil ensure_service! unless query.is_a?(Query) || query.is_a?(GqlQuery) raise 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.
165 166 167 |
# File 'lib/google/cloud/datastore/dataset.rb', line 165 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.
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 |
# File 'lib/google/cloud/datastore/dataset.rb', line 526 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 StandardError begin tx.rollback rescue StandardError 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.
245 246 247 |
# File 'lib/google/cloud/datastore/dataset.rb', line 245 def update *entities commit { |c| c.update(*entities) } end |