Skip to content

Commit 801a1e6

Browse files
Migrate ArrayTransforms to use Values
1 parent 82c0095 commit 801a1e6

File tree

9 files changed

+56
-38
lines changed

9 files changed

+56
-38
lines changed

firebase-firestore/src/main/java/com/google/firebase/firestore/Query.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.google.firebase.firestore.model.value.ServerTimestampValue;
4646
import com.google.firebase.firestore.util.Executors;
4747
import com.google.firebase.firestore.util.Util;
48+
import com.google.firestore.v1.Value;
4849
import java.util.ArrayList;
4950
import java.util.Arrays;
5051
import java.util.List;
@@ -336,9 +337,9 @@ private Query whereHelper(@NonNull FieldPath fieldPath, Operator op, Object valu
336337
+ "' queries on FieldPath.documentId().");
337338
} else if (op == Operator.IN) {
338339
validateDisjunctiveFilterElements(value, op);
339-
List<FieldValue> referenceList = new ArrayList<>();
340+
List<Value> referenceList = new ArrayList<>();
340341
for (Object arrayValue : (List) value) {
341-
referenceList.add(parseDocumentIdValue(arrayValue));
342+
referenceList.add(parseDocumentIdValue(arrayValue).getProto());
342343
}
343344
fieldValue = ArrayValue.fromList(referenceList);
344345
} else {

firebase-firestore/src/main/java/com/google/firebase/firestore/UserDataReader.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -357,13 +357,13 @@ private void parseSentinelFieldValue(
357357
context.addToFieldTransforms(context.getPath(), ServerTimestampOperation.getInstance());
358358

359359
} else if (value instanceof ArrayUnionFieldValue) {
360-
List<FieldValue> parsedElements =
360+
List<Value> parsedElements =
361361
parseArrayTransformElements(((ArrayUnionFieldValue) value).getElements());
362362
ArrayTransformOperation arrayUnion = new ArrayTransformOperation.Union(parsedElements);
363363
context.addToFieldTransforms(context.getPath(), arrayUnion);
364364

365365
} else if (value instanceof ArrayRemoveFieldValue) {
366-
List<FieldValue> parsedElements =
366+
List<Value> parsedElements =
367367
parseArrayTransformElements(((ArrayRemoveFieldValue) value).getElements());
368368
ArrayTransformOperation arrayRemove = new ArrayTransformOperation.Remove(parsedElements);
369369
context.addToFieldTransforms(context.getPath(), arrayRemove);
@@ -464,17 +464,17 @@ private Value parseTimestamp(Timestamp timestamp) {
464464
.build();
465465
}
466466

467-
private List<FieldValue> parseArrayTransformElements(List<Object> elements) {
467+
private List<Value> parseArrayTransformElements(List<Object> elements) {
468468
ParseAccumulator accumulator = new ParseAccumulator(UserData.Source.Argument);
469469

470-
ArrayList<FieldValue> result = new ArrayList<>(elements.size());
470+
List<Value> result = new ArrayList<>(elements.size());
471471
for (int i = 0; i < elements.size(); i++) {
472472
Object element = elements.get(i);
473473
// Although array transforms are used with writes, the actual elements
474474
// being unioned or removed are not considered writes since they cannot
475475
// contain any FieldValue sentinels, etc.
476476
ParseContext context = accumulator.rootContext();
477-
result.add(FieldValue.valueOf(convertAndParseFieldData(element, context.childContext(i))));
477+
result.add(convertAndParseFieldData(element, context.childContext(i)));
478478
}
479479
return result;
480480
}

firebase-firestore/src/main/java/com/google/firebase/firestore/model/mutation/ArrayTransformOperation.java

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818
import com.google.firebase.Timestamp;
1919
import com.google.firebase.firestore.model.value.ArrayValue;
2020
import com.google.firebase.firestore.model.value.FieldValue;
21+
import com.google.firebase.firestore.model.value.ProtoValues;
22+
import com.google.firestore.v1.Value;
2123
import java.util.ArrayList;
2224
import java.util.Collections;
25+
import java.util.Iterator;
2326
import java.util.List;
2427

2528
/**
@@ -28,13 +31,13 @@
2831
* <p>Implementations are: ArrayTransformOperation.Union and ArrayTransformOperation.Remove
2932
*/
3033
public abstract class ArrayTransformOperation implements TransformOperation {
31-
private final List<FieldValue> elements;
34+
private final List<Value> elements;
3235

33-
ArrayTransformOperation(List<FieldValue> elements) {
36+
ArrayTransformOperation(List<Value> elements) {
3437
this.elements = Collections.unmodifiableList(elements);
3538
}
3639

37-
public List<FieldValue> getElements() {
40+
public List<Value> getElements() {
3841
return elements;
3942
}
4043

@@ -86,9 +89,9 @@ public int hashCode() {
8689
* Inspects the provided value, returning an ArrayList copy of the internal array if it's an
8790
* ArrayValue and an empty ArrayList if it's null or any other type of FSTFieldValue.
8891
*/
89-
static List<FieldValue> coercedFieldValuesArray(@Nullable FieldValue value) {
92+
static List<Value> coercedFieldValuesArray(@Nullable FieldValue value) {
9093
if (value instanceof ArrayValue) {
91-
return ((ArrayValue) value).getValues();
94+
return value.getProto().getArrayValue().getValuesList();
9295
} else {
9396
// coerce to empty array.
9497
return new ArrayList<>();
@@ -97,17 +100,23 @@ static List<FieldValue> coercedFieldValuesArray(@Nullable FieldValue value) {
97100

98101
/** An array union transform operation. */
99102
public static class Union extends ArrayTransformOperation {
100-
// TODO(mrschmidt): Migrate to list of Value protos
101-
public Union(List<FieldValue> elements) {
103+
public Union(List<Value> elements) {
102104
super(elements);
103105
}
104106

105107
@Override
106108
protected ArrayValue apply(@Nullable FieldValue previousValue) {
107-
List<FieldValue> result = coercedFieldValuesArray(previousValue);
108-
for (FieldValue element : getElements()) {
109-
if (!result.contains(element)) {
110-
result.add(element);
109+
List<Value> result = coercedFieldValuesArray(previousValue);
110+
for (Value unionElement : getElements()) {
111+
boolean contains = false;
112+
for (Value existingElement : result) {
113+
if (ProtoValues.equals(unionElement, existingElement)) {
114+
contains = true;
115+
break;
116+
}
117+
}
118+
if (!contains) {
119+
result.add(unionElement);
111120
}
112121
}
113122
return ArrayValue.fromList(result);
@@ -116,15 +125,21 @@ protected ArrayValue apply(@Nullable FieldValue previousValue) {
116125

117126
/** An array remove transform operation. */
118127
public static class Remove extends ArrayTransformOperation {
119-
public Remove(List<FieldValue> elements) {
128+
public Remove(List<Value> elements) {
120129
super(elements);
121130
}
122131

123132
@Override
124133
protected ArrayValue apply(@Nullable FieldValue previousValue) {
125-
List<FieldValue> result = coercedFieldValuesArray(previousValue);
126-
for (FieldValue element : getElements()) {
127-
result.removeAll(Collections.singleton(element));
134+
List<Value> result = coercedFieldValuesArray(previousValue);
135+
for (Value removeElement : getElements()) {
136+
Iterator<Value> existingValuesIterator = result.iterator();
137+
while (existingValuesIterator.hasNext()) {
138+
Value existingElement = existingValuesIterator.next();
139+
if (ProtoValues.equals(existingElement, removeElement)) {
140+
existingValuesIterator.remove();
141+
}
142+
}
128143
}
129144
return ArrayValue.fromList(result);
130145
}

firebase-firestore/src/main/java/com/google/firebase/firestore/model/value/ArrayValue.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ public class ArrayValue extends FieldValue {
2424
super(value);
2525
}
2626

27-
public static ArrayValue fromList(List<FieldValue> list) {
27+
public static ArrayValue fromList(List<Value> list) {
2828
com.google.firestore.v1.ArrayValue.Builder builder =
2929
com.google.firestore.v1.ArrayValue.newBuilder();
30-
for (FieldValue value : list) {
31-
builder.addValues(value.getProto());
30+
for (Value value : list) {
31+
builder.addValues(value);
3232
}
3333
return new ArrayValue(Value.newBuilder().setArrayValue(builder).build());
3434
}

firebase-firestore/src/test/java/com/google/firebase/firestore/UserDataWriterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static com.google.firebase.firestore.testutil.TestUtil.blob;
1818
import static com.google.firebase.firestore.testutil.TestUtil.map;
1919
import static com.google.firebase.firestore.testutil.TestUtil.ref;
20+
import static com.google.firebase.firestore.testutil.TestUtil.valueOf;
2021
import static com.google.firebase.firestore.testutil.TestUtil.wrap;
2122
import static com.google.firebase.firestore.testutil.TestUtil.wrapObject;
2223
import static java.util.Arrays.asList;
@@ -270,8 +271,7 @@ public void testConvertsNestedObjects() {
270271

271272
@Test
272273
public void testConvertsLists() {
273-
ArrayValue expected =
274-
ArrayValue.fromList(asList(StringValue.valueOf("value"), BooleanValue.valueOf(true)));
274+
ArrayValue expected = ArrayValue.fromList(asList(valueOf("value"), valueOf(true)));
275275
FieldValue actual = wrap(asList("value", true));
276276
assertEquals(expected, actual);
277277
}

firebase-firestore/src/test/java/com/google/firebase/firestore/model/FieldValueTest.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static com.google.firebase.firestore.testutil.TestUtil.key;
2222
import static com.google.firebase.firestore.testutil.TestUtil.map;
2323
import static com.google.firebase.firestore.testutil.TestUtil.ref;
24+
import static com.google.firebase.firestore.testutil.TestUtil.valueOf;
2425
import static com.google.firebase.firestore.testutil.TestUtil.wrap;
2526
import static com.google.firebase.firestore.testutil.TestUtil.wrapObject;
2627
import static junit.framework.TestCase.assertTrue;
@@ -128,12 +129,7 @@ public void testAddsNewFields() {
128129
public void testAddsMultipleNewFields() {
129130
ObjectValue object = ObjectValue.emptyObject();
130131
object = setField(object, "a", wrap("a"));
131-
object =
132-
object
133-
.toBuilder()
134-
.set(field("b"), wrap("b").getProto())
135-
.set(field("c"), wrap("c").getProto())
136-
.build();
132+
object = object.toBuilder().set(field("b"), valueOf("b")).set(field("c"), valueOf("c")).build();
137133

138134
assertEquals(wrapObject("a", "a", "b", "b", "c", "c"), object);
139135
}

firebase-firestore/src/test/java/com/google/firebase/firestore/model/ObjectValueBuilderTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import static com.google.firebase.firestore.testutil.TestUtil.field;
1818
import static com.google.firebase.firestore.testutil.TestUtil.map;
19-
import static com.google.firebase.firestore.testutil.TestUtil.wrap;
19+
import static com.google.firebase.firestore.testutil.TestUtil.valueOf;
2020
import static com.google.firebase.firestore.testutil.TestUtil.wrapObject;
2121
import static junit.framework.TestCase.assertEquals;
2222

@@ -31,9 +31,9 @@
3131
@Config(manifest = Config.NONE)
3232
public class ObjectValueBuilderTest {
3333
private String fooString = "foo";
34-
private Value fooValue = wrap(fooString).getProto();
34+
private Value fooValue = valueOf(fooString);
3535
private String barString = "bar";
36-
private Value barValue = wrap(barString).getProto();
36+
private Value barValue = valueOf(barString);
3737
private Value emptyObject = ObjectValue.emptyObject().getProto();
3838

3939
@Test

firebase-firestore/src/test/java/com/google/firebase/firestore/remote/RemoteSerializerTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static com.google.firebase.firestore.testutil.TestUtil.ref;
2828
import static com.google.firebase.firestore.testutil.TestUtil.setMutation;
2929
import static com.google.firebase.firestore.testutil.TestUtil.transformMutation;
30+
import static com.google.firebase.firestore.testutil.TestUtil.valueOf;
3031
import static com.google.firebase.firestore.testutil.TestUtil.verifyMutation;
3132
import static com.google.firebase.firestore.testutil.TestUtil.wrap;
3233
import static java.util.Arrays.asList;
@@ -435,8 +436,8 @@ public void testEncodesArrayTransformMutations() {
435436
.setFieldPath("a")
436437
.setAppendMissingElements(
437438
ArrayValue.newBuilder()
438-
.addValues(wrap("a").getProto())
439-
.addValues(wrap(2).getProto())))
439+
.addValues(valueOf("a"))
440+
.addValues(valueOf(2))))
440441
.addFieldTransforms(
441442
DocumentTransform.FieldTransform.newBuilder()
442443
.setFieldPath("bar.baz")

firebase-firestore/src/testUtil/java/com/google/firebase/firestore/testutil/TestUtil.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import com.google.firebase.firestore.remote.WatchChange;
7171
import com.google.firebase.firestore.remote.WatchChange.DocumentChange;
7272
import com.google.firebase.firestore.remote.WatchChangeAggregator;
73+
import com.google.firestore.v1.Value;
7374
import com.google.protobuf.ByteString;
7475
import java.io.IOException;
7576
import java.util.ArrayList;
@@ -143,6 +144,10 @@ public static ObjectValue wrapObject(Object... entries) {
143144
return wrapObject(map(entries));
144145
}
145146

147+
public static Value valueOf(Object value) {
148+
return wrap(value).getProto();
149+
}
150+
146151
public static DocumentKey key(String key) {
147152
return DocumentKey.fromPathString(key);
148153
}

0 commit comments

Comments
 (0)