Skip to content

Commit

Permalink
feat: added whereDocumentId()
Browse files Browse the repository at this point in the history
- added whereDocumentId() constraint to filter on a collection's document identifiers
  • Loading branch information
dereekb committed Jun 5, 2022
1 parent 52a1ec8 commit 7f5f5b8
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 3 deletions.
2 changes: 2 additions & 0 deletions packages/firebase-server/src/lib/firestore/driver.query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
FirestoreQueryConstraintFunctionsDriver,
FirestoreQueryDriver,
FIRESTORE_WHERE_QUERY_CONSTRAINT_TYPE,
FIRESTORE_WHERE_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE,
FIRESTORE_START_AFTER_QUERY_CONSTRAINT_TYPE,
FIRESTORE_ORDER_BY_QUERY_CONSTRAINT_TYPE,
FIRESTORE_OFFSET_QUERY_CONSTRAINT_TYPE,
Expand All @@ -30,6 +31,7 @@ export const FIRESTORE_CLIENT_QUERY_CONSTRAINT_HANDLER_MAPPING: FullFirestoreQue
[FIRESTORE_ORDER_BY_QUERY_CONSTRAINT_TYPE]: (builder, data) => builder.orderBy(data.fieldPath, data.directionStr),
[FIRESTORE_ORDER_BY_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE]: (builder, data) => builder.orderBy(FieldPath.documentId(), data.directionStr),
[FIRESTORE_WHERE_QUERY_CONSTRAINT_TYPE]: (builder, data) => builder.where(data.fieldPath, data.opStr, data.value),
[FIRESTORE_WHERE_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE]: (builder, data) => builder.where(FieldPath.documentId(), data.opStr, data.value),
[FIRESTORE_OFFSET_QUERY_CONSTRAINT_TYPE]: (builder, data) => builder.offset(data.offset),
[FIRESTORE_START_AT_QUERY_CONSTRAINT_TYPE]: (builder, data) => builder.startAt(data.snapshot as DocumentSnapshot),
[FIRESTORE_START_AT_VALUE_QUERY_CONSTRAINT_TYPE]: (builder, data) => builder.startAt(...data.fieldValues),
Expand Down
4 changes: 3 additions & 1 deletion packages/firebase/src/lib/client/firestore/driver.query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ import {
FIRESTORE_END_BEFORE_QUERY_CONSTRAINT_TYPE,
FIRESTORE_ORDER_BY_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE,
FIRESTORE_START_AT_VALUE_QUERY_CONSTRAINT_TYPE,
FIRESTORE_END_AT_VALUE_QUERY_CONSTRAINT_TYPE
FIRESTORE_END_AT_VALUE_QUERY_CONSTRAINT_TYPE,
FIRESTORE_WHERE_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE
} from './../../common/firestore/query/constraint';
import { makeFirestoreQueryConstraintFunctionsDriver } from '../../common/firestore/driver/query.handler';
import { FirestoreQueryConstraintFunctionsDriver, FirestoreQueryDriver } from '../../common/firestore/driver/query';
Expand All @@ -39,6 +40,7 @@ export const FIRESTORE_CLIENT_QUERY_CONSTRAINT_HANDLER_MAPPING: FullFirestoreQue
[FIRESTORE_ORDER_BY_QUERY_CONSTRAINT_TYPE]: (builder, data) => addConstraintToBuilder(builder, orderBy(data.fieldPath, data.directionStr)),
[FIRESTORE_ORDER_BY_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE]: (builder, data) => addConstraintToBuilder(builder, orderBy(documentId(), data.directionStr)),
[FIRESTORE_WHERE_QUERY_CONSTRAINT_TYPE]: (builder, data) => addConstraintToBuilder(builder, where(data.fieldPath, data.opStr, data.value)),
[FIRESTORE_WHERE_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE]: (builder, data) => addConstraintToBuilder(builder, where(documentId(), data.opStr, data.value)),
[FIRESTORE_OFFSET_QUERY_CONSTRAINT_TYPE]: undefined,
[FIRESTORE_START_AT_QUERY_CONSTRAINT_TYPE]: (builder, data) => addConstraintToBuilder(builder, startAt(data.snapshot as DocumentSnapshot)),
[FIRESTORE_START_AT_VALUE_QUERY_CONSTRAINT_TYPE]: (builder, data) => addConstraintToBuilder(builder, startAt(...data.fieldValues)),
Expand Down
12 changes: 11 additions & 1 deletion packages/firebase/src/lib/common/firestore/query/constraint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,15 @@ export function where(fieldPath: unknown, opStr: WhereFilterOp, value: unknown):
return firestoreQueryConstraint(FIRESTORE_WHERE_QUERY_CONSTRAINT_TYPE, { fieldPath: fieldPath as string, opStr, value });
}

