lib/gcloud/bigquery/dataset/list.rb in gcloud-0.10.0 vs lib/gcloud/bigquery/dataset/list.rb in gcloud-0.11.0
- old
+ new
@@ -28,23 +28,145 @@
# A hash of this page of results.
attr_accessor :etag
##
- # Create a new Dataset::List with an array of datasets.
+ # @private Create a new Dataset::List with an array of datasets.
def initialize arr = []
super arr
end
##
+ # Whether there is a next page of datasets.
+ #
+ # @return [Boolean]
+ #
+ # @example
+ # require "gcloud"
+ #
+ # gcloud = Gcloud.new
+ # bigquery = gcloud.bigquery
+ #
+ # datasets = bigquery.datasets
+ # if datasets.next?
+ # next_datasets = datasets.next
+ # end
+ def next?
+ !token.nil?
+ end
+
+ ##
+ # Retrieve the next page of datasets.
+ #
+ # @return [Dataset::List]
+ #
+ # @example
+ # require "gcloud"
+ #
+ # gcloud = Gcloud.new
+ # bigquery = gcloud.bigquery
+ #
+ # datasets = bigquery.datasets
+ # if datasets.next?
+ # next_datasets = datasets.next
+ # end
+ def next
+ return nil unless next?
+ ensure_connection!
+ options = { all: @hidden, token: token, max: @max }
+ resp = @connection.list_datasets options
+ if resp.success?
+ self.class.from_response resp, @connection
+ else
+ fail ApiError.from_response(resp)
+ end
+ end
+
+ ##
+ # Retrieves all datasets by repeatedly loading {#next} until {#next?}
+ # returns `false`. Calls the given block once for each dataset, which is
+ # passed as the parameter.
+ #
+ # An Enumerator is returned if no block is given.
+ #
+ # This method may make several API calls until all datasets are
+ # retrieved. Be sure to use as narrow a search criteria as possible.
+ # Please use with caution.
+ #
+ # @param [Integer] request_limit The upper limit of API requests to make
+ # to load all datasets. Default is no limit.
+ # @yield [dataset] The block for accessing each dataset.
+ # @yieldparam [Dataset] dataset The dataset object.
+ #
+ # @return [Enumerator]
+ #
+ # @example Iterating each result by passing a block:
+ # require "gcloud"
+ #
+ # gcloud = Gcloud.new
+ # bigquery = gcloud.bigquery
+ #
+ # bigquery.datasets.all do |dataset|
+ # puts dataset.name
+ # end
+ #
+ # @example Using the enumerator by not passing a block:
+ # require "gcloud"
+ #
+ # gcloud = Gcloud.new
+ # bigquery = gcloud.bigquery
+ #
+ # all_names = bigquery.datasets.all.map do |dataset|
+ # dataset.name
+ # end
+ #
+ # @example Limit the number of API calls made:
+ # require "gcloud"
+ #
+ # gcloud = Gcloud.new
+ # bigquery = gcloud.bigquery
+ #
+ # bigquery.datasets.all(request_limit: 10) do |dataset|
+ # puts dataset.name
+ # end
+ #
+ def all request_limit: nil
+ request_limit = request_limit.to_i if request_limit
+ unless block_given?
+ return enum_for(:all, request_limit: request_limit)
+ end
+ results = self
+ loop do
+ results.each { |r| yield r }
+ if request_limit
+ request_limit -= 1
+ break if request_limit < 0
+ end
+ break unless results.next?
+ results = results.next
+ end
+ end
+
+ ##
# @private New Dataset::List from a response object.
- def self.from_response resp, conn
+ def self.from_response resp, conn, hidden = nil, max = nil
datasets = List.new(Array(resp.data["datasets"]).map do |gapi_object|
Dataset.from_gapi gapi_object, conn
end)
datasets.instance_variable_set "@token", resp.data["nextPageToken"]
datasets.instance_variable_set "@etag", resp.data["etag"]
+ datasets.instance_variable_set "@connection", conn
+ datasets.instance_variable_set "@hidden", hidden
+ datasets.instance_variable_set "@max", max
datasets
+ end
+
+ protected
+
+ ##
+ # Raise an error unless an active connection is available.
+ def ensure_connection!
+ fail "Must have active connection" unless @connection
end
end
end
end
end