Skip to content

Commit 3ded2c9

Browse files
samtsternkurtisvg
authored andcommitted
Add Firestore array snippets (#1207)
1 parent d72fd89 commit 3ded2c9

File tree

7 files changed

+102
-15
lines changed

7 files changed

+102
-15
lines changed

firestore/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
<dependency>
4646
<groupId>com.google.cloud</groupId>
4747
<artifactId>google-cloud-firestore</artifactId>
48-
<version>0.56.0-beta</version>
48+
<version>0.60.0-beta</version>
4949
</dependency>
5050
<!-- [END fs-maven] -->
5151

firestore/src/main/java/com/example/firestore/snippets/ManageDataSnippets.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.google.cloud.firestore.WriteBatch;
3131
import com.google.cloud.firestore.WriteResult;
3232
import java.util.ArrayList;
33+
import java.util.Arrays;
3334
import java.util.Collections;
3435
import java.util.HashMap;
3536
import java.util.List;
@@ -56,6 +57,7 @@ Map<String, Object> addSimpleDocumentAsMap() throws Exception {
5657
docData.put("name", "Los Angeles");
5758
docData.put("state", "CA");
5859
docData.put("country", "USA");
60+
docData.put("regions", Arrays.asList("west_coast", "socal"));
5961
// Add a new document (asynchronously) in collection "cities" with id "LA"
6062
ApiFuture<WriteResult> future = db.collection("cities").document("LA").set(docData);
6163
// ...
@@ -102,7 +104,8 @@ Map<String, Object> addDocumentWithDifferentDataTypes() throws Exception {
102104
*/
103105
City addSimpleDocumentAsEntity() throws Exception {
104106
// [START fs_add_simple_doc_as_entity]
105-
City city = new City("Los Angeles", "CA", "USA", false, 3900000L);
107+
City city = new City("Los Angeles", "CA", "USA", false, 3900000L,
108+
Arrays.asList("west_coast", "socal"));
106109
ApiFuture<WriteResult> future = db.collection("cities").document("LA").set(city);
107110
// block on response if required
108111
System.out.println("Update time : " + future.get().getUpdateTime());
@@ -258,6 +261,23 @@ void updateServerTimestamp() throws Exception {
258261
// [END fs_update_server_timestamp]
259262
}
260263

264+
/** Update array fields in a document. **/
265+
void updateDocumentArray() throws Exception {
266+
// [START fs_update_document_array]
267+
DocumentReference washingtonRef = db.collection("cities").document("DC");
268+
269+
// Atomically add a new region to the "regions" array field.
270+
ApiFuture<WriteResult> arrayUnion = washingtonRef.update("regions",
271+
FieldValue.arrayUnion("greater_virginia"));
272+
System.out.println("Update time : " + arrayUnion.get());
273+
274+
// Atomically remove a region from the "regions" array field.
275+
ApiFuture<WriteResult> arrayRm = washingtonRef.update("regions",
276+
FieldValue.arrayRemove("east_coast"));
277+
System.out.println("Update time : " + arrayRm.get());
278+
// [END fs_update_document_array]
279+
}
280+
261281
/** Delete specific fields when updating a document. */
262282
void deleteFields() throws Exception {
263283
City city = new City("Beijing");

firestore/src/main/java/com/example/firestore/snippets/QueryDataSnippets.java

+26-5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.google.cloud.firestore.WriteResult;
3030

3131
import java.util.ArrayList;
32+
import java.util.Arrays;
3233
import java.util.List;
3334

3435
/** Snippets to support firestore querying data documentation. */
@@ -46,14 +47,20 @@ class QueryDataSnippets {
4647
* @return collection reference
4748
*/
4849
void prepareExamples() throws Exception {
50+
4951
// [START fs_query_create_examples]
5052
CollectionReference cities = db.collection("cities");
5153
List<ApiFuture<WriteResult>> futures = new ArrayList<>();
52-
futures.add(cities.document("SF").set(new City("San Francisco", "CA", "USA", false, 860000L)));
53-
futures.add(cities.document("LA").set(new City("Los Angeles", "CA", "USA", false, 3900000L)));
54-
futures.add(cities.document("DC").set(new City("Washington D.C.", null, "USA", true, 680000L)));
55-
futures.add(cities.document("TOK").set(new City("Tokyo", null, "Japan", true, 9000000L)));
56-
futures.add(cities.document("BJ").set(new City("Beijing", null, "China", true, 21500000L)));
54+
futures.add(cities.document("SF").set(new City("San Francisco", "CA", "USA", false, 860000L,
55+
Arrays.asList("west_coast", "norcal"))));
56+
futures.add(cities.document("LA").set(new City("Los Angeles", "CA", "USA", false, 3900000L,
57+
Arrays.asList("west_coast", "socal"))));
58+
futures.add(cities.document("DC").set(new City("Washington D.C.", null, "USA", true, 680000L,
59+
Arrays.asList("east_coast"))));
60+
futures.add(cities.document("TOK").set(new City("Tokyo", null, "Japan", true, 9000000L,
61+
Arrays.asList("kanto", "honshu"))));
62+
futures.add(cities.document("BJ").set(new City("Beijing", null, "China", true, 21500000L,
63+
Arrays.asList("jingjinji", "hebei"))));
5764
// (optional) block on documents successfully added
5865
ApiFutures.allAsList(futures).get();
5966
// [END fs_query_create_examples]
@@ -122,6 +129,20 @@ List<Query> createSimpleQueries() {
122129
return querys;
123130
}
124131

132+
/**
133+
* Creates a query based on array containment.
134+
*
135+
* @return query
136+
*/
137+
Query createArrayQuery() {
138+
// [START fs_array_contains_filter]
139+
CollectionReference citiesRef = db.collection("cities");
140+
Query westCoastQuery = citiesRef.whereArrayContains("regions", "west_coast");
141+
// [END fs_array_contains_filter]
142+
143+
return westCoastQuery;
144+
}
145+
125146
/**
126147
* Creates chained where clauses.
127148
*

firestore/src/main/java/com/example/firestore/snippets/RetrieveDataSnippets.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.google.cloud.firestore.WriteResult;
3030

3131
import java.util.ArrayList;
32+
import java.util.Arrays;
3233
import java.util.List;
3334
import java.util.Map;
3435

@@ -46,11 +47,16 @@ void prepareExamples() throws Exception {
4647
// [START fs_retrieve_create_examples]
4748
CollectionReference cities = db.collection("cities");
4849
List<ApiFuture<WriteResult>> futures = new ArrayList<>();
49-
futures.add(cities.document("SF").set(new City("San Francisco", "CA", "USA", false, 860000L)));
50-
futures.add(cities.document("LA").set(new City("Los Angeles", "CA", "USA", false, 3900000L)));
51-
futures.add(cities.document("DC").set(new City("Washington D.C.", null, "USA", true, 680000L)));
52-
futures.add(cities.document("TOK").set(new City("Tokyo", null, "Japan", true, 9000000L)));
53-
futures.add(cities.document("BJ").set(new City("Beijing", null, "China", true, 21500000L)));
50+
futures.add(cities.document("SF").set(new City("San Francisco", "CA", "USA", false, 860000L,
51+
Arrays.asList("west_coast", "norcal"))));
52+
futures.add(cities.document("LA").set(new City("Los Angeles", "CA", "USA", false, 3900000L,
53+
Arrays.asList("west_coast", "socal"))));
54+
futures.add(cities.document("DC").set(new City("Washington D.C.", null, "USA", true, 680000L,
55+
Arrays.asList("east_coast"))));
56+
futures.add(cities.document("TOK").set(new City("Tokyo", null, "Japan", true, 9000000L,
57+
Arrays.asList("kanto", "honshu"))));
58+
futures.add(cities.document("BJ").set(new City("Beijing", null, "China", true, 21500000L,
59+
Arrays.asList("jingjinji", "hebei"))));
5460
// (optional) block on operation
5561
ApiFutures.allAsList(futures).get();
5662
// [END fs_retrieve_create_examples]

firestore/src/main/java/com/example/firestore/snippets/model/City.java

+23-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.example.firestore.snippets.model;
1818

19+
import java.util.List;
1920
import java.util.Objects;
2021

2122
/** Represents a city : name, weather, population, country, capital, geo coordinates. */
@@ -26,19 +27,22 @@ public class City {
2627
private String country;
2728
private Boolean capital;
2829
private Long population;
30+
private List<String> regions;
2931

3032
// [START fs_class_definition]
3133
public City() {
3234
// Must have a public no-argument constructor
3335
}
3436

3537
// Initialize all fields of a city
36-
public City(String name, String state, String country, Boolean capital, Long population) {
38+
public City(String name, String state, String country,
39+
Boolean capital, Long population, List<String> regions) {
3740
this.name = name;
3841
this.state = state;
3942
this.country = country;
4043
this.capital = capital;
4144
this.population = population;
45+
this.regions = regions;
4246
}
4347
// [END fs_class_definition]
4448

@@ -86,6 +90,14 @@ public void setPopulation(Long population) {
8690
this.population = population;
8791
}
8892

93+
public List<String> getRegions() {
94+
return regions;
95+
}
96+
97+
public void setRegions(List<String> regions) {
98+
this.regions = regions;
99+
}
100+
89101
private String getDefinedValue(String s) {
90102
if (s != null) {
91103
return s;
@@ -120,6 +132,14 @@ public String toString() {
120132
sb.append(capital);
121133
sb.append(",");
122134
}
135+
if (regions != null) {
136+
sb.append(" regions : [");
137+
for (String r : regions) {
138+
sb.append(r);
139+
sb.append(", ");
140+
}
141+
sb.append("],");
142+
}
123143
//remove trailing comma
124144
if (sb.lastIndexOf(",") >= sb.length() - 1) {
125145
sb.deleteCharAt(sb.length() - 1);
@@ -138,7 +158,7 @@ public boolean equals(Object obj) {
138158
&& Objects.equals(state, city.state)
139159
&& Objects.equals(country, city.country)
140160
&& Objects.equals(population, city.population)
141-
&& Objects.equals(capital, city.capital);
142-
161+
&& Objects.equals(capital, city.capital)
162+
&& Objects.equals(regions, city.regions);
143163
}
144164
}

firestore/src/test/java/com/example/firestore/snippets/ManageDataSnippetsIT.java

+10
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,16 @@ public void testUpdateServerTimestamp() throws Exception {
129129
assertTrue(data.get("timestamp") instanceof Date);
130130
}
131131

132+
@Test
133+
public void testUpdateDocumentArray() throws Exception {
134+
manageDataSnippets.updateDocumentArray();
135+
DocumentReference docRef = db.collection("cities").document("DC");
136+
City city = getDocumentDataAsCity(docRef);
137+
assertTrue(city.getRegions().contains("greater_virginia"));
138+
assertTrue(!city.getRegions().contains("east_coast"));
139+
}
140+
141+
132142
@Test
133143
public void testDeleteFields() throws Exception {
134144
manageDataSnippets.deleteFields();

firestore/src/test/java/com/example/firestore/snippets/QueryDataSnippetsIT.java

+10
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@ public void testSimpleQueryReturnsExpectedResults() throws Exception {
7474
}
7575
}
7676

77+
@Test
78+
public void testArrayQueryReturnsExpectedResults() throws Exception {
79+
Set<String> expected = new HashSet<>(Arrays.asList("SF", "LA"));
80+
81+
Query query = queryDataSnippets.createArrayQuery();
82+
Set<String> results = getResultsAsSet(query);
83+
84+
assertTrue(Objects.equals(results, expected));
85+
}
86+
7787
@Test
7888
public void testChainedQuery() throws Exception {
7989
Query q = queryDataSnippets.createChainedQuery();

0 commit comments

Comments
 (0)