Search in sources :

Example 1 with Query

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;
}
Also used : ResourcePath(com.google.firebase.firestore.model.ResourcePath) Query(com.google.firebase.firestore.core.Query) DocumentKey(com.google.firebase.firestore.model.DocumentKey) Document(com.google.firebase.firestore.model.Document) MutableDocument(com.google.firebase.firestore.model.MutableDocument) HashMap(java.util.HashMap) Map(java.util.Map) TreeMap(java.util.TreeMap) ImmutableSortedMap(com.google.firebase.database.collection.ImmutableSortedMap) DocumentCollections.emptyDocumentMap(com.google.firebase.firestore.model.DocumentCollections.emptyDocumentMap)

Example 2 with Query

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();
}
Also used : TargetData(com.google.firebase.firestore.local.TargetData) JSONObject(org.json.JSONObject) Query(com.google.firebase.firestore.core.Query) JSONArray(org.json.JSONArray) ByteString(com.google.protobuf.ByteString)

Example 3 with Query

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);
    });
}
Also used : ListenOptions(com.google.firebase.firestore.core.EventManager.ListenOptions) Query(com.google.firebase.firestore.core.Query) QueryListener(com.google.firebase.firestore.core.QueryListener)

Example 4 with Query

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());
}
Also used : TargetData(com.google.firebase.firestore.local.TargetData) DocumentsTarget(com.google.firestore.v1.Target.DocumentsTarget) DocumentsTarget(com.google.firestore.v1.Target.DocumentsTarget) Target(com.google.firestore.v1.Target) QueryTarget(com.google.firestore.v1.Target.QueryTarget) StructuredQuery(com.google.firestore.v1.StructuredQuery) Query(com.google.firebase.firestore.core.Query) Test(org.junit.Test)

Example 5 with Query

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");
}
Also used : Query(com.google.firebase.firestore.core.Query) Test(org.junit.Test)

Aggregations

Query (com.google.firebase.firestore.core.Query)189 Test (org.junit.Test)179 BundledQuery (com.google.firebase.firestore.bundle.BundledQuery)40 NamedQuery (com.google.firebase.firestore.bundle.NamedQuery)39 StructuredQuery (com.google.firestore.v1.StructuredQuery)16 Target (com.google.firestore.v1.Target)13 DocumentsTarget (com.google.firestore.v1.Target.DocumentsTarget)13 QueryTarget (com.google.firestore.v1.Target.QueryTarget)13 DocumentSet (com.google.firebase.firestore.model.DocumentSet)12 MutableDocument (com.google.firebase.firestore.model.MutableDocument)8 ArrayList (java.util.ArrayList)8 TargetData (com.google.firebase.firestore.local.TargetData)7 FieldIndex (com.google.firebase.firestore.model.FieldIndex)7 DocumentKey (com.google.firebase.firestore.model.DocumentKey)6 ByteString (com.google.protobuf.ByteString)5 Document (com.google.firebase.firestore.model.Document)4 HashMap (java.util.HashMap)4 Target (com.google.firebase.firestore.core.Target)3 SnapshotVersion (com.google.firebase.firestore.model.SnapshotVersion)3 Map (java.util.Map)3