-
Notifications
You must be signed in to change notification settings - Fork 544
/
paginate_data.rb
136 lines (115 loc) · 5.11 KB
/
paginate_data.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# Copyright 2020 Google, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "google/cloud/firestore"
def start_at_field_query_cursor project_id:, collection_path: "cities"
# project_id = "Your Google Cloud Project ID"
# collection_path = "cities"
firestore = Google::Cloud::Firestore.new project_id: project_id
cities_ref = firestore.col collection_path
# [START firestore_query_cursor_start_at_field_value_single]
query = cities_ref.order("population").start_at(1_000_000)
# [END firestore_query_cursor_start_at_field_value_single]
query.get do |city|
puts "Document #{city.document_id} returned by start at population 1000000 field query cursor."
end
end
def end_at_field_query_cursor project_id:, collection_path: "cities"
# project_id = "Your Google Cloud Project ID"
# collection_path = "cities"
firestore = Google::Cloud::Firestore.new project_id: project_id
cities_ref = firestore.col collection_path
# [START firestore_query_cursor_end_at_field_value_single]
query = cities_ref.order("population").end_at(1_000_000)
# [END firestore_query_cursor_end_at_field_value_single]
query.get do |city|
puts "Document #{city.document_id} returned by end at population 1000000 field query cursor."
end
end
def paginated_query_cursor project_id:, collection_path: "cities"
# project_id = "Your Google Cloud Project ID"
# collection_path = "cities"
firestore = Google::Cloud::Firestore.new project_id: project_id
# [START firestore_query_cursor_pagination]
cities_ref = firestore.col collection_path
first_query = cities_ref.order("population").limit(3)
# Get the last document from the results.
last_population = 0
first_query.get do |city|
last_population = city.data[:population]
end
# Construct a new query starting at this document.
# Note: this will not have the desired effect if multiple cities have the exact same population value.
second_query = cities_ref.order("population").start_after(last_population)
second_query.get do |city|
puts "Document #{city.document_id} returned by paginated query cursor."
end
# [END firestore_query_cursor_pagination]
end
def multiple_cursor_conditions project_id:, collection_path: "cities"
# project_id = "Your Google Cloud Project ID"
# collection_path = "cities"
firestore = Google::Cloud::Firestore.new project_id: project_id
cities_ref = firestore.col collection_path
# [START firestore_query_cursor_start_at_field_value_multi]
# Will return all Springfields
query1 = firestore.col(collection_path).order("name").order("state").start_at("Springfield")
# Will return "Springfield, Missouri" and "Springfield, Wisconsin"
query2 = firestore.col(collection_path).order("name").order("state").start_at(["Springfield", "Missouri"])
# [END firestore_query_cursor_start_at_field_value_multi]
query1.get do |city|
puts "Document #{city.document_id} returned by start at Springfield query."
end
query2.get do |city|
puts "Document #{city.document_id} returned by start at Springfield, Missouri query."
end
end
def start_at_snapshot_query_cursor project_id:, collection_path: "cities"
# project_id = "Your Google Cloud Project ID"
# collection_path = "cities"
firestore = Google::Cloud::Firestore.new project_id: project_id
cities_ref = firestore.col collection_path
# [START firestore_query_cursor_start_at_document]
doc_ref = firestore.doc "#{collection_path}/SF"
snapshot = doc_ref.get
query = cities_ref.order("population").start_at(snapshot)
# [END firestore_query_cursor_start_at_document]
query.get do |city|
puts "Document #{city.document_id} returned by start at document snapshot query cursor."
end
end
if $PROGRAM_NAME == __FILE__
project = ENV["FIRESTORE_PROJECT"]
case ARGV.shift
when "start_at_field_query_cursor"
start_at_field_query_cursor project_id: project
when "end_at_field_query_cursor"
end_at_field_query_cursor project_id: project
when "paginated_query_cursor"
paginated_query_cursor project_id: project
when "multiple_cursor_conditions"
multiple_cursor_conditions project_id: project
when "start_at_snapshot_query_cursor"
start_at_snapshot_query_cursor project_id: project
else
puts <<~USAGE
Usage: bundle exec ruby paginate_data.rb [command]
Commands:
start_at_field_query_cursor Define field start point for a query.
end_at_field_query_cursor Define field end point for a query.
paginated_query_cursor Paginate using query cursors.
multiple_cursor_conditions Set multiple cursor conditions.
start_at_snapshot_query_cursor Define document snapshot start point for a query.
USAGE
end
end