Skip to content

Commit 7ea5b37

Browse files
Migrate TransformResult to use Value
1 parent 940a268 commit 7ea5b37

File tree

17 files changed

+119
-113
lines changed

17 files changed

+119
-113
lines changed

firebase-firestore/ktx/src/test/kotlin/com/google/firebase/firestore/ktx/FirestoreTests.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import com.google.firebase.firestore.FieldPath
2222
import com.google.firebase.firestore.FirebaseFirestore
2323
import com.google.firebase.firestore.FirebaseFirestoreSettings
2424
import com.google.firebase.firestore.TestUtil
25-
import com.google.firebase.firestore.model.value.IntegerValue
2625
import com.google.firebase.firestore.model.value.ObjectValue
26+
import com.google.firebase.firestore.testutil.TestUtil.wrap
2727
import com.google.firebase.ktx.Firebase
2828
import com.google.firebase.ktx.app
2929
import com.google.firebase.ktx.initialize
@@ -171,7 +171,7 @@ class QuerySnapshotTests {
171171
val qs = TestUtil.querySnapshot(
172172
"rooms",
173173
mapOf(),
174-
mapOf("id" to ObjectValue.fromMap(mapOf("a" to IntegerValue.valueOf(1).proto, "b" to IntegerValue.valueOf(2).proto))),
174+
mapOf("id" to ObjectValue.fromMap(mapOf("a" to wrap(1).proto, "b" to wrap(2).proto))),
175175
false,
176176
false)
177177

firebase-firestore/src/main/java/com/google/firebase/firestore/model/Document.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import androidx.annotation.Nullable;
1919
import com.google.firebase.firestore.model.value.FieldValue;
2020
import com.google.firebase.firestore.model.value.ObjectValue;
21+
import com.google.firestore.v1.Value;
2122
import java.util.Comparator;
2223

2324
/**
@@ -66,6 +67,11 @@ public ObjectValue getData() {
6667
return objectValue.get(path);
6768
}
6869

70+
public @Nullable Value getFieldProto(FieldPath path) {
71+
FieldValue fieldValue = getField(path);
72+
return fieldValue != null ? fieldValue.getProto() : null;
73+
}
74+
6975
public boolean hasLocalMutations() {
7076
return documentState.equals(DocumentState.LOCAL_MUTATIONS);
7177
}

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

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@
1616

1717
import androidx.annotation.Nullable;
1818
import com.google.firebase.Timestamp;
19-
import com.google.firebase.firestore.model.value.ArrayValue;
20-
import com.google.firebase.firestore.model.value.FieldValue;
2119
import com.google.firebase.firestore.model.value.ProtoValues;
20+
import com.google.firestore.v1.ArrayValue;
2221
import com.google.firestore.v1.Value;
23-
import java.util.ArrayList;
2422
import java.util.Collections;
25-
import java.util.Iterator;
2623
import java.util.List;
2724

2825
/**
@@ -42,21 +39,20 @@ public List<Value> getElements() {
4239
}
4340

4441
@Override
45-
public FieldValue applyToLocalView(@Nullable FieldValue previousValue, Timestamp localWriteTime) {
42+
public Value applyToLocalView(@Nullable Value previousValue, Timestamp localWriteTime) {
4643
return apply(previousValue);
4744
}
4845

4946
@Override
50-
public FieldValue applyToRemoteDocument(
51-
@Nullable FieldValue previousValue, FieldValue transformResult) {
47+
public Value applyToRemoteDocument(@Nullable Value previousValue, Value transformResult) {
5248
// The server just sends null as the transform result for array operations, so we have to
5349
// calculate a result the same as we do for local applications.
5450
return apply(previousValue);
5551
}
5652

5753
@Override
5854
@Nullable
59-
public FieldValue computeBaseValue(@Nullable FieldValue currentValue) {
55+
public Value computeBaseValue(@Nullable Value currentValue) {
6056
return null; // Array transforms are idempotent and don't require a base value.
6157
}
6258

@@ -83,18 +79,18 @@ public int hashCode() {
8379
}
8480

8581
/** Applies this ArrayTransformOperation against the specified previousValue. */
86-
protected abstract ArrayValue apply(@Nullable FieldValue previousValue);
82+
protected abstract Value apply(@Nullable Value previousValue);
8783

8884
/**
89-
* Inspects the provided value, returning an ArrayList copy of the internal array if it's an
90-
* ArrayValue and an empty ArrayList if it's null or any other type of FSTFieldValue.
85+
* Inspects the provided value, returning an ArrayValue.Builder containing the existing array
86+
* elements or an empty builder if `value` is not an array.
9187
*/
92-
static ArrayList<Value> coercedFieldValuesArray(@Nullable FieldValue value) {
93-
if (value instanceof ArrayValue) {
94-
return new ArrayList<>(value.getProto().getArrayValue().getValuesList());
88+
static ArrayValue.Builder coercedFieldValuesArray(@Nullable Value value) {
89+
if (ProtoValues.isArray(value)) {
90+
return value.getArrayValue().toBuilder();
9591
} else {
9692
// coerce to empty array.
97-
return new ArrayList<>();
93+
return ArrayValue.newBuilder();
9894
}
9995
}
10096

@@ -105,14 +101,14 @@ public Union(List<Value> elements) {
105101
}
106102

107103
@Override
108-
protected ArrayValue apply(@Nullable FieldValue previousValue) {
109-
List<Value> result = coercedFieldValuesArray(previousValue);
104+
protected Value apply(@Nullable Value previousValue) {
105+
ArrayValue.Builder result = coercedFieldValuesArray(previousValue);
110106
for (Value unionElement : getElements()) {
111-
if (!ProtoValues.contains(result, unionElement)) {
112-
result.add(unionElement);
107+
if (!ProtoValues.contains(result.getValuesList(), unionElement)) {
108+
result.addValues(unionElement);
113109
}
114110
}
115-
return ArrayValue.fromList(result);
111+
return Value.newBuilder().setArrayValue(result).build();
116112
}
117113
}
118114

@@ -123,18 +119,18 @@ public Remove(List<Value> elements) {
123119
}
124120

125121
@Override
126-
protected ArrayValue apply(@Nullable FieldValue previousValue) {
127-
List<Value> result = coercedFieldValuesArray(previousValue);
122+
protected Value apply(@Nullable Value previousValue) {
123+
ArrayValue.Builder result = coercedFieldValuesArray(previousValue);
128124
for (Value removeElement : getElements()) {
129-
Iterator<Value> existingValuesIterator = result.iterator();
130-
while (existingValuesIterator.hasNext()) {
131-
Value existingElement = existingValuesIterator.next();
132-
if (ProtoValues.equals(existingElement, removeElement)) {
133-
existingValuesIterator.remove();
125+
for (int i = 0; i < result.getValuesCount(); ) {
126+
if (ProtoValues.equals(result.getValues(i), removeElement)) {
127+
result.removeValues(i);
128+
} else {
129+
++i;
134130
}
135131
}
136132
}
137-
return ArrayValue.fromList(result);
133+
return Value.newBuilder().setArrayValue(result).build();
138134
}
139135
}
140136
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import androidx.annotation.Nullable;
2020
import com.google.firebase.firestore.model.SnapshotVersion;
21-
import com.google.firebase.firestore.model.value.FieldValue;
21+
import com.google.firestore.v1.Value;
2222
import java.util.List;
2323

2424
/**
@@ -31,9 +31,9 @@
3131
*/
3232
public final class MutationResult {
3333
private final SnapshotVersion version;
34-
@Nullable private final List<FieldValue> transformResults;
34+
@Nullable private final List<Value> transformResults;
3535

36-
public MutationResult(SnapshotVersion version, @Nullable List<FieldValue> transformResults) {
36+
public MutationResult(SnapshotVersion version, @Nullable List<Value> transformResults) {
3737
this.version = checkNotNull(version);
3838
this.transformResults = transformResults;
3939
}
@@ -56,12 +56,12 @@ public SnapshotVersion getVersion() {
5656

5757
/**
5858
* The resulting fields returned from the backend after a TransformMutation has been committed.
59-
* Contains one FieldValue for each FieldTransform that was in the mutation.
59+
* Contains one Value for each FieldTransform that was in the mutation.
6060
*
6161
* <p>Will be null if the mutation was not a TransformMutation.
6262
*/
6363
@Nullable
64-
public List<FieldValue> getTransformResults() {
64+
public List<Value> getTransformResults() {
6565
return transformResults;
6666
}
6767
}

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

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import com.google.firebase.firestore.model.value.FieldValue;
2424
import com.google.firebase.firestore.model.value.IntegerValue;
2525
import com.google.firebase.firestore.model.value.NumberValue;
26+
import com.google.firebase.firestore.model.value.ProtoValues;
27+
import com.google.firestore.v1.Value;
2628

2729
/**
2830
* Implements the backend semantics for locally computed NUMERIC_ADD (increment) transforms.
@@ -37,29 +39,28 @@ public NumericIncrementTransformOperation(NumberValue operand) {
3739
}
3840

3941
@Override
40-
public FieldValue applyToLocalView(@Nullable FieldValue previousValue, Timestamp localWriteTime) {
41-
NumberValue baseValue = computeBaseValue(previousValue);
42+
public Value applyToLocalView(@Nullable Value previousValue, Timestamp localWriteTime) {
43+
Value baseValue = computeBaseValue(previousValue);
4244

4345
// Return an integer value only if the previous value and the operand is an integer.
44-
if (baseValue instanceof IntegerValue && operand instanceof IntegerValue) {
45-
long sum = safeIncrement(((IntegerValue) baseValue).getIntegerValue(), operandAsLong());
46-
return IntegerValue.valueOf(sum);
47-
} else if (baseValue instanceof IntegerValue) {
48-
double sum = ((IntegerValue) baseValue).getIntegerValue() + operandAsDouble();
49-
return DoubleValue.valueOf(sum);
46+
if (isInteger(baseValue) && operand instanceof IntegerValue) {
47+
long sum = safeIncrement(baseValue.getIntegerValue(), operandAsLong());
48+
return Value.newBuilder().setIntegerValue(sum).build();
49+
} else if (isInteger(baseValue)) {
50+
double sum = baseValue.getIntegerValue() + operandAsDouble();
51+
return Value.newBuilder().setDoubleValue(sum).build();
5052
} else {
5153
hardAssert(
52-
baseValue instanceof DoubleValue,
54+
isDouble(baseValue),
5355
"Expected NumberValue to be of type DoubleValue, but was ",
5456
previousValue.getClass().getCanonicalName());
55-
double sum = ((DoubleValue) baseValue).getDoubleValue() + operandAsDouble();
56-
return DoubleValue.valueOf(sum);
57+
double sum = baseValue.getDoubleValue() + operandAsDouble();
58+
return Value.newBuilder().setDoubleValue(sum).build();
5759
}
5860
}
5961

6062
@Override
61-
public FieldValue applyToRemoteDocument(
62-
@Nullable FieldValue previousValue, FieldValue transformResult) {
63+
public Value applyToRemoteDocument(@Nullable Value previousValue, Value transformResult) {
6364
return transformResult;
6465
}
6566

@@ -72,10 +73,10 @@ public FieldValue getOperand() {
7273
* otherwise returning a coerced IntegerValue of 0.
7374
*/
7475
@Override
75-
public NumberValue computeBaseValue(@Nullable FieldValue previousValue) {
76-
return previousValue instanceof NumberValue
77-
? (NumberValue) previousValue
78-
: IntegerValue.valueOf(0L);
76+
public Value computeBaseValue(@Nullable Value previousValue) {
77+
return ProtoValues.isNumber(previousValue)
78+
? previousValue
79+
: Value.newBuilder().setIntegerValue(0).build();
7980
}
8081

8182
/**
@@ -120,4 +121,12 @@ private long operandAsLong() {
120121
+ operand.getClass().getCanonicalName());
121122
}
122123
}
124+
125+
private boolean isInteger(@Nullable Value value) {
126+
return value != null && value.getValueTypeCase() == Value.ValueTypeCase.INTEGER_VALUE;
127+
}
128+
129+
private boolean isDouble(@Nullable Value value) {
130+
return value != null && value.getValueTypeCase() == Value.ValueTypeCase.DOUBLE_VALUE;
131+
}
123132
}

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
import androidx.annotation.Nullable;
1818
import com.google.firebase.Timestamp;
19-
import com.google.firebase.firestore.model.value.FieldValue;
2019
import com.google.firebase.firestore.model.value.ServerTimestampValue;
20+
import com.google.firestore.v1.Value;
2121

2222
/** Transforms a value into a server-generated timestamp. */
2323
public class ServerTimestampOperation implements TransformOperation {
@@ -30,19 +30,18 @@ public static ServerTimestampOperation getInstance() {
3030
}
3131

3232
@Override
33-
public FieldValue applyToLocalView(@Nullable FieldValue previousValue, Timestamp localWriteTime) {
34-
return ServerTimestampValue.valueOf(localWriteTime, previousValue);
33+
public Value applyToLocalView(@Nullable Value previousValue, Timestamp localWriteTime) {
34+
return ServerTimestampValue.valueOf(localWriteTime, previousValue).getProto();
3535
}
3636

3737
@Override
38-
public FieldValue applyToRemoteDocument(
39-
@Nullable FieldValue previousValue, FieldValue transformResult) {
38+
public Value applyToRemoteDocument(@Nullable Value previousValue, Value transformResult) {
4039
return transformResult;
4140
}
4241

4342
@Nullable
4443
@Override
45-
public FieldValue computeBaseValue(@Nullable FieldValue currentValue) {
44+
public Value computeBaseValue(@Nullable Value currentValue) {
4645
return null; // Server timestamps are idempotent and don't require a base value.
4746
}
4847

0 commit comments

Comments
 (0)