|
34 | 34 | import com.google.firestore.v1.Write.Builder;
|
35 | 35 | import com.google.protobuf.ByteString;
|
36 | 36 | import java.util.ArrayList;
|
37 |
| -import java.util.Collections; |
38 | 37 | import java.util.List;
|
39 | 38 |
|
40 | 39 | /** Serializer for values stored in the LocalStore. */
|
@@ -182,28 +181,27 @@ MutationBatch decodeMutationBatch(com.google.firebase.firestore.proto.WriteBatch
|
182 | 181 | // representing `transforms` with `update_transforms` on the SDK means that old `transform`
|
183 | 182 | // mutations stored in IndexedDB need to be updated to `update_transforms`.
|
184 | 183 | // TODO(b/174608374): Remove this code once we perform a schema migration.
|
185 |
| - for (int i = batch.getWritesCount() - 1; i >= 0; --i) { |
186 |
| - Write mutation = batch.getWrites(i); |
187 |
| - if (mutation.hasTransform()) { |
| 184 | + for (int i = 0; i < batch.getWritesCount(); ++i) { |
| 185 | + Write currentMutation = batch.getWrites(i); |
| 186 | + boolean hasTransform = |
| 187 | + i + 1 < batch.getWritesCount() && batch.getWrites(i + 1).hasTransform(); |
| 188 | + if (hasTransform) { |
188 | 189 | hardAssert(
|
189 |
| - i >= 1 && !batch.getWrites(i - 1).hasTransform() && batch.getWrites(i - 1).hasUpdate(), |
| 190 | + batch.getWrites(i).hasUpdate(), |
190 | 191 | "TransformMutation should be preceded by a patch or set mutation");
|
191 |
| - Write mutationToJoin = batch.getWrites(i - 1); |
192 |
| - Builder newMutationBuilder = Write.newBuilder(mutationToJoin); |
193 |
| - for (FieldTransform fieldTransform : mutation.getTransform().getFieldTransformsList()) { |
| 192 | + Builder newMutationBuilder = Write.newBuilder(currentMutation); |
| 193 | + Write transformMutation = batch.getWrites(i + 1); |
| 194 | + for (FieldTransform fieldTransform : |
| 195 | + transformMutation.getTransform().getFieldTransformsList()) { |
194 | 196 | newMutationBuilder.addUpdateTransforms(fieldTransform);
|
195 | 197 | }
|
196 | 198 | mutations.add(rpcSerializer.decodeMutation(newMutationBuilder.build()));
|
197 |
| - --i; |
| 199 | + ++i; |
198 | 200 | } else {
|
199 |
| - mutations.add(rpcSerializer.decodeMutation(mutation)); |
| 201 | + mutations.add(rpcSerializer.decodeMutation(currentMutation)); |
200 | 202 | }
|
201 | 203 | }
|
202 | 204 |
|
203 |
| - // Reverse the mutations to preserve the original ordering since the above for-loop iterates in |
204 |
| - // reverse order. We use reverse() instead of prepending the elements into the mutations array |
205 |
| - // since prepending to a List is O(n). |
206 |
| - Collections.reverse(mutations); |
207 | 205 | return new MutationBatch(batchId, localWriteTime, baseMutations, mutations);
|
208 | 206 | }
|
209 | 207 |
|
|
0 commit comments