// MARK: WhereDocumentId
export const FIRESTORE_WHERE_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE = 'where_doc_id';

export interface WhereDocumentIdQueryConstraintData extends Omit<WhereQueryConstraintData, 'fieldPath'> {}

export function whereDocumentId(opStr: WhereFilterOp, value: unknown): FirestoreQueryConstraint<WhereDocumentIdQueryConstraintData> {
return firestoreQueryConstraint(FIRESTORE_WHERE_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE, { opStr, value });
}

// MARK: OrderBy
export const FIRESTORE_ORDER_BY_QUERY_CONSTRAINT_TYPE = 'order_by';

Expand All @@ -100,7 +109,7 @@ export function orderBy<T = object>(fieldPath: FieldPathOrStringPathOf<T> | Fiel
return firestoreQueryConstraint(FIRESTORE_ORDER_BY_QUERY_CONSTRAINT_TYPE, { fieldPath: fieldPath as FieldPathOrStringPath, directionStr });
}

// MARK: OrderBy
// MARK: OrderByDocumentId
export const FIRESTORE_ORDER_BY_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE = 'order_by_doc_id';

export type OrderByDocumentIdQueryConstraintData = Pick<OrderByQueryConstraintData, 'directionStr'>;
Expand Down Expand Up @@ -202,6 +211,7 @@ export type FullFirestoreQueryConstraintDataMapping = {
[FIRESTORE_LIMIT_QUERY_CONSTRAINT_TYPE]: LimitQueryConstraintData;
[FIRESTORE_LIMIT_TO_LAST_QUERY_CONSTRAINT_TYPE]: LimitToLastQueryConstraintData;
[FIRESTORE_WHERE_QUERY_CONSTRAINT_TYPE]: WhereQueryConstraintData;
[FIRESTORE_WHERE_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE]: WhereDocumentIdQueryConstraintData;
[FIRESTORE_OFFSET_QUERY_CONSTRAINT_TYPE]: OffsetQueryConstraintData;
[FIRESTORE_ORDER_BY_QUERY_CONSTRAINT_TYPE]: OrderByQueryConstraintData;
[FIRESTORE_ORDER_BY_DOCUMENT_ID_QUERY_CONSTRAINT_TYPE]: OrderByDocumentIdQueryConstraintData;
Expand Down
12 changes: 11 additions & 1 deletion packages/firebase/test/src/lib/common/test.driver.query.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { SubscriptionObject } from '@dereekb/rxjs';
import { filter, first, from, skip } from 'rxjs';
import { limit, orderBy, startAfter, startAt, where, limitToLast, endAt, endBefore, makeDocuments, FirestoreQueryFactoryFunction, startAtValue, endAtValue } from '@dereekb/firebase';
import { limit, orderBy, startAfter, startAt, where, limitToLast, endAt, endBefore, makeDocuments, FirestoreQueryFactoryFunction, startAtValue, endAtValue, whereDocumentId } from '@dereekb/firebase';
import { MockItemDocument, MockItem, MockItemSubItemDocument, MockItemSubItem, MockItemDeepSubItemDocument, MockItemDeepSubItem } from './firestore.mock.item';
import { MockItemCollectionFixture } from './firestore.mock.item.fixture';
import { allChildMockItemDeepSubItemsWithinMockItem } from './firestore.mock.item.query';
Expand Down Expand Up @@ -385,6 +385,16 @@ export function describeQueryDriverTests(f: MockItemCollectionFixture) {
});
});

describe('whereDocumentId', () => {
it('should return the documents matching the query.', async () => {
const targetId = items[0].id;

const result = await query(whereDocumentId('==', targetId)).getDocs();
expect(result.docs.length).toBe(1);
expect(result.docs[0].id).toBe(targetId);
});
});

describe('startAt', () => {
it('should return values starting from the specified startAt document.', async () => {
const limitCount = 2;
Expand Down

0 comments on commit 7f5f5b8

Please sign in to comment.