use of com.google.firebase.firestore.core.Query in project firebase-android-sdk by firebase.
the class LocalDocumentsView method getDocumentsMatchingCollectionGroupQuery.
private ImmutableSortedMap<DocumentKey, Document> getDocumentsMatchingCollectionGroupQuery(Query query, IndexOffset offset) {
hardAssert(query.getPath().isEmpty(), "Currently we only support collection group queries at the root.");
String collectionId = query.getCollectionGroup();
ImmutableSortedMap<DocumentKey, Document> results = emptyDocumentMap();
List<ResourcePath> parents = indexManager.getCollectionParents(collectionId);
// aggregate the results.
for (ResourcePath parent : parents) {
Query collectionQuery = query.asCollectionQueryAtPath(parent.append(collectionId));
ImmutableSortedMap<DocumentKey, Document> collectionResults = getDocumentsMatchingCollectionQuery(collectionQuery, offset);
for (Map.Entry<DocumentKey, Document> docEntry : collectionResults) {
results = results.insert(docEntry.getKey(), docEntry.getValue());
}
}
return results;
}
use of com.google.firebase.firestore.core.Query in project firebase-android-sdk by firebase.
the class SpecTestCase method validateExpectedState.
private void validateExpectedState(@Nullable JSONObject expectedState) throws JSONException {
if (expectedState != null) {
if (expectedState.has("numOutstandingWrites")) {
assertEquals(expectedState.getInt("numOutstandingWrites"), writesSent());
}
if (expectedState.has("writeStreamRequestCount")) {
assertEquals(expectedState.getInt("writeStreamRequestCount"), datastore.getWriteStreamRequestCount());
}
if (expectedState.has("watchStreamRequestCount")) {
assertEquals(expectedState.getInt("watchStreamRequestCount"), datastore.getWatchStreamRequestCount());
}
if (expectedState.has("activeLimboDocs")) {
expectedActiveLimboDocs = new HashSet<>();
JSONArray limboDocs = expectedState.getJSONArray("activeLimboDocs");
for (int i = 0; i < limboDocs.length(); i++) {
expectedActiveLimboDocs.add(key((String) limboDocs.get(i)));
}
}
if (expectedState.has("enqueuedLimboDocs")) {
expectedEnqueuedLimboDocs = new HashSet<>();
JSONArray limboDocs = expectedState.getJSONArray("enqueuedLimboDocs");
for (int i = 0; i < limboDocs.length(); i++) {
expectedEnqueuedLimboDocs.add(key((String) limboDocs.get(i)));
}
}
if (expectedState.has("activeTargets")) {
expectedActiveTargets = new HashMap<>();
JSONObject activeTargets = expectedState.getJSONObject("activeTargets");
Iterator<String> keys = activeTargets.keys();
while (keys.hasNext()) {
String targetIdString = keys.next();
int targetId = Integer.parseInt(targetIdString);
JSONObject queryDataJson = activeTargets.getJSONObject(targetIdString);
JSONArray queryArrayJson = queryDataJson.getJSONArray("queries");
expectedActiveTargets.put(targetId, new ArrayList<>());
for (int i = 0; i < queryArrayJson.length(); i++) {
Query query = parseQuery(queryArrayJson.getJSONObject(i));
// TODO: populate the purpose of the target once it's possible to encode that in the
// spec tests. For now, hard-code that it's a listen despite the fact that it's not
// always the right value.
TargetData targetData = new TargetData(query.toTarget(), targetId, ARBITRARY_SEQUENCE_NUMBER, QueryPurpose.LISTEN);
if (queryDataJson.has("resumeToken")) {
targetData = targetData.withResumeToken(ByteString.copyFromUtf8(queryDataJson.getString("resumeToken")), SnapshotVersion.NONE);
} else {
targetData = targetData.withResumeToken(ByteString.EMPTY, version(queryDataJson.getInt("readTime")));
}
expectedActiveTargets.get(targetId).add(targetData);
}
}
}
}
// Always validate the we received the expected number of events.
validateUserCallbacks(expectedState);
// Always validate that the expected limbo docs match the actual limbo docs.
validateActiveLimboDocs();
validateEnqueuedLimboDocs();
// Always validate that the expected active targets match the actual active targets.
validateActiveTargets();
}
use of com.google.firebase.firestore.core.Query in project firebase-android-sdk by firebase.
the class SpecTestCase method doListen.
//
// Methods for doing the steps of the spec test.
//
private void doListen(JSONObject listenSpec) throws Exception {
int expectedId = listenSpec.getInt("targetId");
Query query = parseQuery(listenSpec.getJSONObject("query"));
// TODO: Allow customizing listen options in spec tests
ListenOptions options = new ListenOptions();
options.includeDocumentMetadataChanges = true;
options.includeQueryMetadataChanges = true;
QueryListener listener = new QueryListener(query, options, (value, error) -> {
QueryEvent event = new QueryEvent();
event.query = query;
if (value != null) {
event.view = value;
} else {
event.error = error;
}
events.add(event);
});
queryListeners.put(query, listener);
queue.runSync(() -> {
int actualId = eventManager.addQueryListener(listener);
assertEquals(expectedId, actualId);
});
}
use of com.google.firebase.firestore.core.Query in project firebase-android-sdk by firebase.
the class RemoteSerializerTest method testEncodesFirstLevelKeyQueries.
@Test
public void testEncodesFirstLevelKeyQueries() {
Query q = Query.atPath(ResourcePath.fromString("docs/1"));
Target actual = serializer.encodeTarget(new TargetData(q.toTarget(), 1, 2, QueryPurpose.LISTEN));
DocumentsTarget.Builder docs = DocumentsTarget.newBuilder().addDocuments("projects/p/databases/d/documents/docs/1");
Target expected = Target.newBuilder().setDocuments(docs).setTargetId(1).setResumeToken(ByteString.EMPTY).build();
assertEquals(expected, actual);
assertEquals(serializer.decodeDocumentsTarget(serializer.encodeDocumentsTarget(q.toTarget())), q.toTarget());
}
use of com.google.firebase.firestore.core.Query in project firebase-android-sdk by firebase.
the class SQLiteIndexManagerTest method testNotInFilter.
@Test
public void testNotInFilter() {
setUpSingleValueFilter();
Query query = query("coll").filter(filter("count", "not-in", Arrays.asList(1, 2)));
verifyResults(query, "coll/val3");
}
Aggregations