use of com.google.firebase.firestore.remote.WatchChange.ExistenceFilterWatchChange in project firebase-android-sdk by firebase.
the class SpecTestCase method doWatchFilter.
private void doWatchFilter(JSONArray watchFilter) throws Exception {
List<Integer> targets = parseIntList(watchFilter.getJSONArray(0));
Assert.hardAssert(targets.size() == 1, "ExistenceFilters currently support exactly one target only.");
int keyCount = watchFilter.length() == 0 ? 0 : watchFilter.length() - 1;
// TODO: extend this with different existence filters over time.
ExistenceFilter filter = new ExistenceFilter(keyCount);
ExistenceFilterWatchChange change = new ExistenceFilterWatchChange(targets.get(0), filter);
writeWatchChange(change, SnapshotVersion.NONE);
}
use of com.google.firebase.firestore.remote.WatchChange.ExistenceFilterWatchChange in project firebase-android-sdk by firebase.
the class RemoteStore method handleWatchChange.
private void handleWatchChange(SnapshotVersion snapshotVersion, WatchChange watchChange) {
// Mark the connection as ONLINE because we got a message from the server.
onlineStateTracker.updateState(OnlineState.ONLINE);
hardAssert((watchStream != null) && (watchChangeAggregator != null), "WatchStream and WatchStreamAggregator should both be non-null");
WatchTargetChange watchTargetChange = watchChange instanceof WatchTargetChange ? (WatchTargetChange) watchChange : null;
if (watchTargetChange != null && watchTargetChange.getChangeType().equals(WatchTargetChangeType.Removed) && watchTargetChange.getCause() != null) {
// There was an error on a target, don't wait for a consistent snapshot to raise events
processTargetError(watchTargetChange);
} else {
if (watchChange instanceof DocumentChange) {
watchChangeAggregator.handleDocumentChange((DocumentChange) watchChange);
} else if (watchChange instanceof ExistenceFilterWatchChange) {
watchChangeAggregator.handleExistenceFilter((ExistenceFilterWatchChange) watchChange);
} else {
hardAssert(watchChange instanceof WatchTargetChange, "Expected watchChange to be an instance of WatchTargetChange");
watchChangeAggregator.handleTargetChange((WatchTargetChange) watchChange);
}
if (!snapshotVersion.equals(SnapshotVersion.NONE)) {
SnapshotVersion lastRemoteSnapshotVersion = this.localStore.getLastRemoteSnapshotVersion();
if (snapshotVersion.compareTo(lastRemoteSnapshotVersion) >= 0) {
// We have received a target change with a global snapshot if the snapshot
// version is not equal to SnapshotVersion.MIN.
raiseWatchSnapshot(snapshotVersion);
}
}
}
}
use of com.google.firebase.firestore.remote.WatchChange.ExistenceFilterWatchChange in project firebase-android-sdk by firebase.
the class RemoteSerializer method decodeWatchChange.
// Watch changes
public WatchChange decodeWatchChange(ListenResponse protoChange) {
WatchChange watchChange;
switch(protoChange.getResponseTypeCase()) {
case TARGET_CHANGE:
com.google.firestore.v1.TargetChange targetChange = protoChange.getTargetChange();
WatchTargetChangeType changeType;
Status cause = null;
switch(targetChange.getTargetChangeType()) {
case NO_CHANGE:
changeType = WatchTargetChangeType.NoChange;
break;
case ADD:
changeType = WatchTargetChangeType.Added;
break;
case REMOVE:
changeType = WatchTargetChangeType.Removed;
cause = fromStatus(targetChange.getCause());
break;
case CURRENT:
changeType = WatchTargetChangeType.Current;
break;
case RESET:
changeType = WatchTargetChangeType.Reset;
break;
case UNRECOGNIZED:
default:
throw new IllegalArgumentException("Unknown target change type");
}
watchChange = new WatchTargetChange(changeType, targetChange.getTargetIdsList(), targetChange.getResumeToken(), cause);
break;
case DOCUMENT_CHANGE:
DocumentChange docChange = protoChange.getDocumentChange();
List<Integer> added = docChange.getTargetIdsList();
List<Integer> removed = docChange.getRemovedTargetIdsList();
DocumentKey key = decodeKey(docChange.getDocument().getName());
SnapshotVersion version = decodeVersion(docChange.getDocument().getUpdateTime());
hardAssert(!version.equals(SnapshotVersion.NONE), "Got a document change without an update time");
ObjectValue data = ObjectValue.fromMap(docChange.getDocument().getFieldsMap());
MutableDocument document = MutableDocument.newFoundDocument(key, version, data);
watchChange = new WatchChange.DocumentChange(added, removed, document.getKey(), document);
break;
case DOCUMENT_DELETE:
DocumentDelete docDelete = protoChange.getDocumentDelete();
removed = docDelete.getRemovedTargetIdsList();
key = decodeKey(docDelete.getDocument());
// Note that version might be unset in which case we use SnapshotVersion.NONE
version = decodeVersion(docDelete.getReadTime());
MutableDocument doc = MutableDocument.newNoDocument(key, version);
watchChange = new WatchChange.DocumentChange(Collections.emptyList(), removed, doc.getKey(), doc);
break;
case DOCUMENT_REMOVE:
DocumentRemove docRemove = protoChange.getDocumentRemove();
removed = docRemove.getRemovedTargetIdsList();
key = decodeKey(docRemove.getDocument());
watchChange = new WatchChange.DocumentChange(Collections.emptyList(), removed, key, null);
break;
case FILTER:
com.google.firestore.v1.ExistenceFilter protoFilter = protoChange.getFilter();
// TODO: implement existence filter parsing (see b/33076578)
ExistenceFilter filter = new ExistenceFilter(protoFilter.getCount());
int targetId = protoFilter.getTargetId();
watchChange = new ExistenceFilterWatchChange(targetId, filter);
break;
case RESPONSETYPE_NOT_SET:
default:
throw new IllegalArgumentException("Unknown change type set");
}
return watchChange;
}
Aggregations